기울기를 멀리 보내면 손실이 나빠졌다
앞 시리즈 4편은 층을 스무 개 쌓으면 기울기가 사라지는 것을 봤다. 재귀 신경망 에서는 층 대신 시간이 그 자리에 들어간다. 128자를 훑는 RNN 은 같은 가중치를 128번 통과시키는 128층 신경망이고, 4편이 깊이에 대해 잰 것을 여기서는 길이에 대해 재게 된다.
얼마나 뒤까지 닿나
마지막 자리 하나의 손실만 뒤로 흘리고, 각 자리의 입력 임베딩이 받는 기울기의
크기를 잰다. 마지막 자리를 1 로 놓으면 뒤로 갈수록 얼마나 남는지가 그대로
나온다.
7편에서 쓴 다섯 구조를 각자의 최저점까지 학습시키고 재면
뒤로 17자 뒤로 64자 뒤로 127자
트랜스포머 6.76e-02 1.32e-02 1.19e-02
RNN 2.98e-02 2.09e-04 8.24e-07
LSTM 3.65e-02 2.28e-04 4.78e-07
GRU 2.67e-02 1.41e-04 3.04e-07
CNN 0.00e+00 0.00e+00 0.00e+00
트랜스포머는 64자 지나면서 내려가기를 멈춘다. 127자 뒤에서도 1.19e-02 로,
같은 자리 GRU 의 3.04e-07 보다 39,145배 크다. 어텐션이 자리와 자리를 직접
잇기 때문이고, 그래서 거리가 늘어도 경로 길이는 안 늘어난다.
합성곱은 17자에서 정확히 0 이다
CNN 칸이 0.00e+00 이다. 작은 게 아니라 0 이다.
7편에서 커널 5짜리 4층이라 수용장이 4 x 4 + 1 = 17 자라고 적었다. 그 말은 17
자보다 먼 자리는 계산 그래프에 아예 안 들어간다는 뜻이고, 안 들어가면 기울기가
작은 게 아니라 없다. 7편의 문장이 여기서 정확히 확인된다.
게이트가 도달을 안 늘린다
교과서는 LSTM 과 GRU 가 기울기 소실을 푼다고 말한다. 위 표에서는 안 보인다. 127
자 뒤에서 게이트 없는 RNN 이 8.24e-07, LSTM 이 4.78e-07, GRU 가 3.04e-07
로 게이트가 있는 쪽이 오히려 작다.
학습된 모형이 잊기로 정했을 수 있으니 학습 전에 다시 잰다. 문맥 상한이 없는 재귀 계열은 512자까지 펴서 재도 된다.
절반 1/100 1/10000
RNN 2 8 15
LSTM 2 9 19
GRU 2 9 19
시드 세 개가 한 자도 안 틀리게 같은 값을 준다. 512자로 펴도 똑같다. 게이트가 사는 것은 1/10000 도달이 15자에서 19자로, 네 자다.
원인은 바이어스 하나
LSTM 의 셀 상태는 c_t = f_t · c_{t-1} + ... 로 이어진다. 기울기가 뒤로 갈 때
걸음마다 f_t 가 곱해지므로, 도달을 정하는 것은 망각 게이트 값이다.
파이토치는 모든 바이어스를 0 근처에서 시작한다. 망각 게이트도 마찬가지이니
sigmoid(0) = 0.5 다. 걸음마다 절반이 죽는다. 0.5^127 은 5.88e-39 로
float32 의 최소 정규수 1.18e-38 보다 작다. 그래서 초기값에서 재면 127자 뒤의
기울기가 언더플로로 정확히 0 이 된다 - 게이트 없는 RNN 과 같다.
바이어스만 b 로 바꿔 다시 재면
b sigmoid(b) 절반 1/100 1/10000
0 0.500 2 9 19
1 0.731 3 23 51
2 0.881 5 117 안 죽음
3 0.953 1 안 죽음 안 죽음
b = 2 면 문맥 128자 안에서 기울기가 1/10000 아래로 안 내려간다. b = 3 에서는
127자 뒤의 기울기가 마지막 자리의 1.80 배로, 출처보다 커진다 - 소실의 반대편
이다.
게이트가 문제를 푸는 게 아니라, 게이트를 열어 둘 때 푼다. 망각 게이트 바이어스를 1 이나 2 로 시작하라는 오래된 요령이 이 표다.
그런데 손실은 나빠진다
여기까지면 이야기가 깔끔한데, 그 다음이 안 그렇다. 바이어스만 바꿔 같은 프로토콜로 다시 학습시키면
b 1/10000 도달 최저 검증 (시드 3개) 중앙값
0 19자 1.6771 1.6739 1.6787 1.6771
1 51자 1.7204 1.6983 1.7258 1.7204
2 안 죽음 1.7546 1.7350 1.7463 1.7463
단조롭게 나빠진다. b = 0 의 세 시드가 1.6739~1.6787, b = 2 가
1.7350~1.7546 로 범위가 겹치지도 않는다. 기울기를 멀리 보낼수록 손실이 오른다.
그럴 만하다. 이 일은 다음 글자 맞히기이고 문맥은 128자다. 백 자 전의 글자가 지금 글자를 정하는 일은 드물다. 망각 게이트를 열어 두면 은닉 상태가 오래된 것을 계속 이고 가는데, 쓸모가 없으면 그건 그냥 잡음이다. 잊는 것이 기능이다.
7편에서 이미 같은 모양을 봤다. 트랜스포머는 GRU 보다 4만 배 멀리 기울기를
보내는데 손실은 GRU 가 11.6% 낫다. 도달은 성능을 예측하지 않는다.
남는 것
이 결론은 문맥 128자, 다음 글자 맞히기에 붙어 있다. 앞쪽 정보가 실제로 필요한 일 - 괄호 맞추기, 긴 의존, 복사 - 에서는 도달이 곧 성능일 것이다. 그런 과제를 안 만들어 봤다.
셀 상태 경로만 따로 재지도 않았다. 여기서 잰 것은 입력 임베딩이 받는 기울기라 셀 경로와 게이트 경로가 섞여 있다. 교과서가 말하는 항등 경로만 떼어 보면 그림이 다를 수 있다.
그리고 b = 2 가 손실을 올린 것이 도달 때문인지, 아니면 학습 초기에 상태가
포화해서인지 구별을 못 했다. 둘을 가르려면 게이트 값을 직접 꺼내 봐야 하고,
그게 다음 편이다.
그래서
- 마지막 자리의 손실이 뒤로 보내는 기울기를 재면 재귀 셋이 거의 겹친다. 127자
뒤에서
8.24e-07/4.78e-07/3.04e-07 - 트랜스포머는 64자 넘어서 안 내려간다. 127자 뒤에서 GRU 의
39,145배 - CNN 은 17자에서 정확히 0 이다. 그래프에 없으니 작은 게 아니라 없다
- 초기값에서 게이트가 사는 것은 1/10000 도달
15자 -> 19자, 네 자뿐이다 - 원인은 망각 게이트 바이어스가
0이라sigmoid(0) = 0.5, 걸음마다 절반이 죽는 것이다.0.5^127은 float32 에서 언더플로다 - 바이어스를
2로 열면 128자 안에서 안 죽고,3이면 127자 뒤 기울기가 출처의1.80배가 된다 - 그런데 손실은
1.6771 -> 1.7204 -> 1.7463으로 단조롭게 나빠진다. 이 일에서는 잊는 것이 기능이다
Comments