注意力机制的核心部分是通过计算K K K (键)序列与q q q (查询)的相关性,来得到注意力权重a(通过一定的映射关系f f f ): a = f ( q . K ) a=f(q.K) a = f ( q . K ) 。具体来说,A t t e n t i o n ( Q , K , V ) Attention(Q, K, V) A t t e n t i o n ( Q , K , V ) 函数在输入矩阵 Q、K 和 V 的情况下可计算 Query 序列与 Value 序列之间的注意力关系。其中 Q 的维度为 n × d k n×d_k n × d k ,表示有 n n n 条维度为 d k d_k d k 的 Query、K K K 的维度为 m × d k m×d_k m × d k 、V V V 的维度为 m × d v m×d_v m × d v 。这三个矩阵的乘积可得出 n × d v n×d_v n × d v 维的矩阵,它表示 有n n n 条 Query 对应注意到的 Value 向量
在实际论文的表述里或者开展的实验中,K K K 是词嵌入向量或模型的隐藏层状态向量h t h_t h t ;q q q 是计算注意力分配多少的参考(reference)。本质上就是通过多次Q K QK Q K 得到多个权重a i j k . . . a_{ijk...} a i j k . . . ,(就有了分布函数),再利用权重的分布对V V V 加权。最基础的例子比如:
多头注意力,就是在上面A t t e n t i o n ( Q , K , V ) Attention(Q,K,V) A t t e n t i o n ( Q , K , V ) 里,获得了h h h 个不同版本的Q , K , V Q,K,V Q , K , V ,MultiHead ( Q , K , V ) = Concat ( head1 , . . . , head h ) W O \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head1},...,\text{head}_h)\boldsymbol{W}^O MultiHead ( Q , K , V ) = Concat ( head1 , . . . , head h ) W O head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(\boldsymbol{Q}\boldsymbol{W}_i^Q,\boldsymbol{K}\boldsymbol{W}_i^K,\boldsymbol{V}\boldsymbol{W}_i^V) head i = Attention ( Q W i Q , K W i K , V W i V ) Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}) = \text{softmax}(\frac{\boldsymbol{Q}\boldsymbol{K}^T}{\sqrt{d_k}})\boldsymbol{V} Attention ( Q , K , V ) = softmax ( d k Q K T ) V
我们记Q W i Q = Q i , K W i K = K i , V W i V = V i , i ∈ [ 1 , h ] \boldsymbol{Q}\boldsymbol{W}_i^Q=Q^i,\boldsymbol{K}\boldsymbol{W}_i^K=K^i,\boldsymbol{V}\boldsymbol{W}_i^V=V^i,i \in [1,h] Q W i Q = Q i , K W i K = K i , V W i V = V i , i ∈ [ 1 , h ] ,W i Q , W i K , W i V \boldsymbol{W}_i^Q,\boldsymbol{W}_i^K,\boldsymbol{W}_i^V W i Q , W i K , W i V 称为transformation matrics
如果我们把这些注意头可以看作是从不同角度对序列中同一实体的不同观察结果(权重),那么是否可以尝试从h个注意力头u i u_i u i 中找到一个最合适的v v v 。u i = softmax ( Q i K i T d k ) V i u_i = \text{softmax}(\frac{\boldsymbol{Q_i}\boldsymbol{K_i}^T}{\sqrt{d_k}})\boldsymbol{V_i} u i = softmax ( d k Q i K i T ) V i
这不禁让人想入非非 产生联想,在胶囊网络中,我们知道,对于v in v out的capsule,识别图片中的某一组件(component)的旋转不变性,是通过对该组件的feature与Pose向量做transformation。而我们知道,如果输入的是对同一实体在语言学上的不同描述,那么利用路由机制,就可以决定不同描述的information中谁能流向下一层胶囊层,进而是否可以利用这一性质,对上述h个头进行路由选择呢?
首先,通过将输入胶囊ui乘以表示部分和整体之间的视点不变关系的学习转换矩阵Wij来计算投票:u i u_i u i 是多头注意力机制的权值分布,W i j W_ij W i j 是“部分”和“整体”的视点不变关系转换矩阵(为啥叫这个名字我也不知道…)u ^ j ∣ i = W i j u i \hat u_{j|i}=W_{ij}u_i u ^ j ∣ i = W i j u i
然后计算并更新输出胶囊v v v 和vote u ^ \hat u u ^ ,以及它们之间的分配概率c c c ,c c c 路由迭代中的归一化操作中的量,将输出归一化到下一层的输入胶囊:v = f ( u ^ , c ) v=f(\hat u,c) v = f ( u ^ , c ) ,c = U p d a t e ( u ^ , v ) c=Update(\hat u,v) c = U p d a t e ( u ^ , v )
最后,将输出胶囊v串联在一起,送入前馈网络(FFN),该网络由两个线性变换层组成,线性变换层中通过ReLU完成激活。F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,xW_1+b_1)W_2+b_2 F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2
另外,通过添加了层u u u 和v v v 之间的剩余连接后,最终的输出是:O + F F N ( v ) O+FFN(v) O + F F N ( v ) 添加剩余连接就是用Concatenate操作实现:
Dynamic Routing
我们把所有这些加权vote向量加起来,得到胶囊类型输出向量s j = ∑ i c i j u ^ j ∣ i s_j=\sum_ic_{ij}\hat u_{j|i} s j = i ∑ c i j u ^ j ∣ i 其中c i j = e x p ( b i j ) ∑ k e x p ( b i k ) c_{ij}=\frac{exp(b_{ij})}{\sum_kexp(b_{ik})} c i j = ∑ k e x p ( b i k ) e x p ( b i j ) ,其中b i j b_{ij} b i j 初值=0
然后就和动态路由一样,用s j s_j s j 启动squash:v j = ∣ ∣ s j ∣ ∣ 2 1 + ∣ ∣ s j ∣ ∣ 2 s j ∣ ∣ s j ∣ ∣ v_j=\frac{||s_j||^2}{1+||s_j||^2}\frac{s_j}{||s_j||} v j = 1 + ∣ ∣ s j ∣ ∣ 2 ∣ ∣ s j ∣ ∣ 2 ∣ ∣ s j ∣ ∣ s j
初始的coefficientsb i j b_{ij} b i j 是胶囊输入值u ^ j ∣ i \hat u_{j|i} u ^ j ∣ i 和每个胶囊输出值v j v_j v j 两者的点积(点积衡量相似性,也即coefficients代表输入和输出的相似度,聚类的思想)