seq2seq with self-attention
RNN处理sequence
RNN输入 vector sequence, 输出 vector sequence
RNN的问题:不容易被并行化,只能序列化
usiong CNN to replace RNN->为了并行化
RNN和CNN都能实现 输出B1-B4序列;
更高层的filter可以考虑更大范围的依赖关系
CNN的缺点:需要叠很多层 才能有较大的感受野
小结:
RNN可以捕捉长程关系,但不能并行;
CNN可以并行,但不善于捕捉长程关系,需要堆叠很多层。
使用self-attention layer可以替代RNN
Transformer本身不包含序列的顺序信息,因此需要在输入时增加positional embedding
Transformer重点在self-attention结构,mulit-head旨在捕获单词之间多种维度上的依赖关系。
如何trade-off—self-attention layer:
《Attention is all you need》
self-attention层的输入处理序列,输出也是序列。
每一个输出bi都是基于整个输入序列得到的;但不同的bi是并行输出的。
Step 1:
每一个输入 先经过embedding,然后在乘上三个不同的transformation,产生三个不同的vector(Q,K,V)
q:query(to match others)
k:key(to be matched)
v:information to be extracted
Step 2:
每一个q对每一个k做attention(向量的夹角、相似度)–看这两个向量有多匹配->a11,a12,a13,a14…
每个head的q,k,v都不一样,可以理解为用不同的卷积核提取不同的特征
d:是q和k的维度,为什么要scaled?—归一化
为了避免inner product之后variance太大
Step 3:
将所有的a经过softmax后得到注意力系数α
所有head的该系数 乘以v 得到最后的输出bi
精妙之处:
(1)因为v是包含整个序列的,因此生成的bi是考虑了整个序列的;
(2)通过控制α11,α12,α13等的值就可以控制信息流的输入
比如只考虑local信息,则只保留α11; 考虑global信息,α11,α12,α13,α14都考虑在内
(3)所有的bi都是并行输出的
Step 1:
计算Q,K,V细节:
a1Wq得到q1;a2Wq得到q2…
因此a1,a2,a3,a4可以拼接为一个整体I,他们的Wq可以拼接为一个大的Wq,输出Q按column分为是q1,q2,q3,q4.
K,V同理。
Step 2:
计算α的细节
q1*不同的ki得到αi
因此不同的ki也可以拼成一个大的K;大α矩阵按列拆分成α1,α2,α3,α4;
qi也是可以拼接成一个大的Q
A=K^T * Q
Step 3:获得的A矩阵 经过softmax后获得注意力系数α矩阵A^
Step 4:V矩阵的每一个v根据注意力系数矩阵A^的值做weighted sum,A ^ 按列拆分。
weighted sum结果则是b1,b2,b3,b4组成的输出矩阵O
并行化的OverView:
Wq,Wk,Wv就是需要学习的参数
以two-head为例,需要将Q,K,V进一步分裂成两个矩阵,like 需要学习的Wq,Wk,Wv有多组(2组)->多通道的思想
multi-head的好处:不同的head关注的点是不一样的(local or global)
No position information in self-attention[输入序列的顺序是没有考虑在内的]-如何加入位置信息?
Way 1:
ei表征位置信息,ei维度与ai维度一致,相加;ei:人工设定;
Way 2:
另外一种加入位置信息的方式:
append一个one-hotvector pi 表征位置
分为Encoder和Decoder部分
Encoder:
Step 1:将输入序列通过embedding转化为vector,并且附加位置信息。
Step 2:随后送入 multi-head attention模块 获得序列化输出
Step 3:将self-attention的输入和输出先经过elementwise-addition再经过layer norm
参考:Batch Norm vs Layer Norm
Step 4:将add&norm的结果经过feed forward
Step 5:将feed fordward的输入和输出进行add&norm
Decoder:
输入Decoder的是前一时间步timestep的输出
Step 1:将输入序列通过embedding转化为vector,并且附加位置信息。
Step 2:随后送入 multi-head attention模块 获得序列化输出,注意使用的是masked self-attention-保证输出的因果性,因为后面时间步的结果还没生成呢
Step 3:ADD & Norm
Step 4:将Encoder的输出 进行multi-head attention
这样做的好处是 使用了encoder的结果,使得每一个单词都可以利用到encoder所有单词的信息,而这些信息是无需mask的
Step 5:将前一时间步的self-attention结果和当前时间步Encoder的self-attention结果 进行Add&Norm
Step 6:进行feed forward+Add&Norm
Step 7:经过Linear和softmax获得最终预测输出
multi-head可以看到不同head关注不同的特征 green-global的关联;red-local的关联
批归一化:目的为了解决网络中协变量偏移的问题,将每一批的分布拉倒一个一致的分布。
主要用在序列处理,BN并不适用于RNN这种动态网络和batchsize较小的情况。
Layer Normalization的归一化的维度与BN是垂直的。
BN:取不同样本的同一个通道的特征做归一化
LN:取同一个样本不同通道的特征做归一化。