본문 바로가기

Data Analysis/Natural Language Processing

sequence-to-sequence 학습 전략

Auto Regressive(자기 회귀) 속성

Seq2seq의 훈련 방식과 추론 방식의 차이는 근본적으로 자기회귀(AR, AutoRegressive)라는 속성 때문에 생긴다. 자기회귀란 과거의 자신의 값을 참조하여 현재의 값을 추론(또는 예측)하는 특징을 말한다. 이는 수식에서도 확인할 수 있다. 예를 들어 다음은 전체적인 신경망 기계번역의 수식이다. 

이와 같이 현재 time-step의 출력값 y_t 는 인코더의 입력 문장(또는 시퀀스) X 와 이전 time-step까지의 y{<t} 를 조건부로 받아 결정되므로, 과거 자신의 값( hat{y}_{t-1} )을 참조한다. 이러한 점은 과거에 잘못된 예측을 했을 경우 시간이 지날수록 더 큰 잘못된 예측을 할 가능성을 야기하기도 한다. 또한 과거의 결괏값에 따라 문장(또는 시퀀스)의 구성이 바뀔 뿐만 아니라, 예측 문장 (시퀀스)의 길이마저도 바뀐다. 학습 과정에서는 이미 정답을 알고 있고, 현재 모델의 예측값과 정답과의 차이를 통해 학습하므로, 우리는 자기회귀 속성을 유지한 채 훈련할 수 없다. 

 


Teacher Forcing(교사 강요)

학습을 할 때는 예측값이 input이 아닌 실제값을 input으로 적용하여 학습하는 교사 강요 방법을 적용한다.

그 이유는 Seq-to-seq에서는 다음에 올 단어를 예측하고, 그 예측한 단어를 다음 시점의 RNN Cell의 입력으로 넣는 방식을 반복하는데, 만일 이전 시점의 디코더 셀의 예측이 틀렸는데, 이를 현재 시점의 디코더 셀의 입력으로 사용한 경우, 현재 시점의 디코더 셀의 예측도 잘못될 가능성이 높고 이는 연쇄 작용으로 디코더 전체의 예측을 어렵게 하기 때문이다. 이와 같이 RNN의 모든 시점에 대해서 이전 시점의 예측값 대신 실제값을 입력으로 주는 방법을 교사 강요라고 한다.

 

따라서 우리는 교사 강요(teacher forcing)이라고 불리는 방법을 사용하여 훈련한다. 훈련할 때 각 time-step별 수식은 다음과 같다. 앞에서처럼 조건부에 hat{y}{<t} 가 들어가는 것이 아닌 y{<t} 가 들어가는 것이므로, 훈련 시에는 이전 time-step의 출력 hat{y}_{<t} 을 현재 time-step의 입력으로 넣어줄 수 없다. 

 

디코더의 역할

디코더는 t-1시점의 예측된 단어를 다시 input으로 사용해 t시점의 단어를 예측했다. 물론, 예측 단계에서는 합리적이지만, 학습을 할 때도 똑같은 방식으로 한다면 예측을 틀리게 하면서 연쇄작용으로 디코더 전체의 예측과 학습이 비효율적으로 진행될 것이다.

또한, 실제 손실 함수를 계산하여 경사하강법을 수행할 때도, softmax를 통해 얻은 확률 분포 $\log{P(\text{y}i|X,y{<i};\theta)}$ 에서 해당 time-step의 $\text{argmax}$ 값인 $\hat{yi}$ 의 확률을 사용하지 않고, 크로스엔트로피의 수식에 따라 정답에 해당하는 $y_i$ 의 인덱스에 있는 로그 확률값 $\log{P(\text{y}_i=y_i|X,y{<i};\theta)}$ 을 사용한다.

중요한 점은 훈련 시에는 디코더의 입력으로 이전 time-step의 디코더 출력값이 아닌, 정답 $Y$ 가 들어간다는 것이다. 하지만 추론할 때는 정답 $Y$ 를 모르기 때문에, 이전 time-step에서 계산되어 나온 $\hat{y}_{t-1}$ 를 디코더의 입력으로 사용한다. 이렇게 입력을 넣어주는 훈련 방법을 teacher forcing이라고 한다.
결국 자기회귀 속성으로 인해 teacher forcing 방법을 통해 훈련시킬 수밖에 없고, 이로 인해 훈련 방법과 추론 방법이 달라진다.
이전에 언급했듯이, 추론할 때는 자기회귀 속성 때문에 과거 자기 자신을 참조해야 한다. 따라서 이전 time-step의 자기 자신의 상태를 알기 위해서 각 time-step별로 순차적으로 진행해야 한다. 하지만 훈련할 때는 입력값이 정해져 있으므로 모든 time-step을 한번에 계산할 수 있다. 그러므로 input feeding이 존재하지 않는 디코더는 모든 time-step을 합쳐 수식을 정리할 수 있다.
 
과거 자기 자신을 참조해야 한다..
 
 

추가 학습 전략

seq2seq 논문에서는 여러가지 방법으로 실험을 해서 성능을 측정했다. 성능에 영향을 주는 방법 중 하나로는, input sequence을 변환하여 학습한 것이 괜찮았다. 

예를 들어, 기존 입력 sequence가 a,b,c이고 이를 통해 출력 시퀀스 x,y,z로 번역하는 모델을 학습한다고 가정하자. 일반적인 입력 시퀀스의 a,b,c를 넣었을 때보다 reverse input sequence(c,b,a)를 넣어서 학습했을 때 성능이 높아진 것을 확인했다. 다시 말해 a,b,c가 아닌 c,b,a를 넣어 x,y,z로 번역하는 것을 학습한 것이다. 이는 번역 모델에서 나타난 특징 중 하나로, 어순이 다른 언어일 경우 더 큰 성능 차이를 보일 것이라고 예상한다.

 

 

 

References

https://wikidocs.net/24996

https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-9/05-teacher-forcing

https://blog.naver.com/winddori2002/222001331899

https://m.blog.naver.com/sooftware/221790750668