재귀와 합성곱 part 7 of 13

같은 예산이면 GRU 가 이긴다 - 700걸음 동안만

guide / / 9 sections

앞의 여섯 편에서 재귀 한 걸음, LSTM 의 게이트, GRU, 합성곱 커널, 수용장, 풀링을 하나씩 열어 봤다. 각각이 무엇을 계산하는지는 봤는데 어느 쪽이 나은지는 안 봤다.

이제 붙여 본다. 조건은 하나다 - 같은 것에 대고 재야 한다. 앞 시리즈 13편의 트랜스포머와 파라미터 예산을 맞추고, 코퍼스도 최적화도 같게 둔다.

예산을 맞춘다

13편 모델은 파라미터 637,156 개다. 같은 코퍼스, 같은 문맥 128자, 같은 배치 32, 같은 AdamW 3e-4 를 쓰고, 각 구조의 폭을 그 숫자에 맞춘다.

             폭      파라미터    트랜스포머 대비
RNN         683     637,845        100.1%
LSTM        325     637,550        100.1%
GRU         381     635,835         99.8%
CNN     171채널     639,273        100.3%
트랜스포머                637,156        100.0%

전부 0.3% 안이다. 임베딩과 출력층은 다섯 개가 똑같고, 가운데만 바뀐다. 합성곱은 커널 5짜리 인과 합성곱 4층이라 수용장이 4 x 4 + 1 = 17 자다 - 이건 뒤에 다시 나온다.

같은 예산이라고 해서 같은 곳에 쓰는 것은 아니다. RNN 은 683 x 683 짜리 재귀 행렬 하나에 46만 개를 몰아넣고, 트랜스포머는 블록 세 개에 흩어 놓는다. 그것도 구조의 일부다.

마지막 걸음으로 견주면 틀린다

처음에는 다섯 개를 4000걸음씩 돌리고 마지막 값을 견줬다. 결과가 이랬다.

RNN 3.4327   LSTM 3.2872   GRU 3.3432   CNN 3.6865   트랜스포머 1.8300

트랜스포머 압승으로 보인다. 그런데 같은 실행의 800걸음 지점을 보면 LSTM 이 1.6817, GRU 가 1.6550 이다. 코퍼스가 75,353자뿐이라 다섯 다 외워 버리고, 바닥을 찍는 시점이 서로 다르다. 정해진 걸음 수에서 견주는 것은 남의 최저점을 지나친 자리에서 재는 것과 같다.

그래서 프로토콜을 바꿨다. 1500걸음까지는 100걸음마다, 그 뒤로는 250걸음마다 검증하고, 각 구조의 최저 검증 손실을 그 구조의 성적으로 본다. 시드 3개를 돌린다.

다섯 개를 같이 그리면

2.0 2.5 3.0 3.5 4.0 4.5 바이그램 2.65 균등 4.61 트랜스포머 1.7679 @2750 GRU 1.6449 @800 LSTM 1.6776 @800 RNN 1.8355 @800 CNN 1.8709 @300 0 1000 2000 3000 4000 학습 걸음 검증 손실
다섯 구조의 검증 손실. 파라미터는 63만 개로 맞췄고 코퍼스와 최적화도 같다. 시드 3개 중 가운데 시드의 곡선이고, 점이 각 곡선의 최저점이다. 다섯 다 바닥을 찍고 돌아서는데, 닿는 시점이 300걸음에서 2750걸음까지 아홉 배 차이가 난다. 트랜스포머만 돌아선 뒤에도 거의 평평하다.
           파라미터    최저 검증   시드 3개              최저 시점   퍼플렉서티
GRU         635,835    1.6449   1.6276~1.6503          800       5.180
LSTM        637,550    1.6776   1.6737~1.6785          800       5.353
트랜스포머      637,156    1.7679   1.7662~1.7694         2750       5.859
RNN         637,845    1.8355   1.8354~1.8362          800       6.268
CNN         639,273    1.8709   1.8695~1.8748          300       6.494

시드 산포가 아주 작다. RNN 은 셋이 1.8354 에서 1.8362 사이이고 트랜스포머는 1.7662 에서 1.7694 다. 순위는 시드로 뒤집히지 않는다.

GRU 가 이긴다

1.64491.7679. 퍼플렉서티로는 5.1805.85911.6% 낫다. LSTM 도 1.6776 로 앞선다. 63만 파라미터로 7만 5천 자를 배우는 판에서는 어텐션이 최선이 아니다.

납득이 가는 결과다. 어텐션이 사는 곳은 문맥이 길고 데이터가 많은 쪽이다. 여기서 문맥은 128자이고 데이터는 소설 한 장 분량이다. 그 크기에서는 은닉 상태 하나를 끌고 가는 쪽이 더 효율적으로 짜인다.

RNN 이 1.8355 로 지는 것도 같은 이야기의 뒷면이다. 게이트가 없으면 무엇을 남기고 무엇을 버릴지 못 정한다. LSTM 과 GRU 가 RNN 보다 나은 폭 (0.16~0.19) 이 트랜스포머와의 폭보다 크다. 게이트가 어텐션보다 큰 차이를 만든다.

700걸음 동안만

그런데 이 표는 각자 제일 좋은 순간을 모아 놓은 것이다. 곡선을 보면 다른 게 보인다.

           최저      4000걸음     배
GRU       1.6449     3.4170    2.08
LSTM      1.6776     3.3660    2.01
RNN       1.8355     3.5293    1.92
CNN       1.8709     3.7161    1.99
트랜스포머    1.7679     1.8424    1.04

트랜스포머만 안 무너진다. 바닥을 지나 4000걸음까지 가도 1.04 배인데, 나머지는 두 배가 된다.

GRU 가 트랜스포머의 최저기록 1.7679 보다 나은 구간을 세면 500걸음에서 1200걸음까지다. 시드 세 개가 정확히 같은 구간을 준다. LSTM 은 500~1100 이다. 그 밖에서는 트랜스포머가 이긴다.

반대로 트랜스포머는 자기 최저의 1.1배 (1.945) 아래에 1500걸음부터 4000걸음 까지 있고, 4000에서 아직 그 안이다. GRU 는 같은 기준으로 300~1500 이다.

그러니까 이렇게 읽어야 한다. GRU 의 최고점이 더 높다. 대신 그 자리가 700걸음 짜리 창이고, 트랜스포머의 자리는 열려 있다. 언제 멈출지 정확히 알고 있다면 GRU 를 쓰고, 모른다면 트랜스포머를 쓴다.

합성곱은 17자만 본다

커널 5짜리 4층은 자기 왼쪽으로 17 자까지만 본다. 나머지 넷은 128자를 다 본다.

처음에는 이것이 꼴찌인 이유라고 적었다. 5편에서 창을 125 자까지 넓혀 보니 1.9967더 나빠졌고, 파라미터를 하나도 안 늘리고 팽창으로만 넓힌 경우조차 1.8709 에서 1.9716 이 됐다. 시야가 좁아서 지는 것이 아니다.

바닥에 제일 먼저 닿는 것도 CNN 이다 - 300 걸음. 배울 것이 제일 적으니 제일 빨리 다 배우고 제일 빨리 외우기 시작한다.

13편 숫자와 다른 이유

13편은 같은 트랜스포머의 최저 검증을 1.7510 이라고 적었다. 여기서는 시드 세 개가 1.7662, 1.7679, 1.7694 다. 13편 값이 내 세 시드 밖에 있다.

원인을 찾았다. 13편 학습 스크립트는 중간에 글을 뽑아 보는데, 그 함수가 torch.manual_seed(0) 으로 시작한다. 전역 난수를 다시 심는다는 뜻이고, 그 뒤로는 배치 순서가 처음부터 다시 반복된다.

중간 재시드 없음   136044 248239 714933  93760 848963 848379
3번째에 재시드     136044 248239 714933 136044 248239 714933

13편 모델은 200걸음과 1000걸음에서 그 재시드를 맞았으니, 내 실행과 다른 데이터 순서를 봤다. 두 숫자가 같을 이유가 없다. 13편이 발표한 값은 그 실행이 실제로 낸 값이고 그 체크포인트가 지금도 그 손실을 내므로 앞 시리즈들은 그대로 유효하다. 다만 이 편의 비교는 다섯 구조를 한 프로토콜로 다시 돌린 숫자를 쓴다.

남는 것

여기서 얻은 것은 이 코퍼스, 이 크기에서의 순위다. 7만 5천 자는 작다. 데이터를 키우면 순위가 뒤집힐 것으로 보는 게 상식이지만, 상식은 재 본 것이 아니다.

층 수도 안 건드렸다. 재귀 계열은 전부 1층이고 트랜스포머는 3층이다. 폭으로만 예산을 맞췄으니, 재귀를 2층으로 나누면 어떻게 되는지는 모른다.

그리고 여기서는 학습 시간을 안 쟀다. 처음에는 GRU 한 번 돌리는 데 트랜스포머보다 두 배 넘게 걸렸다고 적었는데, 다섯을 연달아 돌리며 잰 값이라 못 쓸 숫자였다. 9편에서 라운드로빈으로 다시 재니 걸음당 1.21 배다. 같은 걸음 수로 견주는 것이 공정했는지도 9편이 답한다 - 공정했고, 트랜스포머에 유리한 쪽이었다.

그래서

  • 파라미터를 637,156 에 맞추면 다섯 구조가 전부 0.3% 안에 들어온다
  • 다섯 다 과적합한다. 정해진 걸음 수에서 견주면 남의 최저점을 지난 자리에서 재는 것이다
  • 최저 검증으로 견주면 GRU 1.6449 < LSTM 1.6776 < 트랜스포머 1.7679 < RNN 1.8355 < CNN 1.8709
  • GRU 가 트랜스포머보다 퍼플렉서티 11.6% 낫다. 게이트가 없는 RNN 은 진다 - 게이트가 어텐션보다 큰 차이를 만든다
  • 대신 GRU 가 앞서는 구간은 500~1200 걸음뿐이고 4000걸음에서 2.08 배로 무너진다. 트랜스포머는 1.04 배다
  • CNN 은 왼쪽으로 17 자만 본다. 그런데 5편에서 창을 넓혀 보면 더 나빠진다 - 시야가 좁아서 지는 것이 아니다

Comments