核心要点

  • Padding:在短序列尾部补特殊占位符,把同一批序列对齐到等长,才能拼成张量批处理。

  • Masking:用 mask 标记哪些是真实 token、哪些是 pad,让模型忽略填充位置。

  • 注意力中用 attention mask 把 pad 位置打到负无穷,softmax 后权重为 0,不被关注。

  • 计算损失时用 loss mask 排除 pad 位置;RNN 可用 pack_padded_sequence 跳过填充步。

标准回答

为什么要 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,用于自回归生成。两者可同时叠加使用。

追问 2pad 在序列左边还是右边有区别吗?

有。RNN 通常右侧 padding 并配合 pack 处理;而需要取「最后一个时间步」表示时,左侧 padding 可让最后一位恰好是真实结尾。对解码生成、KV cache 等场景,padding 方向会影响实现,需与 mask 和位置编码保持一致。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出