19일차의 흐름은 선형대수 개념을 딥러닝 전에 한 번 정리하는 쪽에 가까웠다. 처음에는 basis, dimension, eigenvalue, Jacobian 같은 단어들이 각각 따로 나오는 것처럼 느껴졌는데, 다시 보면 하나의 흐름으로 이어졌다. 벡터 공간 안에서 기준이 되는 재료를 찾고, 그 재료로 공간을 표현하고, 행렬을 변환으로 바라본 뒤, 그 변환을 고유값과 미분으로 해석하는 과정이었다.
1. 벡터 공간과 부분 공간
가장 먼저 정리한 건 벡터 공간이었다. 벡터 공간은 단순히 벡터들이 모여 있는 집합이 아니라, 그 안에서 덧셈과 상수배가 계속 유지되는 공간이다. 어떤 벡터 두 개를 더해도 다시 그 공간 안에 있어야 하고, 벡터에 상수를 곱해도 다시 그 공간 안에 있어야 한다.
이 조건이 중요한 이유는 그 공간 안에서 계산이 닫혀 있어야 하기 때문이다. 큰 벡터 공간 안에 있는 일부 공간도 덧셈과 상수배에 대해 닫혀 있으면 부분 공간, 즉 subspace라고 볼 수 있다. 처음에는 정의가 딱딱하게 느껴졌지만, 결국 “이 공간 안에서 계산을 계속해도 밖으로 튀어나가지 않는가?”를 보는 개념에 가까웠다.
벡터 공간에서 중요한 조건
1. 두 벡터를 더해도 다시 그 공간 안에 있어야 한다.
2. 벡터에 상수를 곱해도 다시 그 공간 안에 있어야 한다.
3. 부분 공간도 이 조건을 만족해야 한다.
2. 선형 결합, 선형 독립, 선형 종속
그다음은 선형 결합이었다. 선형 결합은 여러 벡터에 각각 상수를 곱한 뒤 더해서 새로운 벡터를 만드는 것이다.
a1v1 + a2v2 + ... + anvn
여기서 a1, a2, ..., an은 스칼라이고, v1, v2, ..., vn은 벡터다. 이 선형 결합을 기준으로 선형 독립과 선형 종속이 정의된다. 여러 벡터의 선형 결합이 0벡터가 될 때, 모든 계수가 0이어야만 가능하면 선형 독립이고, 0이 아닌 계수 조합으로도 0벡터를 만들 수 있으면 선형 종속이다.
처음에는 이 정의가 추상적이었는데, “다른 벡터로 만들 수 있는가?”라고 생각하니까 조금 편해졌다. 선형 독립인 벡터들은 다른 재료로 만들 수 없는 독립적인 재료에 가깝고, 선형 종속인 벡터는 다른 벡터들을 조합해서 만들 수 있는 벡터에 가깝다.
선형 독립
= 다른 벡터 조합으로 만들 수 없는 독립적인 재료
선형 종속
= 다른 벡터들을 적절히 섞어서 만들 수 있는 벡터
이 부분은 나중에 basis로 바로 이어졌다. 결국 어떤 공간을 표현할 때 진짜 필요한 재료만 남기려면, 서로 독립적인 벡터가 필요하다.
3. Span, Basis, Dimension
선형 결합으로 만들 수 있는 모든 벡터의 집합을 span이라고 한다. 예를 들어 (1, 0)과 (0, 1)을 이용하면 2차원 평면의 모든 벡터를 만들 수 있다. 그래서 이 두 벡터는 2차원 공간을 span한다고 볼 수 있다.
하지만 basis가 되려면 span만으로는 부족하다. 해당 공간을 만들 수 있어야 하고, 동시에 벡터들이 선형 독립이어야 한다. 즉 basis는 어떤 공간을 만들 수 있으면서도 중복된 재료가 없는 최소한의 기준 벡터 집합이다.
Basis 조건
1. 해당 벡터 공간을 span해야 한다.
2. 벡터들이 선형 독립이어야 한다.
예를 들어 (1, 0), (0, 1)은 2차원 공간의 basis가 될 수 있다. 하지만 (1, 0), (0, 1), (1, 1)은 2차원 전체를 만들 수는 있어도 basis는 아니다. (1, 1)은 앞의 두 벡터를 더해서 만들 수 있기 때문에 중복된 재료가 들어간 셈이다.
dimension은 basis에 들어 있는 벡터의 개수로 정의된다. 2차원 공간의 basis에는 독립적인 벡터 2개가 필요하고, 3차원 공간의 basis에는 3개가 필요하다. 즉 차원은 단순히 눈으로 보이는 공간의 느낌이 아니라, 그 공간을 표현하는 데 필요한 독립적인 기준 벡터의 개수였다.
4. 표준 기저와 PCA로 이어지는 느낌
표준 기저도 다시 정리했다. 2차원 공간에서는 (1, 0), (0, 1)이 표준 기저이고, 3차원 공간에서는 (1, 0, 0), (0, 1, 0), (0, 0, 1)이 표준 기저다. 이것들을 모으면 항등행렬의 열벡터와 같은 형태가 된다.
다만 basis가 꼭 표준 기저일 필요는 없다. 2차원 공간을 만들 수 있고 서로 독립이라면 (1, 0), (1, 1) 같은 조합도 basis가 될 수 있다. 그러니까 표준 기저는 여러 basis 중에서 우리가 가장 익숙하게 쓰는 기준일 뿐이다.
여기서 PCA가 연결됐다. PCA는 결국 데이터를 더 잘 설명하는 방향으로 basis를 바꾸는 느낌이었다. 데이터가 x축, y축 기준으로 퍼져 있는 것보다 어떤 대각선 방향으로 길게 퍼져 있다면, 그 방향을 새로운 기준으로 잡는 것이 더 효율적일 수 있다. 그래서 PCA는 갑자기 등장한 통계 기법이라기보다, basis를 바꿔서 데이터를 더 적은 정보로 잘 표현하려는 방법으로 이해됐다.
5. Norm, Inner Product, Projection
벡터의 크기는 norm으로 정의했다. 우리가 흔히 아는 유클리드 거리는 L2 norm이다.
L2 norm
= sqrt(x1² + x2² + ... + xn²)
하지만 norm은 하나만 있는 게 아니다. 성분의 절댓값을 더하는 L1 norm도 있고, 이런 개념은 나중에 머신러닝에서 규제와 연결된다. L1은 Lasso, L2는 Ridge와 이어진다고 생각하면 나중에 다시 꺼내보기 좋을 것 같다.
내적은 두 벡터의 성분끼리 곱해서 더하는 연산이다. 그런데 기하학적으로 보면 두 벡터의 크기와 각도로도 해석할 수 있다.
a · b = ||a|| ||b|| cosθ
이 식에서 중요한 건 cosθ다. 두 벡터가 같은 방향을 보면 값이 커지고, 수직이면 0이 되고, 반대 방향이면 음수가 된다. 그래서 내적은 두 벡터가 얼마나 비슷한 방향을 바라보는지 보는 데 사용할 수 있다. 이 개념은 추천 시스템, word2vec, transformer 같은 데서도 계속 이어지는 내용이라 중요하게 느껴졌다.
직교는 내적이 0인 경우다. 내적이 0이면 두 벡터는 수직 관계라고 볼 수 있다. Projection은 한 벡터를 다른 벡터 방향으로 정사영하는 개념이다. 결국 어떤 벡터가 특정 방향으로 얼마나 영향을 주는지를 보는 방식이었다.
6. 선형 변환과 행렬
중간부터는 선형 변환으로 넘어갔다. 변환은 결국 함수다. 입력을 받아 출력으로 바꾸는 역할을 한다. 다만 여기서는 입력과 출력이 스칼라 하나가 아니라 벡터일 수 있다.
선형 변환
= 벡터 공간에서 다른 벡터 공간으로 보내는 함수 중,
덧셈과 상수배가 보존되는 변환
예를 들어 x를 3x로 보내는 변환은 선형 변환이다. 더해서 보내나, 각각 보내고 더하나 결과가 같고, 상수배도 보존된다. 반대로 ax + b처럼 상수항이 붙으면 우리가 일반적으로는 선형 함수라고 부르더라도, 선형대수에서 말하는 선형 변환은 아니다. 상수항 때문에 덧셈 보존이 깨지기 때문이다.
여기서 가장 크게 남은 건 선형 변환은 행렬로 표현할 수 있다는 점이었다. 예를 들어 2차원 벡터를 3배로 늘리는 변환은 아래 행렬과 같다.
[3 0]
[0 3]
이 행렬을 벡터에 곱하면 모든 성분이 3배가 된다. 즉 행렬은 단순한 숫자표가 아니라, 벡터를 다른 벡터로 바꾸는 함수처럼 볼 수 있다. 이 관점은 딥러닝과도 연결된다. 신경망에서 입력 벡터가 여러 층을 통과하면서 바뀌는 과정도 결국 여러 행렬 변환을 거치는 과정으로 볼 수 있기 때문이다.
7. 고유값과 고유벡터
두 번째 텍스트에서는 고유값과 고유벡터가 중심이었다. 고유벡터는 어떤 행렬을 곱해도 방향이 유지되는 벡터다. 길이는 늘어나거나 줄어들 수 있지만, 방향 자체는 유지된다. 이때 얼마나 늘어나거나 줄어드는지를 나타내는 값이 고유값이다.
Ax = λx
이 식을 정리하면 다음과 같다.
(A - λI)x = 0
여기서 x는 0벡터가 아니어야 한다. 따라서 (A - λI)가 역행렬을 가지면 안 된다. 역행렬이 있으면 해가 0벡터밖에 나오지 않기 때문이다. 그래서 determinant가 0이 되는 조건을 찾는다.
det(A - λI) = 0
이 식을 풀면 고유값이 나오고, 그 고유값을 다시 대입해 x를 찾으면 고유벡터가 나온다. 처음에는 고유값이 왜 필요한지 잘 안 와닿았는데, “행렬 변환을 거쳐도 방향이 유지되는 특별한 벡터를 찾는다”라고 보니까 조금 이해됐다. 행렬이 공간을 어떻게 늘리고 줄이는지 볼 때, 방향이 유지되는 축을 찾는 느낌이었다.
8. Determinant와 고유값 계산
고유값을 구하려면 determinant가 필요했다. 2x2 행렬에서는 determinant가 익숙하다.
|a b|
|c d|
det = ad - bc
3x3 이상에서는 한 행이나 한 열을 기준으로 펼쳐서 계산한다. 이때 0이 많은 행이나 열을 선택하면 계산이 훨씬 쉬워진다. 자료에서도 determinant를 전개할 때 어떤 라인을 선택할지에 따라 계산량이 달라지고, 0이 많은 쪽을 선택하는 게 편하다고 설명했다.
고유값 계산 흐름은 이렇게 정리할 수 있었다.
고유값 계산 흐름
1. Ax = λx에서 시작한다.
2. (A - λI)x = 0으로 정리한다.
3. x가 0이 아닌 해를 가지려면 A - λI의 역행렬이 없어야 한다.
4. 따라서 det(A - λI) = 0을 푼다.
5. 나온 λ가 고유값이다.
6. 각 λ를 다시 대입해 x를 구하면 고유벡터다.
이 부분은 계산이 많아서 조금 빡빡했지만, 결국 행렬이 가진 특징을 찾기 위한 과정이었다.
9. 행렬 분해: LU, SVD
이후에는 행렬 분해 이야기도 나왔다. 행렬 분해는 하나의 행렬을 더 다루기 쉬운 여러 행렬의 곱으로 쪼개는 것이다. 숫자 12를 2 × 2 × 3처럼 소인수분해하는 것과 비슷하게 생각하면 된다.
LU 분해는 정사각행렬을 Lower Triangle 행렬과 Upper Triangle 행렬의 곱으로 나누는 방식이다. 계산을 더 쉽게 하기 위해 행렬을 다루기 좋은 형태로 쪼개는 것이다.
SVD는 직사각형 행렬까지 다룰 수 있다는 점에서 중요했다. 정사각행렬이 아니면 고유값을 바로 구하기 어렵기 때문에, AᵀA처럼 정사각행렬을 만들어서 특이값을 구한다. 자료에서도 직사각형 행렬을 정사각형처럼 다루기 위해 transpose를 이용하고, 여기서 나온 값을 기반으로 singular value를 구한다고 설명했다.
이 부분은 아직 손계산을 완전히 익히기보다는, 개념적으로 행렬을 더 좋은 형태로 쪼개서 계산하거나 정보를 압축하는 도구로 이해했다. 나중에 PCA, 추천 시스템, 차원 축소에서 다시 나올 것 같다.
10. 벡터 미분: Gradient, Jacobian, Hessian
마지막 쪽에서는 벡터 미분으로 넘어갔다. 여기서 중요한 건 입력과 출력의 형태에 따라 미분 결과의 모양이 달라진다는 점이었다.
고등학교 때 주로 배운 함수는 스칼라가 들어가서 스칼라가 나오는 함수였다.
f: R → R
그런데 머신러닝에서는 입력이 벡터인 경우가 많다.
f: Rⁿ → R
이런 함수는 다변수 함수다. 입력은 여러 개지만 출력은 하나다. 이때 각 입력 변수에 대해 편미분한 값들을 모으면 gradient vector가 된다.
Gradient
= 다변수 함수의 각 입력 방향별 변화율을 모아둔 벡터
예를 들어 f(x, y, z) = xyz라면 각 변수에 대해 편미분해서 gradient를 만든다.
∂f/∂x = yz
∂f/∂y = xz
∂f/∂z = xy
∇f = (yz, xz, xy)
출력도 벡터인 함수는 벡터 함수다.
f: Rⁿ → Rᵐ
이때는 입력도 여러 개, 출력도 여러 개라서 모든 입력-출력 조합의 편미분을 모아야 한다. 그래서 결과가 행렬이 된다. 이것이 Jacobian matrix다.
Hessian은 다변수 함수를 두 번 미분한 것이다. gradient가 벡터이므로, 그 벡터를 다시 미분하면 행렬이 된다. 즉 Hessian은 2차 미분 정보를 담은 행렬이다.
Gradient = 다변수 함수의 1차 미분 결과가 벡터
Jacobian = 벡터 함수를 1차 미분한 행렬
Hessian = 스칼라 출력 다변수 함수를 2차 미분한 행렬
이 부분은 아직 완전히 익숙하진 않지만, 딥러닝 최적화와 연결될 것 같다. 손실 함수가 여러 파라미터에 대해 어떻게 변하는지 보려면 gradient가 필요하고, 더 정밀하게 곡률까지 보려면 Hessian이 필요하다.
마무리
19일차는 선형대수를 딥러닝 전에 한 번 정리하는 느낌에 가까웠다. 처음에는 basis, dimension, eigenvalue, Jacobian 같은 단어들이 따로 노는 것처럼 보였는데, 다시 보면 결국 하나의 흐름이었다.
벡터 공간 안에서 독립적인 기준을 찾는 것이 basis이고, 그 기준이 몇 개인지를 보는 것이 dimension이었다. 그리고 행렬은 단순한 숫자표가 아니라 벡터를 다른 벡터로 바꾸는 변환으로 볼 수 있었다. 이 관점에서 고유값과 고유벡터는 행렬이 어떤 방향은 유지하면서 얼마나 늘리거나 줄이는지를 보는 개념이었다.
미분 파트는 아직 완전히 익숙하진 않았지만, 입력과 출력이 스칼라인지 벡터인지에 따라 결과가 달라진다는 점은 남았다. 다변수 함수는 gradient, 벡터 함수는 Jacobian, 2차 미분까지 가면 Hessian으로 확장된다. 이 부분은 나중에 딥러닝에서 손실함수, 파라미터, 역전파를 볼 때 다시 꺼내야 할 것 같다.
벡터 공간에서 기준을 잡고, 행렬을 변환으로 보고, 그 변환을 고유값과 미분으로 해석하는 흐름을 잡은 날이었다.
'[SK플래닛] ASAC 빅데이터전문가 11기 > 학습기록' 카테고리의 다른 글
| [SK플래닛] ASAC 빅데이터전문가 11기 | 21일차 (0) | 2026.05.19 |
|---|---|
| [SK플래닛] ASAC 빅데이터전문가 11기 | 20일차 (0) | 2026.05.18 |
| [SK플래닛] ASAC 빅데이터전문가 11기 | 17일차 (0) | 2026.05.14 |
| [SK플래닛] ASAC 빅데이터전문가 11기 | 16일차 (1) | 2026.05.13 |
| [SK플래닛] ASAC 빅데이터전문가 11기 | 16일차 (0) | 2026.05.08 |
