还没加 Mask 的注意力分数
这里可能会对未来 token 给出很高分,这正是“偷看未来”的入口。
当前查询行
当前及历史位置
未来位置
Decoder 在做自回归生成时,当前位置只能看见自己之前的 token,不能提前偷看未来。否则训练时就会“抄答案”,推理时却拿不到这些未来信息,模型行为会前后不一致。因果 Mask 的作用,就是把这种未来泄露硬性堵住。
先选场景,再点击“当前正在计算的 token”。上面的原始打分矩阵展示“如果不加限制,它最想看谁”;右边的因果 Mask 结果展示“哪些未来位置被强制屏蔽了”。
这里可能会对未来 token 给出很高分,这正是“偷看未来”的入口。
未来列会被替换成极小值,Softmax 之后对应权重会压成 0。
下方左侧是“如果允许偷看未来”的注意力分布,右侧是“真正用于自回归生成”的分布。最关键的不是分数本身,而是未来位置的权重是否被压成了 0。
0%
如果没有 Mask,当前查询会有多少注意力流向未来位置。
100%
加上 Mask 后,模型仍然可以完整地看历史和当前位置,不是“全遮住”。
Train = Infer
训练时和推理时都遵守同样的可见范围,模型才不会在训练中学会依赖推理时不存在的信息。
需要因果 Mask。因为目标是按顺序生成,当前位置不能提前看到后面的 token。
通常不需要因果 Mask。像分类、编码、检索表示这类任务,整句输入在一开始就是完整可见的。
通常也不做这种“未来屏蔽”。Decoder 在读取 encoder 输出时,读的是完整输入信息,不属于未来答案泄露。