赞
踩
在普通的RNN
结构中,Encoder
需要把一个句子转化为一个向量,然后在Decoder
中使用,这就要求 Encoder
把源句子中所有的信息都包含进去,但是当句子长度过长的时候,这个要求就很难达到,或者说会产生瓶颈(比如,输入一片文章等长内容),当然我们可以使用更深的RNN和大多的单元来解决这个问题,但是这样的代价也很大。
为此,Bahdanau等人在2015年提出了Attention
机制,Attention翻译成为中文叫做注意力,把这种模型称为Attention based model。就像我们自己看到一幅画,我们能够很快说出画的主要内容,而忽略画中的背景,因为我们注意的,更关注的往往是其中的主要内容。
通过这种方式,在我们的RNN中,我们有通过LSTM
或者是GRU
得到的所有消息,那么这些信息中只去关注重点,而不需要在Decoder的每一个time step使用全部的Encoder的信息,这样就可以解决第一段所说的问题了。
那么现在要讲的Attention机制就能够帮助我们解决这个问题。
假设我们有一个文本翻译的要求,即机器学习翻译为machine learning,那么这个过程通过前面所学习的seq2seq就可以实现
上图的左边是Encoder
,能够得到hidden_state
在右边使用
Decoder中蓝色方框中的内容,是为了提高模型的训练速度而使用teacher forcing手段,否则的话会把前一次的输出作为下一次的输入(但是在Attention模型中不再是这样了)
那么在整个过程中如果使用Attention应该怎么做呢?
在之前我们把Encoder的最后一个输出,作为decoder的初始的隐藏状态,现在我们不再这样做
Decoder
的隐藏状态z0
z0
会和Encoder
第一个time step
的 output
进行match操作(或者是socre操作),得到α0^1
,这里的match可以使用很多种操作,比如:
softmax
,让他们的和为1(可以理解为权重)hi
进行 相加求和得到c^0
c\^0
之后,把它作为decoder的input,同和传入初始化的z\^0
,得到第一个time step
的输出和hidden_state(Z^1)
Z1
再和所有的Encoder的output
进行 match
操作,得到的结果进行softmax
之后作为权重和Encoder的每个time step
的结果相乘求和得到c^1
c\^1
作为decoder的input,和Z\^1
作为输入得到下一个输出,如此循环,直到最终decoder的output为终止符。
attention
的权重:隐藏状态(zi)和Encoder的outputs计算(余弦,DNN,矩阵乘法)出的结果进行softmax之后得到的c^i
:attention weight和Encoder outputs计算得到的,即αi和hi相乘求和output([batch_size, hidden_size])
和上下文向量c^i 进行拼接 ,经过形状变换和tanh的处理之后作为当前时间步的输入。总结:
初始化一个z0,和Encoder的每一个时间步的output进行match操作得到α^1,α^2…α^n,这些α进行softmax操作得到c^0,这个c^0和z^0作为Encoder的输入,得到第一个time step的输出和hidden_state(z^1),z^1和z^0经过一样的步骤和操作,得到z^2,循环往复…
Global-Attention
和 Local-Attention
Bahdanau等人提出的Bahdanau Attention被称为local attention,后来Luong等人提出的Luong Attention是一种Global attention
所谓全局的attention是指:使用的全部的Encoder端的输入的attention的权重
local-attention就是使用了部分的Encoder端的输入的权值(当前时间步上的Encoder的hidden state),这样可以减少计算量,特别是当句子的长度比较长的时候。
前面的计算,是让decoder
的输出hi
和每一个Encoder的hidden state
进行计算,所以是全局的attention
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。