标准回答
为什么要 Padding
同一个 batch 内序列长度不一,但张量要求规整形状,所以把短序列用占位符(如 <pad>)补到该 batch 的最大长度,才能拼成一个矩阵送入模型并行计算。
为什么要 Masking
Padding 引入的占位符没有真实语义,若不处理会污染计算。Masking 用一个布尔/0-1 mask 标出真实位置与填充位置,让模型在两个地方忽略 pad:
- 注意力层:构造 attention mask,把 pad 对应的注意力分数设为 -∞(或极大负数),经 softmax 后权重趋近 0,从而不关注填充位置。
- 损失计算:用 loss mask 只在真实 token 上累计损失,避免 pad 位置贡献梯度,否则会拉偏模型。
RNN 的高效做法
PyTorch 中先按长度排序,用 pack_padded_sequence 把 batch 打包,RNN 只在真实时间步上计算、跳过 pad,再用 pad_packed_sequence 还原,既正确又高效。
常见误区
⚠️ 常见踩坑
只做了 padding 却忘了 mask——填充位置会参与注意力和损失计算,污染表示并产生错误梯度,模型效果下降且难排查。
追问
追问 1:注意力中的 padding mask 和 causal mask 有什么区别?
padding mask 屏蔽的是无意义的填充位置,按每条样本真实长度决定,用于忽略 pad;causal mask 屏蔽的是「未来位置」,让每个位置只能看到自己及之前的 token,用于自回归生成。两者可同时叠加使用。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📚 知识库
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出