벡터와 행렬 연산

Stop._.bmin·2023년 1월 31일
0
post-custom-banner

1. 벡터와 행렬과 텐서

벡터는 크기와 방향을 가진 양이다. 숫자가 나열된 형상이며 파이썬에서는 1차원 배열 또는 리스트로 표현한다.
행렬은 행과 열을 가지는 2차원 형상을 가진 구조이다. 파이썬에서는 2차원 배열로 표현한다. 가로줄을 행(row)라고 하며, 세로줄을 열(column)라고 한다.
3차원 부터는 주로 텐서라고 한다. 텐서는 파이썬에서는 3차원 이상의 배열로 표현한다.

2. 텐서(Tensor)

인공 신경망은 모델 내의 연산을 주로 행렬 연산을 통해 해결한다. 2차원 배열을 통한 행렬 연산만이 아니라 3차원 텐서에 대한 이해도 필수로 요구된다.

Numpy를 통해서 텐서를 보여주겠다.

1) 0차원 텐서(스칼라)

  • ndim을 출력했을 때 나오는 값을 우리는 축(axis)의 개수 또는 텐서의 차원이라고 부른다.

2) 1차원 텐서(벡터)

숫자를 배열한 것을 벡터라고 한다. 벡터는 1차원 텐서이다.
벡터에서도 차원이라는 용어를 쓰는데, 벡터의 차원과 텐서의 차원은 다른 개념이다. 아래의 예제는 4차원 벡터이지만, 1차원 텐서이다. 1D텐서라고도 한다.

3) 2차원 텐서(행렬)

행과 열이 존재하는 벡터의 배열 즉, 행렬(matrix)을 2차원 텐서라고 한다. 2D텐서라고도 한다.

4) 3차원 텐서(다차원 배열)

행렬 또는 2차원 텐서를 단위로 한 번 더 배열하면 3차원 텐서라고 한다. 3D텐서라고도 한다.
데이터 사이언스 분야 한정으로주로 3차원 이상의 배열을 텐서라고 부른다. 3D텐서는 적어도 3차원 배열이다. 이 구조를 이해하지 않으면, 복잡한 인공 신경망의 입, 출력값을 이해하는 것이 쉽지 않다. 개념 자체는 어렵지 않지만 반드시 알아야하는 개념이다.

자연어 처리에서 주로 보게 되는 것이 이 3D텐서이다. 3D 텐서는 시퀀스 데이터를 표현할 때 자주 사용되기 때문이다.

5) 그 이상의 텐서

3차원 텐서를 배열로 합치면 4차원 텐서가 된다. 4차원 텐서를 배열로 합치면 5차원 텐서가 된다. 이렇게 텐서는 다차원 배열으로서 계속해서 확장될 수 있다.

위의 그림은 각 텐서를 도형으로 시각화한 모습을 보여준다.

6) 케라스에서의 텐서

Numpy로 각 텐서의 ndim과 shape를 출력했다. 예를 들어 위의 예제에서 3차원의 텐서의 크기는 (2,3,5)였다. 케라스에서는 신경망의 층에 입력의 크기를 인자로 줄 때 input_shape라는 인자를 사용한다

실제 예제는 input_shape는 배치 크기를 제외하고 차원을 지정한다.

3. 벡터와 행렬의 연산

1) 벡터와 행렬의 덧셈과 뺄셈

같은 크기의 두 개의 벡터나 행렬은 덧셈과 뺄셈을 할 수 있다. 이 경우 같은 위치의 원소끼리 연산하면 된다. 이러한 연산을 요소별(element-wise)연산이라고 한다.


위아 같은 두 벡터의 덧셈과 뺄셈은 아래와 같다.

Numpy를 이용하여 이를 구현할 수 있다.

행렬도 마찬가지로 가능하다.

Numpy를 이용하여 이를 구현할 수 있다.

2) 벡터의 내적과 행렬의 곱셈

벡터의 점곱(dot product) 또는 내적(inner product)에 대해서 알아보자.
벡터의 내적은 연산을 점으로 표현한다.

내적이 성립하기 위해서는 두 벡터의 차원이 같아야 하며, 두 벡터 중 앞의 벡터가 행벡터이고 뒤의 벡터가 열벡터여야 한다.

행렬의 곱셈을 이해하기 위해서는 벡터의 내적을 이해해야한다. 행렬의 곱셈은 왼쪽 행렬의 행벡터와 오른쪽 행렬의 열벡터의 내적이 결과 행렬의 원소가 되는 것으로 이루어진다.

행렬의 곱셈은 딥 러닝을 이해하기 위해 필수적인 개념이므로 반드시 숙지해야한다.

  • 행렬의 곱 A x B이 성립되기 위해서는 행렬 A의 열의 개수와 행렬 B의 행의 개수는 같아야 한다.
  • 두 행렬의 곱 A x B의 결과로 나온 행렬 AB의 크기는 A의 행의 개수와 B의 열의 개수를 가진다.

4. 다중 선형 회귀 행렬 연산으로 이해하기

독립 변수가 2개 이상일 때, 1개의 종속 변수를 예측하는 문제를 행렬의 연산으로 표현한다면 어떻게 될까? 다중 선형 회귀나 다중 로지스틱 회귀가 이러한 연산의 예인데, 여기서는 다중 선형 회귀를 통해 예를 들어본다. 다음은 독립 변수 x가 n개인 다중 선형 회귀 수식이다.

샘플의 개수가 많을 경우에는 행렬의 곱셈으로도 표현이 가능하다. 다음은 집의 크기, 방의 수, 층의 수, 집이 얼마나 오래되었는지와 집의 가격이 기록된 부동산 데이터라고 가정하자. 해당 데이터를 학습하여 새로운 집의 정보가 들어왔을 때, 집의 가격을 예측하는 모델을 구현한다고 해보자.

위 데이터에 대해서 입력 행렬 X와 가중치 벡터 W의 곱으로 표현하면 다음과 같다.

여기에 편항 벡터 B를 더 해주면 위 데이터에 대한 전체 가설 수식 H(X)를 표현할 수 있다.

위의 수식에서 이력 행렬 X는 5행 4열의 크기를 가진다. 출력 벡터를 Y라고 하였을 때 Y는 5행 1열의 크기를 가진다. 여기서 곱셈이 성립하기 위해서 가중치 벡터 W의 크기는 4행 1열을 가져야 함을 추런할 수 있다. 만약 가중치 벡터를 앞에 두고 입력 행렬을 뒤에 두고 행렬 연산을 한다면 이는 아래와 같다.

수학적 관례로 아래와 같이 수식을 표현할 때느느 주로 가중치 W가 입력 X의 앞에 오는 편이다.

인공 신경망도 본질적으로 위와 같은 행렬 연산이다.

5. 샘플(Sample)과 특성(Feature)

훈련 데이터의 입력 행렬을 X라고 하였을 때 샘플과 특성의 정의는 다음과 같다


머신 러닝에서는 데이터를 셀 수 있는 단위로 구분할 때, 각각을 샘플이라고 부르며, 종속 변수 y를 예측하기 위한 각각의 독립 변수 x를 특성이라고 부른다.

6. 가중치와 편향 행렬의 크기 결정

  • 두 행렬의 곱 J x K 이 성립하기 위해서는 J의 열의 개수와 K의 행의 개수는 같아야 한다.
  • 두 행렬의 곱 J x K 의 결과로 나온 행렬 JK의 크기는 J의 행의 개수와 K의 열의 개수를 가진다

이로부터 입력과 출력의 행렬의 크기로부터 가중치 행렬 W와 편향 행렬 B의 크기를 찾아낼 수 있다. 독립 변수 행렬을 X, 종속 변수 행렬을 Y라고 하였을 때, 이때 행렬 X를 입력행렬, Y를 출력 행렬이라고 하자.

이제 행렬의 크기와 출력 행렬의 크기로부터 W행렬과 B행렬의 크기를 추론해보자

행렬의 덧셈에 해당되는 B행렬은 Y행렬의 크기에 영향을 주지 않는다. 그러므로 B행렬의 크기는 Y행렬의 크기와 같다.

행렬의 곱셈이 성립되려면 행렬의 곱셈에서 앞에 있는 행렬의 열의 크기와 뒤에 있는 행렬의 행의 크기는 같아야 한다. 그러므로 입력 행렬 X로부터 W행렬의 행의 크기가 결정된다.
업로드중..

두 행렬의 곱의 결과로서 나온 행렬의 열의 크기는 행렬의 곱셈에서 뒤에 있는 행렬의 열의 크기와 동일하다. 그러므로 출력 행렬 Y로부터 W행렬의 열의 크기가 결정된다.

입력 행렬과 출력 행렬의 크기로부터 가중치 행렬과 편향 행렬의 크기를 추정할 수 있다면, 딥러닝 모델을 구현하였을 때 해당 모델에 존재하는 총 매개변수의 개수를 계산하기 쉽다. 어떤 딥러닝 모델의 총 매개변수의 개수는 해당 모델에 존재하는 가중치 행렬과 편향 행렬의 모든 원소의 수이기 떄문이다.

profile
원하는 만큼만
post-custom-banner

0개의 댓글