任务与先修:研究趋势,而不编造规律
最后一章将整个工程当作一个实验系统。读者需掌握前七章的固定语料、训练预算、参数账与留出指标,并会对数、均值和简单代数。本章目标是学会提出能被数据反驳的规模问题,不是在几秒CPU运行后宣布找到大模型缩放定律。官方课程与原论文将参数、数据、计算分开研究;我们只做一个极小、可全量保留的受控版本,用它练习实验逻辑。真正论文的大范围训练结果是阅读背景,不是本项目已复现的成绩。
在不改变三十二条BPE规则、二十四最大窗口、单层四头、前馈宽度为隐藏宽度两倍、学习率与数据协议的条件下,比较宽度十六与三十二。每种宽度运行随机种子七与十一,在二十、四十、八十更新处评估同一验证组,共四条轨迹十二个点。两个宽度在同一种子下使用相同独立抽样器seed,窗口顺序相同;模型初始化形状不同,不能说初始权重逐元素配对。test保持固定配置的一次最终评估,不参与此网格选点。
四个预算量不能互相替代
参数量记为P,独特训练数据的有效目标数记为 ,累计参与更新的有效目标数记为 ,计算资源记为F。此处 ,八十更新时同seed下两个宽度的 相同,但换seed后因长短窗次序不同略有变化。增加更新数主要重复同样文档,绝不等于增加独特语料。参数变宽还增加输出头和位置等项,不能只用d的平方比例估算整个P,必须使用第五章的精确公式。
这里相同更新数和相同target预算可以比较样本效率,但不是相同计算量:宽模型每步更贵。相同墙钟时间也不是干净的相同计算量,因为这个极小CPU项目有框架固定开销、缓存与计时抖动。项目的四条轨迹按明确更新预算运行,不伪装成精确compute-matched实验。若未来要测试等计算最优分配,应先冻结计算度量与停止策略,为每个模型分配不同步数,然后独立运行而不是从现有曲线上随意截取最好点。
算例一:预算表的逐项重算
宽度十六有11856参数,宽度三十二有27808参数,比值约2.34548,而不是恰好四倍,因为词表矩阵占较大比例。seed七的二十、四十、八十更新分别看见1170、2328、4585个有效目标;两个宽度的这个序列完全一致。八十更新时代理F分别为326158560与764998080,直接由六倍参数数目乘4585得到。这个数是量级代理,不是计时器或硬件计数器测到的FLOPs;列出原始因子能让读者独立复算。
seed十一对应累计目标为1130、2291、4638;相比seed七,同步数不保证累计目标逐值相等,但同seed宽度间保持相等。独立检查一是按seed和step分组断言两个宽度targets_seen相同;独立检查二是用每步receipt的targets累加重建检查点预算。若把两条不同seed轨迹拼成一条“连续最佳曲线”,会破坏状态连贯性;每条曲线都应保留自己的seed、源配置和所有点,包括较差者。
| 宽度 | seed | 20步验证NLL | 40步验证NLL | 80步验证NLL |
|---|---|---|---|---|
| 16 | 7 | 4.882411 | 4.220904 | 3.528842 |
| 16 | 11 | 4.800143 | 4.196600 | 3.557607 |
| 32 | 7 | 4.298590 | 3.518181 | 3.036930 |
| 32 | 11 | 4.261102 | 3.499436 | 2.957531 |
这十二点的观察是:在本数据、学习率、种子和更新预算下,每条轨迹的验证NLL随三个检查点降低;相同seed和step下宽度三十二低于十六。它没有证明所有seed都如此,更没有证明在等计算预算、更多数据或更深层数下仍成立。两个seed只提供一项很小的稳健性检查,不足以可靠估计总体误差分布。表格中的趋势是已测范围内的经验陈述,不是由模型定义推出的定理。
算例二:为什么两点能“拟合”很多规律
常见经验形式可以写成 ,其中E是不可约损失下限的模型项,A和alpha为正。若只知道两个参数量与两个损失,即使观测没有噪声,也有三个未知数;任取一个小于两损失的E,都能计算一个alpha与A拟合两点。给定E时,。因此只拿两个宽度做双对数直线,本质上偷偷固定了下限,不能把斜率当成已识别的自然常数。
用纯教学数值P1=100、P2=400、L1=3、L2=2:若E=0,alpha约0.292481;若E=1,alpha=0.5;若E=1.9,alpha约1.729716。三种曲线都穿过同样两点,却对P=1600给出不同预测。独立检查是代回A与两个P重新得到3和2,然后比较第三点预测差异。未知下限与有限跨度的歧义比画图拟合的小数精度更根本;训练未收敛时,额外的优化误差还会被错误吸收到alpha里。
import math
P1,P2=11856,27808
seen=4585
print('parameter ratio',P2/P1,'proxy budgets',6*P1*seen,6*P2*seen)
for floor in [0.,1.,1.9]:
p1,p2,l1,l2=100.,400.,3.,2.
alpha=math.log((l1-floor)/(l2-floor))/math.log(p2/p1)
A=(l1-floor)*p1**alpha
predicted=lambda p: floor+A*p**(-alpha)
assert abs(predicted(p1)-l1)<1e-12 and abs(predicted(p2)-l2)<1e-12
print('assumed floor',floor,'alpha',round(alpha,6),'third point',round(predicted(1600),6))
small=[3.5288419142490675,3.5576071979618873]
large=[3.0369303862587747,2.957531113083623]
deltas=[a-b for a,b in zip(small,large)]
assert all(d>0 for d in deltas)
print('paired NLL gains',deltas,'mean gain',sum(deltas)/2)
对照应该预先写下哪些东西
一个可反驳问题可以是:“固定编码、数据、层数、学习率和有效target更新预算,在种子七与十一中,增宽是否都降低验证NLL?”它提前给出可失败条件:任何配对不改善都应保留并标明,不能换seed直到两次都赢。还应预先定义主指标、检查点和运行失败处理。若某点出现非有限loss或资源不足,记录失败状态与已用预算,不用另一配置的成绩填空。当前网格没有发生这些失败,但收据设计仍保留全部点而不筛选。
增加模型规模时同时换tokenizer会引入表示混杂;增加预算时删除难文档会引入数据混杂;不同模型读取不同batch顺序会放大抽样噪声;仅报告每条轨迹中最好验证点又不记录搜索次数会引入选择偏差。这些都是让“规模收益”难以解释的具体机制。项目固定前两项,并在同seed下匹配抽样,剩余初始化与有限样本影响明确保留。我们没有声称控制了所有潜在因素,也没有把经验改善归因于某一个注意力头。
若要研究独特数据规模,必须从训练组中事先定义多个嵌套子集,tokenizer是冻结还是随子集重训也要提前决定;否则新增数据与新增编码同时变化。若要研究重复训练,应固定独特集合,仅改变Dseen。若要研究等计算最优点,则需要覆盖不同P与Dseen组合,预算代理误差也应估计。三个问题有不同设计,不能用同一条“多跑几步”曲线统称数据规模律。本课给的是能支撑后续研究的闭环,而不是已完成所有研究。
最终项目验收与课程边界
压缩包包含原创合成语料与切分、可逆byte-BPE、确切窗口、完整自写decoder、单线程训练、冻结评估、checkpoint恢复测试、依赖来源与实测收据。源码未导入其他课程路径,模型从随机初始化开始,全部参数参与更新;标准库片段用于逐项解释数值,项目代码负责真实训练。验收应该先在解压目录执行十三项测试,再按固定命令重建训练和网格;本机小数结果可在同环境复核,计时应被视为可能变化的观测。
课程到这里闭合的是“给定小语料,定义任务与表示,训练一个完整微型语言模型,并判断证据支持什么”。未完成且不暗示已完成的内容包括大规模语料清洗、分布式与GPU内核、真实压缩器、跨领域能力评测和正式缩放定律验证。保留这些边界不是否定小实验,而是让每个已完成组件都有可追踪的输入、输出和独立检验。后续改进应从一个明确的新问题出发,重新冻结协议,而不把多个运行的局部最好结果拼成一个从未存在的模型。
读图时也要区分插值与外推。在两个已测宽度之间估计一个趋势已经依赖平滑假设;把它延伸到百万参数还加入了优化、数据与架构行为不变等大量假设。原论文的大范围实验证据可以启发新设计,却不能代替当前系统在新范围的测量。我们因此不拟合一个看似精确的指数附在小图上,也不把论文中的最佳数据配额直接套到这个词表占比高的单层模型。
两seed配对差值分别约0.491912与0.600076 nats每目标,平均约0.545994。这个均值描述已运行的两对,不是总体置信下界;样本太少时写一个正的平均不能证明任意新seed会改善。若以后增加seed,应保留原有配对并预先定义聚合,不可只保留正差值。参数量、目标预算、墙钟与失败状态都需要同一条运行身份关联,才不会把不同实验的局部胜利误拼成稳定规律。
项目网格在每条轨迹内共享训练状态,从二十继续到四十再到八十,不是每个检查点重新初始化。这样曲线才是实际连续学习过程。不同seed之间则是独立轨迹,不能把每秒记录顺序连成一条更长训练;同一份原始日志中的检查点可以比较趋势,但它们强相关,也不能当十二个独立样本求置信区间。四条轨迹与十二次观测的区别,是进行任何统计汇总前必须先说明的层级。
对照的变量还包括层数。当前增宽同时改变每层表示维度与前馈维度,却固定只有一层;不能从它推导“加深也有相同比例收益”。如果以后比较深度,应重新核算归一化和投影参数,匹配总参数或预算,再记录可能不同的优化难度。词表矩阵在极小模型中占大头,使宽度实验和典型大模型参数组成不同;这个结构差异本身就足以阻止把局部斜率直接带入大规模资源规划。
python run.py grid
python -m unittest -v tests.test_pipeline
TRY IT YOURSELF
练习一:预算是否匹配
两个模型P分别1万和2万,各训练1000个有效目标。它们是否等target预算、等代理计算预算?若要求6PD相等,第二个模型该训练多少目标?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:两点识别
给P1=100、P2=400、L1=3、L2=2,分别取E=0与E=1求alpha,并解释为什么不能只报其中一个为发现。
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:解释真实对照
根据表格给出一个被数据支持的结论和两个未被证明的结论。不得把同更新预算叫等计算预算。