rueki

어텐션 메커니즘 (Attention) 본문

DL/NLP

어텐션 메커니즘 (Attention)

륵기 2020. 4. 18. 23:11
728x90
반응형

Attention이 등장하고, 기계번역의 품질이 월등히 좋아졌는데, Attention에 대해서 오늘 알아보는 시간을 가지고자한다.

어텐션의 기본 정의는 "원 문장의 어떤 단어들에 더 주목할 것인가?" 라고 해석하면 이해가 쉽다.

 

즉, 다시 말해서, 예를 들어 I say hello, you say good bye 라는 문장이 들어왔을 때,

이를 전체 문맥 및 문장으로 가정하고, 매 시점마다 어떤 단어에 집중을 해야하는 지 동적으로 정하기 위함이다.

 

기존 RNN 기반의 Seq2Seq 구조에서는 Encoder의 마지막 context vector만 사용한다는 단점이 있었으나,

Attention을 사용하면, Encoder에서의 각 Time step에서의 Context vector를 넘겨줌에 따라 이의 단점을 해결할 수가 있다.

 

출처 : https://jalammar.github.io/illustrated-transformer/

이제 본문으로 넘어가서, attention 메커니즘에 대해서 알아보자.

 

먼저 어텐션을 설명하기 전에, 어텐션 적용 전의 구조에 대해서 알아볼 필요가 있다.

기존의 구조에서는 원 문장이 Encoder에 들어올 때 하나의 Vector에 압축해서 들어오는 데,

고정된 벡터의 길이를 가지게 된다.

즉 Context가 고정이 된다는 뜻인데, 이는 문장이 길 수록 성능이 저하된다는 단점이 있다.

이의 메커니즘을 아래 수식으로 볼 수가 있다.

 

Encoder

Input : $X = \left\{{x_{1}, x_{2},...,x_{n}}\right\}$

hidden_state : $h_{t} = f(x_{t},h_{t-1})$

Context vector : $q(\left\{{h_{1},...,h_{t}}\right\})$

                     $q$ is non-linear fuction

 

Decoder

previous words : $\left\{y_{1},...,y_{t-1}\right\}$

$P(y_{t}|\left\{y_{1},..,y_{t-1}\right\},c)
= g(y_{i-1},s_{i},c)$

$s_{i}$ is i index of hidden states


이제 Attention 메커니즘에 대해서 살펴보도록 하겠다.

위에서 언급했던 것을 다시 가져와서 설명하자면, 기존 RNN에서 마지막 hidden state를 디코더에 전달하면서 발생하는 단점을 Attention을 통해서 Decoding step에서 어떠한 부분에 집중할 수 있다는 장점이 있다는 것을 알아야한다.

 

Encoder는 Bidirectional-RNN으로, forward 및 backward를 통해 hidden state vector를 생성하고,

각 단어별로 두 vector를 합쳐서 하나의 vector로 만드는데 이를 Annotations라고 한다.

 

Encoder에서 각 step의 Annotation과 Decoder의 이전 hidden state vector를 forward 계산을 통해 $e_{i,j}$라는 Energy Score, 즉 정수 Score를 얻을 수가 있다. 이 점수를 Softmax함에 따라 어느 시점에 집중을 할지에 대한 값을 얻을 수가 있으며, 이 값을 각 state의 Annotation에 곱하고, 전체 합을 진행하면 Context vector를 얻을 수 있게 된다.

얻어낸 Context Vector를 가지고 디코더의 이전 hidden state vector와 이전 출력을 가지고 다음 출력을 얻을 수가 있다.

 

여기서 집중해야하는 것은 Context vector -> $C_{i} = \sum_{j=1}^{T_{x}}a_{i,j}h_{j}$인데, 이는 context가 target에 관련된 input의 중요도를 반영한다는 점이다.

식을 설명하면 hidden layer * Weight a (Score)이고 i - target index, j - input index이다.

 

수식으로 Attention을 설명해보자.

Annotations : $h_{j} = [\rightarrow h_{j}; \leftarrow h_{j}]_{concat}$

 

Energy Score : $e_{i,j} = a(s_{i-1},h_{j})$ $s_{i-1}$은 Decoder에서 이전 hidden state

                   새로운 State S를 생성하기 위해  $h_{j}$ 가 이전 state인 $s_{i-1}$에 미치는 중요도

                   뉴럴 넷에서 feed forward 시, 추가학습을 하지 않는 연산

 

Softmax(Weight) : $a_{i,j} = \frac{\exp(e_{i,j})}{\sum_{k=1}^{T_{x}}\exp(e_{ik})}$

                        어느 시점에 집중할 것인가?

 

Context vector : $C_{i} = \sum_{j=1}^{T_{x}}a_{i,j}h_{j}$

                      i번째 단어의 번역위해 원 문장의 모든 단어 중요도를 고려한다.

                      Encoder의 hidden state에 대해 가중평균을 담는다.

                      목표문장의 i번째 단어와 관련성 높은 은닉층에 높은 가중치를 부여하게 된다.

 

Decoder hidden state

Prob : $P(y_{t}|\left\{y_{1},..,y_{t-1}\right\},X)  = g(y_{i-1},s_{i},c_{i})$

 

 

 

 

 

 

 

 

 

728x90
반응형

'DL > NLP' 카테고리의 다른 글

(NLP in TensorFlow) 3. Padding  (0) 2020.03.25
(NLP in TensorFlow) 2. Text to Sequence  (0) 2020.03.24
(NLP in TensorFlow) 1. 단어 기반 인코딩  (0) 2020.03.24
글로브(Glove)  (0) 2019.07.04
패스트텍스트(FastText)  (0) 2019.07.04
Comments