borch

기초 수학 · 6

고윳값과 SVD

지난 장에서는 행렬로 풀었고, 이 장에서는 행렬을 분해한다. 행렬이 공간에 하는 일의 거의 전부가 몇 개의 수에 담긴다 — 그 수를 찾는 것이 압축·PCA·추천 시스템·저랭크 파인튜닝(LoRA)이 작동하는 방식이다. 분해는 둘이다: 행렬이 늘이기만 하는 방향을 주는 고유분해, 그리고 그것을 임의의 행렬로 일반화하는 SVD. 아래 모든 것은 이 페이지에서, 양 언어로 돈다.

고유벡터: 행렬이 늘이기만 하는 방향

대부분의 벡터는 행렬을 곱하면 방향이 돈다. 소수의 특별한 벡터만 같은 방향으로, 길이만 달라져 나온다 — 그것이 고유벡터이고, 각각이 스케일되는 배수가 고윳값이다: A v = λ v. 행렬이 단순하게 작용하는 축이다.

대칭 행렬은 고윳값이 실수이고 고유벡터가 직교하므로 eigh 가 도구다 — 고윳값을 values 에, 고유벡터를 vectors 의 열로 돌려준다. 첫 쌍을 꺼내 A·v 가 정말 λ·v 인지 확인하라.

SVD: 임의의 행렬을 세 조각으로

고유벡터는 정사각 행렬이 필요하지만, 머신러닝의 행렬은 대개 정사각이 아니다. 특이값 분해에는 그 제약이 없다. 임의의 행렬을 A = U diag(S) Vᵀ 로 쓴다 — 기하로는 회전(Vᵀ), 특이값 S 만큼 축을 따라 스케일, 다시 회전(U). 특이값은 음이 아니고 큰 것부터 정렬돼 있다: 각 방향이 얼마나 중요한지를 매긴다.

왜 몇 개의 수로 충분한가

여기가 핵심이고, 말보다 보기가 쉽다. 아래 행렬은 사실 세 개의 독립 방향으로만 만들어졌고 그 위에 약간의 노이즈가 얹혀 있다. 돌려서 그려지는 스펙트럼을 보라: 처음 세 특이값이 나머지를 압도한다. 그 절벽이 이미지·임베딩·가중치 행렬이 압축되는 이유다 — 큰 특이값 몇 개만 남기고 긴 꼬리를 버려도 잃는 게 거의 없다. LoRA 가 저랭크 업데이트로 파인튜닝할 때 노리는 것도 바로 이것이다.

직접: SVD 로 A 를 되짚기

조각을 다시 맞추는 것이 제대로 이해했는지의 확인이다. 이 블록은 U· S·V 로 A 를 재구성하지만 V 의 전치를 빠뜨린다. 더해서 U diag(S) Vᵀ 가 A 를 되돌리고 gap 이 0 으로 떨어지게 하라.

기억할 것

위 블록이 에러를 내면, 그것도 알아둘 값이다. 이 페이지의 모든 예제는 테스트가 도는 그 라이브러리를 상대로 돈다 — 스크린샷이 아니다. 되돌리려면 Reset 을 누른다.