文章目录
- 0. 前言
- 1. 注意力机制(Attention)概述
- 2. Q、K、V矩阵是怎么来的?
- 3. 缩放点积注意力(Scaled Dot-Product Attention)
- 4. 多头注意力(Multi-Head Attention)
- 5. 多头注意力的好处
- 6. 总结
0. 前言
按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。
本文是Transformer学习系列的第二篇文章,在前面的Transformer模型架构说明中已经有多处提及(多头)注意力机制,注意力机制是Transformer的核心,本文将详细说明注意力机制的数学原理及作用。
1. 注意力机制(Attention)概述
注意力机制是Transformer模型的核心,因为它赋予了模型识别输入序列中不同元素之间复杂关系的能力,而无需受限于传统的顺序处理方式。通过自注意力(Self-Attention)机制,每个位置的元素都能直接与序列中的所有其他元素交互,从而有效地捕捉长距离依赖关系。
这种机制允许并行化计算,极大地提高了训练效率和模型性能,同时使得模型能够动态地对每个输入元素强调不同的关注点,根据其上下文调整对信息的关注程度。因此,注意力机制不仅加速了模型处理速度,还增强了模型的理解能力和表达能力,成为Transformer架构区别于以往模型的关键创新点。
注意力机制通过计算查询(Query)、键(Key)和值(Value)之间的关系来生成输出。强烈建议先阅读下前文【单点知识】多头注意力机制:torch.nn.MultiheadAttention的原理与实践中的例子。
在Attention is All You Need 原文中提出了两种注意力机制:加法注意力和点乘注意力。虽然两者在理论上的复杂度相近,但在实际上点乘注意力性能更好,后面的注意力机制说明都默认是点乘注意力。
注意力机制通过 Q Q Q(Query,查询)、 K K K(Key,键) 和 V V V(Value,值) 矩阵工作。 Q Q Q 表示当前词的查询向量, K K K 表示所有词的键向量, V V V 表示所有词的值向量。
首先,计算 Q Q Q 和 K K K 的点积并缩放,得到注意力分数,表示词与词之间的相关性。然后,通过 Softmax 将分数转换为概率分布。最后,用这些概率加权 V V V, V V V 矩阵提供了词的实际内容,而注意力机制通过加权 V V V 矩阵中的值向量,生成一个上下文相关的表示,帮助模型更好地理解序列中的关系。
2. Q、K、V矩阵是怎么来的?
一说到Transformer的注意力机制,众多文章往往一上来就开始QKVQKV……的解释,令人摸不到头脑。这也是Attention is All You Need 原文并没有太交代清楚的地方,我觉得有必要先说明白。
从模型最开始,Transformer输入的 n n n个Token会被转换为 ( n , d m o d e l ) (n, d_{model}) (n,dmodel)维的矩阵 X X X(回顾下前文【Transformer模型学习】第一篇:提出背景、模型架构及推理过程 中的第三章),Transformer 使用三个不同的可学习权重矩阵生成 Q Q Q、 K K K、 V V V矩阵:
- W Q W_Q WQ:用于生成查询矩阵 Q = X ⋅ W Q Q = X \cdot W_Q Q=X⋅WQ。
- W K W_K WK:用于生成键矩阵 K = X ⋅ W K K = X \cdot W_K K=X⋅WK。
- W V W_V WV:用于生成值矩阵 V = X ⋅ W V V = X \cdot W_V V=X⋅WV。
权重矩阵 W Q W_Q WQ和 W K W_K WK的形状为 ( d model , d k ) (d_{\text{model}}, d_k) (dmodel,dk) ,生成的 Q Q Q和 K K K的形状为 ( n , d k ) (n , d_k) (n,dk)。 W V W_V WV的形状为 ( d model , d v ) (d_{\text{model}}, d_v) (dmodel,dv),生成的 V V V的形状为 ( n , d v ) (n, d_v) (n,dv)。
3. 缩放点积注意力(Scaled Dot-Product Attention)
这是Transformer中使用的注意力机制。它通过计算查询和键的点积,然后进行缩放和Softmax操作来得到权重,最后用这些权重对值进行加权求和。
公式如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中, Q Q Q、 K K K、 V V V分别表示查询、键和值, d k d_k dk是键的维度。
可以更形象一点表示为:
其中,缩放因子 d k \sqrt{d_k} dk是为了防止点积结果过大,导致softmax函数输出接近0或1的极端值,从而减小梯度消失的风险,确保训练过程更加稳定有效。通过缩放点积的结果,可以使softmax函数更有效地分辨不同词之间的关联强度。
最终,如果我们令 d v = d m o d e l d_v=d_{model} dv=dmodel就会发现,Attention变成了和输入 X X X的维度一致,这样,输入 X X X就经历了一个“头”的处理,得到了单头注意力。
4. 多头注意力(Multi-Head Attention)
在单头注意力的基础上我们也可以再将查询 Q Q Q、键 K K K和值 V V V分别投影到多个 d v = d m o d e l / h d_v=d_{model}/h dv=dmodel/h维子空间(在原文中 h h h设定为8, d m o d e l d_{model} dmodel设定为512),然后在每个子空间中并行计算注意力,最后将结果拼接并再次投影。
整个过程相当于把一个“大头”分解成了多个“小头”,其公式如下:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO
W O W^O WO是一个可学习的权重矩阵,用于将多个注意力头的输出拼接后进行线性变换,最终生成多头注意力的输出。其中,每个头 head i \text{head}_i headi的计算方式为:
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
5. 多头注意力的好处
多头注意力的主要好处可以总结为以下几点:
- 捕捉多样化的特征:每个注意力头可以独立学习不同的注意力模式。例如,一个头可能关注局部依赖(如相邻词之间的关系),而另一个头可能关注长距离依赖(如句子中相隔较远的词之间的关系)。
- 支持并行计算,提高效率:多头注意力机制中的每个头的计算是独立的,可以并行进行。这种并行性充分利用了硬件加速器(如GPU或TPU)的计算能力,显著提高了计算效率。
- 增强模型的鲁棒性和表达能力:多个注意力头的组合使得模型能够从不同角度理解输入数据。即使某些头的注意力分配不理想,其他头仍然可以提供有用的信息。
- 更好地建模上下文关系:多头注意力能够同时捕捉输入序列中的多种上下文关系。例如,在自然语言处理任务中,一个词可能与多个其他词有不同的语义关系。
6. 总结
本文详细说明了Transformer的核心——多头注意力机制。它可以通过计算词与词之间的相关性,捕捉序列中的全局依赖关系,允许模型动态关注输入的不同部分,增强上下文理解能力,而不用考虑输入间的举例。多头注意力并行计算多个注意力头,提取多样化的特征,提升模型的表达能力和鲁棒性,广泛应用于机器翻译、文本生成等任务。