borch

배우기 · 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 쪽의 rollmaskedSelect 가 둘 다 끊겨 있었고 골든은 전부 초록이었다. 지금은 적합성 케이스 53 건이 값이 아니라 "기울기가 도착했는가"만 묻는다. 다른 질문이다.