深入理解深度学习——注意力机制(Attention Mechanism):多头注意力(Multi-head Attention)

分类目录:《深入理解深度学习》总目录

相关文章:
·注意力机制(AttentionMechanism):基础知识
·注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归
·注意力机制(AttentionMechanism):注意力评分函数(AttentionScoringFunction)
·注意力机制(AttentionMechanism):Bahdanau注意力
·注意力机制(AttentionMechanism):多头注意力(MultiheadAttention)
·注意力机制(AttentionMechanism):自注意力(Self-attention)
·注意力机制(AttentionMechanism):位置编码(PositionalEncoding)


在实践中,当给定相同的查询、键和值的集合时,我们希望模型可以基于相同的注意力机制学习到不同的行为, 然后将不同的行为作为知识组合起来, 捕获序列内各种范围的依赖关系 (例如,短距离依赖和长距离依赖关系)。因此,允许注意力机制组合使用查询、键和值的不同子空间表示(Representation Subspaces)可能是有益的。

为此,与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的组不同的线性投影(Linear Projections)来变换查询、键和值。 然后,这组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力(Multihead Attention)。对于个注意力汇聚输出,每一个注意力汇聚都被称作一个头(Head)。 下图展示了使用全连接层来实现可学习的线性变换的多头注意力:
深入理解深度学习——注意力机制(Attention Mechanism):多头注意力(Multi-head Attention)_第1张图片
给定查询 q ∈ R d q q\in R^{d_q} qRdq、 键 k ∈ R d k k\in R^{d_k} kRdk和值 v ∈ R d v v\in R^{d_v} vRdv, 每个注意力头 h i ( i = 1 , 2 , ⋯   , h ) h_i(i=1, 2, \cdots, h) hi(i=1,2,,h)的计算方法为:
h i = f ( W i q q , W i k k , W i v v ) ∈ R p v h_i=f(W_i^{q}q, W_i^{k}k, W_i^{v}v)\in R^{p_v} hi=f(Wiqq,Wikk,Wivv)Rpv

其中,可学习的参数包括 W i q ∈ R p q × d q W_i^{q}\in R^{p_q\times d_q} WiqRpq×dq W i k ∈ R p k × d k W_i^{k}\in R^{p_k\times d_k} WikRpk×dk W i v ∈ R p v × d v W_i^{v}\in R^{p_v\times d_v} WivRpv×dv以及代表注意力汇聚的函数 f f f f f f可以是《深入理解深度学习——注意力机制(Attention Mechanism):注意力评分函数(Attention Scoring Function)》中的加性注意力和缩放点积注意力。 多头注意力的输出需要经过另一个线性转换, 它对应着 h h h个头连结后的结果,因此其可学习参数是 W i o ∈ R p p × h p v W_i^{o}\in R^{p_p\times h_{p_v}} WioRpp×hpv
W o [ h 1 h 2 ⋮ h h ] ∈ R p o W^o \begin{gather*} \begin{bmatrix} h_1 \\ h_2 \\ \vdots \\ h_h \end{bmatrix} \end{gather*} \in R^{p_o} Wo h1h2hh Rpo

基于这种设计,每个头都可能会关注输入的不同部分, 可以表示比简单加权平均值更复杂的函数。

自注意力的实例

多头注意力是指我们可以使用多个注意力头,而不是只用一个。我们可以应用在《深入理解深度学习——注意力机制(Attention Mechanism):自注意力(Self-attention)》中的计算注意力矩阵 Z Z Z的方法,来求得多个注意力矩阵。让我们通过一个例子来理解多头注意力层的作用。以“All is well.”这句话为例,假设我们需要计算“well”的自注意力值:
Z well = 0.6 × V all + 0.0 × V is + 0.4 × V well Z_{\text{well}}=0.6\times V_{\text{all}} + 0.0\times V_{\text{is}} + 0.4\times V_{\text{well}} Zwell=0.6×Vall+0.0×Vis+0.4×Vwell

“well”的自注意力值是分数加权的值向量之和,并且它实际上是由“All”主导的。也就是说,将“All”的值向量乘以0.6,而“well”的值向量只乘以了0.4。这意味着 Z well Z_{\text{well}} Zwell将包含60%的“All”的值向量,而“well”的值向量只有40%。这只有在词义含糊不清的情况下才有用。还是以《深入理解深度学习——注意力机制(Attention Mechanism):自注意力(Self-attention)》中的例句为例:

A dog ate the food because it was hungry.
一只狗吃了食物,因为它很饿。

现在我们假设 Z it = 0.00 × V A + 1.00 × V dog + 0.00 × V ate + 0.00 × V the + 0.00 × V food + ⋯ + 0.00 × V hungry Z_{\text{it}}=0.00\times V_{\text{A}} + 1.00\times V_{\text{dog}} + 0.00\times V_{\text{ate}} + 0.00\times V_{\text{the}} + 0.00\times V_{\text{food}} + \cdots + 0.00\times V_{\text{hungry}} Zit=0.00×VA+1.00×Vdog+0.00×Vate+0.00×Vthe+0.00×Vfood++0.00×Vhungry。“it”的自注意力值正是“dog”的值向量。在这里,单词“it”的自注意力值被“dog”所控制。这是正确的,因为“it”的含义模糊,它指的既可能是“dog”,也可能是“food”。如果某个词实际上由其他词的值向量控制,而这个词的含义又是模糊的,那么这种控制关系是有用的;否则,这种控制关系反而会造成误解。为了确保结果准确,我们不能依赖单一的注意力矩阵,而应该计算多个注意力矩阵,并将其结果串联起来。使用多头注意力的逻辑是这样的:使用多个注意力矩阵,而非单一的注意力矩阵,可以提高注意力矩阵的准确性。

假设要计算两个注意力矩阵 Z 1 Z_1 Z1 Z 2 Z_2 Z2。首先,计算注意力矩阵 Z 1 Z_1 Z1。我们已经知道,为了计算注意力矩阵,需要创建三个新的矩阵,分别为查询矩阵、键矩阵和值矩阵。为了创建查询矩阵 Q 1 Q_1 Q1、键矩阵 K 1 K_1 K1和值矩阵 V 1 V_1 V1,我们引入三个新的权重矩阵,称为 W 1 q W^q_1 W1q W 1 k W^k_1 W1k W 1 v W^v_1 W1v。用矩阵 X X X分别乘以矩阵 W 1 q W^q_1 W1q W 1 k W^k_1 W1k W 1 v W^v_1 W1v,就可以依次创建出查询矩阵、键矩阵和值矩阵。

基于以上内容,注意力矩阵 Z 1 Z_1 Z1可按以下公式计算得出:
Z 1 = Softmax ( Q 1 K 1 T d k ) V 1 Z_1=\text{Softmax}(\frac{Q_1K^T_1}{\sqrt{d_k}})V_1 Z1=Softmax(dk Q1K1T)V1

接下来计算第二个注意力矩阵 Z 2 Z_2 Z2。为了计算注意力矩阵 Z 2 Z_2 Z2,我们创建了另一组矩阵:查询矩阵 Q 2 Q_2 Q2、键矩阵 K 2 K_2 K2和值矩阵 V 2 V_2 V2,并引入了三个新的权重矩阵,即 W 2 q W^q_2 W2q W 2 k W^k_2 W2k W 2 v W^v_2 W2v。用矩阵 X X X分别乘以矩阵 W 2 q W^q_2 W2q W 2 k W^k_2 W2k W 2 v W^v_2 W2v,就可以依次得出对应的查询矩阵、键矩阵和值矩阵。注意力矩阵 Z 2 Z_2 Z2可按以下公式计算得出:
Z 2 = Softmax ( Q 2 K 2 T d k ) V 2 Z_2=\text{Softmax}(\frac{Q_2K^T_2}{\sqrt{d_k}})V_2 Z2=Softmax(dk Q2K2T)V2

同理,可以计算出 h h h个注意力矩阵。假设我们有8个注意力矩阵,即 Z 1 Z_1 Z1 Z 8 Z_8 Z8,那么可以直接将所有的注意力头(注意力矩阵)串联起来,并将结果乘以一个新的权重矩阵 W 0 W_0 W0,从而得出最终的注意力矩阵:
Multi-head Attention = Concatenate ( Z 1 , Z 2 , ⋯   , Z 8 ) W 0 \text{Multi-head Attention} = \text{Concatenate}(Z_1, Z_2, \cdots, Z_8)W_0 Multi-head Attention=Concatenate(Z1,Z2,,Z8)W0

参考文献:
[1] Lecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015
[2] Aston Zhang, Zack C. Lipton, Mu Li, Alex J. Smola. Dive Into Deep Learning[J]. arXiv preprint arXiv:2106.11342, 2021.

你可能感兴趣的:(深入理解深度学习,深度学习,自然语言处理,注意力机制,多头注意力,Attention)