본문 바로가기
AI/딥러닝 기초(Deep learning)

[NLP] Attention Mechanism(어텐션)

by Hyen4110 2021. 5. 12.

이 글은 아래 사이트의 글과 udemy의 'deep learning advanced nlp(Lazy Programmer)의 강의를 정리한 내용입니다.

https://www.udemy.com/course/deep-learning-advanced-nlp/

towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3

 

Attn: Illustrated Attention

Attention in GIFs and how it is used in machine translation like Google Translate

towardsdatascience.com

1. Attention 등장 배경

- 수십년간 통계적 기계번역(Statistical Machine Translation)은 번역 모델에서 가장 일반적었지만, 신경망 기계번역(Nueral Machine Translation,NMT)의 등장으로 달라졌습니다. NMT는 텍스트를 입력하면 번역을 출력하는 신경망을 학습하고 만드는 시도로 기계번역 분야의 새로운 떠오르는 접근 기법이 되었습니다.  NMT의 선구자는 Kalchbrenner and Blunsom (2013), Sutskever et. al (2014) and Cho. et. al (2014b)이며, 이 중에서 Sutskever et. al의 sequence-to-sequence(seq2seq) 모델에 대해서 지난 글에서 살펴보았습니다.

 

2021.05.12 - [자연어처리(NLP)] - [NLP] Sequence to Seqence(Seq2Seq)

 

[NLP] Sequence to Seqence(Seq2Seq)

이 글은 아래 유뷰트 강의, 사이트 내용, udemy 강의 'Deep Learning: Advanced NLP and RNNs' 을 정리한 글입니다. www.youtube.com/watch?v=bBBYPuVUnug d2l.ai/chapter_recurrent-modern/seq2seq.html www.udem..

hyen4110.tistory.com

- 요약하자면, seq2seq의 핵심은 2개의 RNN을 encoder-decoder 아키텍처 형식으로 만드는 것입니다. 입력 단어를 하나씩 읽은 후 정해진 차원의 vector 표현을 얻은 후 또 다른 RNN(decoder)에서 이 벡터를 입력값으로 하여 한단어 한단어 추출하는 것입니다. 그러나 seq2seq에도 여러가지 한계점이 있습니다.

 

[seq2seq의 한계점]

: "긴 입력 시퀀스를 하나의 고정된 크기의 벡터로 압축하면서 정보손실 발생"

- seq2seq의 문제점은 decoder가 encoder로부터 받는 유일한 정보는 encoder의 마지막 은닉상태(위의 이미지에서 빨간색 노드2개)로, 입력 시퀀스를 숫자로 요약한 하나의 벡터 표현에 불과하다는 것입니다. 따라서 긴 입력 텍스트에서 대해서도 decoder는 단지 이 하나의 벡터 표현이 입력 시퀀스를 충분히 요약하기를 바라며 번역을 출력할 수밖에 없습니다. 이것은 큰 정보손실로 이어질 수 있습니다. 

- 그렇다면, decoder에 단 한번의 벡터 표현을 주는 대신에 encoder의 매 time step으로부터 하나씩 벡터표현을 추출하면서, 또 중요한 단어에 집중할수 있도록 할 수 있다면 어떨까요? 이것이 바로 attention입니다. 

- attention은 출력단어를 예측하는 시점마다 encoder의 입력시퀀스를 참고하되, 예측할 단어와 연관이 큰 단어에 더 집중해서 참고하는 방법입니다. 

https://trungtran.io/2019/03/29/neural-machine-translation-with-attention-mechanism/

 

[RNN 기반 모델의 한계점] 

: "Vanishing Gradient 문제"

- 기본 RNN 모델에서 발생한 'long-term dependency' 문제를 LSTM와 GRU에서 해결이 되었다고는 하지만, 과연 얼마나 긴 입력 시퀀스에 대해서도 무사할 수 있을까요? 입력 시퀀스가 1000문장 정도 된다면 아마 불가능할 것입니다. 

 

2. Attention 이란?

 

[Attention 역할]

- Attention은 encoder와 decoder사이의 인터페이스로 모든 encoder의 은닉상태로의 정보를 decoder에게 전달하는 역할을 합니다.

- 이러한 구조는 모델이 선택적으로 입력 시퀀스의 유용한 부분에 집중할 수 있도록 하며, 그들 사이의 alignment를 학습합니다. (*alignment란? 번역 전 텍스트 부분을 번역 후 부분과 연결하는 것) 

[Seq2Seq vs Attention]

Seq2Seq Attention
h(T) = s(0)

- Encoder의 마지막 hidden state h(T)와 Decoder의 hidden state s(0)가 같음



s(0)=0

- 더 이상 h(T)만 고려하는 것이 아니라, 모든 h(hidden states)를 고려함 

- 모든 h값들이 attention 계산기를 통해 하나의 context 벡터로 출력되어 어떤 것을 우리가 가장 

[Query, Key, Value]

- Attention에서 Encoder의 모든 hidden_state 중에서 어디에 더 집중할 것인가를 Query, Key, Value를 통해서 구합니다.

- 기존의 딕셔너리 구조(key-value)에서는 key와 정확하게 일치해야 value를 가져왔으나, attention에서는 Queryd와 Key의 유사도에 따라서 Value를 반환합니다. 

Query, Key, Value는 무엇인가? 

    - Query : 현재 time-step의 decoder의 output

    - Keys : 각 time-step 별 encoder의 output

    - Values : 각 time-step 별 encoder의  output

 

 

[Attention의 유형]

- Cho. et. al (2014b)의 논문에 등장하는 attention은 2가지 유형이 있습니다.

  1) 'global attention' : 모든 encoder의 은닉상태들을 사용하는 attention

  2) 'local attention' : encoder의 은닉 상태의 하위집합(subset) 만을 사용하는 attention

- 이 글의 범위는 global attention 에 대한 것으로, "attention"의 용어는 "global attention"을 의미한다고 보시면 되겠습니다. 

 

 

 

3. Attention의 원리

3.1 Attention의 직관적 이해

- attention이 어떻게 쓰이는지 들어가기 전에, 번역과 seq2seq 모델을 사용하는 것에 대한 직관적인 이해를 위해 설명을 해보고자 합니다.

[seq2seq에 대한 직관적인 이해]
- 한 번역가는 독일어를 처음부터 끝까지 읽습니다. 그 일이 끝나면, 그는 단어들을 하나씩 영어로 번역하기 시작합니다. 이때, 만약 문장이 과도하게 길다면 그는 아마 앞쪽 텍스트에서 무엇을 읽었는지를 잊어버렸을 것입니다. 이것이 간단한 seq2seq 모델의 이야기입니다. 이제는 seq2seq모델에 attention이 추가된 모델을 이야기해보겠습니다. 

[seq2seq+attention에 대한 직관적인 이해]
- 한 번역가는 독일어 텍스트를 처음부터 끝까지 키워드를 적으면서 읽은 후 영어로 번역을 시작합니다. 각 독일어 단어를 번역할때, 그는 그가 적어놓은 키워드들을 활용합니다.

- 위의 간단한 비유에서 본 바와   같이, Attention은 각 단어에 점수를 부여함으로써 서로 다른 단어에 다른 초점을 둡니다. 그리고 소프트맥스된 점수를 사용하여 encoder의 은닉상태의 가중치가 부여된 합을 사용하여 encoder 은닉상태를 통합합니다. 이를 통해서 최종적으로 context 벡터를 얻습니다. 

- 즉 정리하자면 attention에서는 출력단어를 예측하기 위하여 attention 점수를 새롭게 사용하는데, 이것은 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태 s(t)와 얼마나 유사한지를 판단하는 스코어값입니다(https://wikidocs.net/22893)

 

3.2 Attention의 구조 

 

- Decoder의 입력값은 2개로, Decoder의 전 은닉상태인 s(t-1)과 timestep t 시점에서의 convex vector 입니다. 

 

- Decoder은 기본 LSTM으로, time step 별 한 단어씩 생성하기 때문에 Bidirectional LSTM은 쓰지 않습니다

 

- context vector는 decoder에 존재하는 모든 은닉상태들의 가중치가 부여된 평균값(weighted average)입니다. 

 

- attention weight(α) : decoder에서 특정 time step에 단어를 생성하기 위해서 각 은닉상태가 얼마나 중요한지 알려주는 가중치로, decoder 의 time step별 context vector를 구하는데 쓰입니다. 

 

<attention weight의 계산>

- 'S(t-1)'의 의미

: h(t')와 함께  s(t-1)을 고려하는데, 이때 s(t-1)는 "출력값에서 현재 내가 어디에 위치하고 있는가"라는 문맥에 대한 정보를 의미합니다. (만약 s(t-1)이 없다면, 모든 step에서의 attention weight는 같은 값일 겁니다.)

: 즉, 내가 어떤 입력 단어에 집중(attention)해야할지는, 현재 생성하려고 하는 출력 단어가 무엇인가에 따라 달라집니다. 

 

https://www.udemy.com/course/deep-learning-advanced-nlp/

 

- 왼쪽은 udemy의 수업 'deep learning advanced nlp(Lazy Programmer) 에서 나온 수도코드입니다.

 

- 매 time step 마다

1. alpha(attention weights)값은 다시 계산

2. alpha와 은닉상태값을 받아서 context vector 생성

3. 출력값과 은닉상태가 만들어지며, 출력값을 softmax 가있는 dense layer에 통과하여 최종 단어를 선택

 

 

 

 

<수식으로 이해하는 attention>

 

 

 

3.3 Attention 단계별 이해

[Step 0] 은닉상태들을 준비한다. (Getting ready to pay attention)

 

 

- encoder의 은닉 상태들(녹색)과 decoder의 첫번째 은닉상태들(갈색)을 준비한다.

 

- encoder의 마지막 통합 은닉상태는 decoder의 첫번째 time step으로 입력된다.

 

- decoder의 첫번째 time step의 출력값은 decoder의 첫번째 은닉층이라고 부른다.

 

 

 

 

[Step 1] 모든 encoder 은닉상태에서 점수를 구한다. (Get the scores)

- 점수는 score function(alignment function 또는 alignment model이라고도 함)에 의해서 구해진다.

 

- 예제에서 score function은 encoder과 decoder의 은닉상태간의 점곱으로 구한다. scroe function은 점곱 외에도 다양한 종류가 있다. 

 

- 이것은, 다음 단어(decoder에 의한 다음 출력)이 encoder의 은닉상태에 의해 크게 영향을 받는다는 것을 의미한다.

 

 

<- 각 encoder의 은닉상태에 decoder의 은닉상태를 곱해서 하나의 은닉상태별 하나의 스칼라 값이 구해진 것을 볼 수 있습니다.

 

 

 

 

[Step 2] 구한 점수들을 소프트맥스 함수를 통과시킨다. (Get the softmaxed scores)

 

 

- 위에서 구한 점수들을 softmax 층에 통과시켜 softmaxed score 스칼라값의 총합이 1이 되도록 만든다. 

 

- 이 softmaxed scoreattention distribution을 나타낸다. 

 

 

 

 

- softmaxed score인 score^을 보면, attention의 분포는 encoder의 은닉상태들 중에서 [5,0,1] 에만 부여된것을 볼 수 있습니다.

 

- 왼쪽에서는 softmaxed score 값이 0 또는 1로 구성되어있지만, 실제로는 0에서 1사이의 실수입니다. 

 

 

[Step 3] encoder 각 은닉상태를 softmaxed score로 곱한다(Get the alignment vectors)

 

- 각 encoder 은닉상태를 그 자신의 softmaxed score(스칼라값)으로 곱함으로써, algnment vector(또는 annotation vector)을 얻을 수 있다.

 

 

 

 

 

 

 

 

- encoder 은닉상태들 중에서 [5,0,1]을 제외하고는 모두 softmaxed score가 0이어서 alignment vector가 0벡터가 됨을 확인할 수 있습니다.

- 이것은, 처음으로 번역되는 단어는 [5,0,1] 임베딩 값과 입력단어를 매칭해야함을 의미합니다. 

 

 

[Step 4] aligment vector을 합한다. (Get the context cevtor)

 

- alignment vector 들은 모두 합산되어 context vector가 됩니다. 즉, context vector는 위에서 구한 alignment vector의 통합된 정보입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[Step 5] context vector를 decoder에 넣는다 (Feet the context vector to decoder)

 

- context vector를 decoder에 넣는(feed) 방법은

 

아키텍처 설계에 따라 다르다. 

 

 

 

 

 

 

 

 

 

 

 

 

4. Attention의 종류

- 지금까지 우리가 알아본 Attention은 사실 다양한 Attention 중 하나에 불과합니다. Attention은 'alignment score function'의 종류에 따라 아래와 같이 나뉩니다.

 

- 이 글에서 배운 Attention은 Dot-product attention으로, 2015년 Luong에 의해 제안된 attention이며 이름을 따서 Luong Attention(루옹 어텐션)이라고도 부릅니다.  

https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html#summary
https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3

 

- 위의 여러가지 Attention 중에서 Bahdanau Attention(바다나우 어텐션)을 다음 글에서 살펴보도록 하겠습니다. 

2021.05.16 - [자연어처리(NLP)] - [NLP] Bahdanau Attention(바다나우 어텐션)

 

[NLP] Bahdanau Attention(바다나우 어텐션)

이 글은 아래 사이트 페이지를 정리한 글입니다. https://medium.com/analytics-vidhya/neural-machine-translation-using-bahdanau-attention-mechanism-d496c9be30c3 Neural Machine Translation using Bahdanau..

hyen4110.tistory.com

 

[그 외]

1. 기계번역의 시작부터 attention의 등장까지 전체적인 흐름을 이해하기 좋은 글(재밌음)

https://medium.com/analytics-vidhya/neural-machine-translation-using-bahdanau-attention-mechanism-d496c9be30c3

 

Neural Machine Translation using Bahdanau Attention Mechanism

Table of Contents

medium.com

 

2. 시각화가 잘되어있어 쉽게 이해하기 좋은 글

https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

 

Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)

Translations: Chinese (Simplified), Japanese, Korean, Russian, Turkish Watch: MIT’s Deep Learning State of the Art lecture referencing this post May 25th update: New graphics (RNN animation, word embedding graph), color coding, elaborated on the final at

jalammar.github.io

 

댓글