news 2026/5/28 3:15:37

AI 术语通俗词典:多头注意力

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI 术语通俗词典:多头注意力

多头注意力是深度学习、自然语言处理、Transformer、大语言模型和多模态模型中非常核心的一个术语。它用来描述一种把注意力机制分成多个“注意力头”,让模型从不同角度同时理解上下文关系的方法。换句话说,多头注意力是在回答:模型怎样同时关注一句话中的多种关系,而不是只用一种注意力模式理解全部内容。

如果说自注意力机制让每个 Token 可以根据相关性关注其他 Token,那么多头注意力则进一步让模型用多个注意力头分别学习不同类型的关系。例如,一个头可能关注主谓关系,一个头可能关注指代关系,一个头可能关注局部短语搭配,还有一个头可能关注长距离依赖。

因此,多头注意力常用于 Transformer、BERT、GPT、大语言模型、机器翻译、文本生成、图像 Transformer、多模态模型和扩散模型中的条件建模,是理解现代人工智能模型结构的重要基础概念。

一、基本概念:什么是多头注意力

多头注意力(Multi-Head Attention)是在注意力机制基础上的扩展。

图 1:多头注意力结构总览

普通自注意力会根据 Q、K、V 计算一次注意力:

其中:

• Q 表示 Query,查询

• K 表示 Key,键

• V 表示 Value,值

• d_k 表示 Key 向量维度

• softmax 用于得到注意力权重

多头注意力不是只计算一次注意力,而是把输入映射到多个不同的子空间中,分别计算多组注意力。

每一组注意力称为一个注意力头。

可以简单理解为:

输入表示↓多个注意力头并行计算↓每个头关注不同关系↓拼接结果↓线性映射得到最终输出

从通俗角度看:单头注意力像一个读者只用一种视角读句子。多头注意力像多个读者同时读同一句话,每个人关注不同线索,最后把意见合并。

例如,对句子:

我喜欢机器学习,因为它能发现数据中的规律。

不同注意力头可能关注:

• “它”和“机器学习”的指代关系

• “发现”和“规律”的动宾关系

• “因为”引导的因果关系

• 相邻词之间的局部搭配

这就是多头注意力的基本思想。

二、为什么需要多头注意力

多头注意力之所以重要,是因为语言和图像中的关系往往不是单一的。

一句话中可能同时存在:

• 语法关系

• 指代关系

• 修饰关系

• 因果关系

• 局部搭配

• 长距离依赖

如果只用一个注意力头,模型只能形成一套注意力分布。这可能不足以同时表达多种关系。

多头注意力通过多个头,让模型可以并行学习不同的注意力模式。

从通俗角度看:一个老师看作文,可能重点看语法;另一个老师可能重点看逻辑;第三个老师可能重点看用词。多个视角合在一起,判断会更全面。

多头注意力的作用包括:

• 从多个角度建模上下文关系

• 提高模型表达能力

• 让不同注意力头学习不同模式

• 支持 Transformer 并行计算

• 增强模型对复杂序列的理解能力

例如,在机器翻译中,一个注意力头可能关注词语对齐,另一个注意力头可能关注句法结构,另一个注意力头可能关注长距离依赖。

因此,多头注意力不是简单增加计算量,而是让模型获得更丰富的表示能力。

三、从单头注意力到多头注意力

理解多头注意力,可以先从单头注意力开始。

图 2:单头注意力与多头注意力

1、单头注意力

单头注意力只计算一组 Q、K、V。

对于输入 X,可以先得到:

然后计算:

其中:

• X 表示输入序列表示

• W_Q、W_K、W_V 是可学习参数

• O 表示注意力输出

单头注意力可以让每个 token 根据上下文更新表示。

但它只有一套注意力权重。

2、多头注意力

多头注意力会为每个头准备不同的线性变换。

第 i 个注意力头可以写为:

其中:

• head_i 表示第 i 个注意力头

• W_i^Q、W_i^K、W_i^V 表示第 i 个头对应的参数

• i 表示注意力头编号

如果有 h 个注意力头,就会得到:

head₁, head₂, ..., head_h

这些头分别从不同子空间中计算注意力。

最后,把它们拼接起来:

再经过输出线性变换:

其中:

• H 表示拼接后的多头结果

• W_O 表示输出投影矩阵

• O 表示多头注意力的最终输出

完整公式常写为:

从通俗角度看:多头注意力先“分头理解”,再“合并意见”。

四、注意力头:每个头到底在学什么

注意力头不是人工指定功能的模块,而是模型在训练过程中自动学习出来的子结构。

每个注意力头都有自己的一组 Q、K、V 变换矩阵。这意味着不同头可以把同一个输入投影到不同特征空间中。

例如,对同一句话:

小明把书放进书包,因为它很重。

不同注意力头可能学习到不同关系:

• 某个头关注“它”与“书”的指代关系

• 某个头关注“放进”和“书包”的动作关系

• 某个头关注相邻词之间的局部关系

• 某个头关注句子整体结构

从通俗角度看:注意力头像多个观察角度。同一个 Token,在不同注意力头中会被用不同方式理解。

需要注意:注意力头的含义不是训练前人工规定的。

我们不能说“第 1 个头一定学语法,第 2 个头一定学指代”。

更准确地说:不同注意力头具有学习不同关系模式的能力,但具体学到什么取决于数据、任务和模型训练结果。

五、多头注意力中的维度变化

多头注意力不仅是概念,也涉及张量形状变化。

假设输入序列表示为:

其中:

• N 表示 batch size

• L 表示序列长度

• d_model 表示模型隐藏维度

如果有 h 个注意力头,通常每个头的维度为:

其中:

• d_head 表示每个注意力头的维度

• h 表示注意力头数量

例如:

d_model = 512h = 8

那么:

也就是说,每个头使用 64 维子空间计算注意力。

多头计算后,h 个头会被拼接回 d_model 维:

从通俗角度看:多头注意力不是简单把总维度无限增大,而是把原来的表示维度拆成多个子空间分别计算,最后再合并回来。

这也是为什么注意力头数量通常要能整除 d_model。

六、多头注意力与自注意力、交叉注意力

多头注意力可以用于不同类型的注意力结构。最常见的是:

• 多头自注意力

• 多头交叉注意力

图 3:多头注意力的三种常见形式

1、多头自注意力

在多头自注意力中,Q、K、V 都来自同一个序列。

例如,在文本理解中:

输入句子 → Q、K、V

可以写为:

其中 Q、K、V 都由 X 生成。

这种结构用于让同一序列内部的 token 互相建模关系。

例如:句子中的每个 token 关注同一句子中的其他 token。

2、多头交叉注意力

在多头交叉注意力中,Q 来自一个序列,K 和 V 来自另一个序列。

例如,在编码器—解码器结构中:

解码器当前状态 → Q编码器输出结果 → K、V

可以理解为:解码器在生成时,去关注编码器提供的信息。

在图文模型中,也可能出现:

文本 token 作为 Q图像特征作为 K、V

从通俗角度看:自注意力是“自己内部互相看”,交叉注意力是“一个序列去看另一个序列”。多头机制可以同时用于这两类注意力。

七、多头注意力在 Transformer 中的位置

在 Transformer 中,多头注意力是核心模块之一。

一个典型 Transformer 层通常包含:

多头注意力↓残差连接 + LayerNorm↓前馈神经网络↓残差连接 + LayerNorm

在编码器中,通常使用多头自注意力。

在解码器中,常见两类注意力:

• 带因果掩码的多头自注意力

• 多头交叉注意力

1、编码器中的多头自注意力

编码器处理完整输入序列,每个 token 通常可以关注输入中的所有 token。

例如,在文本理解任务中:

我 / 喜欢 / 机器学习

每个 token 都可以参考其他 token。

2、解码器中的因果多头自注意力

在生成式模型中,当前位置不能看到未来 token。因此,需要使用因果掩码。

例如,生成第 3 个 token 时,只能参考第 1、2、3 个 token,不能参考第 4 个 token。

从通俗角度看:因果掩码防止模型“偷看答案”。

3、解码器中的多头交叉注意力

在机器翻译等编码器—解码器模型中,解码器还会通过交叉注意力关注编码器输出。

例如:

源语言句子 → 编码器目标语言生成 → 解码器通过交叉注意力参考源句信息

这使模型在生成目标语言时能够不断查看源语言内容。

八、多头注意力的优势、局限与使用注意事项

1、多头注意力的主要优势

多头注意力最大的优势是可以从多个角度建模上下文。

不同头可以学习不同关系模式,使模型表达能力更强。

其次,多头注意力支持并行计算。

它不像 RNN 那样必须按时间步依次处理,适合在 GPU 上高效训练。

再次,多头注意力可以用于多种数据类型。

文本、图像 patch、语音片段、多模态特征都可以通过多头注意力建模关系。

从通俗角度看,多头注意力的优势在于:让模型不是只用一种视角理解输入,而是用多个视角综合判断。

2、多头注意力的主要局限

多头注意力也有局限。

首先,计算成本较高。

标准注意力需要计算 L × L 的注意力矩阵,序列越长,成本越高。

可以近似理解为:

其中:

• L 表示序列长度

• O(L²) 表示计算量随序列长度平方级增长

其次,注意力头数量不是越多越好。

如果头太少,表达能力可能不足。

如果头太多,每个头的维度太小,单个头的表达能力也可能受限。

再次,注意力头不一定都学到有用信息。

有些头可能冗余,有些头可能关注模式并不清晰。

此外,注意力图不能被简单等同于人类解释。

某个头关注某个 token,并不一定意味着它就是人类意义上的因果解释。

3、使用多头注意力时需要注意的问题

使用多头注意力时,需要注意:

• d_model 通常要能被注意力头数量 h 整除

• 每个头的维度通常是 d_model / h

• 多头结果需要拼接并经过输出投影

• 自注意力中 Q、K、V 来自同一序列

• 交叉注意力中 Q 和 K、V 可来自不同序列

• 生成式模型需要因果掩码

• 长序列会带来较高计算和显存成本

• 注意力头数量需要结合模型规模和任务选择

从实践角度看,多头注意力是 Transformer 的核心,但它的效果并不只由“头数”决定,还与模型深度、隐藏维度、训练数据和任务目标有关。

九、Python 示例

下面给出几个简单示例,用来帮助理解多头注意力的基本使用。

示例 1:使用 PyTorch 的 MultiheadAttention

import torchimport torch.nn as nn # 定义多头注意力层:输入特征维度16,4个注意力头,batch_first=True使输入形状为(batch, seq, feature)attention = nn.MultiheadAttention( embed_dim=16, num_heads=4, batch_first=True) # 生成一批输入:2个序列,每个序列5个位置,每个位置16维特征x = torch.randn(2, 5, 16) # 自注意力:query、key、value 使用相同的输入 xoutput, attn_weights = attention(query=x, key=x, value=x) print("输入形状:", x.shape) print("输出形状:", output.shape) print("注意力权重形状:", attn_weights.shape)

输出形状通常为:

输入形状: torch.Size([2, 5, 16])输出形状: torch.Size([2, 5, 16])注意力权重形状: torch.Size([2, 5, 5])

这个例子中:

• embed_dim = 16

• num_heads = 4

• 每个头的维度为 16 / 4 = 4

• 输出形状仍然保持 batch × seq_len × embed_dim

示例 2:理解每个头的维度

d_model = 768num_heads = 12 d_head = d_model // num_heads print("模型维度:", d_model)print("注意力头数:", num_heads)print("每个头的维度:", d_head)

输出:

模型维度:768注意力头数:12每个头的维度:64

这说明:

也就是说,768 维表示会被拆成 12 个 64 维的注意力头进行计算。

示例 3:多头交叉注意力

import torchimport torch.nn as nn # 定义多头注意力层:输入维度32,4个注意力头,batch_first=True 使输入形状为 (batch, seq, feature)attention = nn.MultiheadAttention( embed_dim=32, num_heads=4, batch_first=True) # query 来自目标序列(例如解码器输入),6个位置,每个32维query = torch.randn(2, 6, 32) # key 和 value 来自源序列(例如编码器输出),10个位置,每个32维source = torch.randn(2, 10, 32) # 交叉注意力:query 与 source 的 key/value 计算注意力output, attn_weights = attention( query=query, key=source, value=source) print("query 形状:", query.shape) # (2,6,32)print("source 形状:", source.shape) # (2,10,32)print("输出形状:", output.shape) # (2,6,32)print("注意力权重形状:", attn_weights.shape) # (2,6,10) 每个 query 对源序列的注意力分布

这里:

• 目标序列长度为 6

• 源序列长度为 10

• 注意力权重形状为 6 × 10

这表示目标序列中的每个位置,都可以关注源序列中的 10 个位置。

示例 4:带因果掩码的多头自注意力

import torchimport torch.nn as nn seq_len = 5 # 序列长度 # 定义多头注意力:输入维度16,4个头,batch_first=Trueattention = nn.MultiheadAttention(embed_dim=16, num_heads=4, batch_first=True) x = torch.randn(2, seq_len, 16) # (batch, seq, embed) # 生成因果掩码(上三角为True),用于遮住未来位置(自回归生成时防止信息泄露)causal_mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool() # 在自注意力中应用因果掩码:每个位置只能看到它之前(含自身)的位置output, attn_weights = attention(query=x, key=x, value=x, attn_mask=causal_mask) print("输出形状:", output.shape) # (2,5,16)print("因果掩码:")print(causal_mask) # 5x5上三角布尔矩阵

输出:

输出形状: torch.Size([2, 5, 16])因果掩码:tensor([[False, True, True, True, True], [False, False, True, True, True], [False, False, False, True, True], [False, False, False, False, True], [False, False, False, False, False]])

这个例子中:

• 第 1 个 token 只能看自己

• 第 2 个 token 可以看第 1、2 个 token

• 第 3 个 token 可以看第 1、2、3 个 token

• 后面的 token 不能被提前看到

这正是生成式语言模型中常用的因果自注意力思想。

示例 5:查看不同头的注意力权重

默认情况下,PyTorch 可能返回对所有头平均后的注意力权重。如果希望查看每个头的权重,可以设置:

import torchimport torch.nn as nn # 多头注意力层:输入维度16,4个注意力头,batch_first=Trueattention = nn.MultiheadAttention( embed_dim=16, num_heads=4, batch_first=True) # 模拟输入:2个序列,每个序列5个位置,每个位置16维特征x = torch.randn(2, 5, 16) # average_attn_weights=False 返回每个头的注意力权重,形状 (batch, num_heads, seq_len, seq_len)output, attn_weights = attention( query=x, key=x, value=x, average_attn_weights=False # 不平均多个头的权重,保留所有头) print("输出形状:", output.shape) print("每个头的注意力权重形状:", attn_weights.shape)

输出形状通常为:

输出形状: torch.Size([2, 5, 16])每个头的注意力权重形状: torch.Size([2, 4, 5, 5])

其中:

• 2 表示 batch size

• 4 表示注意力头数量

• 5 × 5 表示每个头中的 token 关注矩阵

这可以帮助观察不同注意力头是否学到了不同关注模式。

📘 小结

多头注意力是在注意力机制基础上引入多个注意力头,让模型从多个角度理解上下文关系。每个头使用不同的 Q、K、V 投影,分别计算注意力,再将结果拼接并线性映射。它是 Transformer 的核心结构之一。对初学者而言,可以把多头注意力理解为:让模型同时用多个视角阅读同一段内容,再综合这些视角形成更丰富的表示。

“点赞有美意,赞赏是鼓励”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 3:13:57

c++模板进阶知识讲解(对模板的进一步的运用与理解)

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来…

作者头像 李华
网站建设 2026/5/28 2:57:46

Spring AI 和 LangChain4j 中文档处理功能对比

前面几篇文章分别介绍了 Spring AI 和 LangChain4j 在 RAG 文档处理各环节的支持——文档读取、解析、分段、清洗、元数据加工。本文将这些知识点汇总到一个完整的对比框架中,以《仙逆》知识库构建为参考场景,帮助你在项目起始阶段快速判断哪个框架更适合…

作者头像 李华
网站建设 2026/5/28 2:51:59

Dropbox CEO 德鲁·休斯顿掌舵 19 年后卸任,将投身人工智能创业

要点 Dropbox CEO 德鲁休斯顿 24 岁创立该云存储公司,计划卸任 CEO 转任执行董事长。阿什拉夫阿尔卡米将从产品主管晋升为联合 CEO,先与休斯顿共事,最终独自接任 CEO 职位。休斯顿接受采访谈及卸任决定时称“从来没有一个完美的时机”。 本文…

作者头像 李华
网站建设 2026/5/28 2:48:16

AI写论文的宝藏工具!4款AI论文生成神器,为你的论文加分!

AI论文生成工具评测 在2025年,随着学术写作日益智能化,越来越多的人开始使用AI写论文的工具来撰写学术文章。很多AI论文生成工具在处理硕士和博士这样的大篇幅论文时,常常面临着理论深度不足和逻辑结构松散的问题。这使得许多普通的AI写论文…

作者头像 李华