[SK플래닛] ASAC 빅데이터전문가 11기 | 20일차

20일차는 전날 배운 선형대수 개념이 실제 머신러닝의 대표적인 차원 축소 방법인 PCA로 이어지는 흐름이었다. 19일차에는 basis, eigenvalue, gradient, Jacobian 같은 개념을 각각 따로 봤다면, 이번에는 그 개념들이 왜 필요한지 조금 더 연결해서 볼 수 있었다.

전체 흐름은 크게 두 갈래였다. 앞부분은 데이터를 평균 중심으로 옮기고, 공분산 행렬을 만들고, 새로운 basis에서 분산이 가장 커지는 방향을 찾는 과정이었다. 뒷부분은 벡터 미분과 인공신경망을 연결하면서, forward 계산뿐 아니라 backward 과정도 행렬과 미분으로 볼 수 있다는 내용이었다. 특히 PCA에서 “분산이 가장 큰 방향을 찾는다”는 말이 단순 설명이 아니라, 실제로는 WᵀSW를 최대화하는 문제이고, 이 문제가 결국 공분산 행렬의 고유값/고유벡터 문제로 연결된다는 점이 핵심이었다.  

1. 평균을 빼는 이유: 데이터를 중심으로 옮기기

PCA를 보기 전에 먼저 데이터에서 평균을 빼는 이유를 다시 생각했다. 통계에서 편차를 쓸 때도 단순히 값 자체를 보는 것이 아니라, 각 값이 평균으로부터 얼마나 떨어져 있는지를 봤다. 이걸 벡터 관점으로 보면 데이터를 평균 벡터 기준으로 이동시키는 작업에 가깝다.

원본 데이터가 그대로 있으면 값의 크기 자체가 중심 위치에 영향을 받는다. 그래서 각 feature별 평균을 빼서 평균이 0 근처에 오도록 맞춰준다. 이 과정은 데이터를 “평균 중심으로 센터링”하는 작업이었다. 자료에서도 기존 데이터를 평균 벡터 기준으로 옮겨서, 순수하게 데이터가 어떻게 흩어져 있는지 보려고 한다고 설명했다.  

원본 데이터
→ 각 feature의 평균 계산
→ 각 값에서 평균을 뺌
→ 평균 중심으로 이동한 데이터

이 부분은 단순 전처리처럼 보이지만, PCA에서는 꽤 중요했다. PCA가 결국 데이터의 흩어짐, 즉 분산이 큰 방향을 찾는 방법이기 때문에, 먼저 기준점을 평균으로 맞춰두는 과정이 필요했다.

2. 공분산 행렬은 변수끼리의 흩어짐을 모아둔 행렬이었다

평균을 뺀 뒤에는 공분산 행렬을 만든다. 처음에는 공분산 행렬이라고 하면 그냥 공식처럼 느껴졌는데, 이번에는 조금 다르게 보였다. 각 변수의 편차들을 벡터로 보고, 그 편차들끼리 내적을 모아둔 행렬이라고 생각할 수 있었다.

자료에서는 벡터의 제곱합을 내적으로 표현하고, 이를 행렬 관점으로 보면 transpose가 필요하다고 설명했다. 예를 들어 하나의 벡터 v = [1, 2, 3]의 제곱합은 벡터 내적으로 계산할 수 있고, 행렬로 표현하면 v와 vᵀ의 곱으로 볼 수 있다. 이 관점이 여러 샘플과 여러 feature로 확장되면 공분산 행렬로 이어진다.  

편차 벡터의 제곱합
= 자기 자신과의 내적

여러 변수의 편차 내적을 모아둔 것
= 공분산 행렬

공분산 행렬에서 대각선 성분은 각 변수 자신의 분산이다. 반면 대각선이 아닌 성분은 변수와 변수 사이의 공분산이다. 즉 두 변수가 같은 방향으로 움직이는지, 반대 방향으로 움직이는지에 대한 정보가 들어 있다.

예를 들어 키와 몸무게가 같이 커지는 경향이 강하면 두 변수의 공분산은 양수 방향으로 커질 수 있다. 반대로 한쪽이 커질 때 다른 쪽이 작아지는 경향이면 음수 방향으로 나올 수 있다. 자료에서도 공분산 행렬은 변수의 흩어짐뿐 아니라 변수와 변수 사이의 방향성 정보까지 담고 있고, 이를 표준화한 것이 상관계수와 연결된다고 설명했다.  

3. 좌표는 basis 방향으로 정사영한 값이었다

중간에 좌표계를 바꾸는 이야기가 나왔다. 처음에는 갑자기 좌표 변환이 왜 나오는지 살짝 헷갈렸는데, PCA가 결국 “기존 축이 아니라 새로운 축으로 데이터를 바라보자”는 내용이기 때문에 필요한 과정이었다.

표준 basis인 E1, E2 기준으로 어떤 점을 표현하면 우리가 흔히 아는 x좌표, y좌표가 나온다. 그런데 이 좌표값도 결국 기하학적으로 보면 각 basis 방향으로 정사영한 값이었다. 어떤 점을 x축 방향으로 내리면 x좌표가 되고, y축 방향으로 내리면 y좌표가 되는 것처럼, 새로운 basis를 잡으면 그 basis 방향으로 다시 정사영해서 좌표가 바뀐다.

예를 들어 표준 기저에서는 (2, 0)처럼 보이는 점도, 45도 방향의 새로운 basis를 기준으로 보면 다른 좌표값을 가진다. 중요한 건 점 자체가 바뀌는 것이 아니라, 그 점을 표현하는 기준이 바뀐다는 점이다. 자료에서도 기존 좌표 체계와 새로운 basis 체계를 행렬 곱으로 연결하면 새로운 좌표계로 넘어갈 수 있고, 이 과정은 내적과 정사영의 관점으로 이해할 수 있다고 설명했다.  

점 자체가 바뀌는 것이 아니라,
그 점을 표현하는 기준이 바뀐다.

이 부분이 PCA랑 바로 연결됐다. 원래 feature 축으로 데이터를 보는 대신, 데이터가 더 많이 퍼져 있는 방향을 새로운 basis로 잡으면 같은 데이터를 더 효율적으로 표현할 수 있다.

4. PCA는 분산이 가장 큰 새로운 basis를 찾는 문제였다

PCA의 목적은 데이터가 가장 많이 흩어진 방향을 찾는 것이다. 기존 x축, y축 기준으로 데이터를 보면 분산이 애매하게 나뉘어 보일 수 있지만, 데이터가 길게 퍼진 방향을 새로운 축으로 잡으면 그 한 축만으로도 많은 정보를 설명할 수 있다.

자료에서는 기존 데이터에 새로운 basis를 도입했을 때, 그 새로운 시스템에서의 분산이 커지는 방향을 찾고 싶다고 설명했다. 이때 새 basis는 아무 벡터나 되면 안 되고, 보통 크기가 1인 벡터로 두고 문제를 푼다. 즉 “분산은 최대화하되, basis 벡터의 크기는 1이어야 한다”는 제약 조건이 생긴다.  

수식으로 보면 대략 이런 형태였다.

maximize   WᵀSW
subject to WᵀW = 1

여기서 S는 공분산 행렬이고, W는 새로 찾고 싶은 basis 방향이다. 처음에는 식이 갑자기 무거워 보였는데, 말로 풀면 “새로운 방향 W로 데이터를 봤을 때 분산이 가장 커지게 만들자”는 뜻이었다.

이 문제를 풀기 위해 라그랑주 승수법이 나왔다. 고등학교 때 최댓값/최솟값 문제에서 미분값이 0이 되는 지점을 찾았던 것처럼, 여기서는 제약 조건이 있는 최적화 문제를 풀어야 했다. 자료에서도 x + y를 최대화하되 x² + y² = 1 같은 제약 조건이 있는 문제를 예시로 들고, 접하는 지점에서 gradient들이 평행 관계가 된다는 관점으로 라그랑주 승수법을 설명했다.  

5. PCA 문제가 고유값/고유벡터 문제로 바뀌는 지점

라그랑주 승수법으로 WᵀSW를 최대화하는 문제를 풀다 보면 결국 공분산 행렬 S에 대한 고유값 문제로 바뀐다. 여기서 전날 배운 고유값/고유벡터가 다시 등장했다.

공분산 행렬은 대칭행렬이다. 편차 행렬과 그 transpose를 곱해 만든 구조라서 대각선을 기준으로 대칭 형태가 된다. 이 성질 덕분에 미분식이 조금 더 단순해지고, 최종적으로는 아래와 비슷한 형태로 정리된다.

SW = λW

이건 결국 고유값/고유벡터 식이다. 즉 PCA에서 찾는 새로운 basis 방향은 공분산 행렬의 고유벡터가 되고, 그 방향으로의 분산 크기는 고유값과 연결된다. 자료에서도 WᵀSW를 최대화하는 문제가 공분산 행렬이 가진 고유값 문제와 같은 형태로 풀리고, 이때 W가 고유벡터가 된다고 설명했다.  

이 부분이 20일차에서 가장 크게 연결된 지점이었다. 19일차에는 고유값과 고유벡터를 행렬의 특징으로 배웠는데, 이번에는 그게 PCA에서 “분산이 큰 축”을 찾는 데 실제로 쓰였다.

공분산 행렬의 고유벡터
= PCA에서 새롭게 잡는 축

고유값
= 그 축 방향으로 데이터가 얼마나 퍼져 있는지

그래서 PCA는 단순히 “차원 축소 기법”이라고 외우는 것보다, 공분산 행렬에서 분산이 큰 방향을 고유벡터로 찾는 과정으로 보는 게 더 자연스러웠다.

6. 행렬 미분이 필요한 이유

PCA 유도 과정에서 또 하나 걸렸던 부분은 행렬 미분이었다. WᵀSW를 W로 미분해야 하는데, 이건 단순한 스칼라 미분과는 다르다. 그래도 느낌 자체는 고등학교 때 배운 x² 미분과 어느 정도 닮아 있었다.

자료에서는 x²을 곱의 미분 관점에서 보면 x * x를 미분하는 것이고, 행렬에서도 비슷하게 WᵀSW처럼 곱으로 이루어진 식을 미분해야 한다고 설명했다. 다만 가운데에 행렬 S가 들어가고, transpose가 얽히기 때문에 일반적인 경우에는 식이 더 복잡하다. 하지만 S가 대칭행렬이면 결과가 단순해진다.  

대략 이런 느낌이었다.

WᵀSW를 W로 미분

S가 대칭행렬이면
→ 2SW 형태로 정리 가능

이 부분은 아직 손으로 완전히 편하게 풀 수 있는 단계는 아니지만, 왜 PCA 유도에서 미분과 고유값 문제가 함께 등장하는지 이해하는 데 필요했다. 그리고 자료에서도 이 내용은 PCA만을 위한 것이 아니라, 행렬 단위로 데이터를 다루는 머신러닝에서는 이런 표현과 미분이 계속 필요하다고 설명했다.  

7. 인공신경망도 결국 함수의 합성으로 볼 수 있었다

뒷부분은 딥러닝과 연결됐다. 인공신경망을 그림으로만 보면 input layer, hidden layer, output layer가 있는 구조다. 그런데 수학적으로 보면 이건 함수의 합성으로 볼 수 있었다.

입력 벡터가 hidden layer를 거치면서 중간 결과 벡터 Z가 되고, 이 Z가 다시 output layer를 거쳐 최종 출력 Y가 된다. 자료에서는 입력층은 사용하는 데이터에 따라 정해지고, 출력층은 회귀/분류/생성 같은 목적에 따라 달라지며, 중간 hidden layer 설계가 성능에 영향을 준다고 설명했다. Dense Layer, CNN, RNN, LSTM, Transformer 같은 구조도 결국 이 중간 구조를 어떻게 설계하느냐의 문제로 이어졌다.  

X → G(X) = Z → F(Z) = Y

여기서 G는 벡터가 들어가서 벡터가 나오는 벡터 함수이고, F는 벡터가 들어가서 스칼라가 나오는 다변수 함수로 볼 수 있다. 예를 들어 주택 가격을 예측한다면, 입력은 면적, 방 개수, 학교와의 거리, 지하철역과의 거리 같은 여러 feature가 되고, 최종 출력은 주택 가격 하나가 될 수 있다. 자료에서도 이런 구조를 벡터 함수와 다변수 함수의 합성으로 설명했다.  

이렇게 보니까 인공신경망이 갑자기 새로운 구조라기보다, 여러 함수가 층층이 합성된 형태로 보였다.

8. Gradient, Jacobian, Backpropagation

인공신경망을 함수의 합성으로 보면, 미분도 합성 함수의 미분으로 봐야 한다. 여기서 gradient와 Jacobian이 다시 등장했다.

출력이 하나인 함수 F는 여러 입력에 대한 미분값을 모으면 gradient vector가 된다. 반면 G처럼 벡터가 들어가고 벡터가 나오는 함수는 각 출력과 각 입력 사이의 미분값을 모두 모아야 하므로 Jacobian matrix가 된다. 자료에서도 출력 하나에 대해 입력 여러 개를 미분하면 gradient가 나오고, 출력도 여러 개면 각 출력별 gradient가 쌓여 Jacobian 행렬이 된다고 설명했다.  

F: Rᵐ → R
→ gradient

G: Rⁿ → Rᵐ
→ Jacobian

자료에서는 간단한 네트워크 예시로 입력 2개, hidden output 3개, 최종 output 1개를 놓고 계산했다. 이때 최종 출력 Y를 입력 X1, X2에 대해 미분하려면 중간 결과 Z1, Z2, Z3을 거쳐야 한다. 즉 직접 한 번에 보는 것이 아니라, 각 경로별 미분을 곱해서 더하는 형태가 된다.

X → Z → Y

이걸 하나씩 쓰면 복잡하지만, gradient와 Jacobian을 행렬로 모아두면 행렬 곱으로 한 번에 표현할 수 있다. 자료에서도 gradient와 Jacobian을 곱하면 input에서 output까지의 미분값을 행렬 연산으로 계산할 수 있고, 이것이 backpropagation에서 미분값을 흘려보내는 방식과 연결된다고 설명했다.  

이 부분이 꽤 중요했다. forward는 행렬 곱으로 계산하고, backward도 미분값을 행렬 연산으로 흘려보낼 수 있다. 그래서 딥러닝에서 행렬 연산이 단순히 값을 계산하는 데만 중요한 것이 아니라, 역전파 과정에서도 중요하다는 점이 보였다.  

마무리

20일차는 19일차에 배운 선형대수와 벡터 미분이 실제 머신러닝 개념으로 연결되는 날이었다. 공분산 행렬은 단순한 공식이 아니라 변수들의 흩어짐과 방향성을 모아둔 행렬이었고, PCA는 이 공분산 행렬에서 분산이 가장 큰 방향을 찾는 문제였다.

처음에는 WᵀSW, 라그랑주 승수법, 고유값 문제, 행렬 미분이 각각 따로 나오는 것처럼 보였는데, 다시 보면 하나의 흐름이었다. 데이터를 평균 중심으로 옮기고, 공분산 행렬을 만들고, 새로운 basis에서 분산이 최대가 되는 방향을 찾고, 그 문제가 공분산 행렬의 고유벡터를 찾는 문제로 바뀌었다.

뒷부분에서는 인공신경망도 벡터 함수와 다변수 함수의 합성으로 볼 수 있었다. forward 계산뿐 아니라 backward 계산도 gradient와 Jacobian을 이용한 행렬 곱으로 표현할 수 있다는 점이 남았다. 선형대수와 미분이 따로 있는 것이 아니라, PCA와 딥러닝을 이해하기 위한 기본 언어처럼 쓰인다는 느낌이었다.


공분산 행렬에서 분산이 큰 방향을 찾는 PCA와, 미분값을 행렬로 흘려보내는 backpropagation이 선형대수와 벡터 미분 위에서 이어지는 흐름이었다.