거리·행렬·벡터 미분 — 고유값 분해로 줄어드는 계산
1. 이 글이 채우는 것
이 글은 앞 글인 머신러닝 개론과 수학 복습에서 이어집니다. 거기서 벡터와 거리, 내적, 기저, 고유값 분해를 봤습니다. 그런데 건너뛴 것이 꽤 있습니다. 거리에는 종류가 여럿이고, 직교하는 축을 실제로 만드는 절차가 있고, 행렬에는 행렬식과 랭크 같은 값들이 붙습니다. 고유값 분해를 해 두면 그 값들이 전부 쉬워집니다. 마지막에는 벡터로 미분하는 법과 볼록함수를 봅니다.
2. 거리의 여러 종류
거리는 함수입니다. 벡터 두 개를 넣으면 숫자 하나가 나오는 이변수 함수입니다. 아무 이변수 함수나 거리가 되지는 않고, 네 조건을 만족해야 합니다. 음수가 아닐 것, 0이면 같은 점일 것, 대칭일 것, 삼각부등식을 지킬 것입니다.
조건을 어기는 예를 보면 뜻이 분명해집니다. 지도 앱이 알려 주는 거리는 집에서 회사까지와 회사에서 집까지가 다르게 나옵니다. 일방통행이 있고 회전이 막힌 곳이 있기 때문입니다. 대칭이 깨졌으니 수학적으로는 거리가 아닙니다.
p 노름과 맨해튼 거리
유클리드 거리는 차를 제곱해 더하고 제곱근을 씌운 것입니다. 제곱 대신 p 제곱, 제곱근 대신 p 제곱근을 쓰면 p 노름입니다. p가 2이면 유클리드 거리이고, p 자리에 1이나 3이나 무한대를 넣을 수 있습니다.
p가 1이면 맨해튼 거리입니다. 차에 절댓값만 씌워 더합니다. 격자로 난 길에서는 대각선으로 가로지를 수 없으니, 동쪽으로 세 블록, 북쪽으로 열 블록 걸었다면 걸은 거리는 열세 블록입니다. 어떤 순서로 걸어도, 지그재그로 가도 열세 블록입니다. 경로는 여러 가지인데 거리는 하나입니다. 유클리드 거리에서는 직선 하나만 최단인 것과 다릅니다.
그래프 거리와 편집 거리
점과 선으로 된 그래프에서는 두 점 사이 최단 경로에 들어 있는 변의 개수가 거리입니다. 친구의 친구의 친구를 세 단계라고 부르는 것과 같습니다. 어떤 유명인까지 다섯 다리를 건너야 한다면 그 사람과 나의 거리가 5입니다.
글자열 사이에는 편집 거리가 있습니다. 한쪽을 다른 쪽으로 바꾸는 데 필요한 최소 연산 횟수입니다. abcde와 abde라면 c를 d로 바꾸고 남은 d를 지워 두 번, 편집 거리는 2입니다. 유전자 서열을 비교하거나 오타를 잡을 때 씁니다.
거리를 이렇게 오래 보는 이유가 있습니다. 점 하나는 그 자체로 아무 뜻이 없고, 다른 점들과의 관계가 있어야 뜻이 생깁니다. 그 관계를 주는 것이 거리입니다. 모든 점 쌍에 거리가 정해지면 데이터의 구조가 정해지고, 그래서 어떤 거리를 쓰느냐가 결과를 바꿉니다.
3. 기저와 그람-슈미트 직교화
데이터를 어느 방향으로 재느냐도 거리만큼 결과를 바꿉니다. 축을 직접 만들려면 정사영이 필요합니다. 벡터 y 위에서 x 방향 선으로 수직으로 빛을 비추면 생기는 그림자의 길이는 y와 x 방향 단위벡터의 내적이고, 여기에 그 단위벡터를 곱하면 그림자 벡터가 됩니다.
벡터 몇 개로 공간 전체를 표현할 수 있으면 그 벡터들이 공간을 채운다고 말합니다. 평면에서 단위벡터 하나로는 그 직선 위의 점만 만들 수 있습니다. 직교하는 벡터를 하나 더 두면 두 벡터에 적당한 수를 곱해 더해서 평면의 어느 점이든 만들 수 있습니다. 평면에 벡터를 세 개 두면 하나는 반드시 나머지 둘로 만들 수 있습니다. 어느 하나도 나머지의 가중합으로 만들어지지 않는 상태가 일차독립이고, 평면에서는 최대 두 개, n차원에서는 최대 n개입니다.
일차독립인 벡터들을 모으면 기저가 됩니다. 기저가 되기 위해 서로 직교해야 하는 것은 아닙니다. 비스듬해도 일차독립이면 기저입니다. 다만 직교하고 길이가 1인 기저가 계산이 훨씬 편하고, 그런 기저를 만드는 절차가 있습니다.
- 첫 번째 벡터를 길이로 나눠 길이를 1로 만듭니다. 이것이 첫 번째 축입니다. 방향은 그대로이고 크기만 맞춘 것입니다.
- 두 번째 벡터를 첫 번째 축에 정사영해 그림자를 구하고, 원래 벡터에서 그 그림자를 뺍니다. 남은 것은 첫 번째 축과 직교합니다. 길이를 1로 만들면 두 번째 축입니다.
- 세 번째 벡터에서는 첫 번째와 두 번째 축 성분을 모두 빼고 길이로 나눕니다. 네 번째는 앞의 세 축 성분을 전부 뺍니다.
이렇게 끝까지 가면 직교하고 길이가 1인 기저가 만들어집니다. 일차독립이기만 하면 언제나 됩니다.
4. 행렬과 기본 연산
행렬은 스칼라를 이차원으로 늘어놓은 것입니다. 가로가 행이고 세로가 열입니다. 차원을 올리는 말이 텐서입니다. 스칼라가 0차원, 벡터가 1차원, 행렬이 2차원 텐서이고, 3차원 이상은 따로 이름 없이 텐서라고 부릅니다.
전치는 대각선을 기준으로 원소를 뒤집어 행과 열을 바꾸는 것입니다. 여기서 실수가 자주 납니다. 딥러닝 라이브러리에는 5×10 행렬을 10×5로 모양만 바꾸는 함수가 따로 있는데, 그건 전치가 아닙니다. 원소를 읽은 순서대로 다시 채워 넣을 뿐이라 값의 배치가 다릅니다.
곱셈도 두 가지입니다. 행렬 곱은 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 같아야 하고, 결과는 앞의 행 개수와 뒤의 열 개수를 가집니다. 원소별 곱은 모양이 완전히 같아야 하고 같은 자리끼리 곱하며 결과 모양도 그대로입니다. 둘을 헷갈리면 모양은 맞는데 값이 엉뚱해집니다.
대각선이 전부 1이고 나머지가 0인 행렬이 항등행렬입니다. 어떤 행렬에 곱해도 그대로 나오는, 숫자로 치면 1입니다. 곱해서 항등행렬이 되는 행렬이 역행렬이고, 숫자의 역수와 달리 없을 수도 있습니다.
5. 행렬식, 트레이스, 랭크
행렬식은 2×2 행렬에서 ad − bc입니다. 3×3에서는 항이 여섯 개가 됩니다. 오른쪽 아래로 내려가는 대각선 셋을 더하고, 왼쪽 아래로 내려가는 대각선 셋을 뺍니다. 편한 성질이 둘 있습니다. 두 행렬을 곱한 것의 행렬식은 각 행렬식의 곱이고, 역행렬의 행렬식은 원래 행렬식의 역수입니다.
트레이스는 대각선 원소를 전부 더한 것입니다. 두 행렬을 곱한 것의 트레이스는 순서를 바꿔 곱해도 같습니다. 행렬 곱은 순서를 바꾸면 값이 달라지는데, 트레이스를 씌우면 같아집니다.
랭크는 일차독립인 열의 개수입니다. 행으로 세도 같습니다. 3×3 행렬인데 세 번째 열이 첫 번째 열의 두 배라면 세 번째 열은 새로운 정보가 아니고, 랭크는 2입니다. 랭크가 열 개수와 같으면 풀랭크입니다. 정사각 행렬에서 다음 세 가지는 같은 말입니다.
- 풀랭크다
- 역행렬이 있다
- 행렬식이 0이 아니다
논문에서 어떤 변환이 풀랭크라고 쓰여 있으면 정보를 잃지 않는 변환이라는 뜻입니다.
6. 양정부호와 유사역행렬
어떤 벡터를 가져와도 그 벡터를 행렬 양쪽에 끼워 곱한 값이 항상 양수이면 그 행렬은 양정부호입니다. 0을 허용하면 준양정부호입니다. 이차식으로 보면 쉽습니다. 변수가 하나인 이차식에서 제곱 앞 계수가 양수이면 위로 열린 그릇, 0이면 직선, 음수이면 뒤집힌 산 모양입니다. 변수가 여럿이면 그 계수 자리에 행렬이 들어갑니다. 양정부호란 어느 방향으로 잘라 봐도 그릇 모양이라는 뜻입니다.
정사각이 아닌 행렬은 역행렬이 없지만 역행렬처럼 쓸 수 있는 것을 만들 수 있습니다. y = Ax의 양변에 Aᵀ를 곱하면 가운데에 AᵀA가 생깁니다. 이건 정사각이라 역행렬이 있을 수 있고, 그 역행렬을 곱해 지우면 x만 남습니다. 이 조합 (AᵀA)⁻¹Aᵀ를 유사역행렬이라고 부릅니다.
7. 고유값 분해가 계산을 줄인다
어떤 행렬을 곱해도 방향이 바뀌지 않고 길이만 변하는 벡터가 고유벡터이고, 몇 배가 되는지가 고유값입니다. 3×3 행렬이면 세 쌍이 나옵니다. 고유벡터를 열로 세운 행렬과 고유값을 대각선에 놓은 행렬을 만들면, 원래 행렬을 세 조각의 곱으로 적을 수 있습니다.
같은 고유값을 가진 고유벡터 두 개를 아무렇게나 섞은 벡터도 고유벡터입니다. 행렬을 곱하면 각각에 같은 고유값이 곱해지고, 그 고유값을 밖으로 묶어 내면 섞은 벡터에 고유값이 곱해진 꼴이 되기 때문입니다.
| 계산 | 분해 후 |
|---|---|
| 거듭제곱 | 가운데의 고유벡터 행렬과 그 전치가 만나 항등행렬로 사라지고, 대각선 값만 제곱하면 됩니다. 고유값 3과 2 → 9와 4. k제곱도 같습니다. |
| 역행렬 | 대각선 값을 각각 뒤집으면 끝입니다. |
| 행렬식 | 고유벡터 행렬은 직교행렬이라 행렬식이 1. 남는 것은 고유값을 전부 곱한 값입니다. |
| 트레이스 | 고유값을 전부 더한 값입니다. |
8. 행렬식은 부피의 배율이다
분해된 변환을 순서대로 따라가 봅시다. 먼저 고유벡터 행렬의 전치를 곱합니다. 직교행렬이라 회전하거나 뒤집기만 하고 크기는 그대로입니다. 다음에 대각행렬을 곱해 축마다 고유값만큼 늘이거나 줄입니다. 크기가 바뀌는 곳은 여기뿐입니다. 마지막으로 다시 돌려놓습니다.
평면에서 고유값이 3과 2이면 한 축은 3배, 다른 축은 2배로 늘어납니다. 넓이가 1이던 정사각형이 6이 됩니다. 행렬식도 고유값의 곱이니 3×2 = 6입니다. 그래서 행렬식은 그 변환이 부피를 몇 배로 바꾸는지를 나타냅니다.
랭크도 고유값으로 읽을 수 있습니다. 고유값 중에 0이 있으면 그 방향은 완전히 눌려 버리고, 눌린 방향만큼 랭크가 줄어듭니다. 풀랭크는 0인 고유값이 하나도 없다는 말과 같고, 0인 고유값이 하나라도 있으면 행렬식도 0입니다. 앞에서 본 세 조건이 여기서 다시 만납니다.
대칭행렬과 양정부호
대칭행렬은 고유값이 서로 다르면 대응하는 고유벡터들이 직교합니다. 한 고유벡터를 다른 쪽 식의 양변에 곱해 보면 같은 값을 두 방식으로 적게 되는데, 한쪽에는 첫 번째 고유값이, 다른 쪽에는 두 번째 고유값이 붙습니다. 두 고유값이 다르니 남은 내적이 0이어야 합니다.
양정부호이면 모든 고유값이 양수입니다. 분해를 끼워 넣으면 고유값 하나하나에 어떤 값의 제곱이 곱해져 더해진 꼴이 됩니다. 고유값 중에 음수가 하나라도 있으면 그 자리만 살리는 벡터를 골라 합을 음수로 만들 수 있고, 양정부호라는 조건에 어긋납니다.
9. 벡터와 행렬의 미분
벡터를 스칼라로 미분할 때는 원소 하나하나를 그 스칼라로 미분합니다. 결과는 같은 모양의 벡터이고, 행렬도 마찬가지입니다.
더 자주 쓰이는 것은 반대 방향, 스칼라를 벡터로 미분하는 경우입니다. 입력이 벡터이고 출력이 숫자 하나인 함수, 손실함수가 딱 그 모양입니다. 결과는 벡터이고, i번째 원소는 함수를 벡터의 i번째 성분으로 미분한 값입니다. 이것이 그래디언트입니다.
- 숫자일 때 ax를 x로 미분하면 a입니다. 벡터에서도
xᵀa를 x로 미분하면 a입니다. - 곱 AB의 미분은 A를 미분한 것에 B를 곱한 항과, A에 B를 미분한 것을 곱한 항의 합입니다.
- 역행렬과 원래 행렬을 곱하면 항등행렬이고, 항등행렬을 미분하면 0입니다. 이 관계를 곱의 미분 규칙에 넣고 정리하면 역행렬의 미분 공식이 나옵니다.
- 두 행렬 곱의 트레이스를 앞 행렬로 미분하면 뒤 행렬의 전치가 나옵니다.
- 행렬식을 미분하면 행렬식에 역행렬의 전치를 곱한 값입니다.
외울 필요는 없고, 필요할 때 찾아 쓰면 됩니다.
전미분과 편미분
함수가 ax + by라고 합시다. 전미분은 변수들 사이의 관계를 무시하지 않습니다. x로 미분하면 a에, by를 x로 미분한 값을 더합니다. y가 x에 딸려 움직인다고 보는 것입니다. 편미분은 둘이 무관하다고 가정하고 a만 남깁니다. 신경망에서는 거의 전부 편미분입니다. 미분을 엄청나게 많이 하는데 매번 변수들 사이의 얽힘을 따라가면 감당이 안 되기 때문입니다.
기호도 구분해 두면 좋습니다. 곧은 d는 전미분, 둥근 ∂는 편미분입니다. Δ는 변수가 얼마나 변했는지를, 거꾸로 선 삼각형 ∇는 그래디언트를 나타내는 연산자입니다.
10. 볼록함수와 젠센 부등식
곡선 위에서 두 점을 아무렇게나 골라 직선으로 잇습니다. 어디를 골라도 그 직선이 항상 곡선보다 위에 있으면 볼록함수입니다. 한 번이라도 직선이 곡선 아래로 내려가면 볼록이 아닙니다. 뒤집힌 모양은 오목함수라고 부릅니다.
x²으로 확인해 봅시다. x가 1일 때 1, 3일 때 9입니다. 두 점을 이은 직선은 가운데인 x = 2에서 5를 지나는데, 곡선은 그 자리에서 4입니다. 직선이 위에 있습니다.
여기서 나오는 것이 젠센 부등식입니다. 두 점을 가중평균한 자리에서의 함수값은, 두 함수값을 같은 가중치로 평균한 것보다 항상 작거나 같습니다. 앞의 것은 곡선 위의 값이고 뒤의 것은 직선 위의 값이니 당연합니다. 방금 본 숫자, 가운데 자리의 함수값 4가 두 함수값의 평균 5보다 작은 것이 바로 이 부등식입니다.
이 부등식을 확률에서 아주 많이 씁니다. 가중평균 자리에 기댓값을 넣으면, 기댓값의 함수값이 함수값의 기댓값보다 작거나 같다는 식이 됩니다. 함수와 기댓값의 순서를 바꿀 때 부등호가 어느 쪽인지를 이 식이 정해 줍니다.
정리
거리를 정하면 데이터의 구조가 정해지고, 고유값 분해를 해 두면 거듭제곱과 역행렬과 행렬식과 트레이스가 전부 고유값 몇 개로 줄어듭니다. 행렬 분해에는 촐레스키 분해도 있는데, 더 깊이 가려면 그때 찾아보면 됩니다. 다음 글은 3주차 확률과 통계입니다.