因果掩码为什么不让模型看见未来:3 个新手问题拆懂原理
【免费下载链接】nn-zero-to-heroNeural Networks: Zero to Hero项目地址: https://gitcode.com/GitHub_Trending/nn/nn-zero-to-hero
在 nn-zero-to-hero(Neural Networks: Zero to Hero)里从零搭文本模型,没跑几步就会撞上因果掩码——一条把模型视线截断在当前位置的规则。为什么非要有它?它到底怎么挡?该从哪个 notebook 开始动手?本文用三个问题把它拆开,不需要你先会注意力机制,用到哪讲到哪。
先想清楚:模型看未来会犯什么错
🏭 先把语言模型想成一条单向流水线的传送带:每个位置只能看到上游已经流过去的成品,还没下线的零件(也就是未来的文字)全都挡在帘子后面。这个"只看后面"就是自回归——一个字一个字地往外吐文本,每个新字只依赖它前面的字。
把帘子一拆,事故立刻显形:训练会作弊。任务是看"今天天气"猜下一个字,可没人挡着时,模型可以先把整句读完,再从全文里"抄"出下一个字,损失值几步就跳水,但学到的是假本事,相当于背下了倒着念答案的技巧。生成更直接报废:推理时文本还没吐出来,根本没有未来可看,模型用全视角练出来的习惯无处对齐,输出直接乱掉。
所以训练和生成的规则必须对齐:两边都只看过去。信息屏蔽干的就是这件事——训练时堵住泄露,生成时保证一致。
帘子怎么挂:挡住"看未来"的具体位置
挡的动作发生在注意力机制里。注意力机制就是句子里每个位置给其他所有位置打一个权重分,再按分数加权汇总信息。关键是控制谁能看谁:在算注意力分数时,把当前位置之后所有位置的分数直接归零,只留下 0 到 i 的三角区域。
几行伪代码就明白了:对第 i 个位置,j 只从 0 走到 i,算 dot(q_i, k_j) 得分,再 softmax 归一成权重,取最大。
看到 j 的循环了吗:它在 i 处刹车,多一步都不走。这个上三角结构就是因果掩码的物理形态,和注意力配合起来就是因果掩码 注意力机制的核心。
挡了未来,训练反而更快?
它不拖后腿,还是加速训练的关键一块。生成只能一个字一个字吐,但训练时一句话里所有位置可以同一时刻并行计算——每个位置各自做"猜下一个字"的任务,掩码只是把每个位置的视线分别堵住,互不串味。可以说并行训练要付费,付出的就是掩码这道工序,语言模型训练 掩码与并行是一枚硬币的两面。理解了这个交换,就看懂了现在所有大模型为什么都长一个样。
动手路径:从 part1 到 part4 把帘子挂上
- lectures/makemore/makemore_part1_bigrams.ipynb:用查表法"看上一个字猜下一个字",先搭最原始的自回归基线,体会"只看过去"的预测力上限。
- lectures/makemore/makemore_part2_mlp.ipynb:把查表换成 MLP,"看完整上下文"后预测力立刻上来,顺带认识 softmax 和采样。
- lectures/makemore/makemore_part4_backprop.ipynb:末尾的采样循环是逐字生成的完整过程,在这里把注意力和三角掩码补上,就能把"看过去"升级成"带权地看过去"。
三本 notebook 按顺序跑完,因果掩码原理你已经亲手验证过一遍了。
【免费下载链接】nn-zero-to-heroNeural Networks: Zero to Hero项目地址: https://gitcode.com/GitHub_Trending/nn/nn-zero-to-hero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考