跳转至

Transfomer精选面试

多头注意力的核心思想是什么?使用多个头的好处有哪些?

多头注意力的核心思想是:将输入投影到多个不同的“表示子空间”中,在每个子空间内独立进行缩放点积注意力计算,然后将各个子空间的输出拼接起来,再做一次线性投影,得到最终的输出。这样,模型可以同时从不同角度关注输入序列的不同部分和不同类型的依赖关系。

使用多个头的好处:

  • 增强表达能力:单头注意力只能学习一种固定的查询-键匹配模式,而多头注意力允许模型共同关注来自不同位置的不同表示子空间的信息。例如,一个头可能关注局部语法结构,另一个头可能捕捉长距离的语义关系,还有一个头可能专门关注某个特定词或标点。

  • 降低单个头学习的压力:每个头的维度通常较小,让模型通过多个低维注意力并行工作,比使用一个高维注意力更容易优化,且能学到更丰富的特征组合。

  • 稳定训练:多个注意力头可以相互补充,即使某些头在初期未学到有效模式,其他头仍能提供有效信号,整体训练更鲁棒。

  • 可解释性:不同的头可能学会分工,如有的头负责指代消解,有的头负责词性匹配,通过可视化可以分析模型内部的语言处理机制。

image.png

多头注意力的输出是如何合并的?头的数量与每个头的维度 dkdk 之间通常有什么关系?

多头注意力的合并过程:

image.png

增加头的数量会带来什么影响?何时头数太多反而有害?

增加头数的影响:

  • 更细粒度的子空间:每个头的维度更小,能够学习更专门化的模式。在一定范围内增加头数可以提高模型性能,因为更多的并行注意力模式能捕获更丰富的信息。

image.png

  • 计算量略有增加:尽管矩阵乘法的总 FLOPS 大致相同,但更小的矩阵乘法和更多的拼接/拆分操作可能导致实际效率下降。

头数太多的害处:

  • 每个头维度过小:如果 dk太小,点积注意力的表达能力受限,无法有效捕捉复杂的语义关联。实验表明,当 dk 降至一定值(如 8 或 16)以下,性能可能开始下降。

  • 冗余与过拟合风险:过多的头可能导致许多头学到相似的冗余模式,没有带来额外的多样性,反而增加了计算开销和模型复杂度。

  • 优化困难:过多的头使得梯度被分割得更细,可能不利于优化器找到好的解。

image.png

在实现多头注意力时,如何通过矩阵分块一次性计算所有头?

为了高效并行,多头注意力通常不分别循环计算每个头,而是通过矩阵重塑和批量运算一次性计算所有头。具体方法如下:

image.png

这种实现完全避免了 Python 循环,所有计算都是高效的 GPU 张量操作。

为什么说多头注意力允许模型在不同的“表示子空间”中关注信息?请举例说明。

“表示子空间”指的是通过不同的 Q、K、V 投影矩阵,输入被映射到不同的低维空间。在这些不同的空间中,token 之间的“相似性”度量方式不同,因此注意力权重会不同,聚合的值信息也来自不同方面。

举例:假设输入句子“The cat sat on the mat because it was comfortable.”,其中“it”指代“mat”。在多头注意力中:

  • 一个头可能学习到句法依存关系:该头中名词“cat”的查询会与动词“sat”的键匹配,形容词“comfortable”与系动词“was”匹配。在这种子空间中,注意力权重体现的是语法结构。

  • 另一个头可能学习到指代消解:该头中“it”的查询会与“mat”的键强烈匹配,从而正确地将“it”关联到先行词。在这个子空间中,“it”和“mat”的向量距离更近。

  • 第三个头可能关注局部上下文:每个词更多地关注相邻的词,捕捉搭配和短语结构。

因此,不同的头相当于从不同视角分析同一序列,并将各自获取的信息融合在一起,使模型同时掌握局部细节、全局语义、句法角色等多种依赖关系。

image.png

单头注意力与多头注意力在参数量和计算量上有何差异?

参数量:

image.png

因此,多头注意力在不增加参数和计算总量的前提下,通过分割子空间增强了模型表达能力。

能不能在推理时剪枝掉一部分注意力头?这样做有什么风险?

可以。许多研究(如 Michel et al., 2019)表明,在训练好的 Transformer 模型中,相当一部分注意力头是冗余的,可以被剪枝掉而性能损失很小。具体做法是在验证集上评估每个头的重要性(例如去掉该头后损失的变化),然后移除不重要的头。

风险:

  • 性能下降:如果剪枝过多,剩下的头可能不足以捕获所有必要的注意力模式,导致任务性能下降。需要仔细评估剪枝阈值。

  • 领域偏移:在训练领域剪枝后,在新的下游领域可能效果不佳,因为头的重要性可能随任务改变。

  • 模型鲁棒性降低:某些头可能在对抗攻击或稀有样本上起关键作用,剪掉后模型可能变得脆弱。

  • 不可逆:剪枝是一种有损操作,一旦剪掉,无法恢复。可以通过掩码或结构重参数化进行“软”剪枝,保留未来恢复的可能性。

因此,头剪枝是一种有效的压缩技术,但需要针对具体任务和数据进行谨慎验证,通常配合微调恢复部分精度。

分析一下多头注意力中是否存在冗余,有哪些方法可以合并或共享头?

大量实证研究表明,Transformer 中的注意力头确实存在显著冗余。例如,同一层内的多个头可能学习到几乎相同的注意力模式(如都关注 [SEP] 或特定高频词),或者某些头的输出在最终预测中贡献极低。

合并或共享头的方法:

  • 头剪枝:评估每个头的重要性,直接移除不重要的头(见上一问)。

  • 头合并/重组:将多个行为相似的头通过加权求和或低秩近似合并为一个头,减少总头数。例如,可以利用注意力输出的相似性进行聚类,将同一簇的头合并。

  • 共享 QKV 投影:让多个头共享部分或全部的 Q、K、V 投影参数,减少参数量和计算量。例如,AlBERT 就跨层共享所有参数,包括注意力头的参数。

  • 动态头选择:在推理时根据输入动态选择激活哪些头(如 MoE 式的门控),未激活的头不参与计算,相当于一种条件计算。

  • 低秩因子分解:将每个头的 QKV 投影分解为两个低秩矩阵的乘积,并让多个头共享一个大的“基础”矩阵,每个头只需学习小的差异矩阵,达到参数共享和压缩。

这些方法都可以在保持模型容量的同时减少冗余,提高推理效率。

为什么后来许多大模型(如 LLaMA)使用 Multi-Head Attention,而不是始终增加头数?

后来的大模型仍然使用多头注意力,但它们在头数选择上更加审慎,通常不会无止境地增加头数,而是会平衡总维度、每个头维度和头数之间的关系。原因如下:

image.png

  • 计算和内存开销:虽然参数量与头数无关,但多头注意力中每个头都需要独立的 softmax 计算,这增加了实际的计算图复杂度和内存占用(需要存储多个注意力矩阵)。头数太多会让 GPU 并行效率下降。

  • 边际收益递减:实验表明,在达到一定头数后,继续增加头带来的性能提升微乎其微,甚至因为每个头维度太小而损害性能。

  • 新兴注意力变体:大模型开始尝试一些多头注意力的变体,如 Multi-Query Attention (MQA) 和 Grouped-Query Attention (GQA)。MQA 让所有头共享同一组 K、V,极大减少 KV 缓存;GQA 则将头分组,组内共享 KV。这些方法在保持多头多样性的同时降低了内存和计算,被 LLaMA 2、Mistral 等模型采用。这表明未来的趋势不是增加头数,而是更高效地利用头的结构。

因此,大模型并非简单地增加头数,而是在保持每个头充足维度的前提下,通过优化头的组织方式(如共享、分组)来进一步提升效率。

多头注意力的不同头之间是否可能产生冗余?如何量化这种冗余度?

冗余的存在:大量实验表明,Transformer 中的多个注意力头确实存在显著冗余。同一层内的不同头可能学习到几乎相同的注意力模式(例如都强烈关注 [SEP] 标记或句子首词),或者在功能上高度重叠。这主要是因为标准训练过程并没有显式鼓励头之间的多样性,它们可能在相似的梯度信号下收敛到相似解。

量化冗余度的方法:

  • 注意力分布相似度:对于同一输入序列,计算两个头输出的注意力权重矩阵之间的差异。常用指标有 Jensen-Shannon 散度(JSD)、KL 散度或简单的余弦相似度。如果两个头在所有位置上的注意力分布高度一致(JSD 接近 0,余弦相似度接近 1),则它们可视为冗余。

  • 输出表示的相似度:将两个头的输出向量(经过各自的注意力计算后)进行中心化核对齐(Centered Kernel Alignment, CKA)或线性中心核对齐(Linear CKA)。高相似度表示两个头提供了几乎相同的信息。

  • 消融实验:依次移除某个头,观察模型在下游任务上的性能变化。如果移除一个头后性能几乎不变,说明该头冗余。还可以测量移除头前后模型输出 logits 的差异,差异越小说明该头越不重要。

  • 头重要性评分:通过计算损失函数对头输出权重的梯度,或利用 Taylor 展开估计每个头对损失的贡献。贡献极低的头可视为冗余。

  • 子空间重叠度:由于每个头学习一个注意力子空间,可以计算子空间基之间的 Grassmann 距离或主角度。主角度越小,子空间越接近,表示头可能关注相似的特征方向。

综合这些方法,可以构建一个“冗余度矩阵”,直观展示任意两个头之间的功能重叠程度,为后续剪枝或合并提供依据。

如果限制每个注意力头只能关注特定的局部区域,这还算多头注意力吗?会有什么效果?

是否算多头注意力:从广义上讲,这仍然属于多头注意力的变体。多头注意力的核心特征是拥有多个并行的注意力计算单元,即使每个单元的作用范围被限制,只要它们独立计算、最后合并输出,就保持了多头的本质。典型例子包括局部注意力(Local Attention)或滑动窗口注意力(Sliding Window Attention),这些模型中每个头可以设定不同的窗口大小或位置,从而在保持多头并行性的同时限制关注范围。

效果:

  • 计算效率提升:限制每个头只关注局部区域,可以将复杂度从 O(L²) 降到 O(L×W),其中 W 是窗口大小。这极大减少了长序列的计算和内存开销。

  • 局部细节捕获能力增强:局部注意力强制模型优先学习邻近 token 的依赖,这类似卷积的归纳偏置,在处理图像、音频等具有强局部结构的数据时尤其有益。实验表明,混合使用局部和全局注意力头往往能取得速度和精度的平衡。

  • 可能损失全局视野:如果所有头都被限制为局部,模型将无法直接捕捉长距离依赖。通常需要保留至少一个全局注意力头,或通过堆叠多层来间接扩大感受野。

  • 可解释性提升:结构化限制使每个头的行为更易分析,有助于理解模型到底关注了输入的哪些区域。

因此,这种变体可视为标准多头注意力在效率上的特化,仍属于多头框架,常见于 Longformer、Swin Transformer 等高效架构。

为什么在一些轻量化模型中会减少头的数量,甚至使用单头?如何在效率和效果间取舍?

轻量化模型(如 MobileViT、EdgeFormer、一些蒸馏后的 BERT 变体)减少头数或使用单头的主要原因在于计算与参数效率。

减少头数的动机:

  • 参数和计算量:虽然多头注意力的总参数量与头数无关(当总维度固定时),但每个头都需要独立的 QKV 投影、注意力矩阵计算和 softmax。多头操作会引入额外的重塑、转置、拼接开销,且在实际 GPU 调度中,太多的小矩阵乘法会降低并行效率,增加内存访问成本。

  • 头维度过小的风险:轻量化模型的总维度 d_model 通常很小(如 256 或 384),如果强行分成多个头,每个头的 d_k 可能只有 16 或 32,这严重限制了单个头的表示能力,容易导致注意力模式低质、训练困难。

  • 边际收益递减:对于小模型,多头的增益可能微乎其微,甚至因为表示稀释而损害性能。单头或少量头使每个头拥有更大的维度,能学习更丰富的特征,反而更有效。

效率与效果的取舍:

  • 根据模型规模选择:总维度 ≥512 时通常保持多头(如 8 头,d_k=64);维度较小(如 256)时可减为 2-4 头;极小模型(如 128 维)直接用单头。这确保了每个头至少拥有 32-64 维的表示空间。

  • 使用分组查询(Grouped-Query Attention, GQA)或 Multi-Query Attention (MQA):不直接减少头数,而是让多个头共享同一组 Key 和 Value,从而大幅降低 KV 缓存和计算量,同时保留 Query 的多样性。LLaMA 2、Mistral 等模型采用 GQA,在效率与多头多样性之间取得平衡。

  • 混合注意力模式:部分头使用全局注意力,部分使用局部或稀疏注意力,使计算预算集中于重要区域。

  • 在微调阶段评估头的重要性,剪除贡献低的头,将模型压缩到最适合目标任务的配置。

总之,取舍原则是:保证每个头有足够维度(≥32),在此基础上通过共享、剪枝等减少实际计算量,而非简单削减头数牺牲能力。

有没有办法在推理时动态合并相似的注意力头,以降低计算量?这需要哪些条件?

动态合并的方法:

是的,可以在推理时对相似的头进行合并,类似于模型压缩中的“头融合”(Head Fusion)。动态合并指在推理过程中,基于输入或基于预先分析的冗余度,实时地将多个注意力头合并为一个,从而减少总计算量。

具体技术:

  • 基于权重的线性合并:如果两个头的 QKV 投影矩阵以及输出投影矩阵高度相似,可以计算一个合并后的投影矩阵(例如加权平均),在运行时使用合并后的矩阵替代。这需要预先计算头的相似性。

  • 运行时投票/门控:设计一个小型门控网络,输入当前层的特征,动态选择激活哪些头。不重要的头可以跳过计算,或者用平均值替代。

  • 低秩近似合并:将多个头对应的输出权重矩阵视作一组基,用低秩分解得到一个共享的核心矩阵和头特定的小扰动,推理时优先用核心矩阵,头扰动可以忽略或合并。

需要的条件:

  • 预先分析冗余度:离线阶段需要量化头之间的相似性(如使用第1问的方法),识别出哪些头可以安全合并。这要求开发集与推理分布一致,以确保合并后不会损害新数据的性能。

  • 模型架构支持:模型需要设计成易于合并的形式,例如头之间输出投影独立(标准 Transformer 中输出投影是拼接后一次性做的,需要先分离再合并),或者采用分组查询那样的结构。

  • 精度-效率权衡机制:合并可能导致精度损失,需要设定一个可接受的损失阈值,根据实际场景决定合并力度。通常需要微调来恢复精度。

  • 动态性要求:如果合并是输入依赖的(动态),则需要额外的网络或规则来实时决定合并方案,这本身会增加一些开销,必须确保净收益为正。

在工业部署中,更常见的做法是离线剪枝或合并后重新微调,因为动态合并带来的计算图条件分支会增加延迟和复杂度。但是,随着自适应推理的发展,动态合并头部的研究正在增加。

多头注意力中的头维度通常远小于总维度,这会不会限制每个头的表达能力?

可能的限制:是的,每个头的维度 d_k 通常只有 d_model/h,比如 64 或 128,远小于总维度(如 768、1024)。单个头的低维空间确实限制了其可以建模的复杂关系——点积注意力在低维空间中更易受到噪声影响,且无法捕获需要高维表示才能区分的细粒度语义差异。

但限制被以下因素缓解:

  • 多个头联合:每个头关注不同子空间,拼接后的整体表示维度恢复到 d_model,并经过输出投影,可以在全局层面组合各个头的低维信息。这种“分而治之”的策略使得模型的总体表示能力并未下降,反而能捕获多角度的特征。

  • 非线性组合:注意力输出经过拼接和输出投影(线性变换),再经过前馈网络(FFN)的非线性变换。FFN 可以在高维空间中重组来自不同头的信息,弥补单个头维度的不足。

  • 信息瓶颈的有益性:适当的低维约束可以作为一种正则化,迫使每个头专注于最有信息量的特征方向,减少过拟合风险。

  • 任务依赖性:对于许多任务,64 维的表示已经足够捕捉注意力模式。实验表明,当 d_k 从 64 降为 32 时,大型模型的性能下降并不明显;但降至 16 以下时可能出现瓶颈。

因此,头维度较小确实在微观层面限制了单个头的容量,但通过多头并行的互补性、后续层级的融合以及适当的维度选择,整体模型的表达能力得以充分保持。

分析一下多头注意力与“多通道卷积”的类比,它们有哪些相似和不同?

相似之处:

  • 并行多组处理:多头注意力使用多组 QKV 投影,多通道卷积使用多个卷积核。每个头/通道都可以学习不同的特征模式(头关注不同的依赖关系,卷积核检测不同的视觉特征如边缘、纹理)。

  • 输出拼接/融合:多头的输出在特征维度上拼接后通过线性投影融合;多通道卷积的输出就是多个特征图,直接堆叠成多通道张量,后续由下一层处理。都体现了“分组处理、合并信息”的思想。

  • 参数共享与多样性:注意力头的投影矩阵和卷积核都是可学习参数,训练后不同头/核会自动分化,捕捉不同模式。

不同之处:

  • 操作机制:多头注意力是内容自适应的——权重由输入本身计算得到(Query-Key匹配),属于动态计算;卷积核的权重是静态的,训练后固定,对任何输入都执行相同的滤波操作。

  • 感受野:注意力天然拥有全局感受野(在标准实现中),每个输出位置都可以直接访问整个输入序列;卷积核通常具有局部感受野,需要堆叠多层来扩大。

  • 计算复杂度:注意力的计算和内存开销随序列长度呈平方级增长;卷积的复杂度与序列长度线性增长(假设卷积核大小固定)。

  • 归纳偏置:卷积引入了平移等变性和局部性先验,这在数据量少时尤为重要;注意力缺乏这些先验,需要海量数据才能学到类似能力。

类比有助于理解,但两者在实际应用中有各自的优势领域。现代视觉模型(如 ViT 与 CNN 对比)正在逐渐融合两种机制,例如在 Transformer 中引入局部窗口注意力或卷积 stem。

如果不同头使用不同温度系数,会对注意力分布产生什么影响?

在标准注意力中,温度系数通常被隐含为统一缩放因子 1/√d_k。如果为每个头分配不同的温度 τ_i,则注意力计算变为 softmax(QK^T / (τ_i·√d_k))。不同温度会显著改变注意力分布的“锐度”:

  • 低温度(τ < 1):softmax 更尖锐,注意力高度集中在分数最大的少数位置。这可以让头专注于最相关的 token,提高精度,但可能导致梯度消失和多样性降低。

  • 高温度(τ > 1):softmax 更平滑,注意力分布更均匀。这允许头融合更多 token 的信息,可能捕获全局上下文,但过高的温度会使输出退化为简单平均,丧失注意力选择能力。

引入多温度的效果:

  • 增强多样性:不同头采用不同温度,可以促使它们聚焦不同范围的信息——有的头做“精确查找”(低温),有的头做“广撒网”(高温),从机制上鼓励头之间的功能分化,可能降低冗余。

  • 动态范围控制:对于语义匹配要求高的层(如浅层),低温有助于提取精确局部特征;对于需要全局推理的高层,高温有助于整合全局信息。

  • 梯度流动:低温头更容易饱和,训练时可能需要更小的学习率或梯度裁剪。实践中,可通过可学习温度参数让模型自适应调整。

然而,额外引入温度系数增加了超参数复杂度。标准 Transformer 通过统一缩放已取得良好平衡,多温度方案更多出现在特定研究或领域适配中(如对比学习的温度调节)。

能否将标准多头注意力改造成“深度可分离注意力”来减少参数量?类似 MobileNet 的思想。

可以,深度可分离卷积的思想可以迁移到注意力中,形成“深度可分离注意力”(Depthwise Separable Attention)。其核心是将标准注意力的混合操作分解为两步:

  • 深度注意力(Depthwise Attention):每个头(或每个通道)独立计算自己的注意力,但 Value 的聚合不混合不同通道的信息。类似于对每个特征维度单独进行加权聚合。

  • 逐点投影(Pointwise Projection):在深度注意力之后,通过一个 1×1 的线性变换(逐点卷积等效)将各通道信息混合。

实现方式:

假设输入 X 形状 (L, d),标准多头注意力中,每个头将 d 维投影到 d_k 维,计算注意力后输出 d_v 维,然后拼接并投影回 d。要减少参数量,可以:

  1. 对每个位置(token)单独做注意力?不,更类似的是 通道维度的分组:让每个头只负责 d_model/h 个通道的注意力,Value 也只来自那个通道组,相当于每个头在低维通道组内独立完成自注意力。这本身已经是标准多头的做法。

  2. 为了进一步减少参数,可以减少投影矩阵的尺寸,例如不将整个 d_model 投影到 h·d_k,而是先用一个便宜的线性层降维,再分头;或者共享 Q、K、V 投影中的大部分参数(如 MQA 共享 K、V)。

  3. 真正的“深度可分离”注意力可以设计为:保留 Q 和 K 的多样性(多头),但 Value 投影使用深度可分离卷积的思想——Value 的聚合在通道组内独立进行,且 Value 投影矩阵采用分组卷积或逐通道卷积,大幅减少参数量。

效果与权衡:

  • 参数量和计算量显著下降,特别是减少 Value 投影和输出投影的矩阵尺寸。

  • 可能限制信息混合能力,因为通道间的信息交互被延迟到了逐点投影步骤,表达能力可能弱于标准方法。

  • 实际应用中,MQA 和 GQA 已经部分实现了这种思想:减少 Key/Value 头的数量,保留 Query 的多头性,实质是一种不对称的参数共享,大幅降低了 KV 缓存,同时性能下降可控。

因此,“深度可分离注意力”是一种有效的轻量化方向,尤其适合对内存和带宽敏感的边缘设备。