Attention Mechanism

Attention Mechanism은 Neural Machine Translation, NMT 분야에서 Seq2seq(S2S)모델 의 성능을 높히기 위해 처음 사용되었다[1-2].

S2S model Notation

name representation dimension how to get
input $x_{i=1,2.., T_x}$ $x_i \in \mathbb{Z}_{+} $ given
input’s hidden state $h_{i=1, 2,..,T_x}$ $h_i \in \mathbb{R} ^d$ encoder’s output for each step
target $y_{i=1, 2, .., T_y}$ $y_i \in \mathbb{Z}_{+}$ given
target’s hidden state $s_{i=1, 2, .., T_y}$ $s_i \in \mathbb{R} ^d$ decoder’s output for each step
context vector $c_{i=1, 2, .., T_x}$ $c_i \in \mathbb{R} ^d$ $\sum_{j=1}^{T_x}{\alpha_{ij}h_j}$
alignment vector $\alpha_{ij}$
$i\in [1, T_y]$
$j\in [1, T_x]$
$\alpha_{ij} \in \mathbb{R}$ $\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}e_{ik}}$
energy $e_{ij}$
$ i \in [1, T_y]$
$j\in [1, T_x]$
$e_{ij} \in \mathbb{R} $ $align(s_{i-1}, h_j)$
  • context vector $c_{i}$는 $y_i$에 대한 input’s hidden state에 대해 attention weights로 weight average된 벡터.
  • attention weight $\alpha_{ij}$는 $e_{ij}$를 $j$축에 대해 softmax를 취한 값이며 $[0, 1]$의 확률값.
  • energy $e_{ij}$는 decoder의 cell이 $s_i$를 output하고 $y_i$를 예측할 때 쓰는 $s_{i-1}$가 encoder의 $h_j$와 얼마나 유사한지 나타내는 scalar 값.

Description

w/o Attention

Attention Mechanism이 사용되지않은 Sequence to Sequence model은 다음과 같이 계산된다.
encoder에서 다음 그림과 같이 context vector를 decoder에게 넘겨줄때, 첫 time step에서만 넘겨주게 된다.

overview pytorch implementation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class DecoderRNN(nn.Module):
    """ w/o attention mechanism. """
    def __init__(self, hidden_size, output_size):
        super(DecoderRNN, self).__init__()
        self.hidden_size = hidden_size

        self.embedding = nn.Embedding(output_size, hidden_size)
        self.gru = nn.GRU(hidden_size, hidden_size)
        self.out = nn.Linear(hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        output = self.embedding(input).view(1, 1, -1)
        output = F.relu(output)
        output, hidden = self.gru(output, hidden)
        output = self.softmax(self.out(output[0]))
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, 1, self.hidden_size, device=device)

with Attentnion

만약 decoder에서 output할 문장이 긴 문장이면 context vector의 영향이 적어 성능이 떨어질 수 있다.
이런 약점을 보완하고자, decoder에서 매 time step마다 다른 context vecter를 만들어 단어를 output하도록 하였다.
attention mechanism이 쓰이지 않은 기존 모델과 다른 점은
decoder에서 contect vector를 모두 같은 것을 쓰거나 단순히 전파되는 것이 아니라 매 time step마다 다른 context vecter를 만든다는 점이다.
다음 그림과 같이 각기 다른 context vector는 encoder의 전체 hidden state들과 decoder의 이전 hidden state 를 바탕으로 만든다.
(그림과 구현은 [1]의 방식을 기준으로 작성 되었으며, [14]에 각 논문들 별로 구체적인 구현과정을 visualization과 함께 설명하였다.)

overview animation pytorch implementation
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
32
33
34
35
class AttnDecoderRNN(nn.Module):
    def __init__(self, hidden_size, output_size, dropout_p=0.1, max_length=MAX_LENGTH):
        super(AttnDecoderRNN, self).__init__()
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.dropout_p = dropout_p
        self.max_length = max_length

        self.embedding = nn.Embedding(self.output_size, self.hidden_size)
        self.attn = nn.Linear(self.hidden_size * 2, self.max_length)
        self.attn_combine = nn.Linear(self.hidden_size * 2, self.hidden_size)
        self.dropout = nn.Dropout(self.dropout_p)
        self.gru = nn.GRU(self.hidden_size, self.hidden_size)
        self.out = nn.Linear(self.hidden_size, self.output_size)

    def forward(self, input, hidden, encoder_outputs):
        embedded = self.embedding(input).view(1, 1, -1)
        embedded = self.dropout(embedded)

        attn_weights = F.softmax(
            self.attn(torch.cat((embedded[0], hidden[0]), 1)), dim=1)
        attn_applied = torch.bmm(attn_weights.unsqueeze(0),
                                 encoder_outputs.unsqueeze(0))

        output = torch.cat((embedded[0], attn_applied[0]), 1)
        output = self.attn_combine(output).unsqueeze(0)

        output = F.relu(output)
        output, hidden = self.gru(output, hidden)

        output = F.log_softmax(self.out(output[0]), dim=1)
        return output, hidden, attn_weights

    def initHidden(self):
        return torch.zeros(1, 1, self.hidden_size, device=device)

Family of Attention Mechanism

$e_{ij} = align(s_{i-1}, h_j)$를 계산하는 alignment model은 여러 Family 가 있다.
notation을 간결화 하기위해 $i-1$을 $t$로 치환하여 정리

Name alignment score function: $align(\mathbf{s}_t, \mathbf{h}_j)$ citation
additive $\mathbf{v}_a^\top tanh(\mathbf{W}_a[\mathbf{s}_t; \mathbf{h}_i])$ Bahdanau2015
Location-Base $\alpha_{t,i} = softmax(\mathbf{W}_a \mathbf{s}_t) $
Note : This simplifies the softmax alignment max to only depend on the target position.
Luong2015
General $\mathbf{s}_t^\top \mathbf{W}_a \mathbf{h}_i$
where $\mathbf{W}_a$ is a trainable weight matrix in the attention layer.
Luong2015
Dot-Product $ \mathbf{s}_t^\top \mathbf{h}_i$ Luong2015
Scaled Dot-Product ${\mathbf{s}_t^\top \mathbf{h}_i}\over{\sqrt{n}}$
Note: very similar to dot-product attention except for a scaling factor; where n is the dimension of the source hidden state.
Vaswani2017

어텐션 방식을 더 넓은 범위에서 다음과 같이 카테고리화 할 수 있다(서로 영역이 겹칠 수 있음).

Name How citation
Self(or intra) Relating different positions of the same input sequence. $x_{(:)} = y_{(:)}$ Cheng2016 Vaswani2017
Cross works on different sequences; $x_{(:)} \neq y_{(:)}$  
Global/Soft Attending to the entire input state space. Xu2015
Local/hard Attending to the part of input state space; $i.e.$ a patch of the input image. Xu2015;Luong2015

Cross vs Self

[4]를 바탕으로 설명하면 이해가 쉽다.

cross self(or intra)
works on different sequence relate different positions of single sequence to compute its representation

Soft vs Hard

[3]에서 기본적 아이디어 제안 됨. [3]은 image captioning을 목표로 하며 attention 구조 및 모델 overview는 다음과 같다.

[3]은 번역 문제가 아니라서 notation이 약간 다르다. 헷갈릴 수 있으니 정리하겠다.

name notation
a sub-section of an image $y_{i=1, 2, …, n}$ after CNN
context $C(= h_{t-1} )$
summary $Z$

어텐션 모델은 $y_{i=1, 2,…, n}$의 weighted arithmetic mean을 반환하며, weight는 주어진 context C에 대한 각 $y_i$의 연관도에 따라 설정된다.

soft: deterministic hard: stochastic
모든 alignment vector를 반영하여 weight average alignment vector값으로 확률적으로 샘플링
* soft hard
장점(+) 모델이 스무스하고 미분가능(differentiable)함 인퍼런스에서 더 적은 계산 비용
단점(-) 이미지가 클 때 계산비용이 큼 샘플링했기때문에 미분 불가능(non-differentiable)

Global vs Local

[2]에서 아이디어가 처음 제안 됨.

global local
to generate a target word, consider all source words
basically soft attention
to generate a target word, first predicts a source word position
use a window around this position to compute the target word
blend of soft and hard (to make hard attention differentiable)
근본적으로 global alignment vector들을 구할 기준이 되는 position을 샘플링하는게 아니라 예측함으로써 미분가능해지며, 에측한 위치에서 window 크기 내에 들어오는 source word 들을 고려하여 alignment vectors를 만들고 aggregate해서 context vector를 만든다.

soft와 global 의 구현 차이

soft global
Bahdanau, ICLR’15 Luong, EMNLP’15
decoder GRU, encoder는 BiGRU 사용 LSTM 사용
alignment model: Scaled Dot-Product Scaled Dot-Product, General, Dot-Product 실험

Key-Value

다음 그림과 같이 key, query, value 로 설명가능하다.

간략히 설명 하면 다음과 같다.

name description dimension
query (projected) decoder hidden state $\mathbb{R}^{T_y \times d_q}$
key (projected) encoder hidden state (for attn weight computation); attention information $\mathbb{R}^{T_x \times d_k}$
value (projected) encoder hidden state (for context vector buildup); content information $\mathbb{R}^{T_x \times d_v}$
context vector(outcome) weight sum of values, where each weight is output of function(query, key) $\mathbb{R}^{T_y \times d_v}$

다음 그림처럼 query, key를 바탕으로 alignment vector 를 구하고(scaled dot product방식) value에 적용하므로써 context vector를 구한다. 그림과 같이 계산하려면 제약사항은 $d_k = d_q$ 이어야 hadamard product가 가능하다.

Multi-Head

[4] 에서 다음 그림과 같은 Transformer 구조를 사용하였고, 성능을 비약적으로 높혔다.

  • 위와 같은 Key-Value Attention Mechanism을 효율적(병렬적)으로 하였다.
  • Multi-Head를 사용하였다.

LSTM Transformer
decoder에서 previous step에 대한 hidden state를 구해야 current step의 계산을 할 수있다 한번에 decoder의 모든 step을 계산할 수 있다
병렬 계산 불가능 병렬 계산 가능

이 곳에서 tensorflow를 사용하여 코드 단계에서 NMT 를 학습하고 예측하는 tutorial 를 line by line으로 실행해 보았다.

Reference

Papers

[1] Neural Machine Translation by Jointly Learning to Align and Translate arXiv Bahdanau, ICLR’15
[2] Effective Approaches to Attention-based Neural Machine Translation arXiv Luong, EMNLP’15
[3] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention arXiv Xu, ICML’15
[4] Attention Is All You Need arXiv Vaswani, NIPS’17

Documents

[11] NLP 흐름 정리
[12] S2S 모델에 대한 visualization 이 잘되어있는 blog
[13] Pytorch S2S Tutorial, 가장 구체적이게 묘사한다, 구현 시 이 방식으로 할 것
[14] Attention 방법론에 대한 정리가 가장 잘 되어있다, medium english, DL 수업 참고자료; tistory, korean
[15] Attention 방법론에 대한 정리 v2, english; yjucho’s blog, korean)
[16] Soft vs Hard attention 정리 blog, english; blog, korean
[17] [2]논문을 정리, Global vs Local 비교 설명 포함, korean

Leave a comment