티스토리 뷰

이번 수업에서는 지난 주에 이어서 계속해서 뉴럴넷을 기반으로 한 자동 번역을 배우는데, 좀 더 깊이 들어가서 거기에 쓰이는 attention mechanism 과 Decoder 성능을 어떻게 향상시킬 수 있는지에 대해 다룬다. 

1. Machine translation with neural networks 


NMT 는 기본적으로 Encoder 와 Decoder 로 이루어져 있다. Encoder 는 인풋을 hidden state 로 바꾸는 역할이고, Decoder 는 이걸 바탕으로 번역을 generate (생성)하는 구조라고 보면 된다. Encoder 의 마지막 부분이 인풋 문장 전체에 대한 정보를 담고 있다고 보면 되고, 디코더는 이 마지막 hidden state 를 바탕으로 번역을 생성하는 것이 특징이다. 




여기서도 보면 알 수 있듯이 Encoder 가 마지막 hidden state 까지를 생성하면 이걸 바탕으로 Decoder 가 번역 문장을 생성해낸다. 여기서 중요한게, Decoder 사실상 recurrent language model 와 매우 흡사하게 작동한다는 거다. 교수님은 Decoder 를 conditional recurrent language model 이라고 했다. 차이점은 출력값이 source sentence + last previous hidden state 에 conditioned 된다는 것. 좀 더 자세하게는 아래 그림을 보자. 




예를 들어 generation time step 1 을 보자. z1 을 generate 하기 위해서 쓰이는 input 은 다음의 3가지이다 : 1) 이 전에 generated 된 Z t-1 2) source text 단어 t번째 단어(?) 3) 인풋 문장 전체를 represent 하는 last previous state. 


여기에서 1) 번 때문에 이 모델이 recurrent language model 이랑 비슷하다고 하는거다. 

그리고 2)번이랑 3)번이 recurrent language model 과의 차이점이라고 할 수 있겠다. 그리고 이 2가지를 each time step of generation 에서 사용하는 거기 때문에, medium memory 를 보존해야 할 필요성이 조금 덜해진다. 



정체기에 머물러 있던 machine translation이 비약적인 발전을 할 수 있도록 한 1등 공신 NMT 의 승리요인을 뽑아보자면 다음과 같다. 


  1. input, output 만 있으면 중간 개입 없이 트레이닝 가능한 End-to-end 모델이다 (+ 그 전에는 reordering model, transliteration model 등 각각을 separate component 로 다뤄서 처리해야 했는데, NMT 는 이것까지 다 알아서 함..) 
  2. Word2vec 등 입력 단어들의 distributed representation 을 사용한다. 
  3. SMT 에 비해 훨씬 넓게 문맥을 사용하여 번역했다 (기존의 SMT 는 주로 4-gram, 5-gram 등 window 크기가 그렇게 크지 않았음.) 
  4. 굉장히 자연스러운 번역. (번역은 잘 못 됐을지언정 출력 문장 자체는 굉장히 매끄럽다) 


2. Attention mechanism 

모든 것이 Nice 해보이는 NMT 이지만, 완벽한 모델을 없지. 


지금까지 배운 모델을 Encoder 가 마지막으로 출력한 fixed-dimensional hidden state 만을 가지고 (이미지의 녹색 원 부분) generation 의 모든 과정에서 끌고 가야했음. 하지만 문장이 길어질수록 하나의 hidden state 가 전체 문장에 대한 정보를 포함하기란 사실상 어려운 일이고, 실제로 이것 때문에 문장이 길수록 번역의 질이 형편 없어지는 문제가 있었음 (절레절레..) 


그렇다면 마지막 hidden state 에서만 출력을 할 것이 아니라, encoder 가 출력한 모든 hidden state 에서 그 때 그 때 필요한 걸 찾아서 쓸 수는 없을까? 하고 생각한 것이 Attention model 의 기본 아이디어! 아래 사진을 보자. 



Encoder 가 출력한 모든 hidden state 을 pool of options, 혹은 언제나 access 가능한 random memory 처럼 보는 것임. 이걸 alignment 관점에서 볼 수도 있음. 즉, 디코더가 t 번째 단어를 출력하고 싶을 때, source text 의 어떤 단어를 봐야할지 align 하는 문제. 

예를 들어, 디코더가 'Je' 다음 단어를 출력하려고 할 때, source text (엄밀이 말하면 Encoder 가 출력한 hidden state) 의 어디를 봐야할지를 봐야하는 거임. 당연히 Je 다음 단어를 번역하려면 'am' 을 봐야겠지. 그래서 'suis' - 'am' 같이 alignment 가 되는 거임. 


이 방법이 실제로 인간 번역가가 번역을 하는 방법과도 더 유사하다고 할 수 있음. 번역사가 번역을 할 때, source text 전체를 딱 한 번 보고 번역을 우다다다다 해내는 게 아니라, 현재 단어 다음에는 어떤 단어를 번역해야 할지를 골라서 하는거니까. 




그래서 attention 모델을 쓰면 translation 과 alignment 를 동시에 배우는 거라고 보면 되는데, the European Economic Area 라는 번역을 생성해내는 과정에서 불어에서는 명사 - 형용사 어순인 점을 감안하여 Economic 다음 단어 번역을 생성해낼 때, 불어에서는 économique 앞에 위치한 zone 에 attention 을 줌. (이 부분이 attention model 을 쓰지 않는 모델과의 차이인 듯. 그 전의 Decoder 는 전체 문장을 encoding 한 last previous state와 Xt 를 인풋으로 하지 인풋의 어느 단어를 번역할지는 고려하지 않음.)





단순하게, 어느 부분에 attention 을 줄지 결정하고 그 input 만 고려해서 번역을 생성하는 것은 단순한 모델이고 (?), 실제로는 전체 pool of source 에 socre 매겨서 각 부분에 어느 정도의 attention 을 줄지 결정하는 scoring 을 사용한다. 위에서 보이는 것처럼, Encoder 의 마지막 layers 를 기준으로 모든 hidden state 에 대해서 점수를 매긴 다음에 이걸 바탕으로 attention 을 분배해서 번역에 반영한다. 그럼 이 점수를 어떻게 결정할까? 


단순하게 말하자면, target 과 source 을 비교해서 점수를 계산한다.  우선 Decoder 의 현재  step  t가 Je 를 출력할 차례라고 하자. 그럼 그 전에 빨간 네모에 동그라미가 쳐진 부분이 이 디코더의 previous hidden state 이다. 이 부분과 Encoder 의 마지막 layer 의 모든 부분을 각각 combine 에서 점수를 얻고 이 점수에 또 softmax 를 더해서 각각의 hidden state 와 곱해서 sigmoid 한 값을 context vector 로 쓴다. 이제 Zt 를 generate 하기 위해서 단순히 last hidden state 를 쓰는 것이 아니라, last hidden state 와 encoder 의 전체 hidden states 를 비교하고 계산해서 얻어진 context vector 를 쓰는 거임.



Encoder 의 hidden state hs 와, 디코더의 previous hidden state를 combine 에서 score 를 구하는 방법에는 여러가지 방법이 있다. 위 슬라이드에 나온 3가지 식을 보면, 1번째는 단순히 2개의 dot product 를 구한 것이다. 3번째는 hs 와 ht 를 concatenate 한 다음 parameter W - W는 학습되는 값 - 를 곱하고 여기에 tanh 을 씌워서 여기에 또한번 parameter v 를  - v 는 학습되는 값 - 곱하는 것이다. 2번째는 ht x W x hs 이다 (스탠포드에서 발표). 3번째 보다 2번째가 더 좋은 방법인데 왜 그럴까? 3번째 방법은 사실 생각해보면 2개의 벡터를 단순히 concatenate 해서 다른 값과 곱한 것이기 때문에, W 의 서로 다른 부분이 단순히 ht 와 hs 에 각각 곱해지는 것이다. 즉, 실제로는 ht 와 hs 사이의 interaction 이 없다. 


반대로, 2번째 식은 parameter W 가 ht 와 hs 가 interact 하는 방법을 조절하는 식이라고 볼 수 있는데, 이 parameter W 가 ht 와 hs 의 dot product 에서 어느 부분에 더 weight 을 많이 줄지를 결정하기 때문이다.  




하지만 앞서 봤듯이 Decoder 의 previous hidden state 와 Encoder 의 모든 hidden state 를 각각 곱해서 score 를 구하고 attention 을 다르게 분배하는 방법은 당연히 계산 시간도 많이 걸리고 computationally heavy 할 수 밖에 없다. 그렇기 때문에 Encoder 의 모든 부분이 아니라 subset 만을 중심으로 score 를 계산하고 attention 을 분배하는 것도 많이 사용된다.




그리고 attention 을 고루 분배하기 위해서는 2가지 방법이 쓰이는데 

1) 각각의 generation step 에서 source 의 서로 다른 부분에 attention 을 분배하도록 고의적으로 하는 방법 -> (각 부분에 대한 합이 항상 1이 되도록)

2) 혹은 다양한 generation step 에서 계속 같은 곳에만 attention 을 주면 (다른 단어를 번역하는데, 계속 한 단어만 가지고 번역한다든가) 하면 punish 하는 방법이 있다. 결국 둘 다 목적은 attention 이 한 데만 계속 집중하지 않고 고르게 분배되도록 하는 데 있다. 



3. Decoder of machine translation 

Decoder 가 번역을 생성할 때, 각 time step 에서 가장 높은 probability 를 가진 단어만을 선택해서 쭉쭉 나아가면 된다고 생각할 수 있는데 (실제로 이 방법을 greedy search 라고 한다), 실제로는 그렇게 하면 각 step 에서는 최고의 선택을 한 거지만 결과적으로 전체적인 번역을 봤을 때는 최고의 결과라고 장담할 수 없다. 


그렇기 때문에 여러 가지 번역 옵션을 고려하는 방법들이 쓰이는데 그 중 몇 가지를 살펴보자. 우선 첫번째 방법은 그냥 모든 번역 option 에 대한 가능성을 고려하는 것. 각 time step 에서 선택한 것들로부터 다음 step 에 선택한 것으로 가지를 뻗어 나가면서 가능한 모든 번역 option 을 생각하고 end of sentence 까지 나오면 complete 번역 option 중 최고의 것을 선택하는 것 -> 사실상 불가능. Unlimited number of translation optiosn because of vocabulary size... 


이게 무한하게 많은 번역 옵션을 모두 고려해야 돼서 문제라면 그걸 좀 줄이면 되지! 두번째 방법. 지금까지 Decoder 가 출력한 단어들을 바탕으로 다음 time step t+1 에서 출력할 수 있는 단어들을 미리 sampling 하고 이 단어들만을 대상으로 probability 를 계산하는 방법. 하지만 이 방법은 할 때마다 결과값이 다르게 나오고 별로 효율적인 방법도 아니라고 함. 


효율적이면서 정확도도 높은 방법!! Beam search !! 



간단하게 말하면 각각 time step 에서 highest probability 를 가진 k 개의 option 만을 가지고 가지를 뻗어나가는 것이다. 엥? 그러면 이것도 역시 기하급수적으로 option 이 늘어나지 않나? k x k x k ... -> 아님! 


예를 들어 k = 5 라고 가정하자 (k 를 beam 크기라고 하는데 neural network 에서는 beam 크기가 작아도 상당히 정확도 높다는 것이 특징 <-> SMT). Time step t 에서 5개의 highest probability 를 가진 단어를 선택했다. 각각 5 개에 대해서 다음 스텝 t+1 에서 또 5개의 highest probability 가 높은 단어를 뽑는다. 그러면 options 이 25개가 되는데, 여기에서 또 각각의 25개를 바탕으로 다음스텝에서 5 개의 최고 option 을 뽑는게 아니라, 이미 t+1 에서 나온 25개의 options 중 최고의 probability 가 있는 5개의 option 만 뽑아내고 t_+2 로 넘어간다. 즉, 각각의 time step 에서 keep 하는 options 은 5개밖에 없는 거임. 



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함