MENU

图解 Attention

July 1, 2020 • Read: 24557 • Deep Learning阅读设置

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

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

首先我们需要将 $s_0$ 和所有的 $h_i\ (i=1,...,m)$ 计算一个 "相关性",比方说计算 $s_0$ 和 $h_1$ 之间的相关性计算得 $\alpha_1=\text {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 中?

废话不多说,直接见下图

Last Modified: May 19, 2021
Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment

23 Comments
  1. 啦啦啦 啦啦啦

    废话不多说,直接见下图
    此处没有图啊?刷新了好几次

    1. mathor mathor

      @啦啦啦图刷新的有点慢,稍微等一会儿,我这能显示

  2. 鸭鸭 鸭鸭

    博主好,我想请问一下 decoder 的输入 x' 是指代什么?

    1. mathor mathor

      @鸭鸭无论是训练还是测试,decoder 初始时刻输入,即 x_1' 的输入都是 <sos>
      而之后时刻的输入,训练和测试就有区别了
      训练时是由于知道正确答案,所以直接将答案依次输入进去
      测试时由于不知道正确答案,所以会将上一时刻的输出作为下一时刻的输入

    2. 鸭鸭 鸭鸭

      @mathor 谢谢博主回答,x_1' 的输入是啥,我这好像没显示出来

    3. mathor mathor

      @鸭鸭起始标志 <sos>

    4. 鸭鸭 鸭鸭

      @mathor 谢谢!

  3. hehe hehe

    我有个问题,hm 隐状态可以理解为对句子的语义编码吗?hm 和 s0 值相等,那么 align (s0,hm) 等于 1 吗?

    1. mathor mathor

      @hehehm 和 s0 值是相等的,但是 align (s0,hm) 并不等于 1,因为我们只是感性认为 align 函数是相关性函数,但是从理性上(公式上)来看,align (s0,hm) 是一系列矩阵运算,究竟会算出什么值,谁也不知道

  4. bigFly bigFly

    大牛 Wk Wq 是如何选取或获得的?

    1. mathor mathor

      @bigFlyWk, Wq 就是权重,如果是 pytorch,简单的利用 nn.Linear (x,y,bias=False) 就可以了

    2. bigFly bigFly

      @mathor 请问大牛 2 个问题:
      1 采用交叉熵损失函数,期望输出是否必须是 one-hot 形式的(因为实际输出 y_hat 为概率形式,这样求交叉熵损失函数才有可能对应上)
      2 deoder_hidden 最终经 softmax () 转换输出为一个概率形式 y_hat,该概率是表明输出层与期望值 y 的相似程度还是与 encoder_hidden 的相似程度,感觉两者都说的过去,又都模糊(注意力机制算的是输出隐藏 deoder_hidden 与输入隐层 encoder_hidden 的相似程度;计算交叉熵损失时候,又是计算预测值 y_hat(间接 deoder_hidden)与期望值 y 的相似程度,来反向传播校正误差),这个 deoder_hidden 作为参加计算概率的一方,感觉随便拉个向量都能与它求相似度,但是 deoder_hidden 与 encoder_hidden 它们的相关性,是正 / 负相关 还是不相关,感觉没有一个定性的说明,即这种前向计算过程没有理论支撑表明神经模型前向计算结果一定会朝着接近期望值的方向演进,靠的完全是反向误差的传播来修改达到相似靠近的目的,但是网随着络层权重的演进,使得大量预测输出又越来越接近真实值,大牛能否分析下我的理解是否正确!

    3. mathor mathor

      @bigFly1.criterion = nn.CrossEntropyLoss()
      loss = criterion (pred, target),其中 pred 是模型的输出,要求是概率形式而不是 ont-hot,target 要求是一个一个索引,也不是 one-hot。具体的您可以看下 pytorch 官方 api

      2. 您的理解是正确的

    4. bigFly bigFly

      @mathor 感谢大牛的认真回复,解惑了一大半!赞!!!

    5. bigFly bigFly

      @bigFly 请问大牛
      基于本节的模型设计,为什么不可以将解码器在不同时间步的隐藏状态 s⊤t′−1∈R1×h,t′∈1,…,T′st′−1⊤∈R1×h,t′∈1,…,T′连结成查询项矩阵 Q∈RT′×hQ∈RT′×h,从而同时计算不同时间步的含注意力机制的背景变量 c⊤t′,t′∈1,…,T′ct′⊤,t′∈1,…,T′?
      问题来自 http://zh.gluon.ai/chapter_natural-language-processing/attention.html

    6. mathor mathor

      @bigFly 建议你去它们的官方论坛提问吧,回答的比我权威一些

    7. bigFly bigFly

      @mathor 你来回答吧,他们官网没有响应

    8. aji0110 aji0110

      @mathor 大佬你好,我最近也在尝试在 LSTM 中加入 attention 机制,但是基础很差,想问下,这个 Wk 和 Wq,是这样创建的吗:Wk = nn.Liner (x,y,bias=False), 就是想问下,这里面 x, y 各是什么值??

    9. aji0110 aji0110

      @mathor 并且只是做时序数据预测,不是特别难,但是基础不好,之前光在调用现成的模型

    10. kang kang

      @aji0110 你试试 print (Wk.weight.shape),就知道 x 和 y 是啥了

    11. kang kang

      @bigFly 我以为,如果你从 t'=1..T' 全都取到了没什么用啊,因为你后来还需要 target token 的输入,这个有不可能超前提供。当然,除非你是 teach and learn 的,这个还有可能。

  5. tracy tracy

    写得很好,也帮助了我理解,博主能放一下收款码之类的么,我想要发一个小红包,以示感谢

    1. mathor mathor

      @tracy 文章下面,评论区上面,有一个打赏二字,点击一下就有微信以及支付宝付款码