同样是训练,ChatGPT 比我们多走了两大步
你训出的,是一个"续写机"
上一篇你完整训练出了一个迷你 GPT。给它一个开头,它能接着往下写,而且写得有模有样。
但你大概也察觉到了:它和 ChatGPT 不是一回事。你没法"问"它问题——你给它"中国的首都是",它可能接一句"一个值得一去的地方";你给它"请帮我写一封信",它可能接着编"的格式应当注意以下几点"。它只会做一件事:顺着你给的文字往下续写。它是一台续写机,不是一个能对话、能听指令的助手。
这是这个系列的最后一篇。我们要回答最后一个问题:从你训出的这台续写机,到真正的 ChatGPT,中间还隔着什么。答案是两大步。而你会发现,这两步用的还是同一套训练原理——前七篇没有白学。
第一阶段:预训练,我们做的就是它的迷你版
先给你做的事情正名。
你前七篇做的,专业名词叫预训练(pre-training)。目标就是那一个:在海量文字上反复练"预测下一个 token"。GPT 名字里的 P,指的就是这个 pre-trained。
真正的大模型,第一阶段做的和你完全是同一件事——同样的"预测下一个 token"目标,同样的反向传播,同样的梯度下降。区别只有一个字:大。
你的语料是一部小说,几 MB;它们的语料是几乎整个互联网能抓到的文本、海量书籍和代码,规模是几万亿个 token。你的模型是零点几个 M 参数,4 层;它们是几百上千亿参数,几十上百层。你在一台笔记本上训了几分钟;它们在成千上万张顶级显卡上训了几个月,电费以百万美元计。
但请记住:把规模的差异拿掉,内核是你已经亲手跑通过的那一套。你不是看了个热闹,你做的就是这件事本身的迷你版。
规模带来质变
既然内核一样,为什么大模型能做到我们的迷你 GPT 远做不到的事?
因为规模本身会带来质变。模型小的时候,"预测下一个 token"逼它学会的,是字的搭配、基本的语法。当模型和数据同时放大几个数量级,为了把下一个 token 预测得更准,它被迫学到的东西也跟着升级——它得理解事实("中国的首都是"后面大概率是"北京")、得掌握推理(一道数学题的下一步该写什么)、甚至得会一点代码逻辑。这些能力不是谁专门教的,是"把下一个 token 预测到极致"这个朴素目标,在足够大的规模下自己逼出来的。
业界把这种"小模型没有、模型大到一定程度才冒出来"的能力,叫涌现能力(emergent abilities)。这也是为什么这些年大家拼命把模型往大了做。
续写机不会聊天
预训练做完,你得到一个能力很强、但只会续写的模型。它脑子里装着海量知识,却不知道该怎么"为你所用"。
你问它"怎么煮饭",它可能回你"怎么炒菜""怎么烧水"——因为在它读过的互联网文本里,一个问句后面,跟着的常常是更多问句。它在忠实地做"预测下一个 token",只是这个行为模式不是你想要的。
它缺的不是知识,是"行为方式"。它需要被教会:看到一个指令或问题,应该给出回答,而不是续写更多问题。这就是第二步要解决的。
第二阶段:SFT,教它听话
第二阶段叫 SFT(Supervised Fine-Tuning,监督微调),也叫指令微调。
它的做法,说出来你会觉得熟悉:还是训练,还是预测下一个 token,还是反向传播拧旋钮。唯一变的,是喂的数据。
预训练喂的是原始的互联网文本。SFT 喂的是人工精心准备的"指令和理想回答"成对的数据,形式大概是这样:
指令:用一句话解释什么是光合作用。
回答:光合作用是植物利用阳光,把二氧化碳和水转化成养分并释放氧气的过程。
指令:把下面这句话翻译成英文:今天天气很好。
回答:The weather is nice today.
拿成千上万条这样的数据,在预训练好的模型上继续训练。模型还是在学"预测下一个 token",但因为它现在见到的全是"指令后面跟着一个得体的回答",它就慢慢学会了一种新的行为模式:遇到指令,就给出回答。
注意,SFT 几乎没有给模型灌新知识——知识在预训练阶段就装满了。SFT 改的是行为:把一台续写机,调教成一个会听指令、会回答的助手。同一套训练机制,喂不同的数据,得到不同的结果。
第三阶段:对齐,教它把话说好
经过 SFT,模型已经会回答问题了。但"会回答"和"回答得好"还有距离。同一个问题,模型能写出好几种都算"正确"的回答——有的啰嗦有的简洁,有的礼貌有的生硬,有的稳妥有的可能带点风险。怎么让它稳定地产出人类更喜欢、更安全的那一种?
这就是第三阶段,对齐(alignment),最经典的方法叫 RLHF(基于人类反馈的强化学习)。它的思路分两步。
先训一个"评委"。让模型对同一个问题生成多个回答,请人来排序——哪个最好、哪个最差。用这些人类的偏好数据,训练出一个专门的评分模型,它学会的是"模拟人类,给一个回答打分"。
再用这个评委去调主模型。让主模型生成回答,评委打分,然后——又回到了老办法——根据分数去调整主模型的旋钮,让它越来越倾向于产出高分回答。只不过这里的"损失"不再来自"预测下一个 token 准不准",而是来自评委的打分。
经过对齐,模型的回答才真正变得稳定地有用、得体、有分寸。这一步管的是语气、安全和价值观。如今也有 DPO 等更简化的对齐方法,省掉了单独训评委这一步,但目标一致——用人类的偏好,把模型的输出校准到人想要的样子。
预训练、SFT、对齐,这三个阶段连起来,才是从一堆文字到 ChatGPT 的完整链路。而你已经亲手走完了第一阶段的迷你版,也看清了后两个阶段——它们用的还是你熟悉的那套训练原理。
真实模型还有哪些不同
为了不留误解,再补几个我们为了简化而省略、但真实模型里很重要的点。
分词上,第二篇说过,我们用的是最简单的字符级,真实模型用 BPE 子词分词,token 不是单个字符而是常见的字符片段。
上下文长度上,我们的 block_size 只有 32,真实模型动辄几万甚至上百万,这样才能读长文档、记住长对话。
工程上,真实训练还涉及大量我们没碰的东西:成千上万张显卡如何分工协作、超大模型如何切分到多张卡上、训练中断如何恢复。这些都是专门的大工程。
但这些都是"扩展"和"工程",不是"另一套原理"。你在这个系列里建立的那个内核——模型在猜下一个 token、训练在按梯度拧旋钮——从迷你 GPT 到 GPT-4,一以贯之。
接下来你可以往哪走
如果想继续,几个方向供你参考。
想验证理解、再往里走一层,可以去读 Andrej Karpathy 的 nanoGPT 项目,它是这个系列思路的来源,代码精炼,是字符级 GPT 的标准参考实现。
想动手做点实用的,可以试试微调(fine-tune)一个开源模型——拿一个已经预训练好的小模型,用你自己的数据做 SFT,这正是上面第二阶段的实践版。
想补深层的数学,博客里的 ml-basics 系列有神经网络、反向传播、Transformer 的系统推导。想转向"用模型造应用"而不是训练模型,可以看 ai-for-python 和 llm-advanced 两个系列。
系列结语
回头看这八篇。我们从一个问题出发——模型到底是怎么训练出来的——然后没有停在道理上,而是真的动手:把文字变成数字,搭起训练循环,拆开反向传播这个心脏,造出注意力机制,拼成一个完整的 GPT,把它训练到能写出像样的句子,最后看清它和 ChatGPT 之间还隔着的那两步。
如果你跟着把代码都跑了一遍,那么"模型训练"这个词,对你来说应该已经不再是一团浆糊。它是一件具体的、有每一步、可以被看见的事情:一台装着许多旋钮的机器,靠着"猜错、感知错的方向、微调"这个朴素的循环,被海量的文字一点一点教会。
不神秘,但很了不起。这就是这个系列想带你看见的东西。
参考资料
- nanoGPT 项目源码
- InstructGPT 论文:用人类反馈训练模型听从指令
- DPO 论文:Direct Preference Optimization
- Hugging Face:如何微调一个语言模型
- 博客内 ml-basics、ai-for-python、llm-advanced 三个系列
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:从迷你 GPT 到 ChatGPT:预训练之后还发生了什么
本文链接:https://www.sshipanoo.com/blog/ai/mini-gpt/08-从迷你GPT到ChatGPT/
本文最后一次更新为 天前,文章中的某些内容可能已过时!