序列建模中 Padding 和 Masking 怎么处理?
简化版
Padding 把变长序列补到统一长度,Mask 告诉注意力、RNN 打包和损失哪些位置无效。仅把 PAD 值设为 0 不够;必须在表示传播与 loss 聚合处都正确屏蔽,并使用真实长度。
详细版
-
PAD token 需要固定 id,与真实词分开。
-
attention mask 防止读取补齐位置。
-
loss mask 防止 PAD 贡献梯度和指标。
-
packed RNN 可跳过 padding 并避免状态被无效步更新。
-
左/右 padding 与位置索引、因果 mask 必须匹配。
完整版教学
一、Padding 解决张量形状,Mask 保证语义不变
批处理要求矩形张量,所以补齐是工程手段;PAD 不属于原序列,不应改变 hidden state、注意力归一化或损失分母。
不同模块的 mask 约定可能相反:1 表有效或 1 表屏蔽,bool 与加性 -inf 也不同,必须核对 API。
二、底层机制与公式
loss=sum_(b,t) mask_bt*CE_bt / sum mask
attention_logits += (1-mask)*(-infinity)
三、带数字的推演
序列长度 [3,1] 补到 3,共 6 个位置但只有 4 个有效。
masked loss 分母应为 4;若除 6,短序列比例越高,loss 会被人工压小。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 普通 pad+mask | 通用易调试 | 仍计算无效位 |
| Packed sequence | RNN 跳过无效步 | 排序和 API 复杂 |
| Ragged/Nested | 减少 padding | 算子支持有限 |
五、执行流程
生成 PAD 与 lengths -> 构造有效 mask -> embedding/attention 或 pack
-> 解包对齐 -> masked loss/metric -> 还原原序列顺序
六、边界条件与工程代价
softmax 前应把无效 key logit 置为足够负值;softmax 后简单乘 0 会让有效权重和小于 1。
全 PAD 样本会使分母为 0 或 attention 全 -inf,数据层应拒绝或专门处理。
记忆钩子:Padding 让形状一样,Mask 让结果像没补过。
七、常见误区与追问
-
误区:PAD embedding 为 0 就无需 mask。 偏置和递归仍会产生非零状态。
-
追问:loss 为什么要重新归一化? 只按有效 token 数求平均。
-
误区:所有框架 mask 中 1 都表示有效。 API 约定可能相反。
-
追问:pack 有什么优势? RNN 不执行补齐时间步,也不更新无效状态。
-
追问:左 padding 有何风险? 位置编码和因果 mask 索引可能错位。
八、加强记忆
Padding 让形状一样,Mask 让结果像没补过。
检查三处:注意力/递归、loss、metric,并核对 mask 的 0/1 语义。