大家好,欢迎来到IT知识分享网。
又是一篇积攒了好久的整理贴,重新整理下。
从本篇文章你将会学习到如下内容:
- 为什么要用attention机制?
- 什么是attention-based model?
- attention-based model有哪些计算attention权重的方法?
- attention-based model有哪些应用场景和模型?
- attention实战参考
看了台大的李宏毅老师关于Attention部分的内容,这一部分讲得挺好的(其实李宏毅老师其它部分的内容也不错,比较幽默,安利一下),记录一下,本博客的大部分内容据来自李宏毅老师的授课资料:Attention-based Model。如发现有误,望不吝赐教。
1. attention简介和作用
最基本的seq2seq模型包含一个encoder和一个decoder,通常的做法是将一个输入的句子编码成一个固定大小的state,然后作为decoder的初始状态(当然也可以作为每一时刻的输入),但这样的一个状态对于decoder中的所有时刻都是一样的。
传统seq2seq
attention即为注意力,人脑在对于的不同部分的注意力是不同的。需要attention的原因是非常直观的,比如,我们期末考试的时候,我们需要老师划重点,划重点的目的就是为了尽量将我们的attention放在这部分的内容上,以期用最少的付出获取尽可能高的分数;再比如我们到一个新的班级,吸引我们attention的是不是颜值比较高的人?普通的模型可以看成所有部分的attention都是一样的,而这里的attention-based model对于不同的部分,重要的程度则不同。
Attention-based Model其实就是一个相似性的度量,当前的输入与目标状态越相似,那么在当前的输入的权重就会越大,说明当前的输出越依赖于当前的输入。严格来说,Attention并算不上是一种新的model,而仅仅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比较合理的叫法,而非Attention Model。
没有attention机制的encoder-decoder结构通常把encoder的最后一个状态作为decoder的输入(可能作为初始化,也可能作为每一时刻的输入),但是encoder的state毕竟是有限的,存储不了太多的信息,对于decoder过程,每一个步骤都和之前的输入都没有关系了,只与这个传入的state有关。attention机制的引入之后,decoder根据时刻的不同,让每一时刻的输入都有所不同。
再引用tensorflow源码attention_decoder()函数关于attention的注释:
“In this context ‘attention’ means that, during decoding, the RNN can look up information in the additional tensor attention_states, and it does this by focusing on a few entries from the tensor.”
2. 模型介绍
对于机器翻译来说,比如我们翻译“机器学习”,在翻译“machine”的时候,我们希望模型更加关注的是“机器”而不是“学习”。那么,就从这个例子开始说吧(以下图片均来自上述课程链接的slides)
h1为当前时刻RNN的隐层输出向量,而不是原始输入的词向量,z0初始化向量,如rnn中的initial memory,图片中的这一部分是encode的部分 ),其中的match为计算这两个向量的匹配度的模块,出来的α10即为由match算出来的相似度。好了,基本上这个就是attention-based model 的attention部分了。那么,match什么呢? 对于“match”, 理论上任何可以计算两个向量的相似度都可以,比如:
- 余弦相似度
- 一个简单的 神经网络,输入为 h h h和 w w w,输出为 α α α
- 或者矩阵变换 α = h T W z α=h^{T}Wz α=hTWz (Multiplicative attention,Luong et al., 2015)
这里有一个问题:就是如果match用后面的两种,那么参数应该怎么学呢?其实这些都是可以BP的时候就可以自动学到的。比如我们明确输出是什么,在第一时刻的时候,那就会调整 z 0 z^0 z0和 c 0 c^0 c0的值,进而就会调整所有的 α \alpha α值,之前说过 α \alpha α是match的输出,如果match是后两种的话,就会进而调整match中的参数。
图片中的左半部分是encode,右面部分是decode,
再看看Grammar as a Foreign Language一文当中的公式:
u i t = v T t a n h ( W 1 ′ h i + W 2 ′ d t ) u^t_i = v^T tanh(W’_1h_i+W’_2d_t) uit=vTtanh(W1′hi+W2′dt)
a i t = s o f t m a x ( u i t ) a_i^t = softmax(u^t_i) ait=softmax(uit)
d t ′ = ∑ i = 1 T A a i t h i d’_t=\sum^{T_A}_{i=1}a_i^t h_i dt′=i=1∑TAaithi
上面的符号表示和前面描述的不太一样,经统一符号的公式如下:
u t i = v T t a n h ( W 1 h i + W 2 Z t ) u_t^{i}=v^{T}tanh(W_1h^{i}+W_2Z^{t}) uti=vTtanh(W1hi+W2Zt)
α t i = s o f t m a x ( u t i ) \alpha_t^{i}=softmax(u_t^{i}) αti=softmax(uti)
c t = ∑ i α t i h i c^{t}=\sum_i\alpha_{t}^{i}h^i ct=∑iαtihi
得到 c t c^t ct之后,就可以作为第t时刻RNN的input,而 Z t Z^t Zt可以作为t时刻RNN的隐状态的输入,这样就能够得到新的隐状态 Z t + 1 Z^{t+1} Zt+1,如此循环,直到遇到停止符为止。
上式 v T v^T vT为一个向量, u t i u_{t}^{i} uti即为t时刻的decoder隐状态向量和第i个输入的相似度(未归一化)。
在第一个式子当中的 t a n h tanh tanh里面的内容,tensorflow对于第一部分的实现是采用卷积的方式实现,而第二部分使用的是线性映射函数linear实现。
v T v^T vT向量的长度即为attention_vec_size,tensorflow 中直接把输入向量的长度设置为attention向量的长度,你要设置其他的值也可以,这里比较奇怪,tensorflow没有将其作为函数的参数,难道设成和输入的向量相同的效果更好?(有知情者也烦请告知)
3. Attention-based Model应用
Attention-based Model广泛应用于多个领域,比如reading comprehention、machine translation、speech recognition、image caption generation、video caption,下面针对部分领域展开模型相关说明,大同小异。
3.1 机器翻译
3.2 应用之阅读理解
3.3 图像处理
更多attention实战详见Attention-based Model【源码篇】
参考文献:
- 浅谈 NLP 中的 Attention 机制
- 一文读懂「Attention is All You Need」| 附代码实现
- 台达slide
- Attention总结 * 博主推荐 *
- 刁宇峰 AAAI2018中的自注意力机制(Self-attention Mechanism) * 博主推荐++ *
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15980.html