(5강) Sequence to Sequence with Attention

💡
Sequence를 Encoding, Decoding 할 수 있는 Seq2Seq와 RNN 모델의 단점을 보완하기 위한 Attention 기법에 대해 알아본다.

Encoder-Decoder Architecture

Sequence-to-Sequence 모델은 RNN의 모델 구조 중 Many-to-Many Task에 해당한다. 입력 데이터인 입력 데이터는 Word 단위의 Sentence이며, 출력 역시 동일하다. 대표적으로 Neural Machine Translation나 Chat Bot 등의 Task에 자주 사용되는 모델이다.

Seq2Seq는 Many-to-Many Task에 해당하는 모델이다.

Seq2Seq 모델은 Encoder와 Decoder로 구분된다. 입력 문장을 받아 Hidden State Vector를 생성하는 부분이 Encoder이며, Encoder로부터 Hidden State Vector를 전달받아 출력을 만들어내는 부분이 Decoder이다.

Encoder와 Decoder 모두 LSTM의 구조를 차용했다.

Encoder와 Decoder는 모두 LSTM의 RNN구조를 하고 있으나, 서로 공유하지 않는 모듈(파라미터)를 갖는다. 전혀 다른 가중치를 사용한다는 의미이다. Encoder는 유의미한 정보가 유실되지 않도록 학습되며, Decoder는 Task에 맞는 문장을 생성할 수 있도록 학습된다.

Encoder는 Time Step별로 단어를 입력받아 Hidden State Vector에 이 값을 저장하고, 입력이 종료 되었을 때 생성된 최종 Hidden State Vector를 Decoder에 전달하게 된다.

Decoder는 첫 입력 데이터로, Encoder의 Hidden State Vector값과 특수한 Token을 입력받는다. 문장의 생성을 시작하는 의미를 가진 Start of Sentence Token을 입력받아 출력을 시작하고, End of Sentence Token을 출력하는 것으로 생성을 종료한다.

Seq2Seq with Attention

Seq2Seq 모델의 성능 향상을 위해 Attention 기법을 사용할 수 있다. 이 기법은 Encoder가 최종적으로 생성한 Hidden State Vector 하나에만 의존하지 않는 것으로, Seq2Seq 모델 성능에 큰 향상을 가져왔다.

한문을 영어로 번역하는 Task의 예시 eie_i로 표현되는 Encoder의 Hidden State Vector를 활용한다.

Seq2Seq가 내부적으로 LSTM을 사용하더라도, Long Term Data에 대한 정보는 소실되거나 변질되기 쉽다. 특히 앞쪽에 중요한 정보가 등장하는 문장의 경우, 해당 정보가 소실되어 출력 문장의 질이 현저히 떨어지는 문제도 발생할 수 있다. 이를 해결하기 위한 테크닉으로 입력 문장을 거꾸로 뒤집어서 전달하는 방법도 제시되었다.

Attention 기법은 위와 같은 Long Term Dependency한 Data를 잘 처리할 수 있다. Encoder에서 생성된 각각의 Hidden State Vector의 정보를 활용하기 때문이다. 이 기법의 도입으로 Neural Machine Translation Task의 성능이 비약적으로 향상될 수 있었다.

Attention Mechanism

Attention Mechanism을 사용하지 않는 경우, Decoder는 오직 Encoder의 마지막 Hidden State Vector 하나에만 의존하게 된다. 이에 비해 Attention Mechanism은 Encoder의 모든 hth_t를 사용하여 Decoder가 매 Time Step마다 필요한 정보를 취사선택하여 결과를 출력할 수 있도록 한다.

Encoder와 Decoder의 Hidden State Vector의 Dimension은 동일하다.

Decoder RNN의 관점에서 보자. 가장 처음에는, SOS Token과 Encoder가 전달한 h0h_0를 입력받는다. 이를 통해 Decoder의 Hidden State Vector인 h1h_1을 생성한다. 이 h1h_1과 Encoder의 Hidden State Vector를 의미하는 hˉs\bar h_s와의 내적을 통해 Attention Score를 계산한다. 이 Scalar 값은 두 Vector의 유사도로 이해할 수 있다. 모든 Attention Score에 대해 Softmax를 씌움으로써, Attention Distribution을 계산한다. 이 값은 각 hˉs\bar h_s의 중요도에 따른 가중평균 벡터로 이해할 수 있어, Attention Vector라 칭한다. Attention Vector의 값은 각 hˉs\bar h_s의 가중치로 활용되며, 이 값들의 연산을 통해 Attention Output을 계산할 수 있다. 이는 Context Vector라 칭한다. 최종적으로, Decoder의 Hidden State Vector h1h_1와 Context Vector를 Concatenate하여 y^1\hat y_1를 출력한다.

Decoder의 첫 출력 예시

Decoder의 첫 번째 Time Step Hidden State Vector와 출력인 h1h_1y^1\hat y_1은, 다음 Time Step의 Decoder Module로 전달된다. 위를 일반화 하면, Decoder의 Hidden State Vector를 hth_t로 표현할 수 있다. hth_t는 매 Time Step에서 Output을 생성하기 위해 직접적으로 투입되는 동시에, hˉs\bar h_s의 중요도를 결정하는 역할을 수행한다. 각 Time Step에서 생성되는 hth_t가 다르기 때문에, Attention Score도 달라지게 되며 매번 입력에 해당하는 적절한 출력을 생성해낼 수 있다. 출력은 y^t\hat y_t가 EOS Token일 때까지 출력을 이어나갈 수 있다.

프랑스어를 영어로 번역하는 Task 일반화 예시

Attention을 도입한 Seq2Seq모델의 역전파는 2가지의 방향으로 흐르게 된다. 매 Time Step의 출력인 y^t\hat y_t와 Ground Truth를 비교함으로서 Loss를 구하게 되고, Grad가 구해진다. 이때, Long Term에 있는 hˉs\bar h_s에는 Attention Module로 계산했던 루트로 Grad가 흘러가게 된다. 이를 통해 Grad의 손실이나 왜곡 없이 적절한 학습이 진행될 수 있다.

모델의 초기 학습 단계에서는 적절한 y^\hat y를 출력하기 어렵다. 이때, 이 출력을 그대로 입력에 사용하게 되면 모델은 계속 엉뚱한 출력과 입력이 반복된다. 이러한 문제를 해결하기 위해, y^\hat y 대신 Ground Truth를 Decoder의 입력으로 사용할 수 있다. 이러한 방법을 Teacher Forcing이라고 한다. 이와 같은 방법은 학습에는 도움이 되나, 모델의 최종 성능은 떨어지게 된다. 때문에 학습 초기에는 Teacher Forcing 방법을 사용하고, 이후에는 이를 중단하는 학습 방법을 계획할 수 있다.

Different Attention Mechanisms

Decoder와 Encoder의 Hidden State Vector {ht,hˉs}\{ h_t, \bar h_s \}로 구해지는 Score에 대해 알아보자. 이 값은 다음과 같은 방법으로 구해질 수 있다.

Attention Score를 구하는 방법 예시

dotdot은 두 벡터의 내적을 통해 값을 얻는 형식을 의미한다. 두 벡터는 같은 차원을 갖기 때문에, 내적을 수행하면, Scalar 값을 얻을 수 있다.

generalgeneral은 특정 차원의 값에 가중치를 주는 방법을 의미한다. WaW_a가 항등행렬인 II인 경우는 dot연산과 동일하게 된다. 항등행렬이 아닌 경우, 특정 차원의 값을 조정하는 기능을 할 수 있다. 이처럼 WaW_a를 Attention Module에 속한 Parameter로 사용할 수 있으며, 학습에 의해 Score를 조절하는 기능을 할 수 있다.

concatconcat은 위처럼 Score를 계산하는데 많은 의미를 포함할 수 있도록 모델의 유연성을 더한 것이다. hth_thˉs\bar h_s를 Concatenate한 Vector를 Score 값으로 변환하는 2층짜리 MLP를 구성한 개념이다. 이를 통해서 Score를 계산하는데 더 많은 Parameter가 포함되고, 표현력이 증가하는 효과를 얻을 수 있다.

generalgeneral Example
concatconcat Example

실습

Seq2Seq Example

Seq2Seq with Attention Example


(6강) Beam Search and BLEU

💡
문장 Generation의 성능을 향상시키기 위한 Beam Search Algorithm과, 평가를 위한 BLEU Score Metric에 대해 알아본다.

Beam Search

Beam Search는 Seq2Seq같은 자연어 모델의 Generation 성능을 높여주는 Algorithm이다. 문장 생성은 확률값에 기반하여 다양한 경우의 수에서 높은 확률값의 단어를 순차적으로 생성하는 것이다. 이 때, 적절한 수준의 범위와 확률을 고려하도록 설정하는 기법이 Beam Search이다.

매 출력마다 가장 높은 확률값인 단어 한개만 고려하여 생성해낸다고 가정해보자. 이는 매 순간에서는 최선의 값일지 몰라도, 최종적인 문장의 레벨에서의 확률은 최선의 값이 아닐 수 있다. 또한, 단 하나의 단어만을 고려하면서 생성해나가다보면 문장의 개선 등도 불가능해진다. 즉, 문장의 질이 떨어질 수 있다는 의미이다. 이러한 형태의 Decoding 기법을 Greedy Decoding이라고 표현하며, 기본적인 RNN의 학습이 이와 같이 이루어진다.

이미 생성된 a에 의해 문장을 바꿀 수 없고, 출력 문장의 질이 낮아진다.

가장 좋은 성능을 내는 방법은, 최종 출력인 문장 단위에서 모든 조건을 고려하는 것이다. 각 단어 간의 조건부 확률을 모두 계산하는 식으로, 모든 문장을 고려하게 되면 이때 가장 높은 확률 값을 갖는 문장이 가장 적합한 문장일 것이다. 이와 같은 가정에 따르면, 문장은 각 단어의 동시사건이면서 각 단어는 모든 다른 단어와 관계를 갖게 된다. 이를 수식으로 나타내면 다음과 같다. P(yx)=P(y1x)P(y2y1,x)...P(yty1,...,yt1,x)=1tP(yty1,..yt1,x)P(y|x) = P(y_1|x)P(y_2|y_1,x)...P(y_t|y_1,...,y_{t-1},x) = \prod_1^tP(y_t|y_1,..y_{t-1},x) 하지만, 이와 같은 방법은 터무니 없는 자원을 요구하는 연산이다. 각 단어를 생성하는데 있어서 모든 Vocab Size 만큼의 확률 계산이 필요하기 때문이다.

O(Vt)O(V^t)의 연산복잡도를 가지는 가정이다.

위 두 방법을 적절하게 융합한 것이 Beam Search이다. 이는 매 출력마다 단어의 확률분포를 구하고 미리 정한 kk개만큼의 후보를 만드는 방식이다. 각 후보로부터 다시 kk개의 가설을 만들고 높은 확률을 채택해 나가는 방식을 사용한다.

k가 2인 Beam Search 예시

확률값을 구하는 수식은 다음과 같다. score(y1,...,yt)=logPLM(y1,...,ytx)=i=1tlogPLM(yiy1,...,yi1,x)score(y_1,...,y_t) = logP_{LM}(y_1,...,y_t|x) = \sum_{i=1}^t log P_{LM}(y_i|y_1,...,y_{i-1}, x) 매 Time Step에서 Score가 계산된다. PLM(yx)P_{LM}(y|x)는 확률로 0~1사이의 값을 갖게 된다. 이 값을 계속 곱해나가면, 0에 수렴하기 때문에 loglog를 씌워 덧셈 연산으로 변경한다. loglog에 의해 0~1사이의 값은 inf-\inf~0의 값으로 치환되나, 단조증가 함수이기 때문에, 큰 값을 채택하는 것은 동일하게 이루어진다. 각 Hypothesis에서 높은 Score를 k개 만큼 선택해 나가며 최종 문장을 생성하고 출력하게 된다. 각 Hypothesis 기준에서는 EOS Token을 생성한 시점에서 문장을 완성한 것이 되고, 임시 저장소에 저장된다.

Decoder의 기준에서 문장 선택은 미리 지정한 Time Step tt에 도달했거나, nn개의 문장이 완성 되었을 때 이루어진다. 최종 출력에 대한 결정은 Score값의 총 합으로 결정된다. 문장의 길이가 길어짐에 따라 음수 값이 누적되기 때문에, 문장의 길이를 고려하기 위해 문장의 길이인 tt로 나누어 값을 계산하게 된다.

BLEU Score

BLEU Score는 자연어 생성모델의 출력에 대한 품질이나 정확도를 측정하는 방법이다. 이와 같은 기준을 통해 목적함수를 정의할 수 있게 되는 것이다. 기준을 통해 Loss를 계산하고, 모델을 적절하게 학습시킬 수 있게 된다.

일반적인 Accuracy의 관점으로 보게 되면, 각 Time Step에서의 Ground Truth와 y^\hat y를 비교할 수 있다. 이와 같이만 계산하게 되면, 다음과 같은 상황에서의 Score는 0이 된다.

의미상 문제가 없으나 Accuracy는 0이다.

이와 같은 기준을 세우기 위해 Precision과 Recall의 개념을 도입할 수 있다. Ground Truth인 Reference와 y^\hat y인 Predicted로 부터 각 값을 계산하면 아래 사진과 같다.

Precision, Recall, F-measure Example

여기에서, Precision의 의미는 Model이 예측한 문장이 얼마나 Ground Truth와 적합하냐에 대한 개념으로 사용될 수 있다. BLEU Score는 이런 Precision의 성질과, N-Gram, Brevity Penalty를 통해 계산된다.

N-Gram은 N개의 연속의 단어를 통해 Precision을 계산하는 개념이다. BLEU는 1~4 Gram을 모두 사용하여 Precision값을 구하고, 이 값을 기하평균하여 사용한다.

Brevity Penalty Term은 Recall의 개념을 재해석 한 것으로 해석할 수 있다. 출력이 Ground Truth의 문장보다 짧은 경우 Penalty를 주고, 길더라도 Recall의 최대 값인 1로 한정하는 것이다.

Model 1은 일부 단어를 틀린 결과물로 52%의 Score를 얻었다. Model 2는 모든 단어는 포함되나 문법적인 정보를 포함하지 못해 0%의 Score를 얻었다.


Reference

Seq2Seq Paper

Attention Paper

NLP 관련 Lecture of cs224n

Explain Beam Search Video I

Explain Beam Search Video II

Explain Beam Search Document

Weakness of BLEU Metric

'네이버 부스트캠프 AI Tech' 카테고리의 다른 글

[U] Day 20 - NLP V  (0) 2021.03.26
[U] Day 19 - NLP IV  (0) 2021.03.26
[U] Day 17 - NLP II  (0) 2021.03.26
[U] Day 16 - NLP I  (0) 2021.03.26
[U] Day 15 - Generative Model  (0) 2021.03.26

+ Recent posts