文章目录
一 Attention的原理和实现
1. Attention的介绍
在普通的RNN结构中,Encoder需要把一个句子转化为一个向量,然后在Decoder中使用,这就要求Encoder把源句子中所有的信息都包含进去,但是当句子长度过长的时候,这个要求就很难达到,或者说会产生瓶颈(比如,输入一篇文章等长内容),当然可以使用更深的RNN和增加单元数来解决这个问题,但是这样的代价也很大。那么有没有什么方法能够优化现有的RNN结构呢?
为此,Bahdanau等人在2015年提出了Attenion
机制,Attention
翻译成为中文叫做注意力,把这种模型称为Attention based model
。就像我们自己看到一副画,能够很快的说出画的主要内容,而忽略画中的背景,因为我们更关注的往往是其中的主要内容。
通过这种方式,在RNN模型中,有通过LSTM或者是GRU得到的所有信息,那么这些信息中只去关注重点,而不需要在Decoder的每个time step使用全部的encoder的信息,这样就可以解决第一段所说的问题了
Attention机制
可以帮助解决这个问题
2. Attenion的实现机制
假设现在有一个文本翻译的需求,即机器学习
翻译为machine learning
。那么这个过程通过前面所学习的Seq2Seq就可以实现
上图的左边是Encoder,能够得到hidden_state
在右边使用
Deocder中蓝色方框中的内容,是为了提高模型的训练速度而使用teacher forcing手段,否则的话会把前一次的输出作为下一次的输入(但是在Attention模型中不再是这样了)
那么整个过程中如果使用Attention应该怎么做呢?
在之前把encoder的最后一个输出,作为decoder的初始的隐藏状态,现在不再这样做
2.1 Attention的实现过程
-
初始化一个Decoder的隐藏状态 z 0 z_0 z0
-
这个 z o z_o zo会和encoder第一个time step的output进行match操作(或者是socre操作),得到 α 0 1 \alpha_0^1 α01 ,这里的match可以使很多种操作,比如:
-
z和h的余弦值
-
是一个神经网络,输入为z和h
-
或者 α = h T W z \alpha = h^T W z α=hTWz等
-
-
encoder中的每个output都和 z 0 z_0 z0进行计算之后,得到的结果进行softmax,让他们的和为1(可以理解为权重)
-
之后把所有的softmax之后的结果和原来encoder的输出 h i h_i hi进行相加求和得到 c 0 c^0 c0
即: c 0 = ∑ α ^ 0 i h i 即: c^0 = \sum\hat{\alpha}_0^ih^i 即:c0=∑α^0ihi
-
得到 c 0 c^0 c0之后,把它作为decoder的input,同和传入初始化的 z 0 z^0 z0,得到第一个time step的输出和hidden_state( Z 1 Z^1 Z1)
-
把 Z 1 Z_1 Z1再和所有的encoder的output进行match操作,得到的结果进行softmax之后作为权重和encoder的每个timestep的结果相乘求和得到 c 1 c^1 c1
-
再把 c 1 c^1 c1作为decoder的input,和 Z 1 Z^1 Z1作为输入得到下一个输出,如此循环,直到最终decoder的output为终止符
-
上述参考:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html
-
整个过程写成数学公式如下:
α i j