Attention (学习笔记)

Attention (学习笔记)
Seq-Seq 模型的困难:

p(y1,...yT)x1,...xT=t=1Tp(ytc,y1,...,yt1)=t=1Tg(c,st2,yt1)p(y_1,...y_T)|x_1,...x_T=\prod _{t=1}^{T^{'}}p(y_t|c,y_1,...,y_{t-1})=\prod _{t=1}^{T^{'}}g(c, s_{t-2}, y_{t-1})
困难:
(1)编码到一个hidden state (c)有信息损失。
c的表达能力不足。
(2)梯度消失: decoder 梯度传播到encoder ,梯度传播过长。
(3)非平稳性,实际中不同语言的顺序是不同的。
需要 Attention
Attention enbales the model to be globally. (时间上是globally ,但不是全连接网络,区别是全连接网络是特征组合,不区分每一个时刻的特征对应的对象。 attention对任意一个时刻计算词的相关性)。

Temporal Attention

任何一个词对当前时刻的重要性,简单的方法是加权。
xjx_jsi1s_{i-1}的重要性, 学习 eij=a(si1,xj)e_{ij}=a(s_{i-1}, x_j)
a 可以是全连接网络,例如eij=vaTtanh(Wasi1+Uaxj)e_{ij}=v_a^T tanh(W_a s_{i-1} + U_ax_j)。a也可以是内积(不是很work).

Attention (学习笔记)
a的权重和是1, Softmax aij=exp(eij)k=1Texp(eik)a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^Texp(e_{ik})}
简单的使用方法是a对x进行加权:
ci=j=1Taijxjc_i=\sum_{j=1}^Ta_{ij}x_j (cic_i是上下文向量)

si=f(si1,yi1,ci)s_i = f(s_{i-1},y_{i-1},c_i) ,这里的f是GRU或者LSTM,

区别与LSTM与RNN的单元创新,这里的创新是网络架构的创新(增加了上下文的向量)

  • 双向的RNN

Attention (学习笔记)
蓝色区域是 encoder.
f代表网络的节点,可以是LSTM或者GRU
si=f(si1,yi1,ci)s_i = f(s_{i-1},y_{i-1},c_i)

ci=j=1Taijhj,hj=[hj;hj]c_i=\sum_{j=1}^Ta_{ij}h_j, h_j = [\underset{h_j}{\rightarrow}; \underset {h_j}{\leftarrow}]

学习权重
eij=a(si1,hj)e_{ij}=a(s_{i-1}, h_j)

softmax 分配attention
aij=exp(eij)k=1Texp(eik)a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^Texp(e_{ik})}

注意力模型

Key k, Query q and Value v
target state 是q.
source state 是k.
在深度网络中,k和v是一样的。
计算重要性
wij=a(qi1,kj)w_{ij}=a(q_{i-1}, k_j)

融合重要性
j=1Twijvj\sum_{j=1}^Tw_{ij}v_j

层次化的Attention (Hierarchical Attention)

attention 模型的输出被输入到下一层。
Yang et al. Hieracrchial Attention Networks for Document Classification. ACL-HLT 2016

Local Attention

找到一个source position ptp_t, 滑动窗口计算ptp_t周围的上下文向量ctc_t
下面公式中S是源句子的长度。
pt=Ssigmoid(vpTtanh(Wpht))p_t = S\cdot sigmoid(v_p^T tanh (W_p h_t))

使用高斯核函数,降低计算量
at(s)=align(ht,hsˉ)exp[(spt)22σ2]a_t(s) = align(h_t, \bar{h_s})exp[-\frac{(s-p_t)^2}{2\sigma^2}]
文章: 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所有词的注意力分配。
Attention (学习笔记)

Self -Attention

给出一组Key K=[k1,...,kn]K=[k_1,..., k_n] , query Q和value V
Self_attention中 K=Q=V.

Self-Attention可以使用Temporal Attention实现,但是实现较复杂,并且发生在大的RNN网络中。
eij=vaTtanh(Wasi1+Uahj)e_{ij}=v_a^Ttanh(W_a s_{i-1} + U_ah_j)太复杂

  • 内积
    a(q,k)=qTka(q,k)=q^Tk 内积坏处是并不能真实反应样本的相似性。

  • 双线性
    a(q,k)=qTWka(q,k)=q^TWk 多引入了一组参数,在度量学中经常使用,W是马式矩阵。

  • Scaled 内积
    a(q,k)=qTkdka(q,k)=\frac{q^Tk}{d_k}
    深度学习自己具有特征学习能力,任意两个特征之间如果能很好的学习特征,则足够的。
    内积的值会随着向量维度的增加,所以对向量的维度dkd_k进行Scaled,使得a(q,k)a(q,k)输入在softmax 在非饱和区。

Attention (学习笔记)
Attention(Q,K,V)=Softmax(QKTdk)VAttention(Q,K,V) = Softmax(\frac{QK^T}{\sqrt{d_k}})V
区别 于Temporal Attention ,这里是用伸缩之后的内积区计算。
这里的复杂度是dkl2d_kl^2, l 是句子的长度(单词的个数)。
Temporal Attention的复杂度是dk2l2d^2_kl^2, 通过内积的计算大大降低了复杂度(l << dk).

Self Attention 在decoder的阶段破坏了句子的顺序的信息,所以需要加入 Mask(类似卷积的dropout)。
Attention (学习笔记)
缺点
(1)表达能力不够。
(2)丢失了位置信息,抛弃了循环网络,循环网络是图灵完备的网络。
解决办法: Multi-head Attentiont ,使得能够不同 的chanel 注意力到不同的子空间 。
每一个chanel的维度不是很高,降低WiQ,WiK,WiVW_i^Q, W_i^K, W_i^V的维度,从dmodeld_{model}dk,dk,dvd_k, d_k, d_v

不同head之间参数不共享。
headi=Attention(QWiQ,KWiK,VWiV)head_i =Attention(QW_i^Q, KW_i^K, VW_i^V)

MultiHead(Q,K,V)=Concat(head1,...,headn)WOMultiHead(Q,K,V)=Concat (head_1,...,head_n)W^O

Attention (学习笔记)
对于attention丢失了位置信息,加入位置信息到输入向量。
pos 是位置, i是维度。下面的公式是一个trick。
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos, 2i) = sin(pos/10000^{2i/d_{model}})

PE(pos,2i+1)=cos(pos/100002i/dmodel)PE(pos, 2i+1)=cos(pos/10000^{2i/d_{model}})
Attention (学习笔记)

Transformer

论文: Vaswanni et al. Attention is all youn need. NIPS 2017
Attention (学习笔记)
这里的Transformer 没有RNN结构,只有 Self Attention.
Transformer 的结构:下图通常称之为 Transformer Block, 图中的Nx代表重复了Nx次(6次)。
Attention (学习笔记)
所有的循环连接被 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.
    Attention (学习笔记)
    第二种decorder方式:
    decorder中Q从上一层得到,记忆的K和V从encorder得到。这里的decorder 本质上是cross-attention.
    Attention (学习笔记)
  • Feed forward
    输入是(batch, sel_len, fea_size)reshape成(batch*seq_len, fea_size),加入特征变换使得网络更深,不能使用卷积操作,所以使用全连接网络, 三维变成二维使得可以使用下面的全连接网络。
    使用两层的MLP(with ReLU)
    FFN(x)=max(0,xW1+b1)W2+b2FFN(x) = max(0, xW_1+b_1)W_2 +b_2

然后又Reshape 成3D,类似卷积里面的1x1卷积。
Attention (学习笔记)
仍然需要注意的是在不同层之间有残差连接,防止梯度消失(纵向的方向梯度消失)。这里的Normalization是Layer Normalization。

为什么使用Self_attention

(1)可以并行,没有时间之间的转移,速度更快。
(2)可以建模长期的依赖。
(3)具有一定的可解释性。
(4)计算复杂性(当句子的长度小于表示向量的维度)。

下面n代表句子的长度,d是维度, k是卷积的kernal size. r是邻居的大小。
Attention (学习笔记)

Transformer 与RNNs的联系与区别

RNNs的优点:
对于序列建模是很强大的(图灵完备,可以生成所有的序列)
缺点:
Sequence 使得训练是缓慢的,在一些大规模的语言理解(翻译)。

Transformer优点:
可以并行,更快的训练速度。
缺点:
在小的结构性明显的语言任务中(类似语言的copy, 输入 abc 输出abcabc)
不是图灵完备(因为丢失了位置信息)。