关于Attention的公式推导,我在这篇文章讲过了,本篇文章主要以图示的方式进行讲解

下图是一个Encoder架构,s0s_0从值上来说与hmh_m是相等的,只不过这里换了个名字

首先我们需要将s0s_0和所有的hi (i=1,...,m)h_i\ (i=1,...,m)计算一个"相关性",比方说计算s0s_0h1h_1之间的相关性计算得α1=align(h1,s0)\alpha_1=align(h_1, s_0)

图解Attention

计算得到m个相关性αi\alpha_i之后,将这些值与hih_i进行加权平均,即
c0=i=1mαihi=α1h1+αmhm c_0=\sum_{i=1}^m \alpha_i h_i=\alpha_1h_1+···\alpha_mh_m
我们可以直观的感受一下这样做有什么作用,对于那些值比较大的αk\alpha_k,最终c0c_0中也会有一大部分来自于hkh_kc0c_0实际上考虑到了所有时刻的hh,只不过对于某些时刻可能关注的更多,而某些时刻关注的更少,这就是注意力机制

图解Attention

之后将s0,c0,x1s_0,c_0,x'_1作为t=0t=0时刻Decoder 的输入,计算得到s1s_1,然后再计算s1s_1与所有hi (i=1,...,m)h_i\ (i=1,...,m)之间新的相关性αi\alpha_i

图解Attention

同样的,将新计算得到的αi\alpha_ihih_i做加权平均,得到新的context vector c1c_1

图解Attention

重复上述步骤,直到Decoder结束

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXBKjnuD-1593652073210)(https://i.loli.net/2020/07/01/yqm7WM4tKQpVc6B.png#shadow)]

到这里实际上整个Seq2Seq(with Attention)就讲完了,但是其中还有一些细节,比方说,align()函数怎么设计?cic_i如何应用到Decoder中?下面一一解释

align()函数如何设计?

有两种方法,在最初的论文,即Bahdanau的论文中,他的设计方式如下图所示

图解Attention

现在比较主流的,同时也是Transformer结构使用的方法如下所示

图解Attention

cic_i如何应用到Decoder中?

废话不多说,直接见下图

图解Attention

相关文章:

  • 2021-09-11
  • 2021-10-13
  • 2021-10-18
  • 2021-04-08
  • 2021-04-21
  • 2021-07-10
  • 2022-12-23
猜你喜欢
  • 2021-05-21
  • 2021-10-24
  • 2021-06-02
  • 2022-01-04
  • 2021-10-27
  • 2022-12-23
  • 2021-09-19
相关资源
相似解决方案