Code › ai-engineering-study

머신러닝과 선형대수학

벡터와 행렬, 선형 시스템이 머신러닝의 입력과 가중치 연산으로 연결되는 과정

이번 수업은 머신러닝의 정의에서 시작해 선형대수와 미분, 모델과 비용 함수, 지도학습과 비지도학습까지 진행했다. 와..그런데 본격적으로 내용이 엄청 많아지면서 소화하기 힘들어졌다. 그래서 이렇게라도 복습하면서 정리 해 보고 있다.

할 수 있다..!


머신러닝에 필요한 수학들

그 중에서도 선형대수랑 미적분이 가장 많이 쓰인다.

분야주요 개념역할예시
선형대수벡터, 행렬, 선형 변환데이터와 가중치 표현 및 연산입력 행렬과 가중치 벡터의 곱
미적분변화율, 미분, 기울기비용을 줄이는 방향 계산비용 함수를 가중치로 미분
통계평균, 분산, 분포, 표본데이터의 경향과 변동 파악평균과 표준편차 계산
확률사건, 확률변수, 확률분포불확실성을 수치로 표현클래스별 확률 출력

이 네 분야가 머신러닝 안에서 함께 사용되고 있는데 EDA, 데이터 분석 데이터 전처리, 모델 학습을 위해 선형대수와 미분, 통계, 확률이 유기적으로 사용되고 있다. 일단 내가 더 이해하고 싶은 부분 위주로 질문 답변 하면서 정리해본다.


벡터와 행렬

벡터의 각 좌표가 하나의 차원이라는 말은 무엇을 뜻하는가?

  • 벡터의 각 입력은 이렇게 생각하면 이해하기 조금 편하다. 일반적으로 평면 좌표에서 x,y 축이 있을때, x축 하나만 보면 1차원이고, 거기에 y축이 포함되면 2차원 평면이 된다. 그래서 (x,y) 이렇게 입력값이 들어가는것은 2차원 벡터라고 볼 수 있고 여기에 계속 입력값이 늘어난다면 축이 늘어나는것과 같이 n차원 벡터가 된다.

집값 데이터에서 크기, 방 개수, 위치를 하나의 벡터로 표현하면 어떤 형태가 되는가?

  • 이건, 위에서 n차원 벡터처럼 [30평, 3개, 역세권, 7층] 이렇게 4차원 행벡터로 표시할 수 있다. 여기서는 각 특징을 한 줄에 모아 표현하는 예시로 적었고, 실제 모델에 입력할 때는 역세권 같은 범주형 데이터도 숫자로 변환해야 한다.

행렬의 정의와 표기

  • 행렬은 수나 식을 직사각형 형태로 배열한 것이며, 여러 벡터를 묶거나 선형 변환을 표현하는 데 사용할 수 있다. 행렬은 보통 대문자 A, B로, 벡터는 소문자 x, y로 표기한다.

행렬의 덧셈과 스칼라 곱

  • 행렬의 덧셈(뺄셈)과 요소별로 각각 곱하는 것은 두 행렬의 차원인 행과 열 개수가 모두 같을 때만 가능하다. 그런데 여기서 재미있는 부분이 있다. (재미 없을수도?) 일반적인 행렬 곱셈은 동작이 다르며 다음과 같은 특성을 가지고 있다.

행렬 곱셈

  • 행렬은 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 같아야 하는데, 예를들어 3×23 \times 2 행렬과 2×42 \times 4 행렬이 있으면 앞 행렬의 열 개수는 2이고, 뒤 행렬의 행 개수인 2로 같아서 행렬 곱셈이 가능하다. 행렬 AABB의 크기에 따라 ABAB는 가능하지만 BABA는 정의되지 않을 수도 있다. 두 곱셈이 모두 가능하더라도 ABABBB의 변환을 먼저 적용한 뒤 AA의 변환을 적용하고, BABA는 그 반대 순서로 적용하므로 일반적으로 결과가 같지 않다.

단위행렬, 전치행렬, 역행렬

단위행렬 II는 대각 원소가 1이고 나머지는 0으로 채워져 있다. 그리고 항등원 1처럼 항등행렬인데, AI=IA=AAI = IA = A와 같다.

전치행렬 ATA^{\mathsf{T}}는 쉽게 말하면 행과 열을 바꾼 행렬이다. 데이터 행렬을 전치하면 샘플 축과 특징 축이 서로 뒤바뀐 형태가 된다. 그리고 역행렬은 아래에서 행렬식과 함께 조금 더 자세하게 설명하려고 한다.

행렬식과 역행렬

2×22 \times 2 행렬 AA를 다음과 같이 둔다.

A=[abcd]A = \begin{bmatrix} a & b \\ c & d \end{bmatrix}

행렬식은 다음과 같다.

det(A)=adbc\det(A) = ad - bc

행렬식이 0이 아닐 때 역행렬은 다음과 같이 구한다.

A1=1adbc[dbca]A^{-1} = \frac{1}{ad-bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix} AA1=A1A=IAA^{-1} = A^{-1}A = I

역행렬이 역수의 역할을 하는 이유

우리가 일반 수 계산 할 때 역수를 곱하면 1이 되는 것 처럼 행렬에서도 어떤 행렬에 역행렬을 곱하면 1과 같은 항등행렬인 단위행렬 II가 된다. 행렬식을 순수하게 유도하는 원리부터 그 값을 이용해 역행렬을 구하는 소거법 과정까지는 사실 아직 좀 복잡하다. 이 부분은 공부하면서 별도 포스팅으로 다루는게 좋을 것 같다.

참고로 det(A)=0\det(A) = 0인 경우는 역행렬이 존재하지 않는데 역행렬을 구하는 식에 보면 분모에 adbcad-bc가 있는데 이게 곧 행렬식인 det(A)\det(A)가 들어간다. 수학에서는 분모가 0인 경우는 정의할 수 없기 때문에 역행렬도 존재하지 않는다고 할 수 있다.

역행렬을 이용해 연립방정식 Ax=bAx = b의 해를 표현하는 방법

여기서는 AA가 정사각행렬이고 역행렬이 존재하는 경우를 예시로 들었다. 기본 방정식 Ax=bAx = b에서 양변에 역행렬인 A1A^{-1}을 곱하면 다음과 같이 정리할 수 있다.

A1Ax=A1b(A1A)x=A1bIx=A1bx=A1b\begin{aligned} A^{-1}Ax &= A^{-1}b \\ (A^{-1}A)x &= A^{-1}b \\ Ix &= A^{-1}b \\ x &= A^{-1}b \end{aligned}

결합법칙으로 좌변을 묶으면 A1AA^{-1}A가 단위행렬 II가 되고, 최종적으로 x=A1bx = A^{-1}b라는 해를 얻는다.

머신러닝에서 역행렬을 직접 구하기보다 선형 시스템 풀이, 분해, 최적화를 사용하는 경우가 많은 이유

컴퓨터는 실수를 유한한 자릿수로 표현하기 때문에 역행렬을 직접 계산하는 과정에서 반올림 오차가 생길 수 있고, 특히 수치적으로 불안정한 행렬에서는 이 오차가 결과에 크게 반영될 수 있다. 게다가 Ax=bAx = b의 해만 필요하다면 역행렬 전체를 계산하는 것보다 LU 분해나 QR 분해 등을 이용해 선형 시스템을 직접 푸는 편이 불필요한 연산을 줄일 수 있다. 머신러닝에서도 문제에 따라 닫힌 형태의 해를 역행렬로 구하기보다 경사하강법 같은 최적화 방식으로 가중치를 반복해서 갱신한다.

참고로 역행렬을 구하는 방법인 가우스-조단 소거법(학부시절에 잠시 들어본 기억이..)은 행렬의 한 줄에 상수를 곱하거나 다른 줄에 더해가면서 단위행렬로 만드는 방식이다. N×NN \times N 행렬을 처리하는 시간복잡도는 O(N3)O(N^3)이고, NN이 10만이면 단순 계산으로도 약 101510^{15}번, 즉 천조 번 수준의 연산이 필요하므로 매우 비효율적이다.


선형 시스템을 행렬로 표현하기

곱셈과 덧셈으로 이루어진 여러 선형 방정식을 한꺼번에 표현하면 다음과 같은 형태가 된다.

Ax=bAx = b

그리고 연립방정식을 풀 때, 계수 행렬을 사용해서 가우스-조단 소거법으로 연산한다. 이런식으로 최종적으로 왼쪽 행렬의 모양을 단위행렬로 만들면 오른쪽의 벡터가 미지수의 값이 된다.


일반적인 연립방정식과 머신러닝의 차이

일반적인 연립방정식에서는 계수 행렬 AA와 결과 벡터 bb가 주어졌을 때 미지수 벡터 xx를 구한다. 조건이 맞고 해가 하나라면 모든 방정식을 정확히 만족하는 xx를 찾을 수 있다.

머신러닝에서도 모양은 비슷하지만 역할이 달라진다. 여러 샘플의 입력 행렬 XX와 실제 정답 yy가 주어지고, 여기서 찾아야 하는 값은 각 특징의 영향력을 담은 가중치 벡터 ww다. 실제 데이터에는 잡음이 있고 모든 샘플을 하나의 식으로 정확히 맞추기 어려운 경우가 많아서, 모든 데이터를 가장 잘 설명하도록 비용 함수를 줄이는 ww를 찾는다.


머신러닝에서 행렬이 사용되는 방식

집값 예측 데이터에 샘플이 nn개 있고 각 아파트마다 dd개의 특징이 있다면, 입력 전체는 n×dn \times d 크기의 행렬 XX로 표현할 수 있다. 행 하나는 아파트 한 채이고, 각 열은 크기, 방 개수, 위치 점수 같은 특징이다.

X=[x11x12x1dx21x22x2dxn1xn2xnd]X = \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1d} \\ x_{21} & x_{22} & \cdots & x_{2d} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nd} \end{bmatrix}

각 특징의 영향력을 담은 가중치 벡터를 ww라고 하면 전체 샘플의 예측값은 다음처럼 표현할 수 있다.

y^=Xw+b\hat{y} = Xw + b

XX의 한 행과 ww의 내적에 편향 bb를 더하면 아파트 한 채의 예측 가격이 나온다. 행렬 XX 전체와 ww를 곱하면 같은 계산을 모든 샘플에 대해 한 번에 수행할 수 있다. 여기서 XX는 여러 샘플을 담은 입력 행렬이고, 한 샘플은 특징 벡터 xx로 표현한다.

y^\hat{y}는 찾아보니 와이 햇이라고 읽는다. 문자 위의 모자 모양 기호는 실제로 관측한 값이 아니라 모델이 추정한 값이라는 뜻으로 이해하면 될듯. 결국 학습 데이터에 들어 있는 실제 집값은 yy, 입력과 가중치로 계산한 예측 집값은 y^\hat{y}로 구분하며, 이 문제에서 예측하려는 집값은 target 또는 label이다.


미분은 어떻게 이어지는가

입력 행렬 XX와 가중치 벡터 ww를 곱하면 모델의 예측값을 계산할 수 있다. 다음 문제는 실제값과 예측값의 차이를 줄이기 위해 가중치 ww를 어떻게 바꿀 것인가이다.

이때 비용 함수가 가중치에 따라 얼마나 변하는지 계산하기 위해 미분을 사용한다. 편미분, 경사 벡터, 경사하강법으로 이어지는 과정은 이전 글에서 따로 정리했기에 아래 링크 참고.

손실 함수에서 경사하강법까지 →

일단 오늘은 여기까지 정리했는데, 나머지도 빠르게 정리해서 소화시키고 싶다..!!

하루가 너무 짧게 느껴지는 요즘이다.