자동 미분(Automatic differentiation)
프로그램을 덧셈, 곱셈, sin 같은 기본 연산으로 쪼개고 각 연산의 미분(differentiation)을 연쇄법칙(chain rule)으로 이어 붙여, 도함수(derivative function)의 값을 반올림 오차(round-off error) 수준까지 정확하게 계산하는 방법. 입력 쪽에서 나르는 전진 모드(forward mode)와 출력 쪽에서 거꾸로 나르는 후진 모드(reverse mode)가 있고, 후진 모드는 출력이 하나면 모든 기울기(slope)를 한 번에 준다.
신경망(neural network)을 학습시키려면 수십억에서 수조 개에 이르는 가중치(weight) 하나하나에 대해 '이 수를 조금 바꾸면 손실이 얼마나 변하나'를 알아야 합니다. 방정식을 뉴턴 방법(Newton's method)으로 풀 때도 같은 종류의 값이 필요합니다. 이런 변화율을 주는 함수(function)가 도함수입니다. 컴퓨터는 도함수의 값을 어떻게 계산할까요?
방법은 크게 셋입니다. 식을 기호로 미분하는 기호 미분(symbolic differentiation), 입력을 조금 움직여 보고 차이를 재는 수치 미분(numerical differentiation), 그리고 자동 미분입니다. 예로
전진 모드. 값과 함께 '고른 입력을 조금 움직이면 이 값이 얼마나 움직이나'를 나릅니다. 이것을 점을 찍어
후진 모드. 먼저 앞으로 계산하며 중간값을 모두 기록해 두고, 끝에서 거꾸로
무엇이 얼마나 드나. 입력이 n개, 출력이 m개인 계산을 생각합니다. 위의 예는 n = 2, m = 1입니다. 출력 하나하나를 입력 하나하나로 편미분한 값을 m줄 n칸의 표로 늘어놓은 것을 야코비 행렬(Jacobian matrix) J라 합니다. 위의 예라면 J는 한 줄짜리 (5.5, 1.716)입니다. 전진 모드 한 번은 '입력을 정해 둔 한 방향(씨앗)으로 움직일 때 모든 출력이 얼마나 변하나'를 줍니다. 식으로는 J에 세로 벡터(vector) 하나를 곱한
신경망 학습은 수십억에서 수조 개의 가중치를 입력으로 손실 하나(m = 1)를 내는 계산이라, 후진 모드 한 번이면 모든 기울기가 나옵니다. 전진 모드로는 가중치 수만큼 돌려야 합니다. 사칙연산으로 이루어진 계산이라면 기울기 전체를 원래 계산의 상수 배(입력의 개수와 상관없는) 연산으로 얻을 수 있다는 것을 1983년 발터 바우어와 폴커 슈트라센이 증명했습니다. 반대로 입력 하나에 출력이 많은 계산, 이를테면 매개변수(parameter) 하나를 바꿀 때 시뮬레이션 궤적 전체가 어떻게 변하는지를 알고 싶을 때는 전진 모드가 맞습니다.
후진 모드의 대가는 메모리입니다. 거꾸로 갈 때 쓰려고 앞으로 계산의 중간값을 기억해 두어야 해서, 큰 신경망에서는 이것이 메모리의 큰 몫을 차지합니다. 일부만 기억하고 나머지는 필요할 때 다시 계산하는 체크포인팅(checkpointing)으로 시간과 메모리를 맞바꿉니다.
후진 모드가 싼 까닭도 기억에 있습니다. 각 칸의
수치 미분은 왜 안 쓸까. 입력이 n개면 기울기 하나에 f를 n + 1번 계산해야 한다는 비용 말고도 정밀도(precision)의 문제가 있습니다. 앞으로 h만큼 움직여 보는 앞차분(forward difference)
지금 앞차분의 오차는
오해하기 쉬운 점. 자동 미분은 실행된 프로그램을 미분합니다.
역사. 자동 미분은 신경망 학습보다 먼저, 수치 계산의 도구로 나왔습니다. 1964년 로버트 웽거트는 「간단한 자동 도함수 계산 프로그램」이라는 짧은 논문에서, 식을 중간값의 목록으로 쪼개 값과 도함수를 함께 나르는 전진 모드를 보였습니다. 후진 모드는 1970년 헬싱키 대학의 세포 린나인마가 핀란드어로 쓴 석사 논문에 나옵니다. 그는 계산 도중 연산마다 생기는 작은 반올림 오차가 최종 결과에 얼마나 쌓이는지를 알고 싶었고, 그러려면 출력을 각 중간값으로 미분한 값이 모두 필요했습니다. 그것을 한 번에 얻으려고 끝에서부터 거꾸로 미분을 모은 것이 후진 모드입니다. 같은 방법은 1980년대에 신경망 학습에 쓰이며 역전파라는 이름으로 널리 퍼졌고, 특히 1986년 러멜하트, 힌턴, 윌리엄스의 논문이 계기가 되었습니다.
이어지는 곳.
- 오늘날의 딥러닝(deep learning) 도구: 사용자가 앞으로 계산만 적으면 계산 그래프를 기록했다가 거꾸로 따라가며 기울기를 냅니다. 그 기울기로 확률적 경사 하강법(stochastic gradient descent)이나, 기울기의 최근 평균(mean)으로 걸음 크기를 조절하는 그 변형 Adam이 가중치를 고칩니다. 트랜스포머(transformer)로 만든 언어 모델(language model)의 학습도 이 계산의 되풀이입니다.
- 뉴턴 방법: 방정식 여러 개를 함께 풀 때 필요한 야코비 행렬도 자동 미분으로 얻습니다.
- 행렬의 곱(matrix multiplication): 곱하는 순서가 비용을 가른다는 점은 행렬(matrix) 곱의 결합법칙(associativity)과 같은 이야기입니다.
와 는 값이 같지만 드는 계산은 다릅니다. 맨 왼쪽의 가로 벡터부터 곱해 나가면 모든 곱이 '벡터 × 행렬'(n×n이면 곱셈 약 번)로 끝나고, 행렬끼리의 곱(약 번)을 피할 수 있습니다(점근 표기법, asymptotic notation).
범주론(category theory)을 아는 독자에게
연쇄 법칙이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 미분계수
… 구하는 방법이 역전파입니다. 역전파는 프로그램을 기본 연산으로 쪼개 도함수의 값을 정확히 구하는자동 미분가운데, 출력 쪽에서 거꾸로 나르는 후진 모드를 신경망에 쓴 것입니다. 미분 가능한 함수가 구간 안쪽에서 …
- 연쇄법칙
… 수 하나이고 입력이 많으면 출력 쪽부터 곱해야 계산이 훨씬 적습니다. 이 순서로 도함수를 구하는 것이자동 미분의 후진 모드입니다.
- 행렬의 곱
… 행렬을 출력 쪽부터 거꾸로 곱해 나가며, 각 가중치를 조금 바꾸면 오차가 얼마나 변하는지 계산합니다(자동 미분의 후진 모드). 합을 최솟값으로, 곱을 덧셈으로 바꾼 (min, +) 곱 (A\odot B)_{ik} = …
- 역전파
… 이 방법은 여러 번 따로 발견되었습니다. 1970년 핀란드의 세포 린나인마가 일반적인 계산의역방향 자동 미분을 석사 논문에 적었고, 1974년 폴 워보스가 박사 논문에서 신경망 학습에 쓰자고 제안했으며, 1986년 …
- 기울기 벡터와 야코비 행렬
… 나가면 모든 기울기를 싸게 얻습니다. 이것이 역전파이고, 아무 프로그램에나 쓸 수 있게 일반화한 것이자동 미분입니다. 가중치 행렬에 대한 기울기는 \partial L/\partial W = …
- 확률적 경사 하강법과 Adam
… 좋은지도 문제마다 달라서, 실무의 선택은 대부분 실험으로 정합니다. 이어지는 곳. 미니배치마다의 기울기는자동 미분의 후진 모드, 신경망에서는 역전파가 계산합니다. 미니배치 기울기는 전체 평균을 무작위 표본의 평균으로 …
- 인공지능
… 모은 것이 기울기 벡터입니다. 이것은 합성 함수를 미분하는 규칙인 연쇄법칙을 기계적으로 적용하는자동 미분으로 얻습니다. 그리고 손실이 줄어드는 쪽, 곧 기울기의 반대 방향으로 조금씩 내려가는 것이 ⟦확률적 경사 …
- 순환 신경망과 LSTM
… 고유값의 거듭제곱이 되는 까닭은 대각화에 있습니다. 시간을 거슬러 기울기를 모으는 계산은 역방향자동 미분을 펼친 망에 쓴 것입니다. 입력 x_t 로 들어가는 낱말 벡터는 단어 임베딩이고, 다음 낱말의 확률을 …
- 트랜스포머
… 맨 끝의 소프트맥스 출력으로 학습하는 목표는 언어 모델의 교차 엔트로피이고, 기울기는 역전파와자동 미분으로 구해 확률적 경사 하강법과 Adam으로 가중치를 고칩니다. 사인파 위치 인코딩은 여러 진동수의 …