关于Attention的公式推导,我在这篇文章讲过了,本篇文章主要以图示的方式进行讲解
下图是一个Encoder架构,$s_0$从值上来说与$h_m$是相等的,只不过这里换了个名字
首先我们需要将$s_0$和所有的$h_i (i=1,...,m)$计算一个"相关性",比方说计算$s_0$和$h_1$之间的相关性计算得$alpha_1=align(h_1, s_0)$
计算得到m个相关性$alpha_i$之后,将这些值与$h_i$进行加权平均,即
$$ c_0=sum_{i=1}^m alpha_i h_i=alpha_1h_1 ···alpha_mh_m $$
我们可以直观的感受一下这样做有什么作用,对于那些值比较大的$alpha_k$,最终$c_0$中也会有一大部分来自于$h_k$。$c_0$实际上考虑到了所有时刻的$h$,只不过对于某些时刻可能关注的更多,而某些时刻关注的更少,这就是注意力机制
之后将$s_0,c_0,x'_1$作为$t=0$时刻Decoder 的输入,计算得到$s_1$,然后再计算$s_1$与所有$h_i (i=1,...,m)$之间新的相关性$alpha_i$
同样的,将新计算得到的$alpha_i$与$h_i$做加权平均,得到新的context vector $c_1$
重复上述步骤,直到Decoder结束
到这里实际上整个Seq2Seq(with Attention)就讲完了,但是其中还有一些细节,比方说,align()
函数怎么设计?$c_i$如何应用到Decoder中?下面一一解释
align()
函数如何设计?
有两种方法,在最初的论文,即Bahdanau的论文中,他的设计方式如下图所示
现在比较主流的,同时也是Transformer结构使用的方法如下所示
$c_i$如何应用到Decoder中?
废话不多说,直接见下图