一次输入如何连着预测,直到结束
预测到的Token什么时候显示,什么时候成为下一轮输入?
配套正文:F15基础课
一次输入如何连着预测,直到结束
预测到的Token什么时候显示,什么时候成为下一轮输入?
生成像接一条未完的序列,但不是把整句想好再逐字揭幕。每一轮使用已有前缀产生下一项分布,选择一个Token,把它加入已生成序列,再进行下一轮。使用KV缓存时,程序只把尚未处理的新Token送入模型;历史并没有被丢掉,而是通过每层缓存参与计算。
输入与适用条件:独立、可复算的微型模型:7项教学词表、4维表示、单层单头因果Attention、残差与tanh前馈;省略归一化和位置编码。输出头只用三条指定前缀拟合,目的是演示“学习→!→EOS”,不具有通用语言能力。完整参数与中间值随包提供。
1 / 10 · 输入是“我爱”,还没有输出
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
本例教学分词得到[1,2]。这是一台极小的因果模型;下面的候选分数由程序计算,不是商业模型实测。
输入=[1,2];缓存长度=0默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
逐步说明与计算记录
以下解释全部展开,与播放器使用同一份数据;不是另换输入的第二个算例。
1.输入是“我爱”,还没有输出
本例教学分词得到[1,2]。这是一台极小的因果模型;下面的候选分数由程序计算,不是商业模型实测。
输入=[1,2];缓存长度=02.处理完整输入(Prefill)
首次前向处理两个已知Token,缓存长度由0变2。处理结束时,最后一个有效位置已经能给出下一项的分数。
cache_len=2;新输入=[1, 2]3.第1次选择:学习
同一个输出头根据当前最后表示算出分布,最高概率约0.7700。按贪心规则选出“学习”。选择没有再次执行Embedding,所以它还没进入自己的K/V缓存。
已选出=学习;cache_len=24.显示新文字,同时准备下一轮输入
界面可以先显示“学习”,但模型还没有加工这个新Token。下一轮才会把它送进模型,预测其后的候选。
pending=[3];cache_len=25.新一轮:只处理“学习”
把上一步刚选出的“学习”作为新输入,追加它的K/V;历史2个位置的K/V直接复用。并不是只看这个新Token而忘记历史。
cache_len=3;新输入=[3]6.第2次选择:!
同一个输出头根据当前最后表示算出分布,最高概率约0.7700。按贪心规则选出“!”。选择没有再次执行Embedding,所以它还没进入自己的K/V缓存。
已选出=!;cache_len=37.显示新文字,同时准备下一轮输入
界面可以先显示“!”,但模型还没有加工这个新Token。下一轮才会把它送进模型,预测其后的候选。
pending=[5];cache_len=38.新一轮:只处理“!”
把上一步刚选出的“!”作为新输入,追加它的K/V;历史3个位置的K/V直接复用。并不是只看这个新Token而忘记历史。
cache_len=4;新输入=[5]9.第3次选择:EOS
第三次前向后选出结束Token EOS。宿主看到这个结束标记后停止;不会再为了预测下一个Token而处理EOS。EOS不作为可见文字显示。
已选出=EOS;cache_len=410.结束不等于每个任务都成功
本次显示的追加文字为“学习!”。EOS是此教学序列的停止标记;达到长度上限或取消是不同的停止原因,不能都宣称任务完成。
可见文本=学习!;stop_reason=EOS为什么需要
先区分已处理、已选出、待处理三种状态,才能正确实现生成与缓存。
怎样实现
循环中先前向、再选Token、判停止;未停止时只追加新Token作为下一次输入。
可能的代价与误解
把刚选出的Token算进缓存长度,会造成位置偏移、重复追加或漏算;更改模型参数还会让缓存失效。
如何判断是否做对
本图实际算出三轮选择[3,5,6],缓存长度[2,3,4];每轮与从头计算整个前缀的结果比较。