AI Hero Club

推理模型与强化学习 · 第 5 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 8 个小节
全课目录 8 章
完整课程计划 ↗
推理模型与强化学习 / 课程计划 ↗

CHAPTER 05 / 8建议学习 135 分钟

把完整轨迹接到真实Transformer

两个数字动作怎样接到完整 Transformer 的因果位置,并形成同一条轨迹概率?

本章要解决的 3 个问题
  • 从输入编号、响应位置与因果矩阵推到完整路径似然
  • 逐项核对2768参数账本及十数字支持归一
  • 实现采样、重评分、枚举和冻结参考的统一接口
课程项目 ZIP ↓

从有限策略过渡到共享参数网络

前四章在有限概率上推导,现在使用真正的单层因果Transformer。项目中的decoder.py完整包含词元嵌入、位置嵌入、四头注意力、两次层归一化、GELU前馈、残差和输出头,来自本课程套件自己实现的教学解码器,复制来源和摘要保存在dependency-provenance.json。它不是下载的预训练模型,也不是对每个任务单独保存一个概率表;每个输入经过同一批共享参数,梯度更新全部参数张量。

配置固定为词表十四、上下文上限八、隐藏宽十六、注意力四头、块数一、前馈宽三十二、dropout零。批量B个长度T的编号张量是整数矩阵,嵌入后形状为B乘T乘十六;每头宽四。注意力分数由查询和键内积除以根号四得到,禁止看未来的位置设为负无穷,再归一化。矩阵运算和反向传播机制作为Transformer实战的导入边界,本章重点不是重新证明矩阵微积分,而是证明这些输出如何对应本课程的概率模型。

参数账本要与真实张量相等

输入嵌入十四乘十六,输出头也十四乘十六,二者不绑定,合计448。位置嵌入八乘十六合计128。四个无偏置注意力投影各十六乘十六,合计1024;前馈两矩阵合计1024,加前馈偏置32和16;两层归一化各有增益与偏置,共64。最后归一化再32。全部相加2768,与model.parameter_count和parameter_ledger的实际值一致。

参数张量共有十七个;“全部参数训练”指全部张量requires_grad为真、交给优化器、实际RL中各张量都有有限非零梯度与非零变化,不是每一个标量坐标每步都非零。例如位置嵌入第七行在当前输入长度中没被访问,本来可能不更新;注意力矩阵中的一些精确对称分量也可能梯度极小。报告既保留每张量梯度范数,也保留RL前后最大绝对差,避免只看trainable计数就声称发生了学习。

N=2Vd+Cd+(4d2+2df+f+5d)+2d=2768N=2Vd+Cd+(4d^2+2df+f+5d)+2d=2768
V=14,d=16,C=8,f=32,一层且输入输出嵌入不绑定。

算例一:两个响应位置逐项对齐

任务二加二的完整序列是 [BOS,2,PLUS,2,EQ,4,8,EOS]。自回归模型位置四,也就是等号所在位置的输出,预测第一个响应四;位置五,也就是响应四所在位置的输出,预测第二个响应八。项目path_logps输入到第二个数字为止的七个编号,选输出切片4:6,恰好对应这两个预测位置;最后位置六的输出不用,因为EOS由协议强制,不从十四类分布采样。

许多训练错误出现在“把序列输入和同位置编号直接对齐”:那会教模型复制当前输入,而非预测下一动作。另一个错误是把整个提示五个位置都算入响应损失,优化会混进提示重建任务。这里明确只收集两个响应预测位置的log概率,分别按正确响应编号gather后求和。测试再用长度五和长度六的两次独立前向,核对同一个总和,检查因果对齐,而不是只测函数能输出一个标量。

受限分布必须在采样和评分中完全一致

sampler每次只从当前最后位置前十个logits做softmax,然后分类抽样,将抽到编号拼回前缀,再产生下一步。scorer在训练中重新前向,同样仅前十维做log_softmax,按采样结果取值。不能采样时先做top-k或温度缩放,评分时仍用原始softmax而不修正,因为那样轨迹来自另一个分布,on-policy梯度推导不再适用。本项目没有top-k、拒绝重采样或按奖励筛选,采到什么就记什么。

温度也固定为一;如果改成温度T,动作打分应同时除T后再用于采样和评分。贪心只用于评价,是取最大分数的确定性选择,不能把贪心轨迹当作来自当前概率策略的独立样本训练。强制EOS也同样明确:它是环境语法动作,概率一,不参与随机采样。课程讲的是受限轨迹上的策略学习,不是隐藏格式后假装自由文本完成率很高。

log⁡pθ(y∣x)=∑t=01[zt,yt−log⁡∑k=09ezt,k]\log p_\theta(y\mid x)=\sum_{t=0}^{1}\left[z_{t,y_t}-\log\sum_{k=0}^{9}e^{z_{t,k}}\right]
z_t是相应响应预测位置的原始logits;EOS为强制事件。

算例二:完整路径枚举可以验概率

固定输入后,列出第一位零至九、第二位零至九的笛卡尔积,一共一百条。对每条调用path_logps,取指数再求和应接近一。第一步概率之和一,第二步在每个第一位前缀下也各自和一,有限求和因而得到总和一。这给出独立的数学归一化证明;实际枚举提供实现检查,二者互相支持但不是同一种证据。

当前项目的float32网络先算log概率,再转double求指数与求和,因此误差不会神奇地变成纯float64精度。测试允许小量舍入偏差,报告保留逐题实际概率和。严格成功路径只有一条,枚举期望奖励就是那一条的路径概率;完整KL则对一百条都加权。可以对每个输入同时输出贪心响应与概率最高完整路径,它们不必相同:贪心先选局部最高第一步,未必最大化连乘后完整概率。

参考复制、模式与梯度的区别

参考模型用deepcopy复制当前监督权重,再把每个参数requires_grad设为False;eval模式本身只控制dropout等模块行为,不会关闭自动微分,也不会阻止优化器修改参数。相反,torch.no_grad只在特定计算区间不记录计算图,并不永久冻结参数。完整冻结需要明确的参数所有权、优化器参数集合和梯度路径;项目同时使用这些条件并检查摘要。

模型训练时dropout零,所以train与eval的前向在本配置下相同;这样采样后重新评分才与采样分布一致。如果用非零dropout,采样和重评分看到不同随机mask,需要把这些随机性纳入策略或固定处理,否则同一轨迹的概率难以按这里的简单函数解释。本课程没有用dropout零掩盖问题,而是把它列为建模条件,读者修改配置时必须重新验证。

测试最容易漏掉的边界

测试包含未来编号扰动:把最后响应数字改掉,前面所有位置logits须逐元素相等,确认因果mask真实生效。采样重放使用同种子Generator,两次结果必须一致;响应总长三、前两位小于十、末位EOS也逐条检查。不同CPU或PyTorch版本不承诺bitwise重放,因此冻结证据记录版本、种子和单线程设置;离线报告只能对记录的环境负责。

加载检查点时,先验证数据摘要,再按保存的配置实例化两个模型,加载策略和参考。torch.load使用weights_only模式读取本项目张量和基本容器,避免把任意对象反序列化当成正常教材接口;这不意味着可以无条件信任任何陌生文件。课程只随包提供自己生成的权重,不需要从外部站点下载模型或配置。若数据合同变化,加载必须失败,不能静默套上旧权重继续解释。

这一章交付什么以及还缺什么

本章完成从任务到log概率的闭环,包含实际网络、采样、重评分、枚举、参数账本和参考冻结。它没有训练大语言模型能力,词表只有十四个编号,响应只有两个随机动作;模型即使能解决全部二十五题,也不能被称为通用数学推理模型。我们选择此规模,是为了让完整概率与KL能由读者真正算清,而不是用大型库调用遮住最重要的定义。

下一章在同一网络上先做四十步监督暖启动,再做一百步强化学习。暖启动本身会改变模型,因此必须冻结它作为RL前的可比起点,并保存前后同题评价。完整训练项目包括梯度范数、每张量差值和参考哈希;本章的接口与概率检查是这些测量的前提。任何性能结论都在第七章出现,不能把本章接口完备偷换成训练已达目标。

在课程项目目录运行可直接运行的检查
import torch
from run import setup,Config,TransformerLM,enumerate_paths
setup();m=TransformerLM(Config(vocab_size=14,block_size=8,d_model=16,n_heads=4,n_layers=1,d_ff=32))
assert m.parameter_count()==2768
r=enumerate_paths(m,m,(2,2))
assert abs(r["probability_sum"]-1)<1e-6
assert abs(r["exact_trajectory_kl"])<1e-8
print(r)

TRY IT YOURSELF

练习一:位置对齐

输入[BOS,2,PLUS,2,EQ,4,8],哪两个输出位置用于响应似然?

提示 1
从零列出每个输入位置,以及该位置负责预测的下一token。
提示 2
只保留两处随机响应的网络分布;强制EOS按协议概率处理,别把prompt重建也计入。
对照参考解答
从零编号:位置4的EQ输出预测4,位置5的4输出预测8,所以取输出[:,4:6,:10]。位置6预测强制EOS,协议给概率一,不用其网络softmax。提示重建也不算入响应似然。

TRY IT YOURSELF

练习二:参数改变配置

将d16改为d32、f64,其余V14、C8、N1不变,参数数是多少?

提示 1
先列词嵌入/head、位置表、单块、finalLN四组账。
提示 2
同时改d与f后逐项代入,注意注意力是d²项,头数只需合法整除不再额外乘总参数。
对照参考解答
嵌入头2×14×32=896,位置8×32=256;块4×32²+2×32×64+64+5×32=8416;末归一化64。总9632。头数仍需整除d,改变头数但d不变不改变这些投影矩阵参数总数。

TRY IT YOURSELF

练习三:贪心未必全局最高

第一步p(A)=0.6、p(B)=0.4;A下最好后续0.5,B下最好后续0.9。贪心与最高完整路径怎样不同?

提示 1
贪心先最大化第一步,最高路径要最大化两步乘积。
提示 2
分别算A分支和B分支最佳完整概率,不从首步排序直接推断整条路径排序。
对照参考解答
贪心先选A,随后最好路径概率0.6×0.5=0.3。B分支最高完整路径0.4×0.9=0.36,反而更高。项目分别记录greedy和枚举best_path,不能把两者自动视为相同。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. eval模式是否冻结参数?

查看解析永久冻结需requires_grad和优化器所有权等条件,eval本身不关闭梯度。
2. 只在采样阶段用top-k,评分仍用原softmax会怎样?

查看解析轨迹来自截断分布,原分布评分不再是其正确似然。
3. 2768参数全训练意味着什么?

查看解析未访问的位置行可不变;张量级证据与标量级陈述不同。
4. 为何能枚举全部KL?

查看解析路径数随动作数和长度指数增长,不能外推到长文本。

自行标记用于记录学习进度,不代表通过项目验收。