https://www.cnblogs.com/guoyaohua/p/9429924.html
https://zhuanlan.zhihu.com/p/93061413

信息

分类

从Attention的作用角度出发,我们就可以从两个角度来分类Attention种类:Spatial Attention 空间注意力Temporal Attention 时间注意力。更具实际的应用,也可以将Attention分为Soft AttentionHard AttentionSoft Attention是所有的数据都会注意,都会计算出相应的注意力权值,不会设置筛选条件。Hard Attention会在生成注意力权重后筛选掉一部分不符合条件的注意力,让它的注意力权值为0,即可以理解为不再注意这些不符合条件的部分。
**

Attention

传统的encode decode机制

encode输入,然后得到中间结果C,最后decode输出完成任务
中间结果是固定的,和任务完成的位置没有关系(例如翻译任务,翻译的位置到了哪里使用的中间结果是一样的,都是用同样的数据做翻译)

Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对。 ————(思考:对很通用,X是一个问句,Y是答案;X是一个句子,Y是抽取的关系三元组;X是汉语句子,Y是汉语句子的英文翻译。等等),我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成: Attention - 图1   Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C: Attention - 图2   对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词yi : Attention - 图3   每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。 ———(思考:其实这里的Encoder-Decoder是一个序列到序列的模型seq2seq,这个模型是对顺序有依赖的。)   Encoder-Decoder是个非常通用的计算框架,至于Encoder和Decoder具体使用什么模型都是由研究者自己定的,常见的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,这里的变化组合非常多。 ———(思考:人的学习过程包括输入、输出、外界评价。Encoder模型类似于人的输入学习过程,Decoder模型类似于人的输出学习过程,对输出的内容进行评价就类似于损失函数。英语老师给我上了几堂英语课,我在不断的输入Encoder;突然有一个随堂测试,我得做题输出Decoder;最后英语老师改卷子,给我一个分数,不对的地方我得反思调整我对输入数据的加工方式。)———-(再思考:关于英语翻译。课本上的单词和课文是原始数据输入,相当于X;我在大脑里加工这些数据,相当于Encoder模型,我的脑子里有很多加工后的数据,相当于C;现在要让我翻译一个英语句子,这个任务相当于Y,我不能翻课本,所以我只能借助我脑袋里加工的数据C去翻译这个句子,即我得动脑子,相当于Decoder。 学习的过程是什么都要学,要分类整理,要增加线索,并不知道未来的某天能用到什么,所以Encoder-Decoder是一个泛泛学习的框架)

因此引入attention机制,对上述的数据进行改变使得完成任务的时候用的数据是有侧重的,和输出位置有关

Attention机制

由于上述的问题,有了attention机制。就是在执行任务的时候对C进行了加权的计算,使得每一步任务用的C不是完全一样的,是有侧重的
先前的数据对当前任务的处理的“贡献度”不相等

引入AM模型,以翻译一个英语句子举例:输入X:Tom chase Jerry。 理想输出:汤姆追逐杰瑞。   应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值: (Tom,0.3)(Chase,0.2)(Jerry,0.5)

个人的理解就是对隐藏层的权重进行了加权

Attention实例

Attention机制的核心想法就是:在解码器的每一个时间步,都和编码器直接连接,然后只关注source sentence中的特定的一部分
先用图来看一下attention机制在做什么,不考虑数学公式:
Step1:
Attention - 图4
在解码阶段,第一个时间步开始,把hidden layer生成的hidden state,与编码器的第一个时间步的hidden state做点乘,产生一个数值,叫做attention scores
接下来对编码器每一个时间步都这样操作,每一个时间步都产生一个attention scores:
Attention - 图5

Step2:
对刚才产生的scores,通过softmax,转变成概率分布,再将这个概率分布,与编码器的所有hidden states,做一个加权求和,得到一个attention output,很容易看出来,这个输出中,哪一个hidden state的权重最大,就包含了越多它的信息(可以看出解码器的第一个时间步,对编码器的第一个时间步‘关注’最多)
Attention - 图6

Step3:
把这个attention output和解码器的第一个时间步的hidden state合并起来,用来计算 Attention - 图7Attention - 图8 中概率最大的就是预测的值,这里举例是he
Attention - 图9
Step4:
按照前面所说的第一个时间步的做法,对解码器的每一个时间步都这样去做,得到最终的输出,概括来说,就是解码器的每一个时间步,都会去看一下编码器的全文,挑选当前时间步最“感兴趣”的部分,给予大的权重,基于“感兴趣”的部分,得出自己的预测
Attention - 图10


假设编码器的hidden states分别为 Attention - 图11
在解码器的第一个时间步,解码器的hidden state为 Attention - 图12
我们通过点乘得到当前时间步的attention scores:
Attention - 图13
再通过softmax转换成attention distribution(是一个概率分布,和为1):
Attention - 图14
然后用这个概率分布去和编码器的所有hidden states加权求和,得到attention output:
Attention - 图15
最后把attention output和解码器的hidden state合并起来得到 Attention - 图16 ,然后去执行不用attention机制的seq2seq一样的做法就好了
这样就得到了解码器的第一个时间步的输出,后面以此类推