transfomer 《Attention is all you need》
introduction
提出的时候是引用在机器翻译之中
transformer和CNN、RNN不同,其网络结构是基于attention机制,使用attention机制来刻画输入和输出的全局依赖关系。
transformer结构和大部分编码器-解码器架构类似,整体结构是6个堆叠的相同的encoder block和六个decoder block
更好的并行化(ANN会有一系列的隐状态 h t ht ht,),更短的训练时间
输入
单词的表示向量 X X X。
t r a n s f o m e r 的单词表示 X = 词特征向量 + 词位置信息 transfomer的单词表示X=词特征向量 + 词位置信息 transfomer的单词表示X=词特征向量+词位置信息
X n × d X_{n\times d} Xn×d, n n n是单词个数, d d d是embeding维度。
- 词embeding就是词向量,可以使用word2vec,glove,MLP来预训练得到
- 位置embeding(PE)表示单词在句子中的位置信息。(因为cnn和rnn的结构都可以获得单词的顺序信息,但transformer使用的是全局信息,就需要加入一些序列的位置信息)。PE可以预训练得到,也可以根据公式计算。
注意力机制
attention
reference:nndl-book 8.2&&8.3
从 N N N个输入向量 X X X中选择出和某个特定任务相关的信息
三个重要的向量
- 查询向量 Q Q Q:和任务相关的表示
- 键向量 K K K:用于计算注意力分布
- 值向量 V V V:信息聚合,求加权平均
打分函数 s ( x , q ) s(x,q) s(x,q)用于计算输入向量 x x x和查询向量 q q q间的相关性
模式:
-
软性的注意力机制(transformer使用的)
step1:计算注意力分布
α n = p ( z = n ∣ X , q ) = s o f t m a x ( s ( x n , q ) ) \alpha_n = p(z=n|X,q)=softmax(s(x_n,q)) αn=p(z=n∣X,q)=softmax(s(xn,q))
s ( x , q ) s(x,q) s(x,q)过softmax函数,选择第 n n n个输入向量 x n x_n xn的概率 α n \alpha_n αn注意力分布 α n \alpha_n αn,解释为在给定任务的查询向量 q q q时,第 n n n个向量受关注的程度。
step2:加权平均
A t t ( X , q ) = Σ α n x n = E ( x ) Att(X,q) = \Sigma \alpha_n x_n = E(x) Att(X,q)=Σαnxn=E(x),算的是期望,加权和
-
硬性注意力:
相比软性注意力(期望,加权平均),硬性注意力只关注某一个输入向量
-
键值对注意力
将计算注意力分布 K K K(计算 α n \alpha_n αn)和聚合信息 V V V(计算期望)分开。(前面硬性和软性注意力都是用的同一个输入向量 x x x)。
α n = s o f t m a x ( s ( k n , q ) ) \alpha_n = softmax(s(k_n,q)) αn=softmax(s(kn,q))
A t t ( ( K , V ) , q ) = Σ α n v n Att((K,V),q) = \Sigma \alpha_n v_n Att((K,V),q)=Σαnvn
-
多头注意力
多个查询 Q = [ q 1 , q 2 , . . . q m ] Q=[q_1,q_2,...q_m] Q=[q1,q2,...qm]。并行的从输入信息 X X X中选择多组信息,每个注意力关注输入信息 X X X的不同部分
self-attention
将单个序列的不同位置联系起来
常用的是 查询-键-值(QKV) 模式。
过程
-
step1:
对每个输入向量 x i x_i xi,通过线性变化得到三个向量 q i , k i , v i q_i,k_i,v_i qi,ki,vi。
线性变化的过程中就有仨可学习的参数矩阵 W q , W k , W v W_q,W_k,W_v Wq,Wk,Wv。
Q = W q X Q=W_qX Q=WqX, K , V K,V K,V同
-
step2
对每个查询向量 q i q_i qi,使用键值对的注意力机制,得到输出向量 h i h_i hi
α i j = s o f t m a x ( s ( k j , q i ) ) A t t ( ( k j , v j ) , q n ) = Σ α i j v j h i = A t t ( ( K , V ) , q i ) \alpha_{ij} = softmax(s(k_j,q_i)) \\ Att((k_j,v_j),q_n) = \Sigma \alpha_{ij} v_j \\ h_i = Att((K,V),q_i) αij=softmax(s(kj,qi))Att((kj,vj),qn)=Σαijvjhi=Att((K,V),qi)
H = V s o f t m a x ( K T Q D k ) H = V\ softmax({K^TQ\over \sqrt{D_k}}) H=V softmax(DkKTQ)
self-attention 可以作为神经网络的一个部件来使用,比如代替卷积层或者池化层。
multi-head attention
多个self-attention的组合
以 h = 8 h=8 h=8为例,过每个self-attention都会有一个输出矩阵 Z i Z_i Zi。将 Z i ( i ∈ [ 1 , 8 ] ) Z_i(i\in [1,8]) Zi(i∈[1,8])拼接contact起来,再经过一个线性变化,得到最终的输出 Z Z Z
encoder
encoder block结构
- step1: self-attention
Z = A t t ( Q , K , V ) = s o f t m a x ( K T Q D k ) ⋅ V Z = Att(Q,K,V) = softmax({K^TQ\over \sqrt{D_k}})\cdot V Z=Att(Q,K,V)=softmax(DkKTQ)⋅V
D k D_k Dk是输入向量的维度, K T Q D k K^TQ\over {\sqrt {D_k}} DkKTQ叫做缩放点积, D D D太大的时候其 K T Q K^TQ KTQ的方差较大,导致softmax的梯度小。
点积运算还快,省空间…
-
step2: Add&Norm
就是正则化的处理,Norm转成同均值方差的结果
-
step3: feed froward neural network
两层全连接的前馈神经网络,第一层过ReLU,第二层是一个线性激活函数 F F N ( Z ) = m a x ( 0 , Z ⋅ W 1 + b 1 ) ⋅ W 2 + b 2 FFN(Z) = max (0, Z\cdot W_1+b_1)\cdot W_2 + b_2 FFN(Z)=max(0,Z⋅W1+b1)⋅W2+b2
输入和输出维度保持一致
-
step4: Add&Norm
组成encoder
将多个encoder block叠加就可以得到encoder。其中第一个block的输入是单词的向量表示矩阵。后面block的输入是前一个block的输出(论文中block的输入输出矩阵维度一样)。最后一层的输出编码信息矩阵C
decoder
decoder blcok
相比encoder会复杂一些,
- 有两个multi-head attention,第一个有mask操作
- 最后有一个softmax层计算翻译下一个单词的概率
第一个multi-head attention
有一个masked操作。(用于顺序翻译,防止单词 i i i知道 i + 1 i+1 i+1和后面的信息)
一个mask的方阵,大小为句子长度。 m i j = 0 / 1 m_{ij} = 0 / 1 mij=0/1。如此实现单词 i i i只可以使用 i i i和 i i i之前的信息
- 计算 Q K T QK^T QKT,也就是打分衡量相关性
- 过softmax,这儿需要使用mask矩阵。其实就是按位乘(被遮挡的×0=0)
- Z = s o f t m a x ( m a s k ( Q K T ) ) ⋅ V Z = softmax(mask(QK^T))\cdot V Z=softmax(mask(QKT))⋅V
- 然后就是多个self-attention的结果拼接,线性变化,得到第一个multi-head attention的输出(维度和输入一样)
第二个multi-attention
使用的 K , V K,V K,V并不是上一个decoder的输出计算得到的,而是使用encoder的输出信息编码矩阵C来计算
Q Q Q是decoder的第一个multi-head attention的输出。