Transformer之Attention的通俗理解
Transformer之Attention的通俗理解
本文详细介绍了Transformer中的Attention机制,从基本原理到公式推导,再到Multi-Head Attention的实现及其优势,最后区分了Self-Attention和Cross-Attention。内容深入浅出,适合对Transformer有一定了解但希望深入理解Attention机制的读者。
什么是 Attention?
在关于Token的文章中介绍了什么是Token和Token的作用,那么将一堆Token之间的关系和语义进行提取的,就是Attention。其核心就是通过一些升维降维和求积操作,完成对感兴趣的区域进行特征提取。
A t t e n t i o n o u t p u t = S o f t m a x ( Q × K D i m o u t ) × V Attention_{output} = Softmax(\frac{Q \times K}{\sqrt{Dim_{out}}}) \times VAttentionoutput =Softmax(Dimout Q×K )×V
想要理解Attention,就要先理解这个公式做了什么事,嫌麻烦就只看点后面的
- Q × K Q\times KQ×K计算了两组向量之间的相似度,可以理解为一种互相关或者互信息的计算,也称之为注意力得分;
Q × K T = ∑ D i m o u t i = 1 Q i × K i = X ⋅ W q ⋅ [ X ⋅ W k ] T = X ⋅ W q ⋅ W k T ⋅ X T = X ⋅ [ W q ⋅ W k T ] ⋅ X T = X ⋅ W a t t n ⋅ X T \begin{array}{ccl} Q \times K^T &= &\underset{i=1}{\stackrel{Dim_{out}}{\sum}}Q_i \times K_i \ && \ &= &X \cdot W_q \cdot \Big[X \cdot W_k\Big]^T \ && \ &= &X \cdot W_{q} \cdot W^T_k \cdot X^T \ && \ &= &X \cdot \Big[W_{q} \cdot W^T_k \Big] \cdot X^T \ && \ &= &X \cdot W_{attn} \cdot X^T \end{array}Q×KT ===== i=1∑Dimout Qi ×Ki X⋅Wq ⋅[X⋅Wk ]TX⋅Wq ⋅WkT ⋅XTX⋅[Wq ⋅WkT ]⋅XTX⋅Wattn ⋅XT
关于这个注意力得分的理解:
- 这个注意力得分是一个二次型,即s c o r e = X ⋅ W ⋅ X T score=X\cdot W \cdot X^Tscore=X⋅W⋅XT,原因是二次型的维度更高,表达能力更强;如果只是s c o r e = W ⋅ X score=W \cdot Xscore=W⋅X,难么这只是输入的现行变换,没有太强的表达能力;
- 因为是二次型,所以从最后和公式来看,它就是X-corr的相似的计算,计算的也是一种互信息;
- 由于上述公式省略了nn.Linear或者nn.Conv2d中的偏置(bias)过程,所以,一次项没有列出,正因为这个由偏置引起的一次项和零次项,所以在实际操作中无法直接使用先计算输入的内积在乘以矩阵系数的过程(因为这种做法看起来省掉了一组权重系数W WWW,所以有人可能会走这条路去试探)
- s o f t m a x softmaxsoftmax作用就是把相似度转换为概率分布[ 0 , 1 ] [0, 1][0,1],这样就可以作为权重矩阵去加权V VV;
- D i m o u t \sqrt{Dim_{out}}Dimout 缩放注意力得分,用这个值缩放,是因为这个值是标准差,下面是原因;
V a r ( X i Y i ) = E ( X i 2 Y i 2 ) − E ( X i Y i ) 2 = E ( X i 2 ) E ( Y i 2 ) − E ( X i ) 2 E ( Y i ) 2 = ( V a r ( X i ) + E ( X i ) 2 ) ( V a r ( Y i ) + E ( Y i ) 2 ) − E ( X i ) 2 E ( Y i ) 2 = ( 1 + 0 ) ( 1 + 0 ) − 0 = 1 其中 , X = [ X 1 , ⋯ , X n ] ∼ N ( 0 , I ) , Y = [ Y 1 , ⋯ , Y m ] ∼ N ( 0 , I ) , 方差为 1 期望为 0 , 所以 V a r ( X × Y ) = ∑ V a r ( X i , Y i ) D i m o u t i = 1 = D i m o u t \begin{array}{ccl} \mathop{Var}(X_i Y_i) &= &{E(X_i^2Y_i^2) - E(X_iY_i)^2} \ &&\ &= &{E(X_i^2)E(Y_i^2) - E(X_i)^2E(Y_i)^2}\ &&\ &= &(\mathop{Var}(X_i)+E(X_i)^2)(\mathop{Var}(Y_i) +E(Y_i)^2) - E(X_i)^2E(Y_i)^2 \ &&\ &= & (1+0)(1+0) - 0 \ && \ & = &1 \ \end{array}\ \quad \ 其中, X = [X_1, \cdots, X_n] \sim N(0, I),\quad Y=[Y_1, \cdots, Y_m] \sim N(0, I) ,\ 方差为1期望为0, 所以 \mathop{Var}(X \times Y) = \underset{i=1}{\stackrel{Dim_{out}}{\sum \mathop{Var}(X_i,Y_i)}} =Dim_{out}Var(Xi Yi ) ===== E(Xi2 Yi2 )−E(Xi Yi )2E(Xi2 )E(Yi2 )−E(Xi )2E(Yi )2(Var(Xi )+E(Xi )2)(Var(Yi )+E(Yi )2)−E(Xi )2E(Yi )2(1+0)(1+0)−01 其中,X=[X1 ,⋯,Xn ]∼N(0,I),Y=[Y1 ,⋯,Ym ]∼N(0,I),方差为1期望为0,所以Var(X×Y)=i=1∑Var(Xi ,Yi )Dimout =Dimout
- s o f t m a x ( Q × K T D i m o u t ) softmax(\frac{Q \times K^T}{\sqrt{Dim_{out}}})softmax(Dimout Q×KT )整体作为V VV的权重,进行加权,就是s o f t m a x ( Q × K T D i m o u t ) softmax(\frac{Q \times K^T}{\sqrt{Dim_{out}}})softmax(Dimout Q×KT )
- 这么做,实现了N个词汇向量或者像素patch的语义(就是他们通道)之间的交互,可以理解为词与词或者patch与patch之间的关系被注意力得分表示出来了,然后再在V a l u e ValueValue上加权,就可以得到一个被高亮的v a l u e valuevalue
什么是Multi-Head Attention
按照输入数据维度分类,Attention可分为普通Attention和Multi-Head Attention。上面是普通的Attention,下面的是Multi-head attention
实际上,他就是将输入数据从[ B , N , C ] [B, N, C][B,N,C]变成[ B × n u m _ h e a d s , N , C ] [B \times num_heads, N, C][B×num_heads,N,C],然后再输入到Attention模块中进行注意力计算。
那么这么做有什么好处呢?
上面说道Attention实现了N个词汇向量或者像素patch的语义(就是他们通道)之间的交互,可以理解为词与词或者patch与patch之间的关系被注意力得分表示出来了,然后再在V a l u e ValueValue上加权,就可以得到一个被高亮的v a l u e valuevalue;
那么这么做的缺点也显而易见,就是整个语义部分被当做一个整体去计算相似度得分和加权V a l u e ValueValue,也就失去了对多重语义的理解
所以,Multi-Head Attention就被提出来了,核心操作就是对语义维度(channel)进行切片,分割成n u m _ h e a d s num_headsnum_heads个,堆叠在Batch维度上再进行注意力计算,这样就可以得到多重语义
优点
- 计算效率提升了
因为要进行相乘的维度从[ c h a n n e l × c h a n n e l ] [channel \times channel][channel×channel]变成了[ c h a n n e l n u m _ h e a d s × c h a n n e l ] \Big[ \frac{channel}{num_heads} \times channel \Big][num_headschannel ×channel], 虽b a t c h batchbatch变成了b a t c h × n u m _ h e a d s batch \times num_headsbatch×num_heads,但是总体少了,大概就是:c h a n n e l 2 channel^2channel2÷( c h a n n e l n u m _ h e a d s ) 2 × n u m _ h e a d s (\frac{channel}{num_heads})^2 \times num_heads(num_headschannel )2×num_heads - 拥有了可以处理多重语义的能力
例如,“日久生情”和"日久生情" - 提高模型泛化能力和降低过拟合风险
多头注意力本质上类似一种多模型model的组合 ,通过对相同嵌入(Embedding)进行多角度的特征理解或者是提取,得到一个拓展的结果集合,在一个更大的空间中筛选结果,确实能提升泛化能力,降低过拟合风险。
其他Attention
- Self-Attention:
Q 、 K 、 V Q、K、VQ、K、V都是来自于同一个嵌入向量Embedding或者同一组图片的patch embedding,进行相同的注意力计算,就是Self-Attention - Cross-Attention:
Q QQ是一组嵌入向量Embedding或者一组图片的patch embedding,而K KK和V VV是来自于另一组且相同的嵌入向量Embedding或者图片的patch embedding, 然后进行相同的注意力计算,就是Self-Attention