tf.contrib.seq2seq.LuongAttention
init(
num_units,
memory,
memory_sequence_length=None,
scale=False,
probability_fn=None,
score_mask_value=float('-inf'),
name='LuongAttention'
)
参数 | 含义 |
---|---|
num_units | 在encoder阶段产生了多个特征向量,每个特征向量的大小 |
memory | 一个batch里,encoder阶段产生的所有的特征向量,在RNNencoder中,维数为[batch_size, max_time, num_units],即encoder阶段产生了max_time个大小为num_units的特征向量 |
memory_sequence_length | 记录memory中 的特征向量的长度,维数是[batch_size,],令memory中超过memory_sequence_length的值为0 |
scale | 是否进行scale |
probability_fn | 将打分函数直接转成概率,默认的是softmax |
score_mask_value | 在将分数传到probability_fn函数之前的掩码值,在有Probability_fn函数的情况下才用 |
原理
论文为Effective Approaches to Attention-based Neural Machine Translation.
论文中提出了两种模式:Global Attention和Local Attention,Global Attention在encoder产生的所有信息中进行Attention操作,Local Attention在部分信息中进行Attention操作。
Global Attention
针对encoder产生的时序特征向量hs
,有一个与其长度相同的对齐向量at
,at
相当于在t时刻对hs
的权重向量,作用就是在t时刻找到hs
中对deocder有影响的部分, at
由decoder当前隐藏状态和hs
得到:
文中使用了三种打分函数:
最后一种将decoder当前隐藏状态ht
和hs
直接相连进行打分,通过分数算出权重与hs
想乘得到上下文向量ct
,通过ct
和ht
得到Attention隐藏状态h ̃t
:
利用隐藏状态求出概览分布:
整体的过程为:ht →at →ct →h ̃t
Local Attention
gloabl attention有一个缺点是在每一个target word生成时都需要考虑所有encdoer产生的特征信息,代价较高且对于长序列可能会有影响。于是用local attention来解决这个问题,local attention选取特征信息中的一部分,相比于global更容易训练。
大致步骤为在每个时刻t先产生一个对其位置pt
,ct
通过[pt−D,pt+D]中的信息求得。
文中尝试了两种方法:local-p和local-m。
local-m:
对齐方法为pt = t
,对齐函数于global中的相同
local-p:
以pt
为中心生成一个高斯分布,对齐函数为:
tf.contrib.seq2seq.BahdanauAttention
init(
num_units,
memory,
memory_sequence_length=None,
normalize=False,
probability_fn=None,
score_mask_value=float('-inf'),
name='BahdanauAttention'
)
参数 | 含义 |
---|---|
normalize | 是否进行weight normalization |
原理
参照论文Neural Machine Translation by Jointly Learning to Align and Translate.
Luong在论文中提到了BahdanauAttention的流程为 ht−1 → at → ct → ht。
具体的公式如下:
条件概率为:p(yi|y1, . . . , yi−1, x) = g(yi−1, si, ci)
其中si
代表i时刻rnn的隐藏状态,ci
为上下文向量。
ci
是根据encoder的输出特征向量(h1 , · · · , hTx )加权得来的,每个时刻的ci
都不一样,ci
为:
每个
αij
由下面的公式计算得出:其中:
eij =a(si−1,hj)
,a就相当于对齐函数,在文中作者用一个前馈神经网络实现的。