선형대수 6강. 행렬 미분과 역전파
신경망 학습의 정체는 연쇄법칙을 거꾸로 한 번 훑는 것입니다. 그 이상도 이하도 아닙니다.
풀고 시작
매개변수가 백만 개일 때의 계산 전략
미분을 배울 때는 변수가 하나였습니다. f(x)를 x로 미분하면 끝이었죠. 그런데 신경망은 조절할 값이 수백만 개입니다. 손실을 줄이려면 각 값이 손실에 얼마나 기여하는지, 즉 편미분을 전부 알아야 합니다.
가장 단순한 방법은 하나씩 건드려 보는 것입니다. 첫 번째 가중치를 아주 조금 키우고 손실이 얼마나 변하는지 재고, 두 번째도 그렇게 하고... 매개변수가 100만 개면 신경망을 100만 번 돌려야 합니다. 한 번 돌리는 데 1밀리초라도 한 걸음에 16분이 걸립니다. 학습이 불가능하죠.
역전파(backpropagation) 는 이것을 단 한 번의 역방향 순회로 끝냅니다. 마법이 아니라 미적분의 연쇄법칙(chain rule) 을 영리하게 적용한 것입니다.
핵심은 방향입니다. 함수가 겹겹이 쌓여 있을 때 연쇄법칙은 앞에서 뒤로 곱해 가도 되고 뒤에서 앞으로 곱해 가도 됩니다. 그런데 입력이 많고 출력이 하나인 상황에서는 뒤에서부터가 압도적으로 쌉니다. 손실은 언제나 숫자 하나이므로, 신경망은 정확히 이 상황입니다.
스칼라 미분과 행렬 미분의 차이
층 하나를 수식으로 쓰면 y = Wx + b입니다. W는 행렬, x와 b는 벡터죠. 여기서 손실 L을 W로 미분하면 무엇이 나올까요.
W와 같은 모양의 행렬이 나옵니다. 이것이 행렬 미분의 첫 번째 감각입니다. 어떤 것으로 미분하든 결과는 그것과 같은 모양입니다. W가 3 × 4 행렬이면 ∂L/∂W도 3 × 4입니다. 그래야 경사하강법에서 W ← W - η(∂L/∂W)처럼 빼 줄 수 있으니까요.
역전파에서 한 층이 하는 일은 세 가지입니다. 위에서 내려온 기울기를 받고, 자기 매개변수의 기울기를 계산해 챙기고, 아래층으로 넘길 기울기를 만들어 내려보냅니다. 각 층이 이 세 가지만 알면 전체가 굴러갑니다. 층을 새로 만들 때 그 층의 미분만 정의해 주면 나머지는 자동으로 이어지는 이유죠.
수치로 확인하는 습관도 알아 두시면 좋습니다. 기울기 검사(gradient checking) 는 매개변수를 아주 조금 흔들어 손실 변화를 재고, 그것이 역전파가 계산한 기울기와 맞는지 보는 방법입니다. 느려서 학습에는 못 쓰지만 새 층을 구현했을 때 검산용으로 씁니다.
기울기가 사라지고 폭발하는 이유
역전파가 곱셈의 연쇄라는 사실에서 유명한 문제 둘이 곧바로 따라 나옵니다.
층을 거칠 때마다 기울기에 무언가를 곱합니다. 곱하는 값이 계속 1보다 작으면 층을 지날수록 기울기가 기하급수적으로 작아집니다. 0.5를 20번 곱하면 백만분의 일이 되죠. 앞쪽 층에는 학습 신호가 사실상 도달하지 않습니다. 이것이 기울기 소실(vanishing gradient) 입니다. 시그모이드 함수의 미분값이 최대 0.25라서 깊은 신경망이 오래도록 학습되지 않았던 이유가 여기 있었습니다.
반대로 1보다 큰 값이 계속 곱해지면 기울기 폭발이 일어나 값이 발산합니다.
이 문제를 다루는 장치들이 오늘날 신경망 구조의 상당 부분을 설명합니다. ReLU는 양수 구간의 미분이 1이라 곱해도 줄지 않습니다. 잔차 연결(residual connection) 은 기울기가 층을 건너뛰어 곧장 흐를 지름길을 냅니다. 기울기 자르기(gradient clipping) 는 폭발을 물리적으로 막습니다. 하나같이 "곱셈의 연쇄"라는 성질에 대한 대응입니다.
미분이 어떻게 작동하는지 아는 것과 모르는 것의 차이가 여기서 갈립니다. 모르면 이 장치들이 그냥 외워야 할 관행이지만, 알면 왜 그렇게 생겼는지가 보입니다.