BERT에서 Dropout 설정 방법 (feat. 준휘) #49
papari1123
started this conversation in
Ideas
Replies: 1 comment
-
현재 pull request한 코드 버전은 AutoModel에 인자로 넣어주는 방법으로 적용되어 있는데, 참고하면 좋을 것 같습니다. 정리해줘서 감사합니다~~ |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
아래 discussion에서 이어지는 내용입니다.
#42
요약
설정 방법
준휘가 말한대로 dropout을 구현하는 방법은 2가지가 있는데, 두 개는 완전히 다른 방식입니다.
이 방식은 모델의 인코더 블럭에 있는 모든 output layer의 dropout을 hidden_dropout_prob값으로 조정합니다.
즉 입력이 인코더 블럭의 output layer 개수만큼 dropout을 거쳐야 하기 때문에 값이 조금만 커져도 학습이 잘 안되는 현상을 볼 수 있습니다.
아래는 그나마 dropout=0.1으로 pretrained된 모델 불러왔기 때문에, 조금은 학습이 되는 것처럼 보임. 신기하게도 valid pearson이 0.85대로 안정적으로 나오는데, train pearson은 0.2~0.6을 왔다 갔다하는 현상을 볼 수 있습니다.
위와 비슷한 상황에서 나온 다른 학습 그래프인데, validation loss도 아니고 train loss가 중간에 올라갔다가 저점까지 내려가지 못하는 이상 현상이 나타납니다.
이런 현상들은 설정한 rate로 dropout하는 layer가 많아 (48개) , training 중에는 이전 step(mini-batch)에서의 weight on/off 상태와 유사한 네트워크 구조를 다시 보기 매우 어렵기 때문에 일어나는 듯 합니다.
상황을 단순화해 예를 들면 : 뉴런이 2개인 레이어를 48개 중첩한 모델을 가정할 때, 레이어마다 dropout을 0.5로 줌으로써 무려 2^48개의 서로 다른 모델을 학습하는 것과 유사합니다.
준휘가 설명한 것처럼, AutoModel을 불러와서 마지막 pooler output 레이어만 끄집어와 1개의 dropout layer를 추가합니다.
이것도 예를 들면 : 뉴런이 2개인 레이어를 48개 중첩한 모델의 마지막 레이어 dropout만 rate=0.5로 추가하는 경우와 비슷하며, 2개의 서로 다른 모델만 학습시키는 것과 유사합니다.
AutoModel로 불러올 때 Pooler 레이어 구조는 다음과 같습니다.
1과 동일한 rate(0.4)를 설정하고, 처음부터 학습했음에도 학습이 잘됩니다.
참고
Beta Was this translation helpful? Give feedback.
All reactions