标准回答
为什么要 Padding
同一个 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,用于自回归生成。两者可同时叠加使用。
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
