Computing

Transformer 정리 (1) : Attention (Neural machine translation by jointly learning to align and translate) 본문

Deep Learning/개념

Transformer 정리 (1) : Attention (Neural machine translation by jointly learning to align and translate)

jhson989 2022. 5. 18. 20:59

Transformer 정리 첫 번째 순서로 attention mechanism에 대하여 정리하고자 한다. 논문 [1]은 neural machine translation (NMT) 분야에 처음 attention 개념을 제안한 논문으로, 기존 NMT 분야에 사용되던 encoder - decoder 구조의 문제점 지적 및 그것을 해결하기 위한 추가적인 attention layer를 소개한다.

 

 

 

기존 Encoder - Decoder 구조의 문제

Fig 1. 기존 Encoder - Decoder 구조 예시 [2]

 

Fig 1. 은 NMT 문제를 해결하기 위해 가장 기본으로 사용되는 encoder - decoder (or seq2seq) 네트워크 구조를 나타낸 것이다. 위 예제는 독일어를 영어로 번역하는 예제이다. 

 

Encoder는 번역하고자 하는 문장 하나를 하나의 fixed length vector로 encode시키는 용도이다. Encoder는 독일어 한 단어씩을 입력으로 받아 encoder RNN의 hidden state로 기억한다. 독일어 문장의 모든 단어에 대하여 순차적으로 이 과정을 마치면 최종적으로 RNN의 hidden state는 번역하고자 하는 독일어 문장을 나타내는 single encoded vector가 된다. Encoded vector는 Fig 1. 속 초록색 박스로 표시되었다.

 

Encoder에 의해 encode된 독일어 문장은 (= encoded vector, 초록색 박스)는 decoder에 의해 해석되어 영어 문장을 출력하는데 사용된다. Fig 1.에서 보듯 decoder RNN은 encoder의 최종 출력값인 encoded vector와 함께 이전 영어 단어를 입력으로 받아서, 현재 영어 단어를 출력한다. 이를 식으로 나타내면 Eq 1. 과 같다. S는 encoder의 최종 출력 state를, H는 decoder의 hidden state, y는 영어 단어, Y는 영어 문장, g는 nonlinear funciton (여기서는 RNN)을 의미 한다.

Eq 1. 현재 영어 단어가 나올 확률
Eq 2. 영어 문장의 확률

Decoder는 encoder의 최종 출력 state가 주어졌을 때, Eq 2.의 확률를 최대로 하는 영어 문장 Y를 출력한다. 따라서 decoder의 결과는 encoder의 최종 결과에 종속적이다. 그렇기에 encoder의 결과는 원래 문장의 모든 의미를 잘 담아둘 수 있어야 한다. 하지만 기존의 encoder - decoder 구조로는 이러한 encoding 과정이 실패할 수 있다. Encoder는 문장의 모든 단어를 하나의 고정된 크기의 vector S에 encode하여 담고, decoder는 S에만 의존하여 문장을 번역한다. 문장이 길어져 단어가 많아질수록 고정된 크기의 vector S에 담기지 못하고 잊혀지는 단어가 많이 생길 것이다. 따라서 고정된 크기의 vector S에 임의 길이의 문장의 모든 정보를 담는다는 것에는 한계가 있을 수 있다.

 

 

 

Attention Mechanism 

Fig 2. Attention 기법을 추가한 Encoder - Decoder 구조 에시 [3]

 

Attention mechanism은 encoding 과정에서 발생할 수 밖에 없는 정보의 손실을 해결하기 위해 제안된 방식이다. Fig 2. 는 attention 기법을 잘 설명해주는 그림이다. Fig 1. 과 같은 기존의 encoder - decoder 구조에 추가적으로 attention 개념 (attention weights, context vector, attention vector) 이 추가되었음을 확인할 수 있다.

 

Attention 기법이 적용된 encoder - decoder 구조는 기존과 마찬가지로 encoder의 출력을 decoder가 받고, 이를 기반으로 번역된 문장을 출력한다. 다만 encoder가 압축한 출력 vector에만 의존하지 않고, encoder가 확인한 모든 단어의 정보까지 확인하는 과정인 attention 과정이 추가되었다. Attention(주의, 주목)이라는 용어 그대로, attention의 목적은 decoder가 현재 출력하고자 하는 단어를 알기 위해서 번역 전 문장의 어디를 집중해서 봐야 하는 지를 가르쳐주는 것이다. 위 예시에서 decoder가 프랑스어 Je (=나) 를 출력하기 위해서는 영어 문장 "I am a student"에서 단어 "I"에 집중 (attention) 해야 한다는 것을 알 수 있다.

 

어느 정도 집중해야 한다는 것을 수치로 나타낸 것이 attention weights이며, 모든 영어 단어에 대하여 번역하고자 하는 시점 t에서 그 단어를 얼마만큼 고려해야 하는 지를 나타내는 확률이다. 즉 decoder는 번역될 단어를 추론하는 과정에서 번역 전 문장의 모든 단어를 참고할 수 있다. 따라서 encoder에 의한 정보 손실에 상관없이 번역 전 문장의 정보를 모두 고려하여 번역을 진행할 수 있게 된 것이다.

 

Context vector는 encode된 영어 단어들의 attention weights에 따른 weights sum이며, 쉽게 context vector는 현재 단어를 추론하기 위해서 문장의 어디 부분을 얼만큼 봐야 하는 지를 포함하고 있다고 생각해도 좋을 듯 하다. 이 context vector와 함께 t시점의 decoder의 hidden state를 고려하여 attention vector를 생성한다. attentin vector를 바탕으로 최종적으로 t 시점에 출력되어야 할 단어를 추론한다. 

 

t시점의 decoder의 hidden state와 s번째 encoder의 hidden state와의 attention weight α는 Eq 3. 와 같다. H는 decoder의 hidden state, S는 encoder의 hidden state이다. score 함수는 일반적으로 dot product를 사용한다.

Eq 3. Attention weight

t시점의 context vector는 Eq 4.와 같이 encoder의 hidden state의 weighted sum이다.

Eq 4. Context vector

 

 

 

 

Attention Mechanism에 대한 개인적인 생각

Attention 기법은 결국 모든 단어 대 단어의 관계, 즉 all-to-all 관계 파악을 위한 단계를 추가한 것이다. 현재 추론하고자 하는 단어와 번역 전 문장의 모든 단어 사이의 관계를 추론하여 어디를 집중해서 봐야 하는 지를 구하겠다는 것인데, 이는 fully connected layer와 같은 맥락일 것이다. 즉 번역 전 단어와 번역 후 단어와의 관계도 딥러닝 네트워크가 직접 자유롭게 학습해서 추론하라는 의도라고 생각이 든다.

 

언어의 경우 번역 전 문장과 번역 후 문장 사이의 연관 관계는 인간이 미리 설정해두기 어렵다. 예를 들어 영어를 한국어로 바꾸는 문제에서, 한국어의 첫 번째에 올 단어는 영어의 첫 번째에 올 단어를 보면 된다고 생각하고는, 이를 바탕으로 딥러닝 네트워크를 설계한다면 필히 좋지 못한 결과를 야기할 것이다. 그렇기에 이러한 all-to-all로 모든 것을 네트워크가 직접 고려할 수 있게끔 fully connected layer를 도입하는것이 더 좋을 것이라는 생각이 든다.

 

다만 fully connected layer는 매우 학습할 parameters가 많은 단점이 있다. 컴퓨터 비전 분야에서 초기 fully connected layer로 구성된 multi-layer perceptron 개념들이 점점 사라지고, 대부분의 네트워크가 convolution layer를 기반으로 바뀌어왔던 것도 이러한 이유 때문일 것이다. Fully connected layer만으로 깊게 layer들을 쌓기에는 학습 시간 및 용량 문제가 두드러질 것이고, 따라서 convolution layer와 같은 structured sparse layer를 사용해왔다고 생각한다. 컴퓨터 비전 영역의 경우 FC layer가 아닌 convolution layer만으로 local feature를 뽑아가면서 추상화해가는 것이 논리적으로 어느정도 맞았기에 이러한 CNN의 성공이 가능하지 않았나 싶다.

 

최근 transformer 개념을 컴퓨터 비전 영역에 도입하려는 연구가 활발히 진행되고 있다. 자연어 처리 분야뿐만 아니라 컴퓨터 비전 영역에도 fully connected layer의 시대가 다시 돌아오는가 싶다. (이는 하드웨어의 발전 덕분일 것이다. 소프트웨어는 하드웨어의 발전에 종속적일 수밖에 없을 것이다. 빠른 하드웨어가 나오지 않았다면 어떻게 수십억개의 parameter 학습이 reasonable한 시간안에 가능했겠는가?) CNN이 가지고 있던 pooling layer에 의한 정보의 손실 문제도 이제는 해결될 수 있지 않을까 생각이 든다.

 

 

 

Reference

[1] Bahdanau, D., Cho, K. H., & Bengio, Y. (2015). Neural machine translation by jointly learning to align and translate. Paper presented at 3rd International Conference on Learning Representations, ICLR 2015, San Diego, United States.

[2] http://www.adeveloperdiary.com/data-science/deep-learning/nlp/machine-translation-recurrent-neural-network-pytorch/

[3] https://medium.com/syncedreview/a-brief-overview-of-attention-mechanism-13c578ba9129