데이터는 머신러닝의 필수 요소이다. 머신러닝에서는 일반적으로 행렬을 이용하여 데이터를 표현한다. 본 포스트와 다음 포스트에 걸쳐 머신러닝에 이용되는 행렬과 선형대수의 여러 개념에 대해 알아본다.

Vector

  • 벡터에 대한 더 엄밀한 정의는 다음 포스트에서 설명합니다.

스칼라(Scalar)는 크기만을 가지는 단일 값이다. 벡터(Vector)는 스칼라들의 집합으로, 크기와 방향을 모두 가진다. 벡터는 다음과 같이 표기된다.

a=(xy)b=(xy)\mathbf{a}=\begin{pmatrix} x & y\end{pmatrix} \\ \mathbf{b}=\begin{pmatrix} x \\ y\end{pmatrix}

a\mathbf{a}와 같이 원소를 행 방향으로 나열하면 행 벡터(Row Vector), b\mathbf{b}와 같이 열 방향으로 나타내면 열 벡터(Column Vector)라고 한다. 일반적으로 머신러닝에서는 특별한 언급이 없으면 벡터 표기는 열벡터를 나타낸다.

Matrix

행렬(Matrix)는 행과 열로 구성된 스칼라의 순서 있는 배열이며, 다음과 같이 표현된다.

A=(abcdef)\mathbf{A} = \begin{pmatrix}a&b\\c&d\\e&f\end{pmatrix}

행렬은 벡터의 배열로도 볼 수 있다. 즉, 행렬 A\mathbf{A}는 행벡터(ab)\begin{pmatrix} a&b\end{pmatrix},(cd)\begin{pmatrix}c&d\end{pmatrix},(ef)\begin{pmatrix}e&f\end{pmatrix}의 집합으로도 볼 수 있고 열백터(ace)\begin{pmatrix}a\\c\\e\end{pmatrix},(bdf)\begin{pmatrix}b\\d\\f\end{pmatrix}의 집합으로도 볼 수 있다. 행렬을 구성하는 각 스칼라값을 행렬 원소(element)라고 한다. iijj열의 원소는 aija_{ij}와 같이 표현할 수 있다. 행렬의 크기는 행 수와 열 수로 나타내는데, 행렬 A\mathbf{A}의 경우 3개의 행과 2개의 열로 구성되므로 3×23\times2행렬이라고 표기한다.

Tensor

방향을 가지지 않는 0차원 값을 스칼라, 행 또는 열의 1차원 값을 벡터, 행과 열 2차원으로 구성된 값을 행렬이라고 한다는 것을 앞서 학습하였다. 이를 일반화하여 nn차원으로 구성된 배열을 텐서(Tensor)라고 한다. 스칼라, 벡터, 행렬을 각각 0차원, 1차원, 2차원 텐서라고 부르기도 한다. 텐서는 머신러닝 라이브러리인 Tensorflow의 유래가 되기도 한다.

Diagonal Matrix & Identity Matrix

대각 행렬(Diagonal Matrix)란 행렬의 대각 원소 이외의 모든 성분이 0인 행렬을 의미하며, 단위 행렬(Identify Matrix)이란 주대각선의 원소가 모두 1인 대각 행렬을 의미한다. 대각 행렬은 행과 열의 크기가 같은 정사각행렬(Square Matrix)에서만 정의된다. 주로 대각 행렬은 D\mathbf{D}, 단위 행렬은 I\mathbf{I}로 표현된다.

Transpose

행렬의 전치(Transpose)는 기존 행렬의 행과 열을 바꾸는 연산을 의미한다. 예를 들어, 다음과 같은 행렬을 생각하자.

A=(123456)\mathbf{A}=\begin{pmatrix}1&2\\3&4\\5&6\end{pmatrix}

이 행렬을 전치하면 다음과 같다. 전치 행렬은 T^T로 표현한다.

AT=(135246)\mathbf{A}^T=\begin{pmatrix}1&3&5\\2&4&6\end{pmatrix}

Operations of Matrix

덧셈과 뺄셈

행렬의 덧셈과 뺄셈은 크기가 같은 행렬들에서만 정의되며, 동일한 위치의 원소끼리 더하거나 빼서 동일한 크기의 행렬을 결과값으로 만드는 연산이다. 연산 과정이 매우 간단하고 직관적이므로 본 포스트에서는 자세히 설명하지 않는다.

스칼라곱

스칼라×행렬 꼴의 곱셈은 모든 행렬 원소에 곱하려는 스칼라를 곱하여 결과를 구할 수 있다. 이 역시 연산 과정이 매우 간단하고 직관적이므로 자세히 설명하지 않는다.

행렬 원소곱

행렬 원소곱은 차원이 동일한 두 행렬의 동일 위치 원소를 서로 곱하는 방법이며, 기호로 \odot과 같이 나타낸다.

행렬곱

행렬곱은 행렬 간 서로 곱하는 것을 의미한다. 행렬곱은 앞 행렬의 열 크기와 뒷 행렬의 행 크기가 일치해야 계산 가능하다. 행렬곱은 기호 없이 두 행렬을 나열함으로써 나타낸다. 행렬곱은 앞에 위치하는 행과 뒤에 뒤치하는 열의 원소를 각각 곱한 후 더하는 것과 같다. 간단한 예시를 통해 이해해 보자.

(123456)(302131)=(564131210211816)\begin{pmatrix}1&2\\3&4\\5&6\end{pmatrix}\begin{pmatrix}3&0&2\\1&3&1\end{pmatrix} = \begin{pmatrix}5&6&4\\13&12&10\\21&18&16\end{pmatrix}

계산 결과로 도출된 행렬의 1행 1열 원소 5는 (12)(31)\begin{pmatrix}1&2\end{pmatrix}\begin{pmatrix}3\\1\end{pmatrix}의 결과이다.

Determinant

행렬식(Determinant)은 행렬의 특성을 하나의 숫자로 표현하는 방법의 하나이다. 좀 더 자세히 알아보기 위해 다음과 같은 3×33\times3 행렬을 생각하자.

A=(a11a12a13a21a22a23a31a32a33)\mathbf{A}=\begin{pmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{pmatrix}

이 행렬의 기본곱(Elementary Product)는 다음과 같이 정의된다.

a1a2a3a_{1-}a_{2-}a_{3-}

빈 자리(-)에는 {1,2,3}\left\{1,2,3\right\}의 순열(Permutation)이 들어간다. 다음과 같은 6종류의 permutation이 있다.

(1,2,3)(2,3,1)(3,1,2)(1,3,2)(2,1,3)(3,2,1)(1,2,3)\quad(2,3,1)\quad(3,1,2) \\ (1,3,2)\quad(2,1,3)\quad(3,2,1)

이때, 큰 수가 작은 수를 선행하는 것을 전도(Inversion)이라고 하고, Inversion이 짝수 번 일어난 permutation을 even(짝), inversion이 홀수 번 일어난 permutation을 odd(홀)이라고 정의한다. 위 예시에서 윗줄의 permutation이 모두 even이고, 아랫줄의 permutation이 모두 even이다.
이제 이것을 일반화해 보자. n×nn\times n행렬 A\mathbf{A}의 elementary product는 다음과 같다.

a1j1a2j2a3j3anjna_{1j_1}a_{2j_2}a_{3j_3}\cdots a_{nj_n}

이때 {j1,j2,,jn}\left\{j_1, j_2, \cdots, j_n\right\}{1,2,n}\left\{1,2 \cdots, n\right\}의 permutation이다. 이제 이 elementary product에 (j1,j2,,jn)(j_1, j_2, \cdots, j_n)가 even이면 ++를, odd면 -를 붙인다. 이를 부호가 붙은 기본곱(Signed Elementary Product)라고 한다.
행렬의 Signed Elementary Product를 모두 더한 것을 행렬식(Determinant)라고 하고, determinant는 det(A)\det(\mathbf{A}) 또는 A|\mathbf{A}|와 같이 나타내며 다음과 같이 표현된다.

det(A)=±a1j1a2j2a3j3anjn\det(\mathbf{A})=\sum\pm a_{1j_1}a_{2j_2}a_{3j_3}\cdots a_{nj_n}

행렬식의 절대값은 해당 행렬이 단위 공간을 얼마나 늘이거나 줄였는지를 나타낸다. 예를 들어, 만약 행렬식의 값이 1이라면 해당 행렬이 단위 공간과 부피가 같다는 것을 표현하고, 행렬식이 0이라면 해당 행렬이 나타내는 부피가 0임을 의미한다.

Minor Determinant

(i,j)(i,j)소행렬식(Minor Determinant of Entry aija_{ij})이란 n×nn\times n행렬 AAii행과 jj열을 제거하고 만든 부분행렬의 행렬식으로, MijM_{ij}와 같이 표현한다. 이를 식으로 표현하면 다음과 같다.

Confactor Matrix & Adjoint Matrix

여인수(Confactor)는 다음과 같이 정의된다.

Cij=(1)i+jMijC_{ij}=(-1)^{i+j}M_{ij}

여인수로 이루어진 행렬을 여인수 행렬(Confactor Matrix)이라고 한다. 여인수 행렬은 다음과 같이 표현된다.

Cij=(C11C12C1jC1nC21C22C2jC2nCi1Ci2CijCinCn1Cn2CnjCnn)C_{ij}=\begin{pmatrix}C_{11}&C_{12}&\cdots&C_{1j}&\cdots&C_{1n} \\ C_{21}&C_{22}&\cdots&C_{2j}&\cdots&C_{2n} \\ \vdots&\vdots&\ddots&\vdots&\ddots&\vdots \\ C_{i1}&C_{i2}&\cdots&C_{ij}&\cdots&C_{in} \\ \vdots&\vdots&\ddots&\vdots&\ddots&\vdots \\ C_{n1}&C_{n2}&\cdots&C_{nj}&\cdots&C_{nn} \end{pmatrix}

수반 행렬(Adjoint Matrix)은 여인수 행렬의 전치행렬이며, 다음과 같이 표현된다.

CijT=adj(A)C_{ij}^{T}=\text{adj}{(\textbf{A})}

Inverse Matrix

행렬 A\mathbf{A}에 대해 AB=I\mathbf{AB}=\mathbf{I}를 만족하는 행렬 B\mathbf{B}가 있을 때 행렬 A\mathbf{A}를 가역 행렬(Invertible Matrix)라고 하고, 행렬 B\mathbf{B}를 행렬 A\mathbf{A}의 역행렬(Inverse Matrix)라고 하고 기호로 A1\mathbf{A}^{-1}과 같이 나타낸다. 역행렬은 다음과 같이 계산할 수 있다.

A1=adj (A)det(A)\mathbf{A}^{-1}=\frac{\text{adj }(\mathbf{A})}{\det{(\mathbf{A})}}

위의 식에서 역행렬이 존재할 조건을 다음과 같이 얻을 수 있다.

det(A)0\det(\mathbf{A}) \ne 0

Inner Product

내적(Inner Product) 또는 도트곱(Dot Product)는 벡터 간의 연산이다. 다음과 같은 두 벡터를 생각하자.

u=(u1u2un),v=(v1v2vn)\mathbf{u} = \begin{pmatrix}u_1 \\u_2\\\vdots\\u_n\end{pmatrix}, \mathbf{v} = \begin{pmatrix}v_1 \\v_2\\\vdots\\v_n\end{pmatrix}

이 벡터의 내적은 다음과 같이 표현할 수 있다.

<u,v>=uv=uTv=u1v1+u2v2++unvn<\mathbf{u,v}>=\mathbf{u} \cdot\mathbf{v}=\mathbf{u}^T\mathbf{v}=u_1v_1+u_2v_2+\cdots+u_nv_n

즉, 동일한 위치의 스칼라를 모두 곱하여 더하여 내적을 구할 수 있다. 내적은 다른 연산과는 달리 벡터를 연산하여 스칼라를 결과값으로 내어 놓는다. 내적은 정사영(projection)의 개념을 이용하여 좀 더 자세히 설명할 수 있지만, 본 포스트에서는 그 결과만을 설명한다. 두 벡터가 이루는 각의 크기를 θ\theta라고 할 때,

uv=uvcosθ\mathbf{u} \cdot\mathbf{v}=||\mathbf{u}||\,||\mathbf{v}||\,\cos{\theta}

이다. 이때 u||\mathbf{u}||은 벡터의 길이 또는 노름(Norm)을 나타내고, 다음과 같이 정의된다.

u=u12+u22++un2||\mathbf{u}|| = \sqrt{u^2_1+u^2_2+\cdots+u^2_n}

Linear Transformation

정의역(Domain) AA의 각 원소를 ff가 치역(Codomain) BB의 단 하나의 원소에 대응시킬 때 이 ff를 함수(Function)이라고 함을 기억하자. aAa\in AbBb \in B에 대응될 때, b=f(a)b=f(a)라고 하고 bbaa의 상(image)이라고 표현한다. 대부분의 잘 알려진 함수의 경우, A,BA,B가 실수 집합이고, 이 경우 ff는 real-valued function of a real variable이라고 불린다(적절한 번역어를 찾지 못하였기 때문에 영어로만 기술한다. 적절한 번역어가 있는 경우 댓글로 추천받아 이후 반영하도록 하겠다.).
정의역과 치역은 다차원일 수 있는데, 이때 nn차원 실수 집합을 Rn\mathbb{R}^n과 같이 표현한다. 만약 어떤 함수의 정의역이 Rn\mathbb{R}^n이고, 치역이 Rm\mathbb{R}^m이라면 이 함수는 Rn\mathbb{R}^n에서 Rm\mathbb{R}^m으로의 사영(Map) 또는 변환(Transformation)이라고 부른다. 또 m=nm=n일 경우 이 변환 f:RnRnf:\mathbb{R}^n\rarr\mathbb{R}^nRn\mathbb{R}^n의 연산자(Operator)라고 한다.
f1,f2,,fmf_1,f_2,\cdots,f_mnn개의 실수 변수들에 대한 실숫값 함수일 때,

w1=f1(x1,x2,,xn)w2=f2(x1,x2,,xn)wm=fm(x1,x2,,xn)w_1 = f_1(x_1,x_2,\cdots,x_n) \\ w_2 = f_2(x_1,x_2,\cdots,x_n) \\ \vdots \\ w_m = f_m(x_1,x_2,\cdots,x_n)

와 같이 표현할 수 있다. 이때 f1,f2,,fmf_1,f_2,\cdots,f_m이 선형적일 때, 이 함수들로 이루어진 변환 T:RnRmT:\mathbb{R}^n\rarr\mathbb{R}^m을 선형 변환(Linear Transformation)이라고 한다. 이때, 이 선형 변환을 다음과 같이 행렬을 이용하여 나타낼 수 있다.

(w1w2wn)=(a11a12a1na21a22a2nam1am2amn)(x1x2xn)\begin{pmatrix}w_1\\w_2\\\vdots\\w_n\end{pmatrix} = \begin{pmatrix}a_{11}&a_{12}&\cdots&a_{1n} \\ a_{21}&a_{22}&\cdots&a_{2n} \\ \vdots&\vdots&\ddots&\vdots \\ a_{m1}&a_{m2}&\cdots&a_{mn} \end{pmatrix} \begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}
w=Ax\mathbf{w=Ax}

이처럼 우리가 흔히 사용하는 행렬은 선형 변환의 의미를 가진다.

참고 자료

[1] 장철원, "Chapter 3: 머신러닝을 위한 선형대수" in 선형대수와 통계학으로 배우는 머신러닝. 비제이퍼블릭.
[2] Howard Anton, Elementary Linear Algebra, 7th edition, John Wiley & Sons, Inc.

profile
KAIST 24

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기