자기회귀 속성과 Teacher Forcing 훈련 방법
여기까지 잘 따라오셨다면 궁금증이 하나 생길 수 있습니다. 훈련할 때 디코더의 입력으로 이전 time-step의 출력( $\hat{y}_{t-1}$ )이 들어가는 것일까요? 방금 살펴본 forward 함수를 보면 아닌 것 같은데요. 사실 안타깝게도 seq2seq의 기본적인 훈련 방식은 추론할 때의 방식과 상이합니다.

자기회귀 속성

Seq2seq의 훈련 방식과 추론 방식의 차이는 근본적으로 자기회귀autoregressive(AR)라는 속성 때문에 생깁니다. 자기회귀란 과거의 자신의 값을 참조하여 현재의 값을 추론(또는 예측)하는 특징을 가리킵니다. 이는 수식에서도 확인할 수 있습니다. 예를 들어 다음은 전체적인 신경망 기계번역의 수식입니다.
Y^=argmaxYYP(YX)=argmaxYYi=1nP(yiX,y^<i)ory^t=argmax yYP(ytX,y^<t;θ)where X={x1,x2,,xn}Y={y0,y1,,ym+1} and where y0=BOS.\begin{gathered} \hat{Y}=\underset{Y\in\mathcal{Y}}{\text{argmax}}P(Y|X)=\underset{Y\in\mathcal{Y}}{\text{argmax}}\prod_{i=1}^{n}{P(\text{y}_i|X,\hat{y}_{<i})} \\ \text{or} \\ \hat{y}_t=\underset{y\in\mathcal{Y}}{\text{argmax }}{P(\text{y}_t|X,\hat{y}_{<t};\theta)} \\ \text{where }X=\{x_1,x_2,\cdots,x_n\}\text{, }Y=\{y_0,y_1,\cdots,y_{m+1}\}\text{ and }\text{where }y_0=\text{BOS}. \end{gathered}
이와 같이 현재 time-step의 출력값 $yt$ 는 인코더의 입력 문장(또는 시퀀스) $X$ 와 이전 time-step까지의 $y{<t}$ 를 조건부로 받아 결정되므로, 과거 자신의 값( $\hat{y}_{t-1}$ )을 참조합니다. 이러한 점은 과거에 잘못된 예측을 했을 경우 시간이 지날수록 더 큰 잘못된 예측을 할 가능성을 야기하기도 합니다. 또한 과거의 결괏값에 따라 문장(또는 시퀀스)의 구성이 바뀔 뿐만 아니라, 예측 문장 (시퀀스)의 길이마저도 바뀝니다. 학습 과정에서는 이미 정답을 알고 있고, 현재 모델의 예측값과 정답과의 차이를 통해 학습하므로, 우리는 자기회귀 속성을 유지한 채 훈련할 수 없습니다.

teacher forcing 훈련 방법

추론방식과 훈련방식에서의 디코더의 동작
따라서 우리는 teacher forcing이라고 불리는 방법을 사용하여 훈련합니다. 훈련할 때 각 time-step별 수식은 다음과 같습니다. 앞에서처럼 조건부에 $\hat{y}{<t}$ 가 들어가는 것이 아닌 $y{<t}$ 가 들어가는 것이므로, 훈련 시에는 이전 time-step의 출력 $\hat{y}_{<t}$ 을 현재 time-step의 입력으로 넣어줄 수 없습니다.
L(Y)=i=1m+1logP(yiX,y<i;θ)θθλ1Ni=1NL(Yi)where (X,Y)B={Xi,Yi}i=1N\begin{gathered} \mathcal{L}(Y)=-\sum_{i=1}^{m+1}{\log{P(\text{y}_i|X,y_{<i};\theta)}} \\ \theta\leftarrow\theta-\lambda\frac{1}{N}\sum_{i=1}^{N}{\mathcal{L}(Y_i)} \\ \text{where }(X,Y)\sim\mathcal{B}=\{X_i,Y_i\}_{i=1}^N \end{gathered}
또한, 실제 손실 함수를 계산하여 경사하강법을 수행할 때도, 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을 합쳐 수식을 정리할 수 있습니다.
Htgt=RNNdec(embtgt([BOS;Y[:1]]),hnsrc)H^{tgt}=\text{RNN}_{dec}(\text{emb}_{tgt}([BOS;Y[:-1]]),h_{n}^{src})
하지만 바로 앞 절에서 다루었듯이, 디코더의 input feeding은 이전 time-step의 softmax 이전 계층의 값을 단어 임베딩 벡터와 함께 받아야 하므로 앞에서와 같이 모든 time-step을 한번에 계산하는 것은 불가능합니다. 따라서 input feeding이 추가된 디코더의 수식은 다음과 같이 정의됩니다.
httgt=RNNdec([embtgt(yt1);h~t1tgt],ht1tgt) where h0tgt=hnsrc and y0=BOS.h_{t}^{tgt}=\text{RNN}_{dec}([\text{emb}_{tgt}(y_{t-1});\tilde{h}_{t-1}^{tgt}], h_{t-1}^{tgt})\text{ where }h_{0}^{tgt}=h_{n}^{src}\text{ and }y_{0}=\text{BOS}.
이런 자기회귀 속성 및 teacher forcing 방법은 신경망 언어 모델(NNLM)에도 똑같이 적용되는 문제입니다. 하지만 언어 모델의 경우 퍼블렉서티perplexity는 문장의 확률과 직접적으로 연관이 있기 때문에 큰 문제가 되지 않는 반면, 기계번역에서는 더 큰 문제로 다가옵니다. 이에 관해서는 이어지는 절에서 다루겠습니다.

참고: 언어 모델의 teacher forcing

언어 모델 훈련 시 teacher forcing이 적용되는 상황
언어 모델 추론 시 자기회귀하도록 추론이 적용되는 상황
Last modified 2yr ago