欢迎关注公众号:DeepL Newer

MENU

图解Attention

July 1, 2020 • Read: 4452 • 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

21 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的,这个还有可能。