자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 처음부터 모은 값을 다 섞어야 곡률 어림이 정확하다고 봄 | 1 | 곡률이 자리마다 바뀌면 가장 최근 두 자리의 (s, y) 짝이 지금의 곡률에 가깝다. 준뉴턴법은 새 짝으로 어림을 고친다 |
| 그래디언트가 0이 될 자리로 가면 늘 손실의 바닥 쪽이라고 봄 | 2 | 할선 곡률이 음수면 그 자리는 꼭대기 쪽이다. BFGS는 sᵀy > 0인 짝만 쓴다 |
| 메모리만 맞으면 L-BFGS를 미니배치 학습에 그대로 쓸 수 있다고 봄 | 3 | 스텝이 작아지면 두 그래디언트의 차이가 미니배치 노이즈에 묻힌다. 같은 미니배치로 재거나 미니배치를 키운다 |
| 가우스–뉴턴이 늘 뉴턴법만큼 빠르다고 봄 | 5 | 손실의 바닥에서도 잔차가 크면 버린 덩어리가 남아 오차가 일정한 비율로만 준다 |
| 선형 회귀의 가우스–뉴턴을 여러 스텝 걸리는 반복법으로 봄 | 6 | 잔차가 처음부터 일차식이라 한 스텝이 정규방정식의 해다 |
| 단위만 바꾸면 경사하강의 스텝도 같은 양이라고 봄 | 7 | 그래디언트와 스텝이 단위의 배율을 두 번 받는다. 곡률(피셔)로 나누면 배율이 지워진다 |
| 피셔의 역이 없으면 자연 그래디언트를 쓸 수 없다고 봄 | 8 | 데이터가 정하지 못하는 방향이 있는 것이다. 대각선에 작은 값을 더하면 그 방향은 묶이고 스텝은 한 값으로 모인다 |
| 한 스텝에 17분이면 기다리면 된다고 봄 | 9 | 학습은 수십만 스텝이고, 저장은 파라미터 수의 제곱, 역은 세제곱으로 자란다 |
| 평균끼리 곱하면 늘 작게 어림된다고 봄 | 10 | 곱의 평균 = 평균의 곱 + 공분산. 어느 쪽으로 틀리는지는 공분산의 부호가 정한다 |
| 피셔를 크게 어림하면 스텝도 크다고 봄 | 11 | 자연 그래디언트는 피셔로 나눈다. 크게 어림하면 스텝이 작아지고, 작게 어림할 때가 위험하다 |
| 피셔 행렬이 가중치 행렬과 같은 크기라고 봄 | 12 | 피셔는 가중치 짝마다 한 칸이라 파라미터 수의 제곱이다 |
| 행 배율과 열 배율이면 어느 표든 적을 수 있다고 봄 | 13 | 두 조각의 곱은 특정 행과 특정 열이 엮인 짜임을 적지 못한다 |
| Shampoo 도 곡률의 역처럼 양쪽에 −1/2제곱을 곱하면 된다고 봄 | 14 | 전조건 행렬이 그래디언트의 제곱으로 자라므로 양쪽 −1/4제곱이어야 그래디언트의 크기에 스텝이 휘둘리지 않는다 |
| Shampoo 의 무게가 메모리라고만 봄 | 15 | 메모리는 한 변의 제곱이지만 −1/4제곱을 구하는 계산은 세제곱이다. 그래서 가끔만 다시 구한다 |
요약
뉴턴법이 원하는 헤시안은 큰 모델에서 저장도 역도 불가능하다. 이 장의 방법들은 모두 「곡률 행렬의 무엇을 남기고 무엇을 버리나」에 대한 서로 다른 답이다.
준뉴턴법은 헤시안을 계산하지 않고 스텝 s 와 그래디언트의 차이 y 로 할선 조건 Bs = y 를 맞추며 곡률의 어림을 쌓는다. 1950년대 데이비던이 고장 잦은 컴퓨터 위에서 시작했고, 1970년 네 사람이 따로 낸 BFGS가 표준이 되었다. 로젠브록 함수에서 경사하강의 10,916스텝을 34스텝으로 줄인다. 행렬을 저장하지 않고 최근 몇 쌍만 기억하는 L-BFGS가 큰 문제의 꼴이지만, 미니배치 노이즈 속에서는 그래디언트의 차이가 묻혀 잘 맞지 않는다.
손실이 잔차의 제곱합이면 헤시안의 큰 덩어리 JᵀJ 를 자코비안만으로 얻는 가우스–뉴턴법을 쓸 수 있다. 휨이 늘 양수라 내리막을 놓치지 않고, 손실의 바닥에서 잔차가 작을수록 뉴턴법에 가까워진다. 손실이 확률로 정해지면 JᵀJ 대신 피셔 행렬을 쓴다. 피셔로 나눈 자연 그래디언트는 공부 시간을 시간으로 적든 분으로 적든 같은 6스텝으로 손실의 바닥에 닿지만, 피셔 역시 파라미터 수의 제곱 크기다.
K-FAC 은 층마다 피셔 블록을 활성값 쪽과 역전파 쪽 두 작은 행렬의 크로네커 곱으로 어림한다. 저장은 (mn)² 칸에서 m² + n² 칸으로, 역은 작은 행렬 둘의 역으로 준다. 그 대가는 두 신호가 따로 논다는 가정이고, 큰 활성값이 큰 역전파 신호와 함께 오면 스텝이 너무 커진다. Shampoo 는 같은 두 조각을 층의 그래디언트 행렬 하나로 쌓고 양쪽에 −1/4제곱을 곱한다. 층의 속을 몰라도 되고, 축마다 따로 나누는 방법이 고치지 못하는 비스듬한 골짜기를 고친다.
막힌 곳
Shampoo 의 무게는 결국 행렬의 −1/4제곱이었다. 메모리는 견딜 만해도, 한 변이 만 개를 넘는 행렬을 스텝마다 분해할 수는 없어 수십 스텝에 한 번 묵은 값을 쓴다. 한편 쌓기를 끄면 스텝은 그래디언트 행렬의 특잇값을 모두 1로 바꾼 행렬이 되었다. 곡률을 어림하려던 장치가, 쌓기를 끄면 곡률을 하나도 쓰지 않고 「모든 방향으로 고르게 한 스텝」을 내놓는다. 쌓기를 끈 Shampoo 가 특잇값을 모두 1로 맞추는 것은 우연일까? 스텝의 크기를 그래디언트 벡터의 길이가 아니라 다른 무엇으로 재면 이런 스텝이 저절로 「가장 가파른 스텝」이 되는 것은 아닐까? 그리고 특잇값을 1로 바꾸는 일을 분해 없이 행렬 곱만으로 할 수 있을까?