同样是训练,ChatGPT 比迷你 GPT 多走了两个阶段
你所训练出的,是一个续写模型
上一篇你完整训练出了一个迷你 GPT。给它一个开头,它能够接续着往下写,而且写得已经有了大致的形态。
但你大概也注意到了,它与 ChatGPT 并不相同。你无法向它"提问"——给它"中国的首都是",它可能接一句"一个值得一去的地方";给它"请帮我写一封信",它可能接着写"的格式应当注意以下几点"。它只会做一件事:顺着你给出的文字继续往下写。它是一个续写模型,而不是一个能够对话、能够听从指令的助手。
这是本系列的最后一篇。我们要回答最后一个问题:从你训练出的这个续写模型,到真正的 ChatGPT,中间还间隔着什么。答案是两个阶段。而你会发现,这两个阶段所采用的,仍然是同一套训练原理——前七篇的内容没有白学。
第一阶段:预训练
先为你所做的工作正名。
你在前七篇中所做的,专业术语称为预训练pre-trainingPre-training is the first and largest stage of building a language model: repeatedly practicing next-token prediction on a vast amount of text. The mini GPT in this series is a small-scale pre-training carried out in full. The P in GPT stands for pre-trained. Everything that follows, SFT and alignment, is built on top of this stage. 。它的目标就是那一个:在海量文字上反复练习"预测下一个 token"。GPT 名称中的字母 P,指的正是这个 pre-trained。
真正的大型模型,第一阶段所做的与你完全是同一件事——同样的"预测下一个 token"目标,同样的反向传播,同样的梯度下降。区别只在于一个字:大。
你所用的语料是一部小说,体量为几 MB;大型模型所用的语料是几乎整个互联网能够采集到的文本、海量的书籍与代码,规模达到数万亿个 token。你的模型是零点几个 M 参数、4 层;大型模型则是数百上千亿参数、几十乃至上百层。你在一台笔记本电脑上训练了几分钟;大型模型在成千上万张顶级显卡上训练了数月,电费以百万美元计。
但需要明确:把规模上的差异除去之后,其内核正是你已经亲手运行过的那一套。你所学习的并非旁观一个概念,你所做的就是这件事本身的迷你版本。
规模带来的质变
既然内核相同,为什么大型模型能够做到迷你 GPT 远远做不到的事。
因为规模本身会带来质变。模型较小时,"预测下一个 token"这一目标所能促使它学到的,是字的搭配与基本的语法。当模型与数据同时放大若干个数量级,为了把下一个 token 预测得更为准确,它被迫学到的东西也随之升级——它需要掌握事实("中国的首都是"之后大概率是"北京")、需要掌握推理(一道数学题的下一步应当如何书写)、甚至需要具备一定的代码逻辑。这些能力并非由谁专门教授,而是"把下一个 token 预测到极致"这一朴素目标,在足够大的规模之下自然促成的。
业界把这种"小模型不具备、模型规模达到一定程度后才出现"的能力,称为涌现能力emergent abilitiesEmergent abilities are skills a small model does not show at all, yet that appear once the model and its training data are scaled up by orders of magnitude. Facts, reasoning, even basic coding are not taught directly; they arise on their own, because predicting the next token well at sufficient scale requires them. 。这也是近年来业界持续把模型规模做大的原因。
续写模型并不会对话
预训练完成之后,你得到的是一个能力很强、但只会续写的模型。它内部蕴含着海量的知识,却不知道应当如何"为人所用"。
你向它提问"如何煮饭",它可能回应"如何炒菜""如何烧水"——因为在它所读过的互联网文本中,一个问句之后,紧随的常常是更多的问句。它在忠实地执行"预测下一个 token",只是这一行为方式并不是你所期望的。
它所欠缺的不是知识,而是"行为方式"。它需要被教会:见到一条指令或一个问题,应当给出回答,而不是续写出更多的问题。这正是第二个阶段所要解决的问题。
第二阶段:SFT,让模型学会听从指令
第二个阶段称为 监督微调SFT (Supervised Fine-Tuning)Supervised fine-tuning continues training a pre-trained model, but on curated pairs of instruction and ideal response rather than raw text. The mechanism is unchanged — still next-token prediction, still backpropagation. What it changes is behavior, not knowledge: it turns a model that merely continues text into one that answers when it is given an instruction. ,也称为指令微调。
它的做法说出来你会感到熟悉:仍然是训练,仍然是预测下一个 token,仍然是反向传播调整参数。唯一改变的,是所输入的数据。
预训练所输入的,是原始的互联网文本。SFT 所输入的,是经过人工精心准备的"指令与理想回答"成对的数据,其形式大致如下:
指令:用一句话解释什么是光合作用。
回答:光合作用是植物利用阳光,把二氧化碳和水转化为养分并释放氧气的过程。
指令:把下面这句话翻译成英文:今天天气很好。
回答:The weather is nice today.
用成千上万条这样的数据,在已经预训练好的模型上继续训练。模型仍然在学习"预测下一个 token",但由于它现在所见到的全部是"指令之后紧随一个得体的回答",它便逐步学会了一种新的行为方式:遇到指令,就给出回答。
需要注意,SFT 几乎不向模型灌输新的知识——知识在预训练阶段就已经具备。SFT 所改变的是行为方式:把一个续写模型,调整为一个能够听从指令、给出回答的助手。同样一套训练机制,输入不同的数据,便得到不同的结果。
第三阶段:对齐,让模型把回答给得更好
经过 SFT,模型已经能够回答问题了。但"能够回答"与"回答得好"之间仍有距离。对于同一个问题,模型能够写出多种都算作"正确"的回答——有的冗长有的简洁,有的得体有的生硬,有的稳妥有的可能带有风险。如何让它稳定地给出人类更为认可、更为安全的那一种回答。
这就是第三个阶段,对齐alignmentAlignment is the stage that shapes how a model answers — its tone, its safety, its judgment — rather than what it knows. The classic method, RLHF, trains a reward model from human rankings of responses, then adjusts the main model to favor high-scoring answers. It is what turns a model that can answer into one that answers well. ,其中最经典的方法称为 RLHF(基于人类反馈的强化学习)。它的思路分为两步。
第一步,训练一个"评分模型"。让模型针对同一个问题生成多个回答,再请人对这些回答进行排序——指出哪个最好、哪个最差。用这些体现人类偏好的数据,训练出一个专门的评分模型,它所学会的,是"模拟人类,为一个回答打分"。
第二步,用这个评分模型来调整主模型。让主模型生成回答,由评分模型打分,然后——又回到了我们熟悉的做法——依据分数去调整主模型的参数,使它越来越倾向于产出高分的回答。区别只在于,此处的"损失"不再来自"预测下一个 token 是否准确",而是来自评分模型给出的分数。
经过对齐,模型的回答才真正变得稳定地有用、得体、有分寸。这一阶段所管的是语气、安全与价值取向。如今也出现了 DPO 等更为简化的对齐方法,省去了单独训练评分模型这一步,但目标是一致的——用人类的偏好,把模型的输出校准到人所期望的样子。
预训练、SFT、对齐,这三个阶段连接起来,才构成了从一堆文字到 ChatGPT 的完整流程。而你已经亲手完成了第一阶段的迷你版本,也已经了解了后两个阶段——它们所采用的,仍然是你所熟悉的那一套训练原理。
真实模型还有哪些差异
为了避免留下误解,再补充几点我们出于简化而省略、但在真实模型中相当重要的内容。
在分词上,第二篇说明过,我们采用的是最简单的字符级分词,真实模型采用 BPE 子词分词,token 不是单个字符,而是常见的字符片段。
在上下文长度上,我们的 block_size 只有 32,真实模型则动辄数万乃至上百万,唯有如此才能够读取长文档、记住长对话。
在工程上,真实的训练还涉及大量我们未曾触及的内容:成千上万张显卡如何分工协作、超大模型如何切分到多张显卡之上、训练中断之后如何恢复。这些都是专门的大型工程问题。
但这些都属于"扩展"与"工程",而不是"另一套原理"。你在本系列中所建立的那个内核——模型在预测下一个 token,训练在依据梯度调整参数——从迷你 GPT 到 GPT-4,始终是一致的。
后续可以探索的方向
如果希望继续深入,以下几个方向可供参考。
希望验证理解、再深入一层,可以阅读 Andrej Karpathy 的 nanoGPT 项目,它是本系列思路的来源,代码精炼,是字符级 GPT 的标准参考实现。
希望动手做一些实用的事情,可以尝试微调fine-tuneFine-tuning means taking a model that has already been pre-trained and continuing to train it on your own, usually much smaller, dataset. It does not start from scratch; it adapts existing abilities to a specific purpose. The SFT stage described above is itself a form of fine-tuning. 一个开源模型——取一个已经预训练好的小型模型,用你自己的数据进行 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/
本文最后一次更新为 天前,文章中的某些内容可能已过时!