坐下 6 / 6
这一次只跑通一条链。不逛框架。
选一件小事:字符级语言模型,或一个很小的 MLP 分类。目标是别人能按你的步骤重跑,中断了能从 checkpoint 接着,并且你写得出它做不到什么。新框架、新优化器、多卡,都不在这一次。
数据落成文件
把语料或表格放进一个你找得到的文件,记下 sha256 或至少文件大小和行数。字符级模型:一份纯文本,按字符建表,stoi / itos 和数据一起存。分类:每行 x 和 y,缺标签的行丢掉并记下来,不要静默填 0。
切分写进代码,不要手滑另存三个 csv 却忘了规则。按时间或按实体切,种子写死。训练、验证、测试三个路径印出来。测试目录这个循环里不要打开。
循环长什么样
一个可恢复的循环至少有:读 batch、前向、损失、零梯度、反向、一步、每隔 N step 在验证集上算同一指标、把「目前验证最好」的权重存成 ckpt.pt。文件里写下 step、种子、切分哈希、超参。中断之后:加载权重、恢复 step,不要把优化器状态随手丢掉又假装从零学习率接着走。
字符级模型的损失是下一个字符的交叉熵。输入 text[0:T],目标 text[1:T+1]。生成时改成一个字符一个字符走,温度先用 1.0,再试 0.8。分类模型在验证集上印混淆矩阵,不要只印准确率——上一张实验卡里那个 98% 的教训还在。
存完再写八行
模型卡不是广告。八行就够:任务;输入;输出;数据从哪来、怎么切;主指标和这次测到的数(写明是验证还是冻住后的测试);训练预算(步数、墙钟、机器);它做不到什么;什么情况下不要用。最后两行比分数重要。字符模型在莎士比亚上能续写,并不代表能回答事实。MLP 在 28×28 数字上 97%,换到手机拍照就会掉。
第一次完整训练常见的断点:数据文件只在 notebook 内存里、checkpoint 不含词表、生成脚本和训练脚本各用一套归一化、验证时忘了 model.eval() 和 torch.no_grad()。清单勾完再写卡。论文仍放在第五次坐下之后;Attention Is All You Need 等你已经有一次能恢复的运行再读。
这一次的清单
勾完写八行。存在本机。第八行附近要出现「做不到」或「不要用」。
六次坐下到这里。形状、回传、曲线、掩码,都是为了让这一次运行出了问题你知道该翻哪一页。对照原版二十四章,缺的深度可以再补;这一条链不要拆。