논문 소개 참고
- Attention mechanism이 처음으로 소개된 논문
- attention보다는 soft-alignment로 논문이 소개
용어 정리
1. Soft-alignment(attention): source word -> target에 대한 정보를 스스로 alignment를 학습하여 사람이 직접 알려주지 않는 방법
2. Hard-alignment: source sentence의 word를 target sentence의 word로 사람이 직접 지정(예. 'I am hungry', '나는 배고프다.' -> I => 나, am => 는)
3. Context vector c: 문장의 의미를 담고 있는 fixed length vector
4. Annotation: Encoder의 hidden state, 수식에서 h로 표현
5. hidden state: t번째 input에 대한 정보를 담고 있는 vector(특정 언급이 없는 경우, decoder의 hidden state를 의미), 수식에서 s로 표현
Neural machine translation
해당 논문에서는
새로운 제안법으로
Neural machine translation은 machine translation에 새롭게 등장하는 접근 방식으로, Kalchbrenner and Blunsom (2013), Sutskever et al. (2014) 그리고 Cho et al. (2014b)에 의해 제안되었다.
이전의 전통적인 phrase-based translation system은 많은 작은 sub-components(tunded separately)로 이루어졌다
그와 달리, neural machine translation은 single이며 large neural network(문장을 읽고, 정확한 번역을 내는 것이 가능한)를 build하고 train하고자 한다
제안된 대다수의 neural machine translation models는 encoder-decoder (Sutskever et al., 2014; Cho et al., 2014a)의 family로 소속된다
encoder-decoder 기반의 potential issue는
해당 문제를 해결하고자, 본 논문에서는 encoder-decoder model의 extension을 소개한다
해당 approach에서 가장 중요한 특징은,
해당 논문에서는
probabilistic perspective에서 translation은 target sentence y를 찾는 것과 동일하다
최근에 conditional distribution을 학습하고자, 많은 연구들이 neural network의 사용을 제안했다(e.g., Kalchbrenner and Blunsom, 2013; Cho et al., 2014a; Sutskever et al., 2014; Cho et al., 2014b; Forcada and Neco, 1997)
neural machine translation은 이미 promising한 결과들을 보여왔다
Seq2Seq 구조에서 Attention 매커니즘과 양방향 RNN(bidirectional RNN)을 제안 링크텍스트
1. Seq2Seq 구조: Encoder와 decoder로 구성. encoder가 source sentence를 입력 받아, 고정된 벡터 크기로 반환. 고정된 길이의 벡터가 긴 문장을 번역하는데 문제점이라 판단해 decoder가 어떤 source sentence에 집중해야 하는지 결정하도록 함. -> decoder를 attention 매커니즘으로 작동하게 해, encoder는 source sentence의 모든 정보를 고정된 길이의 벡터로 encode해야하는 부담감을 덜게 됨. 또한 다음 target 단어의 생성과 관련 있는 정보에만 집중할 수 있게 됨
2. 양방향 RNN: 두 개의 RNN을 사용, 하나의 RNN은 input sequence를 순서대로 읽고, forward hidden states의 순서를 계산. 역방향 RNN은 역방향으로 sequence를 읽고, backward hidden states를 계산. 이 둘의 출력 hidden state를 concat으로 연결. 따라서 concat된 hidden state는 단어 x 주변의 단어에 집중할 수 있게 됨.
RNN의 한계의 BIRNN의 등장 배경
BiRNN
model architecture
single layer GRU 사용
bidirectional RNN 사용
RNN의 결과 값
hidden
outputs
decoder가 bidirectional이 아니어서 single context vector인 z가 필요
Note
class Encoder(nn.Module):
def __init__(self, input_dim, emb_dim, enc_hid_dim, dec_hid_dim, dropout):
super().__init__()
self.embedding = nn.Embedding(input_dim, emb_dim)
# bidirectional=True로 설정하여 bi-rnn을 구현
self.rnn = nn.GRU(emb_dim, enc_hid_dim, bidirectional = True)
# 양방향 rnn의 출력값을 concat 한 후에 fc layer에 전달
self.fc = nn.Linear(enc_hid_dim * 2, dec_hid_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, src):
#src = [src len, batch size]
# 입력 x를 임베딩
embedded = self.dropout(self.embedding(src))
#embedded = [src len, batch size, emb dim]
# rnn의 출력값
outputs, hidden = self.rnn(embedded)
#outputs = [src len, batch size, hid dim * num directions]
#hidden = [n layers * num directions, batch size, hid dim]
#hidden is stacked [forward_1, backward_1, forward_2, backward_2, ...]
#outputs are always from the last layer
#hidden [-2, :, : ] is the last of the forwards RNN
#hidden [-1, :, : ] is the last of the backwards RNN
#initial decoder hidden is final hidden state of the forwards and backwards
# encoder RNNs fed through a linear layer
hidden = torch.tanh(self.fc(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1)))
#outputs = [src len, batch size, enc hid dim * 2]
#hidden = [batch size, dec hid dim]
return outputs, hidden
attention의 일반적인 구현 과정
class Attention(nn.Module):
def __init__(self, enc_hid_dim, dec_hid_dim):
super().__init__()
self.attn = nn.Linear((enc_hid_dim * 2) + dec_hid_dim, dec_hid_dim)
self.v = nn.Linear(dec_hid_dim, 1, bias = False)
def forward(self, hidden, encoder_outputs):
#hidden = [batch size, dec hid dim]
#encoder_outputs = [src len, batch size, enc hid dim * 2]
batch_size = encoder_outputs.shape[1]
src_len = encoder_outputs.shape[0]
#repeat decoder hidden state src_len times
hidden = hidden.unsqueeze(1).repeat(1, src_len, 1)
encoder_outputs = encoder_outputs.permute(1, 0, 2)
#hidden = [batch size, src len, dec hid dim]
#encoder_outputs = [batch size, src len, enc hid dim * 2]
energy = torch.tanh(self.attn(torch.cat((hidden, encoder_outputs), dim = 2))) # 1. energy 계산: linear layer와 tanh 활성화 함수
#energy = [batch size, src len, dec hid dim]
attention = self.v(energy).squeeze(2) # 2. source sentence 길이로 바꾸고자 v텐서로 곱해줌
#attention= [batch size, src len]
return F.softmax(attention, dim=1) # 3. softmax 함수를 거쳐 0~1 사이의 값을 갖게 함
각 conditional probability를 다음과 같이 정의한다
기존의 encoder-decoder와 달리, 여기서 probability는 distinct content vector ci를 위해 각 target word yi에 대해서 conditioned된다
context vector ci는 a sequence of annotations(h1, · · · , hTx)에 의존한다
거기서 encoder는 input sentence를 maps한다
각 annotation hi는 전체 input sequence에 대한 정보를 포함한다
(input sequence에 대해서 주위의 i번째 단어에 strong focus)
context vector ci가 그러면 annotations hi의 weighted sum으로 계산된다
alignment model은 position j 근처의 input과 position i에서의 output이 얼마나 match되는지 score한다
alignment model a를 feedforward neural network로 parametrize한다
다른 traditional machine translation과 달리, alignment는 잠재변수로 고려되지 X
-> 그 대신, soft alignment를 directly하게 compute
(cost function의 gradient가 backpropagated되는 것을 허용한다, 해당 gradient는 alignment model 그리고 whole translation model을 jointly하게 train하는데 사용될 수 있다)
taking a weighted sum of all the annotations에 대한 approach를, expected annotation을 계산하는 것으로 이해할 수 있다(where the expectation is over possible alignments)
αij를 probability -> target word yi is aligned to, or translated from, a source word xj
probability αij , associated energy eij는 importance of the annotation hj를 reflects.
(with respect to the previous hidden state si−1 in deciding the next state si and generating yi)
-> decoder에서의 attention mechanism을 시행한다(decoder는 집중할 source sentence의 parts를 결정한다)
decoder가 attention mechanism을 가지게 해서 encoder의 sourcer sentence에 있는 모든 정보를 고정된 길이의 벡터로 인코딩해야 한다는 짐을 덜었다
-> 새로운 접근법을 통해, 정보는 sequence of annotations를 통해 퍼질 수 있다(decoder에 따라서 선택적으로 retrieve 가능하다)
class Decoder(nn.Module):
def __init__(self, output_dim, emb_dim, enc_hid_dim, dec_hid_dim, dropout, attention):
super().__init__()
self.output_dim = output_dim
self.attention = attention
self.embedding = nn.Embedding(output_dim, emb_dim)
# embedding과 weighted vector가 concat 된 후, 이전 hidden staet와 함께 입력
self.rnn = nn.GRU((enc_hid_dim * 2) + emb_dim, dec_hid_dim)
# 입력값 d(y_t), w_t, s_t
self.fc_out = nn.Linear((enc_hid_dim * 2) + dec_hid_dim + emb_dim, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, input, hidden, encoder_outputs):
#input = [batch size]
#hidden = [batch size, dec hid dim]
#encoder_outputs = [src len, batch size, enc hid dim * 2]
input = input.unsqueeze(0)
#input = [1, batch size]
embedded = self.dropout(self.embedding(input))
#embedded = [1, batch size, emb dim]
a = self.attention(hidden, encoder_outputs)
#a = [batch size, src len]
a = a.unsqueeze(1)
#a = [batch size, 1, src len]
encoder_outputs = encoder_outputs.permute(1, 0, 2)
#encoder_outputs = [batch size, src len, enc hid dim * 2]
weighted = torch.bmm(a, encoder_outputs)
#weighted = [batch size, 1, enc hid dim * 2]
weighted = weighted.permute(1, 0, 2)
#weighted = [1, batch size, enc hid dim * 2]
rnn_input = torch.cat((embedded, weighted), dim = 2)
#rnn_input = [1, batch size, (enc hid dim * 2) + emb dim]
output, hidden = self.rnn(rnn_input, hidden.unsqueeze(0))
#output = [seq len, batch size, dec hid dim * n directions]
#hidden = [n layers * n directions, batch size, dec hid dim]
#seq len, n layers and n directions will always be 1 in this decoder, therefore:
#output = [1, batch size, dec hid dim]
#hidden = [1, batch size, dec hid dim]
#this also means that output == hidden
assert (output == hidden).all()
embedded = embedded.squeeze(0)
output = output.squeeze(0)
weighted = weighted.squeeze(0)
prediction = self.fc_out(torch.cat((output, weighted, embedded), dim = 1))
#prediction = [batch size, output dim]
return prediction, hidden.squeeze(0)
모델 유형은 두 가지
각 모델을 두차례 훈련
RNNencdec의 encoder와 decoder는 각각 1000 hidden units를 가짐
RNNsearch의
Adadelta와 minibatch stochastic gradient descent (SGD) 알고리즘 사용
beam search로 모델 훈련
-> conditional probability를 최대화하는 translation을 찾기 위해서
BLEU score로 측정된 translation performances
모든 cases에서 proposed RNNsearch는 conventional RNNencdec를 능가
RNNsearch의 중요성은 conventional phrase-based translation system (Moses)만큼 높다 => known words로 구성된 문장들만이 고려되었을 때
proposed approach의 motivation 중 하나는, basic encoder–decoder approach에서 fixed-length context vector의 사용
-> 해당 한계는 basic encoder–decoder approach가 long sentences에 대해서 underperform하게 할 것이라고 추측한다
English와 French words 사이의 alignment가 largely monotonic.
diagonal에는 큰 weights
a number of non-trivial, non-monotonic alignments를 관측
Adjectives and nouns are typically ordered differently between French and English(Fig3 (a))
model correctly translates a phrase
RNNsearch was able to correctly align, jumping over the two words and then looked one word back at a time to complete the whole phrase
soft-alignment의 strength는 hard-alignment와 달리 명확(Fig. 3 (d))
proposed model (RNNsearch)가 conventional model (RNNencdec) 보다 긴 문장 번역에 있어 훨씬 좋다
-> RNNsearch가 long sentence를 fixed-length vector로 완벽하게 인코딩하는 것을 요구하지 않고, 특정 단어를 surround하는 input sentence의 encoding 부분만 정확하게 하기 때문
test set의 예시1)
edecin de reconna ´ ˆıtre un patient a
l’hopital ou un centre m ˆ edical ´ d’un diagnostic ou de prendre un diagnostic en fonction de son etat ´ de sante.edecin d’admettre un patient ´ a un
hopital ou un centre m ˆ edical ´ pour effectuer un diagnostic ou une procedure, ´ selon son statut de travailleur des soins de sante´ a` l’hopital. test set의 예시2)
Bengio et al. (2003)가 neural probabilistic language model을 소개
예를 들어서, Schwenk (2012) 는 feedforward neural network 사용을 제시
Kalchbrenner and Blunsom (2013)와 Devlin et al. (2014)는 neural network의 existing translation system에서의 sub-component로서의 우수성을 보고했다
전통적으로, target-side language model로 훈련된 neural network는 a list of candidate translations (see, e.g., Schwenk et al., 2006)를 rescore하거나 rerank하는데 사용되어왔다.
위의 접근방식들로 stateof-the-art machine translation systems을 넘어선 translation performance의 향상을 보여주고자 하였다 -> 하지만 우리는 "more ambitious objective of designing a completely new translation system based on neural networks."에 관심이 더 많다
우리가 이 논문에서 고려한 neural machine translation 부분은 그러므로, earlier works에 대한 radical departure이다
neural network를 existing system에서 part로 사용하는 대신에, 우리의 모델은 스스로 작동하고, source sentence로부터 직접적으로 translation을 생성한다
neural machine translation의 conventional approach는 encoder-decoder approach라고 불린다
해당 논문에서 우리는 해당 문제를 다루는 novel한 아키텍처를 제시한다
우리는 basic encdoer-decoder를 확장한다
우리는 RNNsearch라 불리는 모델을 English-to-French translation 태스크에서 실험했다
제시된 approach는 존재하는 phrase-based statistical machine translation에 비교할만한 translation performance를 성취했다
후속 연구로 남은 한 가지는,