前言
Attention是一种思想,在当前输出上,是存在部分输入需要重点关注的,其对该输出贡献非常大。之前看到几篇关于attention思想的应用文章,现对比下其中的Attention具体结构上的区别。
NMT using Attention
这篇文章是Bahdanau的2015年佳作,将Attention引入到NMT中并取得了非常好的效果,其中的attention结构不是非常容易理解。
NMT面临的问题:通常的Encoder-Decoder翻译模式下,Encoder会将所有必要的信息压缩到一个定长向量中,而Decoder则依赖这个定长向量来做翻译。定长向量成了制约翻译效果的瓶颈,拓展模型自动寻找与待预测部分相关的source作辅助,会有更好的效果。该方法的主要思路是:每次翻译某个词之前,先找到source中最相关信息的位置,然后利用包含这些位置信息及之前预测词的context vector来预测下个词。其最大的特点:将输入序列编码到序列向量中,自适应地选择其子集供翻译时使用。
![](https://i-blog.csdnimg.cn/blog_migrate/d696216fce570e974cb6b6e025ab5fe2.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/e562f2e722f49c9bd218b996272ebd8b.jpeg)
让我们仔细地研究下Decoder其中的公式关系。
当预测某个词时:
p(yi|y1,y2,...,yi−1,X)=g(yi−1,si,ci) p ( y i | y 1 , y 2 , . . . , y i − 1 , X ) = g ( y i − 1 , s i , c i )
依赖于三个变量,前刻预测词 yi−1 y i − 1 ,当前的隐状态 si s i ,当前的上下文向量 ci c i 。
而当前的隐状态:
si=f(si−1,yi−1,ci) s i = f ( s i − 1 , y i − 1 , c i )
,则依赖于前刻的隐状态
si−1 s i − 1
,前刻的预测词
yi−1 y i − 1
,当前的上下文向量
ci c i
。
不同于常见的RNN结构里面的隐状态,增加对上下文 ci c i 的依赖。
上下文向量 ci c i 涵盖了当前待预测词 yi y i 需要关注的source信息总和, ci=∑Txj=1αijhj c i = ∑ j = 1 T x α i j h j 。到底需要关注哪些source信息呢?对输入序列的对应定义 解释变量 hj h j ,该变量描述了输入序列位置 j j 处及附近的信息。 则表示当前待预测词 yi y i 与source词 xj x j 附近信息的 相关性程度(对每个 xj x j 的关注度)。
疑问1:为什么不直接model xj x j 与 yi y i 的关系呢?后文后有解释。
疑问2:如何具体表示 αij α i j 呢?
αij=exp(eij)∑Txk=1exp(eik) α i j = e x p ( e i j ) ∑ k = 1 T x e x p ( e i k ) ,根据所有输入词对 yi y i 的相关值 eij e i j 作normalize,得到归一化的概率权重,其中 eij=a(si−1,hj) e i j = a ( s i − 1 , h j )
疑问3:如何理解