kakao / khaiii

Kakao Hangul Analyzer III
Apache License 2.0
1.4k stars 285 forks source link

PyTorch 최신 버전 학습 지원 #72

Closed krikit closed 5 years ago

krikit commented 5 years ago

현재까지는 PyTorch 0.4.1 버전에서 학습이 정상적으로 이루어지고, 최신 버전인 1.1.0에서는 성능이 많이 떨어지는 것으로 나오는데, 원인을 분석하고 최신 버전에서도 원활히 학습이 되도록 수정합니다.

krikit commented 5 years ago

PyTorch 0.4.1 버전과 1.1.0 버전에서 결과가 달랐던 원인은 dropout 함수의 동작 방식이 달라졌기 때문입니다.

hidden layer에서 두번 dropout을 사용했는데 코드에서의 위치는 아래와 같습니다. 1) https://github.com/kakao/khaiii/blob/453dc6866f1fe813375ada53938fa3e1cec4d7a0/src/main/python/khaiii/train/models.py#L76 2) https://github.com/kakao/khaiii/blob/453dc6866f1fe813375ada53938fa3e1cec4d7a0/src/main/python/khaiii/train/models.py#L79

v0.4.1에서는 torch.nn.functional.dropout()training argument는 디폴트 값이 False입니다.

그에 반해 v1.1.0에서는 torch.nn.functional.dropout()training argument는 디폴트 값이 True입니다.

그래서 v0.4.1에서는 train/eval 구분 없이 dropout이 전혀 적용되지 않았고, v1.1.0에서는 심지어 eval 타임에서도 dropout이 항상 적용됩니다.

이는 초창기에 제가 PyTorch를 배우면서 model.train() 메소드의 호출과 model.eval() 메소드 호출에 의해 자동으로 dropout 적용을 조절해 준다고 생각했기 때문입니다. 모델의 멤버 변수로 dropout을 등록하여 사용했다면 기대했던 데로 동작했겠지만, functional 모듈의 함수를 사용할 경우 train/eval을 구분하여 training argument를 정확히 수작업으로 전달해 줘야 했습니다.

결론적으로 기존의 코드는 v0.4.1에서 학습을 진행했으므로, dropout이 전혀 적용되지 않았습니다. ㅠ.ㅠ

krikit commented 5 years ago

hidden layter에서 dropout이 적용되도록 수정한 후, dropout 비율을 0, 0.1, 0.2, 0.3으로 높여가며 실험을 한 결과는 아래와 같습니다.

hidden_dropout

청록색: 미적용 > 회색: 0.1 > 주황색: 0.2 > 파란색: 0.3

(dropout도 많이 적용하면 할수록 떨어지네요. ㅠ.ㅠ)