大语言模型听起来很玄,但把它拆开,几乎每个零件都能在更早、更简单的模型里找到原型。这篇从中学就学过的「画一条直线」出发,一次只加一个新想法,走十三步,走到今天的大语言模型。
每一步只回答两个问题:上一步卡在哪,这一步加了什么。读正文只需要会看坐标图、理解加减乘除;公式和推导放在折叠区,可以先跳过。图里的数值来自可复算的教学例子或论文,模拟数据和示意权重会单独标明。
一、从拟合一条直线开始
1 线性回归:给关系配几个旋钮
假设你想根据房子的面积估价格。把手头的成交记录画在图上,横轴是面积,纵轴是价格,点大致排成一条斜线。线性回归做的事,就是找一条最贴近这些点的直线。
这条直线由两个数决定:斜率(每多一平米贵多少)和截距(起步价)。可以把它们想成两个旋钮,拧一拧,直线就跟着转、跟着平移。特征多了,比如再加上房龄、楼层,就是多几个旋钮,道理一样。
怎么算「最贴近」?对每套房子,用预测价格减去真实价格,得到图上的竖直差距;把这些差距平方后取平均,得到均方误差,也就是这里的损失。损失越小,直线对这批数据拟合得越好。
这就是后面所有模型的骨架:模型是带旋钮的函数,损失是一个越小越好的分数,训练就是找到让损失最小的那组旋钮。大语言模型也是这样,只不过旋钮多到几千亿个。
公式版
预测是输入的加权和,权重 和 就是旋钮:
损失用均方误差:
2 梯度下降:蒙着眼睛下山
线性回归可以通过解方程求出最优参数;参数较多时也仍然有直接求解的办法。但后面要遇到的多层非线性网络,通常没有这样的现成解。我们需要一种更通用的办法,一点点把损失降下来。
换个思路:把损失想成一片山地,旋钮的每种组合是地上的一个位置,海拔就是损失。我们蒙着眼睛站在山上,只能用脚感受哪个方向最陡,然后往下迈一小步,再感受,再迈一步……这就是梯度下降。「梯度」是脚下最陡的方向,「学习率」是每一步迈多大:迈得太大容易越过谷底来回晃,迈得太小又走得太慢。
实际训练时数据太多,不可能每走一步都把全部数据看一遍,于是每次只抽一小批样本来估计方向,叫小批量随机梯度下降。今天训练大模型常用的 Adam 等优化器,是在这个基础上加了「惯性」,并让每个旋钮各自决定步子迈多大。
公式版
代表全部旋钮, 是学习率, 是梯度:
3 Softmax 与交叉熵:从猜数字到做选择题
很多任务要的不是一个数,而是一个选项:这封邮件是不是垃圾邮件?这张图是猫、狗还是鸟?
做法是先给每个选项打一个分(分数可正可负,没有固定范围),再用 softmax 把分数换算成加起来等于 100% 的概率。它先对分数取指数,再除以总和:分数越高,分到的概率越大。
怎么衡量猜得好不好?看模型给正确答案的概率有多高。正确答案是猫,模型给了 66%,损失不大;要是模型很笃定地说是鸟,只给猫 1%,损失就会很大。这种衡量方式叫交叉熵。
请记住这一步:大语言模型的最后一步,就是一道选择题,从词表里几万个候选里挑出下一个词。
公式版
softmax 把分数 变成概率:
交叉熵就是正确答案概率的负对数:
4 多层网络:一条直线不够,就多叠几层
直线(在更高维时是平面)能表达的关系很有限。经典的反例是「异或」:两个开关状态相同时灯灭,不同时灯亮。把四种情况画在纸上,亮和灭的点交叉摆放,怎么画一条直线都分不开。
解决办法是在中间加几道「加工」:先把输入组合成一些新特征,再用新特征做判断。关键在于每道加工后面都要接一个非线性的开关,比如 ReLU:小于零就输出零,大于零就原样输出。没有这个开关,叠多少层,效果都和一层直线一样。
中间这些层叫隐藏层,可以理解为模型自己学出来的「看问题的角度」。层数越多,能表达的关系越复杂,这就是「深度学习」里「深度」的意思。后面 Transformer 里的「前馈网络」,就是这样一个两层的小网络。
5 反向传播:把责任分摊到每个旋钮
梯度下降要求知道每个旋钮该往哪拧。网络有很多层、几亿个旋钮时,一个一个去试是不可能的。
反向传播的思路像事故复盘:先从前往后算出结果和损失,这叫正向;再从后往前追责,这叫反向。输出层先算出自己该负多少责任,再按贡献大小把责任分给上一层,一层层传回去,直到每个旋钮都知道自己该往哪拧、拧多少。
一次正向加一次反向,就能算出所有旋钮的调整方向,计算量和正向算一遍差不多。这个方法在 1986 年由 Rumelhart、Hinton 和 Williams 推广开来。今天的深度学习框架都会自动完成这一步。
二、让模型读懂文字
6 词向量:给每个词一个坐标
前面的模型吃的都是数字,可文字不是数字。最笨的办法是给每个词编个号,但编号本身没有意义:「猫」是 3 号、「狗」是 4 号,不代表它们相近。
更好的办法是给每个词一串数字,当作它在「意义空间」里的坐标,意思相近的词,坐标也靠得近。这些坐标一开始是随机的,跟着训练一起调整。2013 年的 word2vec 发现,学出来的坐标甚至能做类比:
另外,模型处理的单位不一定是完整的词。词表太大装不下,于是用 BPE 之类的方法把文字切成常见的片段,叫 token:可能是一个词、半个词,也可能是一个字。
7 语言模型:把写作变成「猜下一个词」
怎样让模型学会语言本身?一个看似简单的办法是:给它一段话的开头,让它猜下一个词。
这正是第 3 步的选择题,只是选项换成了整个词表。猜对了损失小,猜错了损失大,再用梯度下降慢慢调。
这个任务妙在不需要人工标注:任何一段文字都是现成的题库,每个位置都是一道题,答案就是原文里的下一个词。互联网上的海量文本,于是都成了训练数据。
2003 年 Bengio 等人的神经语言模型就是这个思路:把前面几个词的坐标拼起来,送进多层网络,猜下一个词。但它只能看固定的前几个词,再远就看不到了。
公式版
一整段文字的概率,拆成每一步「猜下一个词」的概率相乘:
训练的损失,就是每一步猜中正确词的交叉熵取平均:
8 循环神经网络:边读边记笔记
句子有长有短,关键信息可能在很前面。循环神经网络(RNN)的办法是边读边记笔记:每读一个词,就把新内容和旧笔记合在一起,更新成一份新笔记,再带着它读下一个词。
理论上,笔记可以带着任意长的前文。但实际上有三个问题:
记不远:笔记一遍遍被改写,很早的信息会慢慢被冲淡。1997 年提出的 LSTM 给笔记加了「阀门」,决定哪些该留、哪些该忘,缓解了这个问题,但很长的距离仍然吃力。
只能排队:同一句话里,第 10 个词的状态要等第 9 个词算完,不能像矩阵运算那样把所有位置一起算。不同句子仍然可以组成一批并行处理。
一页笔记装全部:不管前文多长,都要压进一份固定大小的笔记里。
9 注意力:需要什么,就回头翻原文
与其把所有内容压进一页笔记,不如换个思路:原文都留着,需要的时候直接回头翻。
比如读到「小猫追着毛线球跑,因为它很好奇」里的「它」,我们希望模型能从前文取回与指代有关的信息。下面用一组人为设定的权重演示:把较多注意力分给「小猫」,较少分给其他位置,再按这些比例汇总信息。这张图说明计算方式,不代表真实模型一定会这样分配注意力。
这就是注意力。具体做法是:每个词带着一个「我在找什么」的提问,也挂着一张「我是什么」的标签和一份「我能提供什么」的内容。提问和标签越匹配,就从这个词拿走越多内容。把匹配程度换算成权重时,用的又是第 3 步的 softmax。
这样,远处的信息不必经过一长串递归状态才能传过来,模型更容易利用长距离联系;已知输入的各个位置也能并行计算。代价是普通的全注意力要比较各位置之间的关系,序列越长,计算量按长度的平方增长。路径变短不等于模型一定能记住所有细节。Bahdanau 等人在 2014 年把注意力用到神经机器翻译;这里画的是后来用于自回归语言模型的自注意力。
公式版
提问、标签、内容分别记作 、、。先算匹配程度,再用 softmax 换成权重,最后加权汇总:
除以 是为了让分数不要太大,否则 softmax 会几乎只盯着一个词,训练时调不动。
10 Transformer:用注意力搭起整个网络
2017 年的 Transformer 去掉了循环结构,改用注意力和前馈网络组成积木。原论文是编码器—解码器架构;这里沿着语言模型这条线,只看 GPT 使用的解码器式网络:每块积木先用带因果遮挡的自注意力让各位置交换信息,再用前馈网络(第 4 步的多层网络)分别加工每个位置。它没有机器翻译解码器里读取编码器输出的那一层交叉注意力。
这里明确画的是 GPT-2 small。它沿用最初 GPT 的基本骨架,但把 LayerNorm 移到子层输入端,并在全部块之后增加一次 LayerNorm;不能说两者结构完全相同。尺寸和计算顺序可对照 GPT-2 论文 §2.3 与 公开实现。
几个配件各管一件事:
配件 | 管什么 |
|---|---|
多头注意力 | 同时从几个角度看词与词的关系,比如语法、指代 |
残差连接 | 给每块积木加一条旁路,信息和训练信号可以直接穿过,叠几十上百层也训得动 |
层归一化 | 把数值调到稳定的范围,训练更稳 |
位置编码 | 注意力本身不分先后,要额外告诉模型每个词排在第几位 |
因果遮挡 | 预测第 5 个 token 时,只能看前 4 个;答案本身和之后的位置都不能看 |
第 9 步的热力图和这里并不矛盾:输入位置 i 可以看自己和更早的输入,但它负责预测的是位置 i+1。训练时把输入与答案错开一格,再配上因果遮挡,就能同时算各个位置的预测,又不泄露答案。
三、从会续写到会对话
前两部分讲的是模型长什么样;这一部分讲它怎样变成能对话的助手。Andrej Karpathy 的 Deep Dive into LLMs like ChatGPT(2025)梳理了这条流水线。先抓住三个阶段,下面第 11、12 步再展开:
预训练:从大量文本学习续写,得到基础模型(Base model)。
指令微调:学习「问题—好回答」的示范,得到 SFT 模型。
偏好对齐:根据回答的比较或反馈继续调整,让回答更符合期望;第 12 步用 InstructGPT 的 RLHF 路线说明。
延伸阅读:Karpathy 视频完整白板
这张白板左侧是预训练、监督微调和强化学习,右侧是另一个视频 How I use LLMs 的使用笔记。需要核对细节时,可以点开图片放大;正文只沿左侧的训练流程往下讲。
白板把基础模型叫作 internet document simulator,也就是「互联网文档模拟器」:它擅长接着已有文字写下去,却还不一定按提问者的意图回答。第 12 步要解决的正是这个差别。
11 规模化预训练:大力出奇迹,但有规律
结构定了,剩下的问题是:多投入一份算力,能换来多少提升?2020 年 Kaplan 等人发现,模型越大、数据越多、算力越多,损失就越低,而且下降得很有规律:画在对数坐标上,几乎是一条直线。这意味着可以先拿小模型做实验,预测大模型的效果。
2022 年 Hoffmann 等人进一步研究了固定训练算力该怎样分配:参数量和训练 token 数需要一起增长。他们的 Chinchilla 用 700 亿参数配 1.4 万亿个 token,约为每个参数 20 个 token。这个比例是那组实验下的训练算力分配结论,不是所有模型都必须遵守的固定配方。
规模还带来了新能力。2020 年的 GPT-3 有 1750 亿个参数,只要在提问里给几个例子,不用重新训练,就能完成不少新任务,这叫上下文学习。而它的训练目标,始终还是第 7 步的「猜下一个词」。
12 微调与对齐:从续写机器到助手
预训练出来的模型,就是白板上说的「互联网文档模拟器」:你问它一个问题,它可能接着编出更多问题,因为网上的文字常常就是这样排列的。要把它变成助手,还要再走两步。
指令微调:请人写大量「问题—好回答」的示范,让模型照着学。用的仍然是「猜下一个词」,只是题目换成了对话。
偏好对齐:好回答很难写得完美,却比较容易比较。于是请人看两个回答,挑出更好的那个。经典做法 RLHF 先用这些比较结果训练一个「打分模型」,再用强化学习让语言模型去拿高分,同时拉着它别离原来的模型太远,免得为了刷分说怪话。2023 年提出的 DPO 更直接,省掉打分模型,直接用比较结果训练语言模型。
效果很明显:2022 年的 InstructGPT 报告,经过这套流程的 13 亿参数模型,回答比 1750 亿参数的 GPT-3 更受标注者青睐。
公式版
打分模型把「哪个更好」当成二分类,让更受欢迎的回答 比另一个 得分更高:
RLHF 让模型拿高分,同时用 KL 散度拉住它不跑太远:
DPO 省掉打分模型,直接用比较结果训练:
13 生成:一个词一个词往外蹦
实际生成时,先把已有的提示词整体送进网络,这一步常叫预填充(prefill);接着根据末尾位置的概率选出一个 token,把它接回输入,再预测下一个。这个逐步生成的阶段叫解码(decode),直到遇到结束符或达到长度限制。训练时可以并行算已知答案的损失,生成时则必须等新的答案产生;两者用的是同一个网络。
「按规则选」很有讲究:
每次都选概率最高的:稳,但容易重复、乏味。
调温度:温度低,分布更集中、更保守;温度高,分布更平、选择更多样,也更容易跑偏;多样并不保证更正确。
Top-p:按概率从高到低累加,保留达到阈值所需的最少候选,再把它们的概率重新归一后抽样。低概率不等于错误,这只是控制候选范围的一种办法。
下面三张图用同一组示意分数回答「今天天气很 ___」。先比较温度改变后的分布,再看中间那张图怎样应用 top-p:
生成时通常会保留各层里旧 token 的 K、V,这就是 KV 缓存。新一步只为新 token 计算新的表示,并让它查询此前保存的 K、V,省去反复计算整段前文。缓存的是中间结果,不是重新训练出来的参数;前文越长,缓存占用的内存也越多。
回头看:什么变了,什么没变
步骤 | 新加的设计 | 在大语言模型里的位置 |
|---|---|---|
1 线性回归 | 参数、损失、训练 | 每一层里的矩阵乘法 |
2 梯度下降 | 沿梯度的反方向更新参数 | 训练用的优化器 |
3 Softmax 与交叉熵 | 分数变概率,最大似然 | 输出层与训练损失 |
4 多层网络 | 非线性与隐藏层 | 每一层的前馈网络 |
5 反向传播 | 链式法则逐层求梯度 | 框架的自动求导 |
6 词向量与子词 | 离散符号变成稠密向量 | 分词器与输入的嵌入矩阵 |
7 语言模型 | 文本概率拆成逐词预测 | 预训练目标 |
8 循环神经网络 | 用状态记住变长的前文 | 已被注意力取代 |
9 注意力 | 按相关性直接取用任意位置 | 每一层的自注意力 |
10 Transformer | 多头、残差、归一化、位置编码、因果掩码 | 整体结构 |
11 规模化预训练 | 幂律与算力分配 | 训练规划 |
12 微调与对齐 | 示范数据与人类偏好 | 从续写模型到助手 |
13 生成 | 自回归采样与 KV 缓存 | 推理服务 |
一路走下来,模型从两个旋钮长到了几千亿个旋钮,输入从几个数字变成了整个互联网的文本。但最底下的那套逻辑一直没变:写出一个带旋钮的函数,定一个衡量好坏的分数,用梯度下降把它一点点调好。大语言模型的能力究竟从何而来,至今仍有很多没被完全理解的地方;但它的每个零件为什么长成这样,现在应该都能找到来处了。
参考资料
Dive into Deep Learning(动手学深度学习):从线性回归一路讲到注意力与 Transformer,每一章都有可以运行的代码。
Andrej Karpathy,Deep Dive into LLMs like ChatGPT(2025)与 How I use LLMs(2025):本文第三部分白板笔记的出处,前者讲原理,后者讲用法。
Rumelhart、Hinton、Williams,Learning representations by back-propagating errors,Nature,1986:反向传播。
Bengio 等,A Neural Probabilistic Language Model,JMLR,2003:神经语言模型。
Mikolov 等,Efficient Estimation of Word Representations in Vector Space,2013:word2vec。
Sennrich 等,Neural Machine Translation of Rare Words with Subword Units,2015:BPE 子词切分。
Bahdanau 等,Neural Machine Translation by Jointly Learning to Align and Translate,2014:注意力机制。
Vaswani 等,Attention Is All You Need,2017:Transformer。
Radford 等,Improving Language Understanding by Generative Pre-Training,2018:最初的 GPT,用来对照 GPT-2 对网络结构的调整。
Radford 等,Language Models are Unsupervised Multitask Learners,2019:GPT-2,第 10 步的结构、层归一化位置、词表和上下文长度的出处;参数总数按公开代码的尺寸计算。
He 等,Deep Residual Learning for Image Recognition,2015:残差连接;Ba 等,Layer Normalization,2016:层归一化。
Kaplan 等,Scaling Laws for Neural Language Models,2020;Hoffmann 等,Training Compute-Optimal Large Language Models,2022:规模定律与算力分配。
Brown 等,Language Models are Few-Shot Learners,2020:GPT-3 与上下文学习。
Ouyang 等,Training language models to follow instructions with human feedback,2022:InstructGPT 与 RLHF。
Rafailov 等,Direct Preference Optimization,2023:DPO。
Holtzman 等,The Curious Case of Neural Text Degeneration,2019:核采样。
全文评论
0正在加载评论…