본문 바로가기
AI/CS224N 2019

[Lecture 8 - 2][Stanford CS224n(Winter 2019)] Machine Translation, Seq2Seq and Attention

by 아오씬나 2021. 1. 28.
반응형

 

 

1. 통계적 기계번역(SMT):NMT 이전의 방식 

2. NMT에서 사용한 방식인 새로운 신경 아키텍처, sequence-to-sequence를 소개 이번 포스트에서 다룰 주제입니다.

3. Attention 이라는 Seq2Seq 을 향상한 새로운 neural technique 소개


앞선 시간에 배운 SMT는 꽤 괜찮은 시스템이지만 아주 복잡하고 관리가 어렵다는 등의 많은 단점이 있었습니다.

이번 포스트에서는 2014년에 시작된 very dramatic happened (아주 극적인 변화! 였던) NMT 연구에 대해 살펴봅니다.

 

 

NMT는 이름 그대로 단일 신경망으로 기계 번역을 수행하는 방법입니다.

여기서 신경망은 seq2seq 이라고 불리며 2개의 RNN을 포함합니다.

 

먼저 Encoder RNN 을 봅니다.

Encoder RNN 은 소스 문장의 인코딩을 생성합니다.

아, 여기서 RNN 은 uni-directional 로 그렸지만, bi-directional 이 될 수도 있습니다.

그리고 Vanilla RNN 이 될 수도 LSTM 이 될 수도 있다고 합니다.

소스 문장에서 가장 마지막 단어의 output 이 Decoder RNN의 초기 hidden state 값이 됩니다.

 

그럼 이제 Decoder RNN 을 보겠습니다.

이것은 조건부 언어모델임을 강조합니다.

conditional 이 앞에 붙는 이유는 인코딩에 의해 조건화된 출력 값(ppt에서 orange box)에 의해 target sentence 가 생성되기 때문입니다. 
Decoder의 시작 토큰을 <START>를 디코더에 주입하고 계산을 통해 예측하는 데 이용되는 hidden state에 소스 문장의 인코딩 값을 사용하는 것입니다. 

 

그렇게 우리는 디코더로부터 첫번째 출력을 얻고, 다음에 어떤 단어가 나올지 확률분포를 구합니다. 그것을 argmax를 취하여 예측 단어를 얻습니다. 

 

디코더가 최종 토큰을 만들어낼때까지 이 작업을 반복하고, 멈추게 됩니다.

 

여기서 일어나는 모든 일들은 TEST TIME에서 일어나는 일입니다. 학습할 때 어떤 일이 일어나는지는 이후 설명하겠습니다.

 

Seq2seq 는 다양하게 사용됩니다

 

- 요약 (긴 문장을 짧게)

- 대화 (이전 발화에서 다음 발화를 예측)

- parsing (전체 텍스트를 문장으로 나눔)

- 코드 생성 (일반 언어를 파이썬 코드로)

 

이번장은 NMT에 대한 전체적인 설명입니다. 

이전 장에서도 말했다시피, sequence to sequence 모델은 conditional language model입니다.

decoder에서 y 가 주어졌을 때 다음 문장을 예측하여 문장을 만드는 language model이고, 

encoder의 output에 의해 예측이 가능하니까 conditional입니다. 

 

NMT의 Probability는 해당 수식으로 구합니다.

P(y|x) = 소스 문장 x 가 주어졌을 때 다음 타겟 단어의 확률

           * 소스문장 x 가 주어지고 y1 이 주어졌을때 다음 타겟 단어의 확률

           * ....

           * 소스 문장 x와 지금까지의 타겟 단어 y1~ yt-1 개가 주어지면 다음 타겟 단어의 확률

 

그렇다면, 어떻게 학습할 수 있을까요?

답은 "큰 병렬 말뭉치를 얻는다"입니다. 아래에서 더 자세히 보겠습니다.

 

 

 

학습 시에 일어나는 일을 설명하는 부분입니다.

 

먼저 우리는 큰 병렬 말뭉치에서 문장 쌍을 얻습니다. 
소스 문장을 인코더 RNN에, 타겟문장을 디코더 RNN에 입력하고, 인코더 RNN의 final hidden state를 디코더의 initial hidden state로 입력합니다. 

그리고 디코더의 모든 스텝에서 확률 분포 y^(y hat)을 만듭니다. 

여기서 loss 값을 계산합니다. 

그리고 이 loss는 unconditional language models에서 봤던 것과 같이 

교차 엔트로피가 될 수도 있고, 실제 다음 단어의 negative log-likelihood  가 될 수도 있습니다. 

예를 들어 선택된 단어에서 loass 값을 실제 다음 단어의 negative log probability입니다.

우리는 모든 손실의 평균을 내어 전체 손실을 예로 들 수 있습니다. 위에 보이는 J  값입니다.

 

그리고 여기 연구논문에서 말하고자 하는 것 중 하나는 이것은 end-to-end로 학습하는 예라는 것 입니다. 

backpropagation 이 end-to-end 로 일어나는데 한쪽 끝은 loss function이고, 다른 끝은 인코더 RNN의 시작과 비슷합니다.


요점은, backpropagation 이 전체 시스템을 통해서 흐른다(flows throughout the entire system)는 것이고  이 단일 손실에 대해서 전체 시스템을 학습한다는 점입니다. 

 

그리고 학생들이 질문한 몇 가지 중 제가 이해한 몇가지 질문에 대한 답을 적어보겠습니다.

 

1. 훈련 중에는 예측된 문장이 다음 input으로 들어가는 것이 아니라,

실제 정답(gold target)이 들어간다는 얘기가 있었습니다. 따라서 디코더는 손실을 계산하는 것 이외의 다른 용도로는 사용하지 않습니다. 

 

틀린 예측 결과를 넣었을 때는 학습이 효율적으로 되지 않기 때문일 것 같아 납득이 가는 부분입니다.

 

2. 왜 backpropagation end-to-end로 하느냐는 질문에는, 

이것이 전체적인 시스템을 최적화할 수 있기 때문에 end-to-end training을 유리하게 보는 것 같다고 대답했습니다. 

부품을 별도로 최적화 하기보다 시스템 전체를 최적화한다는 것이죠.

 

3. 두 개 쌍의 번역 모델에 대해 비슷한 언어들에 대한 universal 시스템을 가질 수 있을까?라는 물음에는, 

가능을 하겠으나, 이렇게 보편적인 시스템을 훈련하기 위한 시도는 많이 되었지만, 

상당히 복잡하다고 답했습니다. 

 

4. word embedding 도 우리가 타겟으로 학습시키는 말뭉치에서 나온 것일까? 

이 질문에는 몇 가지 옵션이 있다고 생각한다고 합니다. 우리는 Word2Vec 이나 GloVe와 같은 사전 훈련된 단어 벡터를 다운로드하여 사용할 수도 있고, 

이후에는 임베딩 값을 freeze 하거나, 혹은 end-to-end 학습 과정에서 fine-tune 할 수도 있고, 

혹은 그냥 0에 가까운 단어 벡터를 초기화한 값들에서 학습을 시작할 수도 있다고 말하고 있습니다. 

 



방금 전 training 과정에서 다음 단어를 예측하는 방법으로 우리는 argmax 값을 선택하는

Greedy decoding을 적용한 것을 보았습니다. 

 

이 함수에는 항상 argmax 만 선택한다는 문제점이 있고, 한 번 선택하면 다시 돌아갈(다른 단어를 선택할) 방법이 없다는 것입니다.

No way to backtrack, No way to go back.

되돌릴 방법도 없고, 돌아갈 방법도 없다는 것.

 

그렇다면, 그리디 디코딩의 문제를 어떻게 해결할 수 있을까요?

그전에, 모든 확률을 따져서(검색해서) 최적의 결과를 출력하는 방법(y 값이 최대화되는 경우)에 대해 알아봅니다. (브루트포스라고 할 수 있을까요?)

이 방법은 당연하게도 시간 복잡도가 매우 커져서 비용이 크다는 단점이 있습니다.

그래서 모든 검색을 다 하는 대신 일종의 알고리즘을 선택할 것입니다.

 

 

대안은 빔 검색 디코딩입니다.

Beam Search Decoding의 핵심 아이디어는 아래와 같습니다.

"디코더의 각 단계에서 k 개(k는 beam size)의 가장 가능성 있는 부분(=가설) 번역을 추적함)

이제 어떤 가설이 좋은지 알 수 있는 score를 어떻게 구할 수 있는지 알아봅니다.

언어 모델 확률을 구하는 것과 같습니다.

score는 x(소스문장), 이전 번역 단어들이 주어질 때 현재 단어가 올 확률의 로그 값을 모두 더한 값이 됩니다. 

score 는 높을수록 좋습니다. (가설이 맞을 확률이기 때문)

아래 예시로 자세히 설명됩니다.

 

여기서 주의할 점은 

- 빔 서치는 최적의 결과를 보장하지는 않는다는 점 

- 그렇지만 전체 탐색보다는 훨씬 효율적이라는 점! 이 있습니다. 

 







k, 즉 각 부분에서 몇 개의 가설을 선택하는지에 대한 값을 2로 정한 예제를 살펴봅니다.

<START> 토큰으로 시작하고, 다음에 올 단어의 확률 분포를 seq2seq 모델을 사용하여 계산하고 

상우 두 가지 옵션을 선택합니다. (he, I) 그리고 score function에 따라 가설의 score를 계산합니다.

다음 스텝에서 각 가설에서의 k개의 상위 옵션을 선택,,, 반복합니다. 

다음 스텝은 이전 단어(들)와 현재 단어가 올 경우의 확률에 대한 log 값과 이전 가설의 score를 더한 값이 계산됩니다.

2개의 가설에서 파생된 2개의 가설, 총 4개의 가설 중 높은 score 를 가진 상위 2개 가설에 대해서만 search를 진행합니다. (hit, was)

 

또 다음 단계에서는 높은 값을 가진 a, me 가 선택되고,, 이런 식으로 반복되면

최종적으로 마지막 스텝에서는 가장 높은 확률의 pie까지 선택합니다. (stopping rule에 대해서는 이후 자세히 설명합니다.)

 

 

pie를 선택하고 나면, 트리를 통해 backtracking 하여 전체 번역 문장을 찾습니다. 

 



언제 멈추는지 자세히 알아봅시다.

이전 Greedy decoding에서 살펴보면, 모델이 <END> 토큰을 생성할 때까지 계속 디코딩했습니다.

beam search 디코딩의 문제점은 가설에 따라 움직이다 보니, 멈출 수 있는 확실한 장소가 없다는 것입니다.

그래서 해결방법은, 

가설이 <END> 토큰을 출력해도 다른 가설에서 <END> 토큰이 나올 때까지 지속합니다.

언제까지 탐색을 지속할지에 대한 중지 방법으로는 

1. 사전에 정의한 timestep T 값에 도달하면 멈추는 것과

2. 적어도 n 개의 완성된 가설을 가질 때까지 빔 서치를 지속하는 방법이 있습니다.

 

이제 가설 모음 중 최고의 문장을 선택하고자 할 때, 각 가설의 score 만으로 답을 고르기에는 또 문제가 있습니다.

여기서 발생하는 문제는, 짧은 문장이 선택될 것이라는 점입니다

바꿔 말하면, 가설이 길수록 score는 낮다는 것입니다.

일반적으로 더 많은 확률을 곱할수록 작아져서 더 낮은 음수 값을 갖게 된다는 것입니다.

 

이 문제를 해결하기 위해 우리는 간단하게 길이에 대해 Normalize 합니다. (* 1/t)

 



이제 전반적으로 SMT와 비교할 때 NMT의 장점을 알아봅니다. 

 

1. 성능이 낫다.

유창함, 문맥 표현이 더 낫고, 구문의 유사성에 따른 성능이 더 좋다(일반화를 더 잘한다.)

 

2. end-to-end로 최적화할 수 있는 단일 신경망이라는 점.

SMT처럼 개별적으로 최적화해야 하는 subcomponent들이 없다는 점에서 훨씬 편리하다는 점이 있습니다. 

 

3. 인간의 노력이 덜 든다.

feature engineering을 할 필요가 없고, 모든 언어 쌍에 대해 거의 동일한 방법이 사용됩니다.

 

반면에, 단점은 

1. 해석력이 낮다.

end-to-end 방식으로 내부에서 어떤 방식으로 학습이 이루어지는지 디버깅이 상대적으로 힘들다는 점입니다. 

2. 다루기 힘들다.

SMT에서는 규칙을 정하여 프로그래밍하면 되었지만, NMT 시스템에는 단계별로 수행 작업을 정의할 수는 없습니다.

이것을 NMT 시스템에서 특정한 나쁜 단어를 말하는 것에 대해서 제어하기 힘들다는 의미이기도 합니다. 

전/후처리를 하면 되겠지만 전반적인 제어는 매우 힘듭니다. 

 

이제 NMT의 평가방법을 알아봅니다.

주로 사용되는 평가지표는 BLEU입니다. 

주요 아이디어는 

기계 번역 시스템에서 생성된 번역과 사람이 적은 번역(들)을 n-gram precision, 짧은 문장에 대한 페널티를  부과하는 등을 기반으로 하는 similarity score를 구하는 것입니다. 

* 짧은 문장에 대한 페널티를 넣는 이유는, 시스템에서 생성된 결과가 정말로 확실한 단어만 넣은 짧은 문장일 때 이것이 무조건 좋은 번역이 아님에도 불구하고 n-gram precision 가 최대화될 수 있기 때문입니다. 

 

BLEU는 유용하나, 완벽하지는 않습니다. 

번역 결과가 다양해도 hand written 번역 결과와 다르면 무조건 낮은 score 가 나오기 때문입니다.

 



이제 BLEU 스코어로 NMT 가 얼마나 단기간에 발전했는지를 살펴보겠습니다.

빨간, 파란 막대그래프는 두 종류의 SMT의 발전 속도에 비해 NMT는 1년 사이에 기존 시스템의 score 를 넘어선 것처럼 아주 빠르게 진행됩니다.

NMT 는 정말 NLP 딥러닝에서 큰 성과를 보였습니다.

2014년에 seq2seq 모델이 발표되었고, 2년 후 구글은 번역 모델을 SMT에서 NMT로 변경했습니다.

 

구글에서는 SMT 번역 시스템을 위해 수년 동안 수백 명의 엔지니어를 통해 개발된 시스템인 것 에 반해, 

NMT 번역시스템은 몇 달 만에 소수의 엔지니어가 구축했습니다.  

이것만 봐도 2년 만에 적은 사람의 노력으로 구축한 성과라고 볼 때 상당히 놀랍다! 고 볼 수 있습니다. 

 





하지만 NMT로 기계번역 분야는 모두 해결되지는 않았습니다. 

위의 예시들처럼 아직까지 다양한 문제가 존재합니다.

OOV 문제와(paper jam을 스페인어로 식용 잼으로 번역),

사용하려는 분야가 다를 때 발생하는 문제(위키피디아로 학습한 모델을 트위터 채팅에 적용, 훈련 데이터에서 각 직업에 대한 성별에 biase가 있는 경우 소스 문장에는 없는 gender 정보를 구성하는 오류가 발생),

긴 문장에서의 문맥 유지,

그리고 리소스가 부족한 언어 쌍, 혹은 같은 음절을 반복하는 이상한 문장일 경우 학습된 모델에서 문장을 랜덤하게 generate 하는 문제(주로 언어쌍 정보가 충분한 성경의 번역)가 생길 수 있습니다. 

 

그리고 이 강의가 진행되는 2019년에도 

NMT 연구는 계속해서 진행되고 있습니다. 많은 논문이 소개되고 있고요.

이렇게 소개된 많은 논문은 주로 "vanilla" seq2seq 의 많은 개선점을 찾아내고 있습니다.

 

하지만 seq2seq에 매우 필수적인 한 가지 개선사항이 있어서 이것은 새로운 vanilla로 여겨집니다.

이것은 ATTENTION입니다.

 

ATTENTION 은 다음 포스트에 다루겠습니다. 

 

반응형

댓글