背景
Encoder-Decoder是个非常通用的计算框架,至于Encoder和Decoder具体使用什么模型都是由研究者自己定的,常见的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,这里的变化组合非常多。
seq2seq(14年)
- seq2seq 是一个 Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列。
- Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。
- 这个结构最重要的地方在于输入序列和输出序列的长度是可变的,可以用于翻译,聊天机器人,句法分析,文本摘要等。
Encoder 对输入语句 X 进行编码,经过函数变换为中间语义向量 C,得到中间语义向量 C 后,使用 Decoder 进行解码。Decoder根据中间状态向量 C 和已经生成的历史信息 yi-1 去生成 t 时刻的单词 yi
两种模型
如果将 c 直接输入到Decoder中,则是 Seq2Seq 模型的第二种模型:
c直接作为Decoder阶段RNN的初始化state,而不是在每次decode时都作为RNN cell的输入。
如果将 c 当作 Decoder 的每一时刻输入,则是 Seq2Seq 模型的第一种模型:
tip:g函数往往是一个softmax函数
Seq-to-Seq with Attention(14年)
Encoder-Decoder 模型的局限性:
- 中间语义向量无法完全表达整个输入序列的信息。Encoder 和 Decoder 的唯一联系只有语义编码 C ,即将整个输入序列的信息编码成一个固定大小的状态向量再解码,相当于将信息”有损压缩”。
- 句子X中任意单词对生成某个目标单词yi来说影响力都是相同的,没有任何区别
- RNN难以处理长序列的句子。随着输入信息长度的增加,由于向量长度固定,先前编码好的信息会被后来的信息覆盖,丢失很多信息。
- 每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;
- 并且面临对齐问题。
引入Attention机制优点:
- 打破了只能利用encoder最终单一向量结果的限制,从而使模型可以集中在所有对于下一个目标单词重要的输入信息上,使模型效果得到极大的改善。
- 可解释性。我们通过观察attention 权重矩阵的变化,可以更好地知道哪部分翻译对应哪部分源文字。
Attention 模型的特点是 Decoder 不再将整个输入序列编码为固定长度的中间语义向量 C ,而是根据当前生成的新单词计算新的 ,使得每个时刻输入不同的 C,这样就解决了单词信息丢失的问题。引入了 Attention 的 Encoder-Decoder 模型如下图:
原来:
现在:
attention 权重矩阵的计算
这里关键的操作是计算encoder与decoder state之间的关联性的权重,得到Attention分布,从而对于当前输出位置得到比较重要的输入位置的权重,在预测输出时相应的会占较大的比重。
Attention(17年)
背景:attention mechanism通常和RNN结合使用,每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;
应用:机器翻译,图片描述,语音转文字
注意力模型优势:
- 提高任务性能
- 提高模型的可解释性
- 并行计算减少模型训练时间。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。但是CNN也只是每次捕捉局部信息,通过层叠来获取全局的联系增强视野。
- 可以灵活的捕捉长期和local依赖,而且是一步到位的。AM解决了RNN模型的很多问题,例如在面对长文本时的性能衰减,以及计算序列数据对任务的权重影响等。
可以从两个角度来分类Attention:
- Spatial Attention 空间注意力和Temporal Attention 时间注意力。
- Soft Attention和Hard Attention。Soft Attention是所有的数据都会注意,都会计算出相应的注意力权值,不会设置筛选条件。Hard Attention会在生成注意力权重后筛选掉一部分不符合条件的注意力,让它的注意力权值为0,即可以理解为不再注意这些不符合条件的部分。
通用理解
Attention is all you need
本文的创新点在于抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果,创新之处在于提出了两个新的Attention机制,分别叫做 Scaled Dot-Product Attention 和 Multi-Head Attention。提出了transformer。
将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。其实就是一个查询(query)到一系列键值(key-value)对的映射。
从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。
scaled dot-product attention
attention函数共有三步完成得到attention value。
- Q与K进行相似度计算得到权值
计算Query和每个Key之间的相似性或相关性一般有三种方式:
- dot:
- General:
- Concat:
- Preceptron:
-
对上部权值归一化
-
用归一化的权值与V加权求和
其意义为:为了用 value求出 query的结果, 根据 query和 key 来决定注意力应该放在value的哪部分。以前的 attention是用 LSTM 做 encoder,也就是用它来生成key 和 value,然后由 decoder来生成 query。(论文 Neural machine translation by jointly learning to align and translate,key 和 value是一样的,都是文中的h ,而 query是文中的 s。)
有两种常用的注意力函数,一种是加法注意力(additive attention),另外一种是点乘注意力(dot-productattention),论文所采用的就是点乘注意力,这种注意力机制对于加法注意力而言,更快,同时更节省空间。
为什么scaling:
如果太大,点乘的值太大,如果不做scaling,结果就没有加法注意力好。(d_k是key和query的维度)
点乘的结果过大,这使得经过softmax之后的梯度很小,不利于反向传播的进行,所以我们通过对点乘的结果进行尺度化。
Multi-head Attention
这里面Multi-head Attention其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征,如下图所示,两个head学习到的Attention侧重点可能略有不同,这样给了模型更大的容量。
self attention
Google最新的机器翻译模型内部大量采用了Self Attention模型。
在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素和Source中的所有元素之间。而Self Attention顾名思义,可以理解为Target=Source这种特殊情况下的注意力计算机制,指的不是Target和Source之间的Attention机制。
优点:
- 引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
- Self Attention对于增加计算的并行性也有直接帮助作用。
Transformer
Encoder: encoder由6个相同的层堆叠而成,每个层有两个子层。第一个子层是多头自我注意力机制(multi-head self-attention mechanism),第二层是简单的位置的全连接前馈网络(position-wise fully connected feed-forward network)。在两个子层中会使用一个残差连接,接着进行层标准化(layer normalization)。也就是说每一个子层的输出都是LayerNorm(x + sublayer(x))。网络输入是三个相同的向量q, k和v,是word embedding和position embedding相加得到的结果。为了方便进行残差连接,我们需要子层的输出和输入都是相同的维度。
Decoder: decoder也是由N(N=6)个完全相同的Layer组成,decoder中的Layer由encoder的Layer中插入一个Multi-Head Attention + Add&Norm组成。输出的embedding与输出的position embedding求和做为decoder的输入,经过一个Multi-HeadAttention + Add&Norm((MA-1)层,MA-1层的输出做为下一Multi-Head Attention + Add&Norm(MA-2)的query(Q)输入。MA-2层的输出输入到一个前馈层(FF),经过AN操作后,经过一个线性+softmax变换得到最后目标输出的概率。对于decoder中的第一个多头注意力子层,需要添加masking,确保预测位置i的时候仅仅依赖于位置小于i的输出。层与层之间使用的Position-wise feed forward network。
key, query, value
- 对于encoder来说,其中key, query, value均来自前一层encoder的输出,即encoder的每个位置都可以注意到之前一层encoder的所有位置。
- 对于decoder来讲,有两个与encoder不同的地方:
- 一个是第一级的Masked Multi-head。key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
- 另一个是第二级的Multi-Head Attention不仅接受来自前一级decoder的输出,还要接收encoder的输出。第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但其key和value来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
- 总结一下,k和v的来源总是相同的,q在encoder及第一级decoder中与k,v来源相同,在encoder-decoder attention layer中与k,v来源不同。
因此,Transformer会在三个不同的方面使用multi-head attention:
- encoder-decoder attention:使用multi-head attention,输入为encoder的输出和decoder的self-attention输出,其中encoder的self-attention作为 key and value,decoder的self-attention作为query
- encoder self-attention:使用 multi-head attention,输入的Q、K、V都是一样的(input embedding and positional embedding)
- decoder self-attention:在decoder的self-attention层中,deocder 都能够访问当前位置前面的位置
position encoding
注意由于该模型没有recurrence或convolution操作,所以没有明确的关于单词在源句子中位置的相对或绝对的信息,为了更好的让模型学习位置信息,所以添加了position encoding并将其叠加在word embedding上。该论文中选取了三角函数的encoding方式,其他方式也可以。
Add+Norm
其中Add代表了Residual Connection,是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,这一方法之前在图像处理结构如ResNet等中常常用到。
而Norm则代表了Layer Normalization,通过对层的激活值的归一化,可以加速模型的训练过程,使其更快的收敛,
参考文献: