Transformer
在transformer之前,RNN,LSTM,GRU已经在序列模型和翻译工作中建立了很多优秀的模型。transformer是第一个完全依赖于注意力去计算输入输出表示的模型,它没有用RNN,CNN。
注意力函数把query,key,value作为输入,再计算值的权重,然后计算值的权重和。
注意力函数普遍是用两种,分别是加法注意力和点乘注意力,他们两者效果取决于dkd_kdk 的大小。dkd_kdk 较小时候,两者效果差不多,dkd_kdk 较大时,加法机制优于乘法机制。在Transformer用的是点乘注意力,这是因为矩阵乘法的代码优化,使得它更快,占用内存更小
- Scaled Dot_Product Attention and Multi-Head Attention
Scaled Dot_Product Attention:
Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax({QK^T \over \sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
Multi-Head Attention:
MultiHead(Q,K,V)=Concat(head1,head2,...,headh)WO whereheadi=Attention(QWiQ,KWiK,VWiV) MultiHead(Q,K,V)=Concat(head_1,head_2,...,head_h)W^O~\\ where head_i =Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,head2,...,headh)WO whereheadi=Attention(QWiQ,KWiK,VWiV)
其中WiQ=ϵRdmodel×dk,WiKϵRdmodel×dk,WiVϵRdmodel×dv 其中 W^Q_i=\epsilon\R^{d_{model}\times d_k},W_i^K\epsilon\R^{d_{model}\times d_k},W_i^V\epsilon\R^{d_{model}\times d_v} 其中WiQ=ϵRdmodel×dk,WiKϵRdmodel×dk,WiVϵRdmodel×dv
其中Multi-Head Attention 可以使用三种不同的方式,详情见论文3.2.3
- Position-wise Feed-Forward Networks
FFN(x)=max(0,xW1+b1)W2+b2 FFN(x)=max(0,xW_1+b_1)W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
相当于用了两个全连接的神经网络,另一个理解方式是,可以把它当作两次核为1的CNN层,输入输出维度dmodel=512d_model=512dmodel=512,内部层维度dff=2048d_ff=2048dff=2048
- Embeddings and Softmax
使用Embedding把输入核输出序列转换为维度为dmodeld_{model}dmodel, 使用softmax函数转换解码器的输出到预测序列类别的可能性
-
Positional Encoding (位置编码)
由于transformer不包含recurrence和CNN,就不能使用到序列的位置信息。为了让模型使用序列的顺序信息,transformer给模型注入了与序列绝对位置相关的信息。最后,作者添加了“positional encodings”到编码器和解码器底部的input embedding。它和Embedding有一样的维度dmodeld_{model}dmodel,这样就可以对两个进行add操作。positional encodings可以有很多选择,自适应的和固定的,见论文参考文献[9]
论文对自适应的positional embeddings做了实验,发现两个版本效果相似,最后选择了正弦版本,因为它可能允许模型推断出比在训练中遇到的更长的序列长度。
PE(pos,2i)=sin(pos/100002i/dmodel) PE(pos,2i+1)=cos(pos/100002i/dmodel) PE_{(pos,2i)}=sin(pos/10000^{{2i}/d_{model}})~\\ PE_{(pos,2i+1)}=cos(pos/10000^{{2i}/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel) PE(pos,2i+1)=cos(pos/100002i/dmodel) -
Why Self-attention
对于一段文本序列,seq2seq模型通常会先用某种机制对该序列进行编码,通过降维方式将它encode成一个固定长度的向量,用于输入到后面的全连接层,而seq2seq模型之前一般会用CNN,RNN(LSTM,GRU)对序列数据进行编码,然后采用polling或RNN直接取最后一个t时刻的hidden state作为句子的向量输出。
然后常用的编码方法不能对长序列有较好的处理,无法很好体现长序列的不同部分的关注程度。例如:I hate you! 如果做情感分析,明显对hate词应该关注更多。用CNN,RNN当然可以编码这种信息,但是序列的长度很长,就没有一个好的效果了,所以Transformer的优势就体现出来了
-
Training
详细见论文
- Results