Attention (学习笔记)
Seq-Seq 模型的困难:
困难:
(1)编码到一个hidden state (c)有信息损失。
c的表达能力不足。
(2)梯度消失: decoder 梯度传播到encoder ,梯度传播过长。
(3)非平稳性,实际中不同语言的顺序是不同的。
需要 Attention
Attention enbales the model to be globally. (时间上是globally ,但不是全连接网络,区别是全连接网络是特征组合,不区分每一个时刻的特征对应的对象。 attention对任意一个时刻计算词的相关性)。
Temporal Attention
任何一个词对当前时刻的重要性,简单的方法是加权。
对的重要性, 学习
a 可以是全连接网络,例如。a也可以是内积(不是很work).
a的权重和是1, Softmax
简单的使用方法是a对x进行加权:
(是上下文向量)
,这里的f是GRU或者LSTM,
区别与LSTM与RNN的单元创新,这里的创新是网络架构的创新(增加了上下文的向量)。
- 双向的RNN
蓝色区域是 encoder.
f代表网络的节点,可以是LSTM或者GRU
学习权重
softmax 分配attention
注意力模型
Key k, Query q and Value v
target state 是q.
source state 是k.
在深度网络中,k和v是一样的。
计算重要性
融合重要性
层次化的Attention (Hierarchical Attention)
attention 模型的输出被输入到下一层。
Yang et al. Hieracrchial Attention Networks for Document Classification. ACL-HLT 2016
Local Attention
找到一个source position , 滑动窗口计算周围的上下文向量。
下面公式中S是源句子的长度。
使用高斯核函数,降低计算量
文章: Luong et al. Effective Approaches to Attention-based Neural Machine Translation. ACL 2015
Google NMT System
把好的想法取出来,组合最新的翻译系统(文章: Wu et al. Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine TRanslation 2016)
(1) encorder 和decoder 结构
(2)采用 Bi-directional 结构
(3)使用 Residual 结构: 在纵向方向上使用,防止梯度消失
(4)采用Attention 结构: 计算 decorder中任意一个词和encorder所有词的注意力分配。
Self -Attention
给出一组Key , query Q和value V
Self_attention中 K=Q=V.
Self-Attention可以使用Temporal Attention实现,但是实现较复杂,并且发生在大的RNN网络中。
太复杂
-
内积
内积坏处是并不能真实反应样本的相似性。 -
双线性
多引入了一组参数,在度量学中经常使用,W是马式矩阵。 -
Scaled 内积
深度学习自己具有特征学习能力,任意两个特征之间如果能很好的学习特征,则足够的。
内积的值会随着向量维度的增加,所以对向量的维度进行Scaled,使得输入在softmax 在非饱和区。
区别 于Temporal Attention ,这里是用伸缩之后的内积区计算。
这里的复杂度是, l 是句子的长度(单词的个数)。
Temporal Attention的复杂度是, 通过内积的计算大大降低了复杂度(l << dk).
Self Attention 在decoder的阶段破坏了句子的顺序的信息,所以需要加入 Mask(类似卷积的dropout)。
缺点
(1)表达能力不够。
(2)丢失了位置信息,抛弃了循环网络,循环网络是图灵完备的网络。
解决办法: Multi-head Attentiont ,使得能够不同 的chanel 注意力到不同的子空间 。
每一个chanel的维度不是很高,降低的维度,从到。
不同head之间参数不共享。
对于attention丢失了位置信息,加入位置信息到输入向量。
pos 是位置, i是维度。下面的公式是一个trick。
Transformer
论文: Vaswanni et al. Attention is all youn need. NIPS 2017
这里的Transformer 没有RNN结构,只有 Self Attention.
Transformer 的结构:下图通常称之为 Transformer Block, 图中的Nx代表重复了Nx次(6次)。
所有的循环连接被 attention modules 取代。
Encorder:
6 layers of self-attention + feed-forward network
Decorder:
6 layers of masked self-attention + feed-forward network
输入层:
输入向量加上位置信息
输出层:
linear transformation and softmax
- 两种方式叠加网络
第一种encorder方式,K,Q,V位置对应,注意图中红框。这里encorder 本质上self-attention.
第二种decorder方式:
decorder中Q从上一层得到,记忆的K和V从encorder得到。这里的decorder 本质上是cross-attention. - Feed forward
输入是(batch, sel_len, fea_size)reshape成(batch*seq_len, fea_size),加入特征变换使得网络更深,不能使用卷积操作,所以使用全连接网络, 三维变成二维使得可以使用下面的全连接网络。
使用两层的MLP(with ReLU)
然后又Reshape 成3D,类似卷积里面的1x1卷积。
仍然需要注意的是在不同层之间有残差连接,防止梯度消失(纵向的方向梯度消失)。这里的Normalization是Layer Normalization。
为什么使用Self_attention
(1)可以并行,没有时间之间的转移,速度更快。
(2)可以建模长期的依赖。
(3)具有一定的可解释性。
(4)计算复杂性(当句子的长度小于表示向量的维度)。
下面n代表句子的长度,d是维度, k是卷积的kernal size. r是邻居的大小。
Transformer 与RNNs的联系与区别
RNNs的优点:
对于序列建模是很强大的(图灵完备,可以生成所有的序列)
缺点:
Sequence 使得训练是缓慢的,在一些大规模的语言理解(翻译)。
Transformer优点:
可以并行,更快的训练速度。
缺点:
在小的结构性明显的语言任务中(类似语言的copy, 输入 abc 输出abcabc)
不是图灵完备(因为丢失了位置信息)。