1.注意力机制原理
上一篇博文介绍了如何使用Tensorflow来搭建一个简单的NMT模型,但那只是一个初级的模型。下面我们通过加入注意力机制(attention mechanism)来使得其变得更加高级一点。
关于什么时注意力机制呢,笔者就按照谷歌NMT开源文档中的说明来简单介绍一下。首先,最初注意力是由Bahdanau等人在2015年提出的,紧接着Luong等人又对其进行了改进,然后就出现了很多的版本。之所以要提出注意力机制就是为了解决当解码的序列太长时,越到后面效果就越差。因为在未引入注意力机制之前,解码时仅仅只依靠上一时刻的输出而忽略了编码阶段每个时刻的输出(“称之为记忆”)。注意力机制的思想在于,希望在解码的时刻能够参考编码阶段的记忆,对上一时刻输出的信息做一定的处理(也就是只注意其中某一部分),然后再喂给下一时刻做解码处理。这样就达到了解码当前时刻时,仅仅只接受与当前时刻有关的输入,类似与先对信息做了一个筛选(注意力选择)。
2. 计算步骤
如图p0109所示,图中右边的输入部分的实线表示是训练时的输入,虚线表示预测时的输入。注意向量(attention vector)是由解码部分每个时刻的计算产生的,此处以计算第一个时刻为例。
-
(1) 首先将当前时刻的状态 h t h_t ht同编码部分的记忆状态( h ‾ 1 , h ‾ 2 , ⋯ , h ‾ s ′ \overline{h}_1,\overline{h}_2,\cdots,\overline{h}_{s^{\prime}} h1,h2,⋯,hs′)逐个进行相似度计算,然后进行一个正则化:
α t s = exp ( s c o r e ( h t , h ˉ s ) ) ∑ s ′ = 1 S exp ( s c o r e ( h t , h ˉ