같은 근본 원인에서 생기는 두 가지 실패
연쇄 법칙에 따라 도함수는 계속 곱해져. 도함수가 대부분 1보다 작으면, 깊어질수록 곱한 값이 기하급수적으로 0에 가까워져. 이것이 기울기 소실이야. 반대로 대부분 1보다 크면 곱한 값이 무한대로 커져. 이것이 기울기 폭주야. 어느 쪽이든 깊은 층은 학습을 멈춰.
1990년대 후반에는 기울기 소실이 지배적인 문제였어. Sigmoid와 tanh 활성화 함수는 양쪽 끝에서 포화되고 도함수가 ≈ 0이 돼. 그래서 시그모이드를 사용한 20층 신경망에서는 초기 층이 거의 학습되지 않았어. ReLU, 신중한 초기화, 배치 정규화가 이 문제의 대부분을 해결했고, 나머지는 잔차 연결이 해결했어.
기울기 폭주는 보통 설정 하나로 해결해
기울기 폭주는 순환 신경망(LSTM, GRU)과 학습률 스케줄링이 잘못된 Transformer에서 가장 자주 나타나. 해결책은 기울기 클리핑이야. 옵티마이저가 갱신하기 전에 기울기의 전역 노름이 정해진 임계값을 넘지 않도록 제한해. torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) 한 줄이면 돼.
기울기 소실은 구조로 해결해야 해
기울기 소실에는 클리핑을 쓸 수 없어. 기울기가 이미 0이라 클리핑할 값 자체가 없거든. 해결책은 구조를 바꾸는 거야. ReLU/GELU 활성화 함수, He/Xavier 초기화, 배치/층 정규화, 잔차 연결을 사용해. 현대 Transformer는 이 4가지를 모두 기본으로 함께 사용해. 그래서 2014년에는 불가능했을 깊이에서도 학습할 수 있어.