역전파: 자코비안 곱을 거꾸로

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
1원 오른 값을 중간 칸에서 멈추고 끝까지 따라가지 않음 1 연쇄법칙의 곱은 출력까지 이어진다. 칸마다 국소 미분값을 곱해 끝까지 넘긴다
순방향 모드는 출력 수만큼 훑는다고 봄 2 순방향 모드는 1을 넣은 입력마다 한 번이다. 출력이 몇 개든 한 번에 나온다
순방향 모드가 정확하니 유한 차분보다 훨씬 싸다고 봄 3 둘 다 입력마다 한 번이라 파라미터 수에 비례한다. 순방향 모드는 정확할 뿐이다
두 곳에 쓰이는 칸의 그래디언트를 한 곳에서만 가져옴 4 한 칸이 여러 곳에 쓰이면 그 칸의 그래디언트는 쓰인 곳마다 온 그래디언트의 합이다
언제나 출력 쪽부터 곱하는 것이 싸다고 봄 5 두 순서의 차이는 m²(n − k)다. 출력이 입력보다 적을 때 거꾸로가 싸다. 손실은 출력이 하나다
거꾸로 가기는 파라미터의 그래디언트만 구하면 된다고 봄 6 아래층으로 넘길 입력의 그래디언트도 구해야 한다. 선형층의 학습 한 스텝은 앞으로의 3배다
자동미분이 기록의 평균 그래디언트를 준다고 봄 7 자동미분은 실행된 가지를 그 입력값에서 미분한 값을 준다. 꺾인 점에서는 코드가 고른 쪽 하나다
같은 값을 내는 코드는 미분도 같다고 봄 8 자동미분은 함수가 아니라 실행된 연산을 미분한다. 경계에서는 코드 모양에 따라 0, nan이 갈린다
backward()를 다시 부르면 그래디언트가 덮어써진다고 봄 9 그래디언트는 더해진다. 스텝마다 zero_grad()를 부르고, 일부러 쌓으면 그래디언트 누적이 된다
체크포인트 수만 세고 다시 계산한 구간의 활성값을 빼먹음 10 거꾸로 갈 때는 체크포인트에 더해 한 구간을 다시 계산한 활성값을 함께 든다
체크포인트를 드물게 둘수록 메모리가 준다고 봄 11 최대 보관 수는 ⌈n/s⌉ + s − 1이라 s ≈ √n에서 가장 작다
층마다 활성값을 하나만 남기면 된다고 봄 12 층 안의 선형층 입력마다 거꾸로 가기에 쓰인다. 메모리는 미니배치 × 길이 × 폭 × 층 수에 비례한다

요약

이 장에서 한 일을 정리해 보자. 손실의 그래디언트는 연쇄법칙으로 구하고, 연쇄법칙의 곱은 층마다의 자코비안을 곱한 것이다. 곱셈은 순서를 바꿔도 답이 같지만 비용은 같지 않다. 입력 쪽부터 곱하는 순방향 모드는 입력 하나에 1을 넣고 칸마다 국소 미분값을 곱해 앞으로 실어 나른다. 1964년 웽거트의 프로그램이 이렇게 했고, 입력이 n개면 n번 훑어야 해서 뉴런 하나의 곱셈 수가 n(n + 2)이었다. 입력이 하나이고 출력이 많을 때는 순방향 모드가 맞는 도구다.

출력 쪽부터 곱하는 역전파는 값을 앞으로 한 번 계산해 둔 뒤 출력에 1을 놓고 칸마다 「들어온 그래디언트 × 국소 미분값」을 거꾸로 나눠 준다. 공통된 뒤쪽 곱을 한 번만 계산하므로 뉴런 하나의 곱셈 수가 n + 2로 줄고, 그래디언트 전체를 얻는 비용이 손실 계산의 몇 배라는 고정된 값에 머문다. 이 생각은 켈리·브라이슨의 비행 경로 계산(1960~61), 린나인마의 반올림 오차 분석(1970), 워보스의 박사 논문(1974)에서 따로 나왔고, 러멜하트·힌턴·윌리엄스의 1986년 논문이 은닉 단위가 쓸모 있는 표현을 배운다는 것을 보이면서 신경망 학습의 표준이 되었다. 이 책의 지도에서 역전파는 1차 최적화에 그래디언트를 대 주는 장치다.

자동미분은 계산 그래프를 사람이 그리지 않게 해 준다. 코드가 실행하는 기본 연산을 하나씩 기록하고, 그 기록 위에서 연쇄법칙을 계산한다. 기호 미분처럼 식이 부풀지 않고, 유한 차분처럼 어림하지도 않는다. 대신 미분하는 대상이 실행된 연산의 기록이라서, 꺾인 점이나 0으로 나누는 점에서는 코드를 어떻게 짰느냐가 답을 정한다.

역전파는 거꾸로 갈 때 국소 미분값을 쓰므로 앞으로 계산한 활성값을 들고 있어야 해서, 학습이 추론보다 메모리를 많이 먹는다. 체크포인팅은 몇 군데만 남기고 거꾸로 갈 때 구간을 다시 계산해, 앞으로 가기를 한 번 더 하는 정도의 계산으로 메모리를 크게 줄인다.

막힌 곳

역전파는 그래디언트를 자코비안의 곱으로 계산하므로, 층이 깊으면 그 곱은 수십, 수백 개의 행렬을 곱한 것이 된다. 같은 크기의 수를 백 번 곱하면 1보다 조금만 커도 터지고 조금만 작아도 사라진다. 그렇다면 깊은 신경망의 그래디언트는 아래층으로 갈수록 터지거나 사라지지 않을까? 학습을 시작하기 전, 파라미터의 처음 값만으로 그 곱의 크기를 다스릴 수 있을까?

그리고 그래디언트를 싸게 얻었다고 해서 어디로 얼마나 가야 하는지가 정해지는 것은 아니다. 그래디언트는 지금 자리에서 손실이 가장 빨리 커지는 방향을 알려 줄 뿐인데, 그 방향의 반대쪽으로 한 스텝을 디딜 때 스텝의 크기는 무엇이 정할까?