浅谈Attention-based Model【原理篇】


或者矩阵变换α=hTWz
  • (Multiplicative attention,Luong et al., 2015)

    现在我们已经由match模块算出了当前输入输出的匹配度,然后我们需要计算当前的输出(实际为decoder端的隐状态)和每一个输入做一次match计算,分别可以得到当前的输出和所有输入的匹配度,由于计算出来并没有归一化,所以我们使用softmax,使其输出时所有权重之和为1。那么和每一个输入的权重都有了(由于下一个输出为“machine”,我们希望第一个权重和第二个权权重越大越好),那么我们可以计算出其加权向量和,作为下一次的输入。

这里有一个问题:就是如果match用后面的两种,那么参数应该怎么学呢?

如下图所示:


浅谈Attention-based Model【原理篇】


那么再算出了c0
之后,我们就把这个向量作为rnn的输入(如果我们decoder用的是RNN的话),然后d第一个时间点的输出的编码z1c0和初始状态z0共同决定。我们计算得到z1之后,替换之前的z0再和每一个输入的encoder的vector计算匹配度,然后softmax,计算向量加权,作为第二时刻的输入……如此循环直至结束。

浅谈Attention-based Model【原理篇】

再看看Grammar as a Foreign Language一文当中的公式:


浅谈Attention-based Model【原理篇】


上面的符号表示和前面描述的不太一样,经统一符号的公式如下:

uit=vTtanh(W1hi+W2Zt)

αit=softmax(uit)

ct=iαithi



得到ct
之后,就可以作为第t时刻RNN的input,而Zt可以作为t时刻RNN的隐状态的输入,这样就能够得到新的隐状态Zt+1

,如此循环,直到遇到停止符为止。

上式vT

为一个向量,uit即为t时刻的decoder隐状态向量和第i个输入的相似度(未归一化)。
在第一个式子当中的tanh里面的内容,tensorflow对于第一部分的实现是采用卷积的方式实现,而第二部分使用的是线性映射函数linear实现。
vT

向量的长度即为attention_vec_size,tensorflow 中直接把输入向量的长度设置为attention向量的长度,你要设置其他的值也可以,这里比较奇怪,tensorflow没有将其作为函数的参数,难道设成和输入的向量相同的效果更好?(有知情者也烦请告知)

4. 遗留问题


本来我们已经结束了,但是仔细想想,其实还有一个地方有所疑问。就是加入match是一个简单地神经网络或者一个矩阵,神经网络的权值和矩阵里面的值怎么来?
其实这些都是可以BP的时候就可以自动学到的。比如我们明确输出是什么,在第一时刻的时候,那就会调整z0

c0的值,进而就会调整所有的α值,之前说过α

是match的输出,如果match是后两种的话,就会进而调整match中的参数。

文本处理方面的注意力机制是在神经机器翻译首先提出,附文献:
DzmitryBahdanau,KyunghyunCho,andYoshuaBengio.Neuralmachinetranslationbyjointlylearning to align and translate. arXiv preprint arXiv:1409.0473, 2014.