文章目录
之前我们认识了
一般的注意力模型
。本文将介绍自注意力和多头注意力,为后续介绍Transformer做铺垫。
自注意力
如果注意力模型中注意力是完全基于特征向量计算的,那么称这种注意力为自注意力:
图片改自:[1]
例如,我们可以使用权重矩阵W K ∈ R d k × d f \boldsymbol{W}K∈\mathbb{R}^{d_k×d_f}W K ∈R d k ×d f 、W V ∈ R d v × d f \boldsymbol{W}_V∈\mathbb{R}^{d_v×d_f}W V ∈R d v ×d f 和W Q ∈ R d q × d f \boldsymbol{W}{Q} \in \mathbb{R}^{d_{q} \times d_{f}}W Q ∈R d q ×d f 对特征矩阵F = [ f 1 , … , f n f ] ∈ R d f × n f \boldsymbol{F}=[\boldsymbol{f}{1}, \ldots, \boldsymbol{f}{n_{f}}] \in \mathbb{R}^{d_{f}\times n_f}F =[f 1 ,…,f n f ]∈R d f ×n f 进行线性变换,得到
键(Key)矩阵
K = W K F = W K [ f 1 , … , f n f ] = [ k 1 , … , k n f ] ∈ R d k × n f \begin{aligned} \boldsymbol{K}&=\boldsymbol{W}{K}\boldsymbol{F}\ &=\boldsymbol{W}{K}[\boldsymbol{f}{1}, \ldots, \boldsymbol{f}{n_{f}}]\ &=\left[\boldsymbol{k}{1}, \ldots, \boldsymbol{k}{n_{f}}\right] \in \mathbb{R}^{d_{k} \times n_{f}} \end{aligned}K =W K F =W K [f 1 ,…,f n f ]=[k 1 ,…,k n f ]∈R d k ×n f
值(Value)矩阵
V = W V F = W V [ f 1 , … , f n f ] = [ v 1 , … , v n f ] ∈ R d v × n f \begin{aligned} \boldsymbol{V}&=\boldsymbol{W}{V}\boldsymbol{F}\ &=\boldsymbol{W}{V}[\boldsymbol{f}{1}, \ldots, \boldsymbol{f}{n_{f}}]\ &=\left[\boldsymbol{v}{1}, \ldots, \boldsymbol{v}{n_{f}}\right] \in \mathbb{R}^{d_{v} \times n_{f}} \end{aligned}V =W V F =W V [f 1 ,…,f n f ]=[v 1 ,…,v n f ]∈R d v ×n f
查询(Query)矩阵
Q = W Q F = W Q [ f 1 , … , f n f ] = [ q 1 , … , q n f ] ∈ R d q × n f \begin{aligned} \boldsymbol{Q}&=\boldsymbol{W}{Q}\boldsymbol{F}\ &=\boldsymbol{W}{Q}[\boldsymbol{f}{1}, \ldots, \boldsymbol{f}{n_{f}}]\ &=\left[\boldsymbol{q}{1}, \ldots, \boldsymbol{q}{n_{f}}\right] \in \mathbb{R}^{d_{q} \times n_{f}} \end{aligned}Q =W Q F =W Q [f 1 ,…,f n f ]=[q 1 ,…,q n f ]∈R d q ×n f
Q \boldsymbol{Q}Q的每一列q i \boldsymbol{q}_i q i 都用作注意力模型的查询。当使用查询向量q i \boldsymbol{q}_i q i 计算注意力时,生成的上下文向量c i \boldsymbol{c}_i c i 将汇总特征向量中对查询q i \boldsymbol{q}_i q i 来说重要的的信息。
首先,对查询q i , i = 1 , 2 , . . . , n f \boldsymbol{q}i,i=1,2,…,n_f q i ,i =1 ,2 ,…,n f 计算键向量k j \boldsymbol{k}{j}k j 的注意力得分:
e i , j 1 × 1 = score ( q i d q × 1 , k j d k × 1 ) , j = 1 , 2 , . . . , n f \underset{1 \times 1}{e_{i,j}}=\operatorname{score}\left(\underset{d_{q} \times 1}{\boldsymbol{q}i}, \underset{d{k} \times 1}{\boldsymbol{k}_{j}}\right),j=1,2,…,n_f 1 ×1 e i ,j =s c o r e (d q ×1 q i ,d k ×1 k j ),j =1 ,2 ,…,n f
查询q i \boldsymbol{q}i q i 表示对信息的请求。注意得分e i , j e{i,j}e i ,j 表示根据查询q i \boldsymbol{q}_i q i ,键向量k j \boldsymbol{k}_j k j 中包含的信息有多重要。计算每个值向量的得分,得到关于查询q i \boldsymbol{q}_i q i 的注意力得分向量:
e i = [ e i 1 , e i 2 , . . . , e i , n f ] T \boldsymbol{e_i}=[e_{i1},e_{i2},…,e_{i,n_f}]^T e i =[e i 1 ,e i 2 ,…,e i ,n f ]T
然后,使用对齐函数align ( ) \operatorname{align}()a l i g n ()进行对齐:
a i , j 1 × 1 = align ( e i , j ; 1 × 1 e i n f × 1 ) , j = 1 , 2 , . . . , n f \underset{1 \times 1}{a_{i,j}}=\operatorname{align}\left(\underset{1 \times 1}{e_{i,j} ;} \underset{n_{f} \times 1}{\boldsymbol{e_i}}\right),j=1,2,…,n_f 1 ×1 a i ,j =a l i g n (1 ×1 e i ,j ;n f ×1 e i ),j =1 ,2 ,…,n f
得到注意力权重向量:a i = [ a i , 1 , a i , 2 , . . . , a i , n f ] T \boldsymbol{a}i=[a{i,1},a_{i,2},…,a_{i,n_f}]^T a i =[a i ,1 ,a i ,2 ,…,a i ,n f ]T。
最后计算上下文向量:
c i d v × 1 = ∑ j = 1 n f a i , j 1 × 1 × v j d v × 1 \underset{d_{v} \times 1}{\boldsymbol{c}i}=\sum{j=1}^{n_{f}}\underset{1\times 1} {a_{i,j}} \times \underset{d_v\times 1}{\boldsymbol{v}_{j}}d v ×1 c i =j =1 ∑n f 1 ×1 a i ,j ×d v ×1 v j
总结以上步骤,自注意力计算表达式为:
c i = self-att ( q i , K , V ) ∈ R d v \boldsymbol{c}_i=\text { self-att }(\boldsymbol{q}_i, \boldsymbol{K}, \boldsymbol{V})\in \mathbb{R}^{d_v}c i =self-att (q i ,K ,V )∈R d v
由于q i = W Q f i \boldsymbol{q}_i=\boldsymbol{W}_Q\boldsymbol{f}_i q i =W Q f i ,因此可以说上下文向量c i \boldsymbol{c}_i c i 包含所有特征向量中(包括f i \boldsymbol{f}_i f i )对特定特征向量f i \boldsymbol{f}_i f i 来说重要的的信息。例如,对于语言,这意味着自注意力可以提取单词特征之间的关系(动词与名词;代词与名词等等),如果f i \boldsymbol{f}_i f i 是一个词的特征向量,那么自注意力可以计算得到其他词对于f i \boldsymbol{f}_i f i 来说重要的信息。对于图像,自注意力则可以得到各个图像区域特征之间的关系。
计算Q \boldsymbol{Q}Q中所有查询向量的上下文向量,得到自注意力层的输出:
C = self-att ( Q , K , V ) = [ c 1 , c 2 , . . . , c n f ] ∈ R d v × n f \boldsymbol{C}=\text { self-att }(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=[\boldsymbol{c}1,\boldsymbol{c}_2,…,\boldsymbol{c}{n_f}]\in \mathbb{R}^{d_{v}\times n_f}C =self-att (Q ,K ,V )=[c 1 ,c 2 ,…,c n f ]∈R d v ×n f
; 多头注意力
多头注意力通过利用同一查询的多个不同版本并行实现多个注意力模块来工作。其思想是使用不同的权重矩阵对查询q \boldsymbol{q}q进行线性变换得到多个查询。每个新形成的查询本质上都需要不同类型的相关信息,从而允许注意模型在上下文向量计算中引入更多信息。
多头注意力的d d d个头部都有自己的多个查询向量、键矩阵和值矩阵:q ( l ) , K ( l ) \boldsymbol{q}^{(l)}, \boldsymbol{K}^{(l)}q (l ),K (l )和V ( l ) \boldsymbol{V}^{(l)}V (l ),l = 1 , … , d l=1, \ldots, d l =1 ,…,d。
查询q ( l ) \boldsymbol{q}^{(l)}q (l )由原始查询q \boldsymbol{q}q经过线性变换得到,而K ( l ) \boldsymbol{K}^{(l)}K (l )和V ( l ) \boldsymbol{V}^{(l)}V (l )则是F \boldsymbol{F}F经过线性变换得到。每个注意力头都有自己的可学习权重矩阵W q ( l ) 、 W K ( l ) 和 W V ( l ) \boldsymbol{W}^{(l)}_q、\boldsymbol{W}^{(l)}_K和\boldsymbol{W}^{(l)}_V W q (l )、W K (l )和W V (l )。第l l l个头的查询、键和值的计算如下:
q ( l ) d q × 1 = W q ( l ) d q × d q × q d q × 1 , \underset{d_{q} \times 1}{\boldsymbol{q}^{(l)}}=\underset{d_{q} \times d_{q}}{\boldsymbol{W}{q}^{(l)}} \times \underset{d{q} \times 1}{\boldsymbol{q}},d q ×1 q (l )=d q ×d q W q (l )×d q ×1 q ,
K ( l ) d k × n f = W K ( l ) d k × d f × F d f × n f \underset{d_{k} \times n_{f}}{\boldsymbol{K}^{(l)}}=\underset{d_{k} \times d_{f}}{\boldsymbol{W}K^{(l)}} \times \underset{d{f} \times n_{f}}{\boldsymbol{F}}d k ×n f K (l )=d k ×d f W K (l )×d f ×n f F
V ( l ) d v × n f = W V ( l ) d v × d f × F d f × n f \underset{d_{v} \times n_{f}}{\boldsymbol{V}^{(l)}}=\underset{d_{v} \times d_{f}}{\boldsymbol{W}V^{(l)}} \times \underset{d{f} \times n_{f}}{\boldsymbol{F}}d v ×n f V (l )=d v ×d f W V (l )×d f ×n f F
每个头都创建了自己对查询q \boldsymbol{q}q和输入矩阵F \boldsymbol{F}F的表示,从而允许模型学习更多的信息。例如,在训练语言模型时,一个注意力头可以学习关注某些动词(例如行走、驾驶、购买)与名词(例如,学生、汽车、苹果)的关系,而另一个注意力头部则学习关注代词(例如,他、她、it)与名词的关系。
每个头还将创建自己的注意力得分向量e i ( l ) = [ e i , 1 ( l ) , … , e i , n f ( l ) ] T ∈ R n f \boldsymbol{e}i^{(l)}=\left[e{i,1}^{(l)}, \ldots, e_{i,n_{f}}^{(l)}\right]^T \in \mathbb{R}^{n_{f}}e i (l )=[e i ,1 (l ),…,e i ,n f (l )]T ∈R n f ,以及相应的注意力权重向量a i ( l ) = [ a i , 1 ( l ) , … , a i , n f ( l ) ] T ∈ R n f \boldsymbol{a}i^{(l)}=\left[a{i,1}^{(l)}, \ldots, a_{i,n_{f}}^{(l)}\right]^T \in \mathbb{R}^{n_{f}}a i (l )=[a i ,1 (l ),…,a i ,n f (l )]T ∈R n f
然后,每个头都会产生自己的上下文向量c i ( l ) ∈ R d v \boldsymbol{c}i^{(l)}\in \mathbb{R}^{d{v}}c i (l )∈R d v ,如下所示:
c i ( l ) d v × 1 = ∑ j = 1 n f a i , j ( l ) 1 × 1 × v j ( l ) d v × 1 \underset{d_{v} \times 1}{\boldsymbol{c}i^{(l)}}=\sum{j=1}^{n_f} \underset{1\times 1}{a_{i,j}^{(l)}}\times \underset{d_{v}\times 1}{\boldsymbol{v}_j^{(l)}}d v ×1 c i (l )=j =1 ∑n f 1 ×1 a i ,j (l )×d v ×1 v j (l )
我们的目标仍然是创建一个上下文向量作为注意力模型的输出。因此,要将各个注意力头产生的上下文向量被连接成一个向量。然后,使用权重矩阵W O ∈ R d c × d v d \boldsymbol{W}{O} \in \mathbb{R}^{d{c} \times d_{v} d}W O ∈R d c ×d v d对其进行线性变换:
c i d c × 1 = W O d c × d v d × concat ( c i ( 1 ) d v × 1 ; … ; c i ( d ) d v × 1 ) \underset{d_{c} \times 1}{\boldsymbol{c}i}=\underset{d{c} \times d_{v} d}{\boldsymbol{W}_{O}} \times \operatorname{concat}\left(\underset{d_v \times 1}{\boldsymbol{c}_i^{(1)}} ; \ldots; \underset{d_v \times 1}{\boldsymbol{c}_i^{(d)}} \right)d c ×1 c i =d c ×d v d W O ×c o n c a t (d v ×1 c i (1 );…;d v ×1 c i (d ))
这保证最终的上下文向量c i ∈ R d c \boldsymbol{c}_i\in\mathbb{R}^{d_c}c i ∈R d c 符合目标维度
参考:
[1] A General Survey on Attention Mechanisms in Deep Learning https://arxiv.org/pdf/2203.14263v1.pdf
Original: https://blog.csdn.net/weixin_44378835/article/details/125110663
Author: 二进制人工智能
Title: 自注意力(self-attention)和多头注意力(multi-head attention)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/719226/
转载文章受原作者版权保护。转载请注明原作者出处!