학습을 오래 돌리면 기울기가 거의 0인 지점에 도달합니다. 그런데 그 자리가 무엇인지는 기울기만 봐서는 알 수 없습니다. 진짜 골짜기 바닥일 수도 있고, 어떤 방향으로는 내려가는데 다른 방향으로는 올라가는 안장일 수도 있습니다. 후자라면 옵티마이저는 아직 갈 길이 남았는데도 멈춘 것처럼 보입니다.
이 둘을 가르려면 기울기가 아니라 그 지점에서 곡면이 어떻게 휘어 있는지를 봐야 합니다. 그 정보를 담은 것이 손실의 이계 편도함수를 한 행렬에 모아 놓은 헤세 행렬입니다. 그리고 헤세 행렬에는 특별한 성질이 하나 있습니다 — 대칭입니다.
지난 글 끝에서 예고한 대로, 대칭이라는 조건 하나가 붙으면 고윳값이 갑자기 얌전해집니다. 이 글은 그 얌전함이 정확히 무엇이고, 그것으로 무엇을 판정할 수 있는지를 봅니다.
대칭 행렬
인 행렬을 대칭 행렬이라고 합니다. 대각선을 접었을 때 위아래가 포개진다는 뜻입니다. 특별해 보이지만, AI에서 실제로 고윳값을 들여다보는 행렬은 거의 전부 여기 해당합니다. 세 갈래로 나옵니다.
그람 행렬과 공분산
어떤 행렬 에 대해 를 그람 행렬이라 하는데, 이것은 무조건 대칭입니다. 전치를 취해 보면 바로 나옵니다.
성분이 의 번 열과 번 열의 내적이라 자리를 바꿔도 같은 값이라는 것이 그 내용입니다.
공분산 행렬도 같은 뿌리입니다. 데이터 개를 행으로 쌓은 를 평균 0으로 맞춰 놓으면 공분산은 라 그람 행렬의 상수배입니다. 번 특성과 번 특성의 공분산은 순서를 바꿔도 같으니 성분 수준에서도 당연합니다. 임베딩의 쏠림을 재거나 PCA로 주축을 찾을 때 고윳값을 구하는 행렬이 바로 이것입니다.
헤세 행렬
헤세 행렬의 성분은 입니다. 이계 편도함수가 연속이면 미분 순서를 바꿔도 값이 같다는 정리가 있고, 신경망의 손실은 거의 모든 점에서 그 조건을 만족하므로 헤세는 대칭입니다.
「거의 모든 점」이라는 단서는 ReLU처럼 꺾이는 점이 있는 함수 때문입니다. 꺾인 자리에서는 이계도함수가 정의되지 않지만, 무작위로 잡은 가중치가 정확히 그 자리에 떨어질 일은 사실상 없어서 실무에서는 신경 쓰지 않습니다.
세 자리 모두 우연이 아닙니다. 둘 사이의 관계를 재는 양은 순서를 바꿔도 같다는 성질이 대칭성의 정체입니다.
대칭 부분
반대로 AI에서 대칭이 아닌 행렬도 흔합니다. 층의 가중치 는 입력 차원과 출력 차원이 달라 정사각형조차 아닌 경우가 대부분이고, 층 하나의 야코비안도 대칭일 이유가 없습니다. 이런 행렬에는 이 글의 도구가 곧바로 들지 않으며, 다음 글의 특잇값 분해가 그 자리를 맡습니다.
다만 이차형식만 놓고 보면 비대칭은 문제가 되지 않습니다. 정사각 행렬 은 언제나 둘로 가를 수 있습니다.
앞쪽 는 전치해도 그대로라 대칭이고, 이것을 의 대칭 부분이라 부릅니다. 뒤쪽 는 전치하면 부호가 뒤집히는 반대칭 부분입니다. 그런데 는 스칼라라 전치해도 같은 값이면서, 동시에 이기도 합니다. 자기 자신과 부호만 다른 수는 0뿐이므로 반대칭 부분은 이차형식에서 통째로 사라지고 만 남습니다.
로 해 보면 대칭 부분은 입니다. 은 삼각행렬이라 고윳값이 대각의 로 둘 다 양수인데, 을 넣으면 로 음수가 나옵니다. 비대칭 행렬에서는 고윳값의 부호가 이차형식의 부호를 알려 주지 않는다는 뜻입니다. 이 글에서 대칭을 고집하는 이유가 여기 있습니다.
스펙트럼 정리
지난 두 글에서 대각화가 안 되는 경우를 봤습니다. 전단은 고유 방향이 하나뿐이었고 회전은 실수 고유 방향이 아예 없었습니다. 대칭 행렬에서는 그런 일이 일어나지 않습니다.
직교 대각화
스펙트럼 정리. 이면 의 고윳값은 모두 실수이고, 고유벡터를 서로 직교하는 것으로 개 고를 수 있다. 그것을 길이 1로 맞춰 열로 세운 행렬을 , 고윳값을 대각에 놓은 것을 라 하면
일반 대각화 과 비교하면 달라진 것은 두 가지입니다. 첫째, 조건이 없습니다 — 대칭이기만 하면 됩니다. 둘째, 자리가 입니다. 열이 서로 직교하고 길이가 1인 정사각 행렬을 직교행렬이라 하고, 직교행렬은 역행렬이 곧 전치입니다. 역행렬을 구하는 계산이 통째로 사라지는 셈입니다.
로 확인합니다. 지난 두 글에서 고윳값 과 고유벡터 을 구해 두었는데, 이 둘의 내적은 입니다. 정말 직교합니다. 길이를 1로 맞추면
이고 임은 열끼리의 내적을 네 번 계산해 보면 확인됩니다. 역행렬을 구하지 않고 전치만으로 을 쓸 수 있습니다. 정리의 세 주장 — 고윳값이 실수, 고유벡터가 직교, 그런 고유벡터가 개 — 중 앞의 둘을 아래에서 증명합니다.
실수 고윳값
회전 행렬에서 고윳값이 복소수로 나왔던 것을 떠올리면, 대칭 행렬에서도 일단 고윳값 와 고유벡터 가 복소수일 수 있다고 열어 두고 시작해야 합니다. 복소수 에서 허수부의 부호만 뒤집은 를 켤레복소수라 하고 윗줄을 그어 로 적습니다. 어떤 수가 자기 켤레와 같으면 허수부가 0, 곧 실수입니다. 그래서 보일 것은 하나입니다.
의 양변에 켤레를 취하면, 는 실수 행렬이라 그대로이므로 입니다. 이제 라는 수 하나를 두 방향으로 계산합니다.
두 줄의 왼쪽은 같은 수이고, 둘째 줄에서 를 로 바꾼 자리가 대칭성이 쓰인 곳입니다. 공통 인수 는 성분의 크기 제곱을 더한 것이라 0 벡터가 아닌 한 양수입니다. 그러니 양변을 나눌 수 있고 가 남습니다. 대칭이 아니면 둘째 줄이 에서 멈춰 버려 이 비교가 성립하지 않고, 회전 행렬이 바로 그 예입니다.
고유벡터의 직교
직교성도 같은 요령으로 증명됩니다. 인 두 고윳값의 고유벡터를 라 하고, 를 두 방향으로 계산합니다.
두 줄의 좌변은 같습니다 — 인데 이기 때문입니다. 대칭성이 정확히 이 한 자리에서 쓰입니다. 그러므로
라고 했으니 입니다. 내적이 0이면 직교라는 것은 직교와 사영에서 정의한 그대로입니다.
이 증명은 고윳값이 서로 다를 때만 말합니다. 같은 고윳값이 두 번 나오는 중근이면 그 고윳값에 속하는 고유벡터 전체, 곧 고유공간이 직선이 아니라 평면 이상이 되고, 그 안의 벡터는 아무거나 다 고유벡터라 저절로 직교하지 않습니다. 이 그런 예입니다. 고윳값이 이고, 고윳값 2의 고유공간은 인 평면 전체입니다. 그 평면에서 과 을 집으면 내적이 1이라 직교하지 않습니다. 이럴 때는 그람-슈미트로 둘째 벡터에서 첫째 방향의 사영을 빼 로 바꿔 잡습니다. 대칭 행렬에서는 고유공간의 차원이 언제나 중근의 개수와 같다는 것이 정리의 셋째 주장이고, 그래서 이렇게 골라 잡으면 늘 개가 채워집니다. 그 부분의 증명은 한 차원씩 떼어 내는 귀납법이라 여기서는 넘어갑니다. 대신 한 가지는 기억해 둡니다 — 중근이 있으면 는 하나로 정해지지 않습니다.
행렬의 제곱근
꼴의 쓸모는 판정에서 끝나지 않습니다. 가운데 대각행렬만 손보면 행렬에 함수를 씌울 수 있습니다. 고윳값이 전부 0 이상일 때 로 두면, 가 가운데서 지워져 입니다. 제곱해서 가 되는 이 행렬을 행렬의 제곱근이라 합니다.
이면 고윳값 의 제곱근 을 대각에 놓고 되돌려
입니다. 제곱해 보면 대각이 , 비대각이 로 가 돌아옵니다. 성분마다 제곱근을 씌운 과는 전혀 다른 행렬이라는 점이 핵심입니다.
같은 방법으로 를 끼우면 가 나옵니다. 공분산 에 이것을 쓴 를 데이터에 곱하면 공분산이 가 되어 모든 방향의 분산이 1로 고르게 펴지는데, 이 조작이 화이트닝입니다. 임베딩의 쏠림을 펴는 쓰임은 이방성과 화이트닝에서 실제 데이터로 다룹니다.
이차형식
이제 대칭 행렬로 무엇을 하는지로 갑니다. 벡터 하나를 넣으면 수 하나가 나오는 함수 가운데 곡률을 재는 데 딱 맞는 꼴이 있습니다.
전개와 교차항
벡터 를 넣으면 수 하나가 나오는 다음 함수를 의 이차형식이라고 합니다.
모양을 보면 이라 결과가 , 즉 스칼라입니다. 에서 실제로 전개해 봅니다.
모든 항이 2차입니다. 이름에 '이차'가 붙은 이유이고, 비대각 성분 가 두 번 등장해 가 되는 것은 위아래 두 자리가 같은 값이기 때문입니다. 처럼 서로 다른 좌표가 곱해진 항을 교차항이라 부르는데, 이 항이 있으면 과 를 따로 떼어 볼 수가 없습니다.
헤세 행렬과 이차형식이 만나는 자리는 테일러 전개입니다. 기울기가 0인 점 에서 작은 걸음 를 내디디면 손실은 대략 가 됩니다. 일차항이 기울기 0 때문에 사라졌으니, 올라가는지 내려가는지는 헤세의 이차형식이 전부 정합니다.
부호가 갈리는 예
이면 입니다. 몇 군데 넣어 봅니다.
전부 양수입니다. 반면 이면 이고
방향에 따라 부호가 갈립니다. 이 차이가 곧 골짜기와 안장의 차이인데, 방향을 몇 개 찍어 보는 것으로는 확인이 끝나지 않습니다. 에서 세 방향이 전부 양수였다고 네 번째 방향도 양수라는 보장은 없습니다. 무한히 많은 방향을 어떻게 한꺼번에 볼 것인가 — 여기서 스펙트럼 정리가 일합니다.
등고선과 조건수
한꺼번에 보는 가장 쉬운 방법은 그림입니다. 을 만족하는 점을 모두 이으면 그 이차형식의 등고선 하나가 그려지는데, 와 는 전혀 다른 곡선을 냅니다.
의 등고선은 타원이고, 그 축이 고유벡터 과 방향으로 섭니다. 축 길이도 고윳값에서 바로 나옵니다. 고유벡터 방향의 단위벡터에 를 곱해 넣으면 이라 이 되는 는 입니다. 고윳값 3인 쪽 반지름이 , 고윳값 1인 쪽이 입니다. 고윳값이 클수록 조금만 가도 값이 1에 닿으므로 그 방향이 짧아집니다.
는 고윳값 이라 방향으로는 아무리 가도 값이 음수여서 1에 닿지 않습니다. 등고선이 닫히지 못하고 두 갈래로 벌어진 쌍곡선이 됩니다. 닫힌 타원이면 한가운데가 바닥이고, 벌어진 쌍곡선이면 안장입니다.
타원의 두 축 비는 입니다. 고윳값의 비 의 제곱근입니다. 이 비가 100이면 등고선은 가로세로가 10배 차이 나는 가느다란 골짜기가 되고, 경사하강법은 좁은 쪽 벽을 오가며 지그재그로 느리게 내려갑니다. 대칭 양정치 행렬에서 이 고윳값의 비를 조건수라 부르며, 행렬 노름을 다루는 뒤의 글에서 일반 행렬로 넓힙니다.
고유기저 대각화
등고선이 고유벡터 방향으로 섰다는 것은 우연이 아닙니다. 좌표축을 고유벡터에 맞춰 돌리면 식에서도 그 사실이 그대로 보입니다.
교차항의 소거
을 이차형식에 넣습니다.
로 두면 — 이것이 를 고유축 좌표로 다시 읽은 것입니다 — 남는 것은 대각행렬을 낀 이차형식뿐입니다.
교차항이 전부 사라졌습니다. 제곱항만 남았고 제곱은 언제나 0 이상이므로, 각 항의 부호는 오직 가 정합니다.
길이 보존
라는 좌표 바꾸기가 길이를 바꾸지 않는다는 점도 짚어 둡니다. 가 직교행렬이므로 입니다. 축을 돌려 봤을 뿐 아무것도 늘이거나 줄이지 않았으므로 새 좌표에서 읽은 부호가 원래 좌표에서도 그대로 참입니다.
로 확인합니다. , 이므로 , 즉 입니다. 고유기저에서 이고, 첫 축 방향으로는 값이 커지고 둘째 축 방향으로는 작아집니다. 앞에서 과 이 나온 것이 바로 그 두 축입니다 — 의 고유벡터가 과 이기 때문입니다.
레일리 몫
길이 보존에서 한 걸음 더 갑니다. 이차형식을 길이의 제곱으로 나눈 값
을 레일리 몫이라 합니다. 크기를 나눠 버렸으니 방향만의 함수입니다. 고유기저로 옮기면 분자는 , 분모는 이라, 가중치 가 전부 0 이상이고 합이 1입니다. 레일리 몫은 고윳값들의 가중평균이고, 그래서 늘 가장 작은 고윳값과 가장 큰 고윳값 사이에 있습니다.
양 끝은 가중치가 한 고윳값에 몰릴 때, 곧 가 그 고유벡터일 때 도달합니다. 에서 단위원 위의 점 를 넣으면 입니다. , 곧 방향에서 최댓값 3이고 , 곧 방향에서 최솟값 1입니다. 아무 방향이나 하나 잡아 를 넣어도 분자 , 분모 로 라 1과 3 사이에 들어갑니다.
이것을 제약이 있는 최적화 문제로 읽을 수도 있습니다. 길이 1인 가운데 를 가장 크게 하는 것을 찾으라는 문제에 라그랑주 승수 를 붙여 미분하면 , 곧 가 나옵니다. 정지점은 고유벡터이고 승수는 고윳값이며, 그 점에서의 값도 입니다. 이차형식의 최댓값을 구하는 일과 최대 고윳값을 구하는 일은 같은 문제이고, 지난 글의 거듭제곱법이 헤세의 가장 가파른 곡률을 재는 데 쓰이는 이유가 여기 있습니다.
부호 판정
고윳값의 부호가 이차형식의 부호를 정하므로, 갈래에 이름을 붙이면 그대로 판정법이 됩니다.
다섯 갈래
0이 아닌 모든 에서 인 행렬을 양정치라 하고, 0까지 허용해 이면 양반정치라 합니다. 양수와 음수가 둘 다 나오면 부정부호입니다. 부호를 뒤집은 음정치와 음반정치까지 합쳐 다섯 갈래이고, 고유기저의 식 에서 곧바로 고윳값 조건으로 옮겨집니다.
| 이름 | 조건 | 고윳값 | 임계점에서 뜻하는 것 |
|---|---|---|---|
| 양정치 | 모든 에 | 전부 양수 | 모든 방향으로 올라간다 — 국소 최소 |
| 양반정치 | 모든 에 | 전부 0 이상, 0이 있음 | 평평한 방향이 있다 — 판정 보류 |
| 부정부호 | 부호가 갈린다 | 양수와 음수가 섞임 | 안장 |
| 음반정치 | 모든 에 | 전부 0 이하, 0이 있음 | 판정 보류 |
| 음정치 | 모든 에 | 전부 음수 | 국소 최대 |
정치와 반정치를 가르는 것은 고윳값 0의 유무입니다. 인 방향은 그 축을 따라 움직여도 이차형식의 값이 변하지 않는 평평한 골입니다. 그 방향으로 더 가면 올라갈지 내려갈지는 삼차 이상의 항이 정하므로, 이계도함수만으로는 판정이 보류됩니다.
교과서에서는 판정 보류가 드문 예외처럼 보이지만 딥러닝에서는 기본값입니다. ReLU 신경망에서 한 층의 가중치와 편향에 2를 곱하고 다음 층의 가중치에 1/2을 곱하면 출력이 그대로라, 손실이 조금도 변하지 않는 방향이 파라미터 공간에 줄지어 있습니다. 최소점에서 그 방향을 따라 잰 곡률은 0이고, 헤세는 그만큼 고윳값 0을 품습니다. 실제로 학습된 큰 모델의 헤세 고윳값을 재 보면 대부분이 0 근처에 몰려 있고, 크게 튀어나온 것은 몇 개뿐이라는 관찰이 여러 번 보고되었습니다. 이 평평한 방향들의 이야기는 손실 지형과 볼록성에서 이어집니다.
2×2 판정
에서는 고윳값을 풀 것도 없습니다. 지난 두 글의 «합은 대각합, 곱은 행렬식»을 그대로 씁니다.
- — 곱이 음수라 부호가 갈립니다. 안장입니다.
- — 곱이 양수라 같은 부호이고, 그 부호는 합이 알려 줍니다. 이면 양정치, 이면 음정치입니다.
- — 고윳값 하나가 0입니다. 반정치이고 판정 보류입니다.
세 예를 표로 굴려 봅니다.
| 행렬 | 읽는 순서 | 판정 | ||
|---|---|---|---|---|
| 열 | 4 | 3 | 곱 양수 → 합 양수 | 양정치 — 최소 |
| 열 | 2 | 곱 음수 | 부정부호 — 안장 | |
| 열 | 2 | 0 | 곱 0 | 양반정치 — 보류 |
세 번째는 라 직접 봐도 0 이상이고, 방향에서 정확히 0입니다. 고윳값을 구하면 와 으로 표의 판정과 맞습니다.
실베스터 판정법
이상에서는 대각합·행렬식 두 수로는 부족합니다. 대각행렬 과 는 둘 다 대각합이 3, 행렬식이 1인데 앞은 양정치이고 뒤는 음수 고윳값이 둘인 부정부호입니다. 곱이 양수라는 것은 음수 고윳값이 짝수 개라는 말일 뿐, 0개인지 2개인지는 알려 주지 않습니다.
고윳값을 구하지 않고 양정치를 가리는 고전적인 방법이 실베스터 판정법입니다. 행렬의 왼쪽 위 모서리에서 , , …, 을 차례로 잘라 낸 정사각 부분의 행렬식을 선행 주소행렬식이라 하는데, 이것이 전부 양수이면 양정치이고 그 역도 성립합니다. 이웃한 성분끼리만 엮인 삼중대각 꼴로 해 봅니다.
첫째가 , 둘째가 , 셋째가 로 전부 양수라 양정치입니다. 고윳값을 실제로 구하면 , , 로 맞습니다.
주의할 자리가 하나 있습니다. 이 판정은 양정치 전용이고, 부등호를 으로 느슨하게 해서 양반정치를 판정하면 틀립니다. 은 선행 주소행렬식이 이라 전부 0 이상인데 고윳값 을 가진 음반정치입니다.
촐레스키 분해
실무에서는 행렬식을 번 따로 구하지 않고 촐레스키 분해가 끝까지 도는지를 봅니다. 촐레스키 분해는 대칭 행렬을 대각이 양수인 하삼각행렬 로 꼴로 쪼개는 것인데, 이런 은 가 양정치일 때만 존재합니다. 에서 을 쪼개는 절차는 세 걸음입니다.
는 , , 로 끝까지 갑니다. 는 , 까지 가고 마지막에 에서 멈춥니다. 근호 안의 는 , 곧 둘째 선행 주소행렬식을 첫째로 나눈 값이라, 촐레스키가 멈추는 자리가 실베스터 판정이 음수를 내는 자리와 같습니다.
비용 차이가 이 방법을 고르는 이유입니다. 부동소수점 연산 횟수로 세면 촐레스키는 대략 번이고, 대칭 행렬의 고윳값은 삼중대각 꼴로 줄이는 첫 단계만 대략 번이라 네 배가 넘습니다. 가우스 과정이나 2차 최적화 코드가 행렬이 양정치인지 확인할 때 촐레스키를 먼저 걸어 보고, 실패하면 대각에 작은 수를 더해 다시 거는 것도 그래서입니다.
코드로 확인하기
넘파이에는 대칭 행렬 전용 함수 eigh가 따로 있습니다. 대칭임을 전제하고 계산해서 빠르고, 실수 고윳값을 오름차순으로 돌려주며, 반올림 탓에 허수부가 붙는 일이 없습니다.
eig와 eigh
import numpy as np
A = np.array([[2., 1], [1, 2]])
w, Q = np.linalg.eigh(A)
print(w) # [1. 3.] 오름차순 실수
print(np.allclose(Q.T @ Q, np.eye(2))) # True — Q는 직교행렬
print(np.allclose(Q @ np.diag(w) @ Q.T, A)) # True — A = QΛQᵀ
일반용 eig를 대칭 행렬에 걸면 무엇이 다른지도 봅니다. 랭크가 3인 그람 행렬 은 이론상 고윳값 셋이 정확히 0입니다.
H = np.random.default_rng(0).standard_normal((6, 3))
G = H @ H.T # 대칭, 랭크 3
print(np.linalg.eig(G)[0][-2:]) # [-1.8e-17+2.6e-17j -1.8e-17-2.6e-17j]
print(np.linalg.eigvalsh(G)[:3]) # [-3.5e-16 9.9e-17 5.5e-16]
eig는 대칭이라는 사실을 모르므로, 0이어야 할 고윳값 둘을 반올림 오차 크기의 켤레복소수 쌍으로 돌려주고 순서도 섞어 놓습니다. 스펙트럼 정리가 보장하는 실수성을 계산이 지키게 하려면 대칭 전용 함수를 써야 합니다. eigvalsh도 0 자리에 수준의 부호가 제각각인 값을 내는 것은 같으므로, 다음 절의 문턱이 필요합니다.
부호 판정 함수
이차형식과 부호 판정도 그대로 옮겨집니다.
def classify(M):
w = np.linalg.eigvalsh(M) # 대칭 전용, 실수만 나온다
if (w > 1e-12).all(): return "양정치 — 최소"
if (w < -1e-12).all(): return "음정치 — 최대"
if (w > 1e-12).any() and (w < -1e-12).any(): return "부정부호 — 안장"
return "반정치 — 판정 보류"
for M in [np.array([[2., 1], [1, 2]]),
np.array([[1., 2], [2, 1]]),
np.array([[1., 1], [1, 1]])]:
print(np.linalg.eigvalsh(M).round(6), classify(M))
# [1. 3.] 양정치 — 최소
# [-1. 3.] 부정부호 — 안장
# [0. 2.] 반정치 — 판정 보류
문턱을 0이 아니라 1e-12로 둔 것이 실무의 요령입니다. 이론상 정확히 0인 고윳값도 부동소수점 계산에서는 위의 같은 값으로 나오므로, 그대로 비교하면 양반정치가 부정부호로 잘못 읽힙니다.
다만 문턱을 두면 촐레스키와 판정이 어긋나는 구간이 생깁니다. 는 작은 고윳값이 약 로 엄연히 양수라 촐레스키는 로 성공하지만, classify는 문턱 아래라서 판정 보류라고 답합니다. 어느 쪽이 맞는지는 수학이 아니라 쓰임이 정합니다. 그 행렬로 연립방정식을 풀 생각이라면 로 나누는 순간 오차가 폭발하므로, 보류라고 답하는 쪽이 오히려 안전합니다.
교차항 검산
교차항이 사라지는 것도 눈으로 확인할 수 있습니다.
C = np.array([[1., 2], [2, 1]])
w, Q = np.linalg.eigh(C)
x = np.array([2., 5])
y = Q.T @ x
print(x @ C @ x) # 69.0
print(w[0]*y[0]**2 + w[1]*y[1]**2) # 69.0 — 제곱항만으로 같은 값
print(np.linalg.norm(x), np.linalg.norm(y)) # 5.385... 5.385... 길이는 그대로
손으로도 맞춰 볼 수 있습니다. 원래 좌표에서는 입니다. 고유축 좌표는 , 라 로 같습니다. eigh는 고윳값을 오름차순으로 주므로 코드의 w[0]은 , w[1]은 이고, 제곱항의 순서가 손계산과 뒤바뀌어 있을 뿐 합은 같습니다.
정리
- AI에서 고윳값을 보는 행렬은 거의 대칭입니다. 그람 , 공분산, 헤세 — 전부 «둘 사이의 관계»를 재는 양이라 순서를 바꿔도 같습니다.
- 비대칭 행렬도 이차형식에는 대칭 부분 만 남깁니다. 이때 부호를 정하는 것은 이 아니라 대칭 부분의 고윳값입니다.
- 스펙트럼 정리: 대칭이면 고윳값이 전부 실수이고 고유벡터를 직교하게 잡을 수 있어 언제나 입니다. 조건이 없고, 자리가 전치라 역행렬 계산이 사라집니다.
- 실수성과 직교성은 같은 요령으로 증명됩니다. 수 하나를 두 방향으로 계산하고 를 쓰면 와 이 나옵니다. 중근이면 고유공간 안에서 직교하는 벡터를 골라 잡습니다.
- 대각만 손본 이 행렬의 제곱근이고, 공분산에 제곱을 쓰면 화이트닝입니다.
- 이차형식 를 고유기저에서 쓰면 이라 교차항이 사라지고, 부호는 고윳값만으로 정해집니다. 등고선은 양정치면 축 길이 인 타원, 부정부호면 쌍곡선입니다.
- 레일리 몫은 고윳값의 가중평균이라 과 사이에 있고, 이차형식의 최댓값 문제는 최대 고윳값 문제와 같습니다.
- 양정치·반정치·부정부호는 고윳값 부호의 이름이고, 각각 국소 최소·판정 보류·안장에 대응합니다. 는 행렬식과 대각합으로 끝나고, 그보다 크면 실베스터 판정법이나 더 싼 촐레스키 분해를 씁니다.
- 코드에서는
eigh와 작은 문턱을 씁니다. 정확히 0이어야 할 고윳값이 수준으로 나오기 때문입니다.
기울기가 0인 지점에서 헤세의 고윳값 부호를 읽으면 골짜기인지 안장인지 갈린다 — 첫머리의 질문에 대한 답입니다. 실제 신경망의 헤세는 파라미터 수만큼의 크기라 통째로 구하지 않고, 레일리 몫과 거듭제곱법으로 곡률이 필요한 방향만 재지만 재고 나서 읽는 방법은 여기서 세운 그대로입니다. 다음 글은 대칭이라는 조건마저 떼어 냅니다. 정사각형도 아니고 대칭도 아닌 아무 행렬에 대해서도 고윳값과 비슷한 것을 얻는 방법 — 특잇값 분해입니다.
읽어주셔서 감사합니다. 😊

