Seq2Seq and Attention 入门

Seq2Seq and Attention

参考文献

[1] Cho 在 2014 年在论文《Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation》中提出 Encoder–Decoder 结构

[2] Sutskever et al 2014年在论文 《Sequence to Sequence Learning with Neural Networks》中正式提出seq2seq的概念

[3] Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio.在论文
《Neural Machine Translation by Jointly Learning to Align and Translate》 ICLR 2015.中提出BahdanauAttention Mechanism。

[4] Minh-Thang Luong, Hieu Pham, Christopher D. Manning.在论文
《”Effective Approaches to Attention-based Neural Machine Translation.”
EMNLP 2015.》中提出LuongAttention Mechanism.

1. Seq2Seq model

seq2seq的名字全称是序列到序列(sequence to sequence), 从一个序列到另一个序列,可以是从中文的序列到英文的序列,也可以是从中文语音序列到中文文字序列,总之,实现的是从一个不定长输入序列到一个不定长输出序列的模型。

1.1 Encoder-Decoder model

要实现从一个序列到另外一个序列的转换,正常思维逻辑是找到一个中间编码,可以实现在两种序列之间实现*转换。于是乎,Encoder-Decoder结构在2014年被Cho提了出来, 先通过编码器对原序列进行编码,再通过解码器对中间编码进行解码得到输出序列。
Seq2Seq and Attention 入门
Figure 1 为Encoder-Decoder结构示意图,Encoder框中是一个正常的Rnn结构,输入序列 (x1,x2,...,xT)(x1,x2,...,xT),输出CCCC是上文中说到的中间序列。Decoder框中同样为Rnn结构, 其输入是中间编码CC, 输出为输出序列(y1,y2,...,yT)(y1,y2,...,yT)

这里Decoder部分的Rnn和Encoder部分的Rnn稍有不同。
Encoder的Rnn为正常使用,由上一时刻隐状态ht1h_{t-1}和该时刻输入xtx_{t}进行隐状态更新,公式为:
ht=f(ht1,xt)h_{t} = f(h_{t-1}, x_{t})
Decoder的Rnn在 tt 时刻的输出由 tt 时刻的隐藏状态sts_{t}t1t-1时刻的输出yt1y_{t-1}CC 计算得出,公式为:
P(ytyt1,yt2,...,y1,C)=g(st,yt1,C)P(y_{t}| y_{t-1}, y_{t-2}, ..., y_{1}, C) = g(s_{t}, y_{t-1}, C)
Encoder和Decoder的训练目标是最大化条件概率分布:
maxθ1Nn=1NlogPθ(ynxn)max_{\theta} \frac{1}{N} \displaystyle\sum_{n=1}^N logP_{\theta}(y_{n}|x_{n})
模型参数为θθ,出现xnx_{n}yny_{n}的条件概率是P(ynxn)P(y_{n}|x_{n})logPlogP是单调递增的,更容易计算,将NPN个P加起来求平均,就是最终的优化目标,输出序列输出几个符号,NN就是几
这里不懂的可以看博客:语言模型:马尔可夫模型

2. Attention

Seq2Seq中Encoder通过 CC 将信息传给Decoder, CC承载的是训练数据中序列的信息,而CC仅仅是Rnn隐藏序列的最后一个,表达的是整个序列的信息。而如果想要更好的结果,将Encoder序列的所有隐藏状态都给Decoder显然更好,因此 CC 可以是Encoder所有时刻的隐藏状态之和,此时的 CC 表示Encoder 中又包含了各个词的隐藏信息;当然,在解码时生成某一个词有时候并不需要依赖输入序列所有的词的信息,此时,只要给Encoder每个时刻隐藏状态一个权值,再相加,就可以得到生成指定词最适合的编码信息了,换种说法就是当生成某个词的时候我们的注意力只放在那些对它有用的词信息上。这就是注意力机制的逻辑。

2.1 Bahdanau Attention Mechanism

先来介绍Bahdanau在2015年提出的attention mechanism。
Seq2Seq and Attention 入门
同样,Decoder通过计算条件概率分布的方式来预测输出:
P(yiyi1,yi2,...,y1,X)=g(si,yi1,ci)P(y_{i}| y_{i-1}, y_{i-2}, ..., y_{1}, X) = g(s_{i}, y_{i-1}, c_{i})
注意:Encoder-Decoder中的 CC 是固定不变得信息,而这里cic_{i} 是一个变化信息,称为第 ii 个输出词的对应的输入上下文向量,同样代表输入句子的表征,不同时刻注意力集中在不同的词上面。

状态 sis_{i}ii 时刻Decoder Rnn的隐藏状态:
si=f(si1,yi1,ci)s_{i} = f(s_{i-1}, y_{i-1}, c_{i})

上下文向量 cic_{i} 由输入序列的隐藏层状态 h1,...,hTh_{1},...,h_{T}产生。每个hih_{i}包含整个序列的信息的同时更多的关注第 ii 个词的上下文信息。cic_{i} 的计算:
ci=j=1Tαijhj c_{i} = \displaystyle\sum_{j=1}^T \alpha_{ij}h_{j}
这里的 αij\alpha_{ij} 是每个 hjh_{j} 的权重得分,范围为(0,1):
αij=exp(eij)k=1Texp(eik)\alpha_{ij} = \frac{exp(e_{ij})}{\displaystyle\sum_{k=1}^T exp(e_{ik})}
eij=a(si1,hj)e_{ij} = a(s_{i-1}, h_{j})

eije_{ij} 为Decoder (i1)(i−1) 位置的隐藏状态si1s_{i-1}和Encoder中 jj 位置的隐藏状态hjh_{j}经过计算方式 aa 得到的分值。
aa的计算方式为:
a=vaTtanh(Wasi1+Uahj) a = v_a^T tanh(W_{a}s_{i-1}+U_{a}h_{j})
这里的WaUaW_a和U_{a}为参数矩阵,作为可训练参数加入整个网络,所以attention也相当于是一层网络,WaUaW_a和U_{a}是这层网络的参数,所以attention的参数矩阵也是可以训练得到的。
网络经过训练可以学习到:解码器在输出一个序列元素时,哪些编码器信息更有价值,更值得被关注,这就是注意力机制的通俗解释。

2.2 Luong Attention Mechanism

Luong 在论文4中提出一种 aa(对齐函数) 的新计算方式,
a=vaTtanh(Wasi+Uahj) a = v_a^T tanh(W_{a}s_{i}+U_{a}h_{j})
需要注意的是在Luong提出的Attention Mechanism中,是通过Decoder ii 时刻的隐藏层状态 sis_{i} 和encoder的隐藏层状态hjh_{j} 来确定aa的值,而在Bahdanau中是通过Decoder (i1)(i−1) 时刻的隐藏状态si1s_{i-1}和Encoder中 jj 位置的隐藏状态hjh_{j}经过计算。
Seq2Seq and Attention 入门
转载自:https://blog.csdn.net/ilikede/article/details/81035889#commentBox