배우기 · 2
Autograd
텐서에 requiresGrad 를 세우고, 계산하고, backward() 를
부르고, .grad 를 읽는다. 역방향은 동기다 — 비동기인 것은 그 수를
도로 읽는 것뿐이다.
가장 작은 기울기
w 를 5 로 당긴다. 손으로 풀면
d/dw (w − 5)² = 2(w − 5) 이고 w = 3 에서 −4 다.
기울기는 쌓인다
backward() 를 두 번 부르면 .grad 를 덮어쓰는 것이 아니라
더한다 — torch 와 같고, 모든 학습 루프가 zeroGrad() 로 시작하는
이유다. 이 블록을 연달아 두 번 돌려 보라.
끄는 법
noGrad(fn) 은 테이프를 끈 채로 함수를 돌린다 — 평가할 때, 그리고
옵티마이저가 파라미터를 제자리에서 고칠 때 그 안이다. 스위치를 직접 쥐어야 하는
쪽을 위해 gradMode 도 열어 두었다. 다른 언어의 결속은 콜백을 경계
너머로 못 넘기기 때문이다.
한 스텝이 아니라 사슬
그래프는 계산하면서 만들어진다 — torch 와 같은 eager 다. 역방향 규칙이 있는 연산은
부모를 기록하고, backward() 가 그것을 거슬러 간다.
값이 맞는다고 그래프가 이어져 있는 것은 아니다. 연산이 옳은 수를
내면서 기울기를 조용히 떨어뜨릴 수 있고, 그때 값만 대조하는 검사는 전부 통과한다.
실제로 그랬다 — GPU 쪽의
roll 과 maskedSelect 가 둘 다
끊겨 있었고 골든은 전부 초록이었다. 지금은 적합성 케이스 53 건이 값이 아니라
"기울기가 도착했는가"만 묻는다. 다른 질문이다.