Transformer中多头自注意力机制的原理解释
多头自注意力机制的核心思想是将输入序列分割成多个子空间,也可以理解为多“头”(heads),每个“头”独立地计算注意力,从而能够捕捉到输入序列中不同位置的特征和关系。,Multi-Head Latent Attention),主要优化的点在于:能够显著降低内存占用和计算开销,同时保持模型性能。DeepSeek使用的Transformer架构中,使用的是优化后的多头自注意力机制,名为。假如模型维度(
在Transformer架构中,多头自注意力机制(MHA,Multi-Head Self-Attention)是其核心组件之一,主要由以下几个步骤实现:
主要步骤如下:
1 输入序列的线性变换
多头自注意力机制的输入是一个序列,通常表示为一个矩阵 X X X,其形状为 ( N , L , D model ) (N,L,D_{\text{model}}) (N,L,Dmodel),其中:
- N N N是批量大小(batch size)。
- L L L是序列长度(sequence length)。
- D m o d e l D_{model} Dmodel是模型的维度(embedding size),指的是输入序列的特征维度,即每个单词或标记(token)的嵌入向量的维度。
在多头自注意力机制中,输入序列 X X X会被分别映射到三个不同的矩阵:查询(Query)、键(Key)和值(Value)。这一过程通过线性变换实现,具体如下:
- 查询(Query)矩阵: Q = X W Q Q = X W^Q Q=XWQ
- 键(Key)矩阵: K = X W K K = X W^K K=XWK
- 值(Value)矩阵: V = X W V V = X W^V V=XWV
其中, W Q 、 W K 、 W V W^Q 、 W^K、W^V WQ、WK、WV是可学习的权重矩阵,它们的形状均为 ( D model , D model ) (D_{\text{model}}, D_{\text{model}}) (Dmodel,Dmodel), D model D_{\text{model}} Dmodel为模型的纬度,因此乘积后所得的 Q , K , V Q,K,V Q,K,V形状仍然为 ( N , L , D model ) (N,L,D_{\text{model}}) (N,L,Dmodel)。这些权重矩阵将输入序列 X X X 变换到不同的空间,分别用于计算查询、键和值矩阵。
2 多头机制的实现
多头自注意力机制的核心思想是将输入序列分割成多个子空间,也可以理解为多“头”(heads),每个“头”独立地计算注意力,从而能够捕捉到输入序列中不同位置的特征和关系。
上一步计算的查询矩阵、键矩阵和值矩阵 Q 、 K 和 V 分别被分割成多个“头”(heads)。假设我们有 h 个头,每个头的维度 d k = D model h d_k = \frac{D_{\text{model}}}{h} dk=hDmodel 。假如模型维度(嵌入向量的维度)为512,“头”的数量为4,则分割后每个头的维度 d k d_k dk 为128。
分割过程如下:
- 将 Q Q Q 分割成 h 个子矩阵 Q 1 , Q 2 , Q 3 … , Q h Q_1,Q_2,Q_3 \ldots,Q_h Q1,Q2,Q3…,Qh,每个子矩阵(头)的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk)。分割后的矩阵 Q ′ Q^{\prime} Q′形状为 ( N , L , h , d k ) (N,L,h,d_k) (N,L,h,dk)。
- 将 K K K 分割成 h 个子矩阵 K 1 , K 2 , K 3 … , K h K_1,K_2,K_3 \ldots,K_h K1,K2,K3…,Kh,每个子矩阵(头)的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk)。分割后的矩阵 K ′ K^{\prime} K′形状为 ( N , L , h , d k ) (N,L,h,d_k) (N,L,h,dk)。
- 将 V V V 分割成 h 个子矩阵 V 1 , V 2 , V 3 … , V h V_1,V_2,V_3 \ldots,V_h V1,V2,V3…,Vh,每个子矩阵(头)的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk)。分割后的矩阵 V ′ V^{\prime} V′形状为 ( N , L , h , d k ) (N,L,h,d_k) (N,L,h,dk)。
注意:虽然每个子矩阵的头形状相同,但是其中的数值不相同。
那分割过程是如何完成的?可以通过矩阵乘法和重塑操作实现。
例如我们将查询矩阵 Q Q Q 进行分割:
- 首先将 Q Q Q 的权重矩阵 W Q W^Q WQ 分割为 h h h 个子矩阵 W 1 Q , W 1 Q … W h Q W_1^Q,W_1^Q\ldots W_h^Q W1Q,W1Q…WhQ,每个子矩阵的形状为 ( D model , d k ) (D_{\text{model}}, d_k) (Dmodel,dk),然后打包为一个整体形状为 ( D model , h , d k ) (D_{\text{model}}, h,d_k) (Dmodel,h,dk)的矩阵 W n e w Q W_{\text new}^Q WnewQ 。
- 然后将矩阵 W n e w Q W_{\text new}^Q WnewQ与 Q Q Q 相乘,得到 Q Q Q 的重塑矩阵(分割后的矩阵) Q ′ Q^{\prime} Q′,即 Q ′ = Q W n e w Q Q^{\prime}=QW_{\text new}^Q Q′=QWnewQ,由于 Q Q Q 的形状为 ( N , L , D model ) (N,L,D_{\text{model}}) (N,L,Dmodel),以 Q Q Q 的最后维度 D model D_{\text{model}} Dmodel 匹配 W n e w Q W_{\text new}^Q WnewQ的 D model D_{\text{model}} Dmodel 维度进行乘积,因此两者乘积的结果 Q ′ Q^{\prime} Q′ 形状为 ( N , L , h , d k ) (N,L,h,d_k) (N,L,h,dk)。
3 每个头的注意力计算
对于每个头 i ( i = 1 , 2 , … h ) i(i=1,2,\ldots h) i(i=1,2,…h),共 h h h 个头,计算注意力分数(attention scores)和加权和(weighted sum)。
-
注意力分数:计算查询 Q Q Q 分割后的一个子矩阵 Q i Q_i Qi 和键 K K K 分割后的一个子矩阵 K i K_i Ki 转置矩阵 K i T K_i^T KiT 的乘积,然后除以一个缩放因子 d k \sqrt{d_k} dk 用于缩放乘积结果,防止数值过大导致梯度消失或爆炸, d k d_k dk为“头”的维度,由之前计算所得。因此注意力分数计算公式为:
scores i = Q i K i T d k \text{scores}_i=\frac{Q_iK_i^T}{\sqrt{d_k}} scoresi=dkQiKiT其中, Q i Q_i Qi的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk), K i K_i Ki 的转置矩阵形状为 ( N , d k , L ) (N,d_k,L) (N,dk,L),以 Q i Q_i Qi的维度 d k d_k dk执行乘法,与 K i K_i Ki 的维度 d k d_k dk 进行匹配相乘,则结果 scores i \text{scores}_i scoresi 的形状为 ( N , L , L ) (N,L,L) (N,L,L)。
-
注意力权重:对计算得到的注意力分数应用Softmax函数,得到注意力权重:
weights i = Softmax ( scores i ) \text{weights}_i=\text{Softmax}(\text{scores}_i) weightsi=Softmax(scoresi) -
加权和:将注意力权重与对应分割后的值子矩阵 V i V_i Vi 相乘,得到每个头的输出:
output i = weights i V i \text{output}_i=\text{weights}_iV_i outputi=weightsiVi
其中, weights i \text{weights}_i weightsi 的形状为 ( N , L , L ) (N,L,L) (N,L,L), V i V_i Vi 的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk),同样以 weights i \text{weights}_i weightsi 的最后维度 L L L 执行乘法,与 V i V_i Vi 的维度 L L L 进行匹配相乘,因此 output i \text{output}_i outputi 的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk)。
根据此计算方法将每个“头”的 output i \text{output}_i outputi (第 i = 1 , 2 , … h i=1,2,\ldots h i=1,2,…h 个头的输出)计算出来。
4 多头输出的合并
将所有头的输出合并为一个矩阵,然后通过一个线性变换进行整合:
-
合并:将所有头的输出拼接在一起:
concat = [ output 1 , output 2 , … output h ] \text{concat}=[\text{output}_1,\text{output}_2,\ldots \text{output}_h] concat=[output1,output2,…outputh]
其中, output i \text{output}_i outputi 的形状为 ( N , L , d k ) (N,L,d_k) (N,L,dk),且 d k × h = D model d_k\times h=D_{\text{model}} dk×h=Dmodel,因此 concat \text{concat} concat 的形状为 ( N , L , D model ) (N,L,D_{\text{model}}) (N,L,Dmodel)。
concat \text{concat} concat 也被称为 Attention \text{Attention} Attention,它即是Transformer多头自注意力机制计算的最终结果。可将上述的所有计算过程合并成一个公式:
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 -
线性变换:通过一个线性变换整合多头的输出,用于后续计算:
output = concat W O \text{output}=\text{concat}W^O output=concatWO
其中, W O W^O WO是一个可学习的权重矩阵,形状为 ( D model , D model ) (D_{\text{model}}, D_{\text{model}}) (Dmodel,Dmodel)。
DeepSeek使用的Transformer架构中,使用的是优化后的多头自注意力机制,名为多头潜在注意力(MLA,Multi-Head Latent Attention),主要优化的点在于:能够显著降低内存占用和计算开销,同时保持模型性能。
如果对此感兴趣可关注后续文章。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐


所有评论(0)