先对齐当前位置:p 不小于 q 时,当前草稿必接受
🎯 先猜一猜
位置 0 的草稿 token 是 10,目标概率 p=0.8,草稿概率 q=0.5。
TODO 1 应执行什么?
先补的知识
- draft_probs 和 target_probs 都是 [K, vocab_size];第 i 行对应第 i 个草稿位置,列 token_id 对应该 token 的概率。
- draft_tokens 在可见测试中是 Python 列表 [10,20,30,40];token_id 可直接作为张量列索引。
- p 和 q 已通过 [i, token_id].item() 取成 Python float,后续比较不是张量广播。
- 接受概率是 min(1,p/q)。当 p>=q 时结果为 1,因此不需要调用随机数。
图解原理
验证时必须同时对齐“位置 i”和“该位置草稿选中的 token_id”。我们只比较这个候选 token 在两个模型下的概率,不比较整行最大值。若目标模型给它的概率至少和草稿模型一样高,草稿没有过度推荐它,可以直接接受。
p=0.8,q=0.5
p>=q,接受概率为 1,直接追加 token。
不要比较错误位置
target_probs[i].max() 回答的是“目标模型最喜欢谁”,不是“草稿 token 能否接受”。
语法热身:逐项核验候选商品的两方评分
import torch
reviewer_a = torch.tensor([[0.2, 0.8], [0.7, 0.3]])
reviewer_b = torch.tensor([[0.1, 0.9], [0.6, 0.4]])
chosen_items = [1, 0]
approved = []
for i, item_id in enumerate(chosen_items):
p = reviewer_a[i, item_id].item()
q = reviewer_b[i, item_id].item()
if p >= q:
approved.append(item_id)从语法例子迁移到 TODO 1
i:对应草稿位置,选择概率矩阵的行item_id:对应 token_id,选择该行中的词表列reviewer_a:对应 target_probs,取目标概率 previewer_b:对应 draft_probs,取草稿概率 qapproved.append:对应 accepted_tokens.append(token_id)
巩固一下
为什么读取概率要写 [i, token_id]?
学完这一段,试着做
用一个小动作确认自己理解了;最后再进入官方题目。