NLP study

[NLP 이론] R-drop과 KL-divergence, 그의 활용

2로 접어듦 2023. 4. 29. 20:10

R-drop 이란?

먼저 Dropout이란, regularization 기법의 일종으로, 모델의 complexity가 주어진 데이터 및 태스크에 비해 너무 클 경우 과적합(overfitting) 하게 되는 것을 방지하고자 고안된 regularization 기법이다.

Dropout은 Fully connected layer에서 몇 개의 unit들을 동작하지 않도록(weight=0) 설정하여 일부만 weight를 전달하도록 학습하게 되는데, 모델의 복잡도를 떨어뜨리면서도 test 시에는 모든 unit들이 동작하게 되어 앙상블과 유사한 효과를 가져올 수 있다(일반화 성능 향상을 기대할 수 있다.)
적은 parameter들로 하여금 feature를 학습하고 정보를 소유할 수 있도록 '규제'함으로써 overfitting을 방지하는 것이다(간단한 문제를 푸는 데 너무 많은 인력이 필요하지 않다만, 실제 추론 시에는 최대한 그 인력들을 다 활용해서 오답률을 줄이겠다는 것.)

 

Dropout layer(오른쪽)


R-drop이란 Regularized Dropout으로, 2021년 논문을 통해 제안된 기법이다.
(R-Drop: Regularized Dropout for Neural Networks, Xiaobo Liang et al. 2021)

 

일단 내가 이해하기로는, 아래 첨부된 사진처럼, dropout 자체에 대한 regularization을 수행하는 것이라고 이해했다. 랜덤하게 dropout이 설정되는 트랜스포머 레이어에서, 출력값들의 차이를 줄여줄 수 있는 KL-divergence loss minimize 식을 기존 Loss에 추가하는 방식이다.

다시 설명하면, Dropout Layer는 어떤 unit이 동작하지 않도록 하는지 random하게 설정한다. 이는 모델 Output으로 하여금 서로 조금씩 다른 결과를 갖게 된다. 같은 input x를 넣었을 때, 모델은 같은 확률 값을 출력해야 하므로 아래 그림 오른쪽 버전과 같이 P1과 P2의 값의 차이를 또 하나의 loss로 설정할 수 있다.

 

KL-divergence 로 두 분포의 차이를 줄여나갈 수 있으므로, 이 수식을 통해 'minimizing bidirectional KL-divergence of the output distributions'을 수행함으로써 모델의 일반화된 성능 향상을 이끌어낼 수 있다고 한다.

(추가하자면, 두 분포 사이의 거리를 최소화하는 것은 dropout을 통해 나온 hidden node들의 결과 값을 최대한 같게 만드는 것과 동일하다. 즉, 모델에 constraint를 주는 것이다.)

논문의 저자들은 R-drop을 통해서 Random dropout으로부터의 inconsistency를 줄여준다고 언급하며, 기존 SOTA 모델들의 성능을 향상시킬 수 있다는 것을 밝혔다.

 

R-drop 논문 발췌. input x를 모델에 2 번(twice) 입력하면(왼쪽), 오른쪽과 같이 randomly initialized된 dropout layer에 의해 결과 P 값이 다르게 나타난다.


다만 논문에서는 단점 아닌 단점도 언급하고 있다.

R-drop을 통해서 모델은 "can acieve much stronger performance", 즉 더욱 강력한 일반화 성능을 가질 수 있지만, R-drop을 적용하지 않은 모델에 비해 비해 "but with a lower convergence", 즉 느리고 낮은 수렴을 보인다고 언급한다. 아래 Figure 2가 그것을 증명한다. R-drop이 없는 Transformer layer가 훨씬 빠른 수렴을 보인다. 대신, training을 지속할 수록 train-loss는 줄어들지만 overfitting하여 dev-loss는 증가하는 것을 확인할 수 있다("quickly but converges to bad local minimum")

 

Figure2 를 통해 R-drop이 처음엔 낮은 BLEU값을 가지지만, training을 지속할 수록 강력한 성능을 가지는 것을 볼 수 있다. Figure3을 통해 step이 길 수록 빠르게 성능을 내지만, step을 짧게 할 수록 (후에)더 강력한 성능을 낸다.

 

논문에서는 2회(2-times) 모델에 input x를 투입시키는 것이 충분한 regularization 기법임을 확인했다고 언급했다(3번한 것은 큰 성능향상이 없었음).

대신 step, 즉 dropout이 k번 있을 때마다 수행하는 k-step R-drop을 수행하고 k 값에 따른 성능 비교를 진행했다(Figure 3.)

R-drop의 유무를 비교했던 Figure 2처럼 k가 작아서 R-drop을 많이 수행할 수록 장기적인 측면에서 성능 향상을 기대할 수 있다.

 

모델에 input을 forward twice 해야하는 과정 자체가 training cost를 증가시키는 작업이라는 것도 또 하나의 시사점이다.

결론을 먼저 언급하자면, 모델 input을 단순히 2배 늘리는 것의 겨우 1.1배의 시간만 걸리지만, 장기적인 성능 향상을 크게 유도할 수 있다는 점을 언급한다.

저자들은 input minibatch를 input x를 반복시켜 concatenate 시킨 [ x ; x ] 를 모델의 input으로 넣었다고 하는데(Section 2.2),
(이 과정으로 어떻게 dropout layer가 각각 randomly하게 initialize되는지는 이해하지 못했다.)

이러한 방식의 (트릭으로) 단순히 batch-size를 두 배 키워서 반복시키는 작업(이 또한 모델의 input size는 concatenate 한 것과 동일하게 된다)에 비해 겨우 1.1배 더 많은 시간을 사용할 뿐이라는 점을 언급했다(Appendix C.1).

1.1배의 시간이 걸리는 이유로는 KL-divergence loss backward 계산 때문이라고 추가적으로 언급하고 있다.

 

솔직히... 논문에서는 거의 600miniutes 동안 학습시키면서 이득(BLEU 2.0 정도)을 보는데, computational cost가 아주 약간의 score 향상을 위해서 너무 많이 소모되는 것이 아닌가 싶다.


KL-divergence란?

(정확한 논문, 자료를 참고한 것이 아니므로 잘못 이해한 부분이 있을 수 있습니다.)

divergence, 간단히 말하면 '차이'를 의미한다.
공업수학 때 div F 같은 걸 배웠던 기억이 어렴풋이 난다. 위키피디아에서는 벡터장의 발산... 과 관련된 개념으로 나온다.

 

딥러닝 loss function 관련해서는 KL-divergence는 '두 확률분포의 차이' 라고 이해할 수 있다.

풀 네임은 Kullback-Leibler divergence로, 위키백과에 따르면 다음과 같이 정의된다.

 

 

KL-divergence 는 두 확률분포의 차이를 계산하는 것이므로, 확률분포가 관여하는 개념인 Cross Entropy로부터 유도될 수 있다.

 

이미지 출처: https://hyunw.kim/blog/2017/10/27/KL_divergence.html

 

확률분포 P, Q에 대한 Cross Entropy H(p, q)는 P의 entropy H(p)와 KL-divergence로 나뉘게 된다.

이 Cross Entropy를 최소화 하는 과정이 목적함수였고, 이는 즉 KL-divergence 또한 최소화되어야 한다와 같은 개념이 된다. 로그 값이 최소화 되기 위해서는 따라서, 두 확률분포 P와 Q가 최대한 동일해져야(==1)한다는 것을 의미한다.

여기서 확률분포 P는 '정답', 즉 모수의 확률 분포가 되므로, KL-divergence loss를 통해서 모델의 예측값 확률이 정답과 비슷해지게 되도록 모델을 학습시킬 수 있다.

 

더 나아가, KL-divergence 는 log 이므로 이를 +- 대수연산으로 simplify할 수 있다. 이 때 분모항 Q만 모델이 관여하는 항이고, 이는 training 데이터세트로부터 얻은 negative log likelihood이다. 즉, KL-divergence 를 최소화하는 것은 log likelihood를 최대화하는 것과 동일하게 된다.

 

이를 활용하는 방안

일반적으로 Cross-Entropy로부터 유래한 KL-divergence를 이용하는 수식이므로, Classification에서 사용된다고 한다(확실하지 않다.) 논문의 저자에 따르면 상당히 많은 다양한 태스크에서 활용할 수 있다고 한다.

 

참고자료

  1. https://arxiv.org/abs/2106.14448 참고 논문
  2. https://github.com/dropreg/R-Drop 참고 깃허브
  3. https://medium.com/codex/r-drop-a-simple-trick-to-improve-dropout-d6f0bb64f302 
    해당 아티클을 중점적으로 참고하였습니다.
  4. https://angeloyeo.github.io/2020/10/27/KL_divergence.html KL-divergence 개념 참고
  5. https://hyunw.kim/blog/2017/10/27/KL_divergence.html KL-divergence 개념 참고