一、什么是掩码注意力机制
掩码注意力是标准自注意力的变体,也叫因果注意力,主要用于Transformer解码器以及Decoder‑Only架构大模型。核心约束:计算当前token注意力时,仅允许访问自身与历史位置token,屏蔽序列未来位置的token信息。
普通自注意力为双向注意力,每个token可以和序列全部位置做交互;掩码注意力实现单向因果约束,服务自回归文本生成任务。
核心计算公式:
Attention(Q,K,V)=softmax(QKTdk+M)V \operatorname{Attention}(Q,K,V)= \operatorname{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}}+M\right)V Attention(Q,K,V)=softmax(dk QKT+M)V
掩码矩阵M定义:
Mij={0j≤i−∞j>i M_{ij}= \begin{cases} 0 & j \le i \\ -\infty & j>i \end{cases} Mij={0−∞j≤ij>i
将未来位置赋值负无穷,经过softmax运算后,对应位置注意力权重趋近于0,完成信息屏蔽。掩码操作必须执行在softmax之前,放在softmax之后将失效。
二、掩码注意力完整计算流程
- 输入经过线性变换得到Q、K、V矩阵;解码器场景Q来自解码器输入,KV来自解码器自身输入;
- QQQ与KTK^\mathrm{T}KT矩阵相乘,得到原始注意力相似度得分;
- 使用dk\sqrt{d_k}dk 做缩放,控制内积数值范围;
- 叠加上三角掩码矩阵,对角线右上方未来token位置填充负无穷;
- 掩码处理后的分数送入softmax,被掩码位置权重归零;
- 归一化后的注意力权重和V矩阵加权求和,输出掩码注意力结果O。
掩码矩阵为上三角矩阵,以序列长度等于3举例:
[
[0, -inf, -inf],
[0, 0, -inf],
[0, 0, 0 ]
]
仅保留下三角与对角线元素,第i个token只能看见0~i位置token。
三、掩码注意力与普通自注意力对比
| 对比维度 | 普通自注意力(Encoder/BERT) | 掩码注意力(Decoder/GPT) |
|---|---|---|
| 信息可见范围 | 双向全序列可见,可访问过去、未来token | 单向可见,屏蔽未来token,仅可见历史+当前token |
| 掩码逻辑 | 无因果上三角掩码,可存在padding掩码 | 强制叠加Look‑Ahead上三角因果掩码 |
| 计算流程 | QKT→缩放→softmax→VQK^\mathrm{T}\rightarrow缩放\rightarrow softmax\rightarrow VQKT→缩放→softmax→V加权 | QKT→缩放→加掩码→softmax→VQK^\mathrm{T}\rightarrow缩放\rightarrow加掩码\rightarrow softmax\rightarrow VQKT→缩放→加掩码→softmax→V加权 |
| 适用模块 | Transformer编码器、BERT | Transformer解码器、GPT、LLaMA等生成模型 |
| 典型任务 | 文本分类、实体识别等理解类任务 | 文本续写、对话生成等自回归生成任务 |
通俗理解:普通注意力是阅读完整全文;掩码注意力是写文本,写当前字符只能参考已经写过的内容,不能偷看尚未生成的后续内容。
四、引入掩码的底层必要性
自回归生成任务,预测第i个token只能依赖0~i‑1已经生成的token。
训练阶段使用Teacher Forcing并行输入完整目标序列,若无掩码,模型会直接读取未来待预测token的信息,相当于训练阶段直接获取答案,训练和推理行为不一致,最终推理生成效果失效。
掩码从计算层面切断对未来token的访问,维持模型因果约束,对齐训练与推理行为。
区分两类mask:
- Look‑Ahead因果掩码:屏蔽未来位置,掩码注意力使用;
- Padding掩码:屏蔽batch内无效padding占位token,编码器解码器均可使用。
五、核心代码片段(PyTorch)
python
import torch
import torch.nn.functional as F
def masked_self_attention(Q, K, V, d_k):
seq_len = Q.size(1)
attn_score = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
# 生成上三角掩码,diagonal=1取对角线上方区域
causal_mask = torch.triu(torch.ones((seq_len, seq_len)), diagonal=1).bool()
attn_score.masked_fill_(causal_mask, -1e9)
attn_weight = F.softmax(attn_score, dim=-1)
output = torch.matmul(attn_weight, V)
return output, attn_weight
六、掩码注意力在Transformer架构中的位置
- Encoder‑Decoder原始Transformer
- Encoder:普通双向自注意力,无Look‑Ahead掩码;
- Decoder第一层:掩码多头自注意力,使用上三角掩码处理目标序列;
- Decoder交叉注意力:Q来自解码器,KV取自编码器输出,不施加因果掩码。
- Decoder‑Only架构(GPT、LLaMA)
每一层注意力全部为掩码注意力,全程开启因果掩码,完成文本自回归续写。
七、总结
- 掩码注意力在softmax前叠加上三角因果掩码矩阵,未来位置填充负无穷,softmax后权重置零,实现屏蔽未来token;
- 和普通自注意力核心差异是增加单向因果约束,适配生成任务;
- 核心作用:对齐训练和推理行为,防止模型偷看未来token,是生成式大模型的底层基础;
- 因果掩码和Padding掩码功能不同,不可混淆。