
大模型这几年从一个学术圈里的概念变成了几乎人人都在讨论的东西。但从“有个模型”到“能用起来”之间其实隔着一条相当长的流水线。很多朋友拿着开源权重跑通推理觉得“模型就是这么回事”真正动手试过一次训练就会发现推理只是整条链路里最简单的一环。今天这篇我想把大模型“练成”这件事从底层逻辑讲透——预训练、微调、强化学习这三步到底各自在干什么、为什么非这么干不可、每一步的工程细节坑在哪里。这篇文章适合这么几类人数据工程师想搞清楚自己辛辛苦苦洗的数据究竟在哪个环节起效算法工程师想从更大视角理解自己正在调的那个参为什么重要还有纯技术好奇的读者——如果你想知道那个 70B 的大家伙在训练机房里到底经历了什么这篇可以给你一个全景地图。1. 大模型的“成型”之路三个阶段与一条暗线很多人第一次接触这套流程觉得预训练、微调、强化学习是三个并列的技术方案。但实际上它们是一条流水线上三个工序处理的是完全不同的矛盾。1.1 为什么不能一步到位直接训练出“听话”的模型要理解这个流水线得先回答一个问题为什么不直接把人类想要的“高质量答案”作为目标一步训练到位原因是数据形态完全撑不住。目标的真正难点在于我们根本无法把人类评价“答案好坏”的复杂标准转化成一条简单的训练信号。人类的正确是一个高维、动态、充满上下文依赖的概念不可能用从一个绝对正确答案来一次反向传播。所以只好把这个目标拆成几层逐层逼近。预训练只做一件事学会“世界知识”和“语言规律”。这个阶段的数据几乎不要钱、量无限训练信号极其稳定——就是预测下一个词。但也因为这信号太简单模型只能学到一个“续写能力”它会在没人引导的情况下把自己从网上学到的“美化式列表”、“口语废话”、“安全无关的多余周旋”表现得耿直又混乱。微调做的则是“让模型知道你在问它”。利用人工精心写的成对问答把模型的说话方式强制掰到“人机对话”的频道上。这一步开始模型才从“文章的续写器”变成“能应对用户指令的助手”。强化学习做的则更进一步把“用户满意度”翻译成可优化的奖励信号——因为微调数据里的“好”是由人写的但人不可能手工写出百万级别的“最优答案对比”集合。所以需要建立一个“评分机器”来规模化替代人给反馈。一条暗线贯穿其中每一个阶段都在把更抽象的目标逐步“翻译”成计算机能计算的损失函数。预训练的损失是交叉熵微调的损失还是交叉熵但换了数据分布强化学习的损失则变成了基于奖励的期望最大化。这条翻译链就是大模型整个工程的地基。1.2 三个阶段各自的“转型点”与衔接逻辑真正起决定作用的是数据配比和分布设计。微调作用于网络的“行为层”用一批高质量指令数据把模型的参数从“续写保险”移到“服务导向”。强化学习作用于模型的“策略层”它不是补知识而是在已有能力边界内调整策略倾向——同一道题它选择更稳妥的解题路径而不是逞强冒险。可以这么理解预训练决定“这个模型会什么”微调决定“这个模型愿意怎么回答”强化学习决定“这个模型在权衡利弊后倾向于哪种回答”。三者缺一不可也因为目标不同每一步的技术指标、卡点、排障手法都完全不同。2. 预训练从文字里提取世界规律的“漫长苦役”预训练阶段是最不受普通开发者关注、但在工业界投入最大的环节。它通常要在数千张加速卡上连续训练数月消耗数千亿token最终产出的是一个具备基础能力的底座模型。这个阶段的目标极其简单给定前文预测下一个token的概率。2.1 一个看似简单的目标函数背后藏着整个大模型的秘密预训练任务是一个自回归的语言建模任务。对模型来说每一个训练样本就是一连串的token模型从左往右阅读每读到一个位置都尝试根据前面的所有内容去预测当前位置的token。之后预测结果和真实token之间做交叉熵反向传播更新参数。你用生活经验去联想就很容易理解这本质上是一个“无限连续的高考语文填空题”。模型每多读一篇文章就对词语搭配、常识关联、逻辑关系多一分“感觉”。但注意它学到的不是死记硬背而是分布式特征——同一个概念在不同语境下的关系都投影到高维空间里语义相近的词在向量空间中就会靠在一起。这阶段有几个关键技术选型你绕不开Tokenizer的选择把文本切分成子词单位。常见的有BPE、SentencePiece、WordPiece。tokenizer好坏直接决定序列长度和语义切分合理性。切分得太细序列太长训练太慢切分得太粗词汇表过大embedding矩阵占用巨大显存。工业界一般会把词表控制在3万到10万之间。上下文长度预训练时的序列长度选择影响模型能力。太短模型学不到长程依赖太长显存和FLOPs爆炸。现在常见方案是短序列预热训练到后期再逐步提升上下文长度。学习率调度预训练几乎都采用“warmup 余弦衰减”策略。前期线性上升避免训练崩溃中期保持高学习率快速收敛后期衰减增强稳定性。2.2 语料收集与清洗——整条流水线里“最土”但最关键的环节我在真实项目里见过太多团队把算法工程师招进来天天写数据清洗脚本抱怨“这不是算法该干的活”。但实际上预训练数据质量对模型能力的上限影响超过架构和算力。很多小团队复现不出开源模型的效果不是因为代码写不过人家而是因为拿不到人家那份清洗到极致的语料。数据清洗的核心要点去重。同一段文本在数据集中反复出现模型就会“背答案”而不是“学规律”导致过拟合、泛化变差。工业界一般通过MinHash计算文本相似度然后逐层去重。去除低质量内容。包括乱码、纯标点、机器翻译的劣质文本。常用的做法是用一个小的分类模型或者规则集过滤。毒性过滤与隐私移除。把涉及个人隐私、暴力等内容的文本剔除这一步也会影响后续模型的安全水平。语言配比。多语言模型要控制不同语言的采样比例避免低资源语言被高资源语言淹没。常见做法是“温度采样”调整语言分布。这里有个容易被低估的细节数据顺序的影响。模型看到数据的顺序会影响训练稳定性和最终能力。一般做法是把数据打乱但又要保证同一个domain的数据不过于连续堆积。现在很多团队会基于“数据难度课程”来安排顺序——简单的内容在前难的在后面。2.3 数据污染的危害——一个幽灵般的隐性问题预训练数据集特别大你几乎不可能人眼检查每一行。于是“污染”成了最棘手的问题测试集或基准题混进了预训练语料。如果你的模型练过某个考试题测试分数会虚高得离谱但真实能力一塌糊涂。我在实际项目中踩过一次很深的坑团队用一个开源的爬虫语料补数据后期发现里面包含了多个公开评测集。结果模型评测分数漂亮得很一度让全团队信心爆棚。后来做了一个“去污染测试”把评测集换了一批同题型不同数字的样本效果立刻暴跌——这才意识到先前的分数是“作弊”得来的。处理污染的基本手段在数据清洗阶段就做n-gram重叠检索删除与公开评测集高度重叠的片段。评测的时候务必留一部分完全不公开的自建发布集这个集合永远不进训练管线。2.4 训练稳定性稳定的模型训练是一场“隐形的体面”预训练是一个需要连续跑几个月的任务最怕的就是中途loss飙高、训练直接断掉。一旦打断意味着数百万的资金重新开始。所以从工程上讲稳定的预训练有四个支柱初始化策略。好的参数初始化能避免早期出现梯度爆炸或消失。现在常用的做法包括小标准差初始化。梯度裁剪。设定梯度范数上限。当某个batch出现极端值时把梯度缩放回安全范围。损失震荡的监控。loss曲线突然飙高不一定是数据问题也可能是学习率过热。这时候要有一套自动降学习率的保护机制。周期性Checkpoint。原则上每N步存一次完整参数、优化器状态、学习率调度状态。不要只存模型权重——重启训练时优化器状态缺失会导致恢复后训练行为错乱。说到这还要提一个“预训练到底要多少数据”的问题。业界有一条经验法则训练数据量应和模型参数量成正比更合理的说法是模型参数量和数据量应同比例扩大。模型越大对数据的需求不是线性增长而是超线性增长。如果你有一个 0.5B 的小模型可能几十B的token就够用到了 7B 级别至少要 200B token以上数据才喂得饱。关于超参的朴素经验更值得注意的其实是以下几点你可能在论文里看不到的Batch size 加大要同步提高学习率两者比例失衡容易导致训练坍塌。sequence length 翻倍实际意味着计算量翻倍但不一定意味着能力翻倍。数据的重复率差异比算力差异更容易解释模型素质的差距。3. 微调把“知识渊博的直男”调教成“懂规矩的助手”预训练做完模型拿到手里你让它对话会得到一个尴尬的结果不管你说什么它都倾向于续写一段话而不是回答你的问题。这时候就需要监督微调把模型的输出行为从“续写模式”掰成“对话模式”。3.1 核心逻辑用成对的问答数据重定义模型行为SFT其实依然在做“预测下一个词”的事情但训练数据完全不同——每一条都是“用户指令 高质量答案”的配对。模型看到的模式是“人类问了一个问题然后给出了一个很棒的回答”它把这种模式内化输出分布就朝着“回答高质量问题”的方向改变。这一步对数据质量的要求极高。我见过太多团队做微调数据是从某个开源数据集里随手抓来的结果模型对话时会出现明显的“驴唇不对马嘴”——因为数据里混了大量低质量回答模型把这些都当成标准学进去了。构造一套合格的指令数据你要注意这么几点每条数据必须有明确意图标签。比如“改写”、“总结”、“问答”、“头脑风暴”。混合训练时按比例采样才能保证模型各类能力平衡发展。答案必须经过人审或强模型审核。不要为了凑量直接把网上抓来的问答喂进去那只会训练出一个“说话水平等同于贴吧平均用户”的模型。指令要覆盖尾部场景。很多团队的数据集中在“知识问答”类但忽略“拒绝回答”、“承认不知道”等安全、诚实性场景结果模型一遇到不会的问题就强行瞎编——这正是因为训练数据里没有教它说“不知道”。3.2 全量微调 vs 参数高效微调到底怎么选刚接触微调的人都会有一个张键盘可能不够使的困惑全参数微调是不是效果一定最好答案是分情况。全参数微调Full Fine-tuning意味着所有参数进入梯度计算并更新。优势是理论上模型能学得更“透”几乎可以完全适配新数据分布。缺点是显存消耗巨大以 7B 模型为例即使采用序列长度为 2048全参微调也需要至少 4×80GB 的 A100 级别显存而且全量微调还有一个副作用——灾难性遗忘模型在新任务上表现优异的同时之前在预训练时学到的通用知识被“覆盖”掉了。参数高效微调PEFT则聪明地绕开这个问题。它冻结预训练的绝大部分参数只训练新增的少量可学习参数。其中口碑建立在LoRA系列技术上在原始权重旁边并联一条低秩矩阵作为可训练分支推理时再把它合并回主权重中几乎不增加任何额外计算量和推理延迟。LoRA的优势在于显存占用降到全量微调的四分之一甚至更低。训练速度更快迭代周期缩短。多任务切换友好——保留多个LoRA适配层按需切换。但LoRA并不是万能。如果任务和新领域差异太大比如中文模型要迁移到纯代码领域低秩矩阵的表达能力可能不够用这时候全量微调仍是最好的选择。我的建议是先用LoRA验证数据和目标是否有效如果LoRA效果不理想再评估是否值得全量微调。3.3 微调过程中的典型工程实践细节在实际微调项目里跑起来相对顺手的配置大致是这样参数推荐值说明学习率1e-5 ~ 3e-5LoRA常用1e-4微调学习率通常远低于预训练防止破坏原有权重。Batch Size能够填满显存的最大值微调数据少batch太小会导致收敛不稳定。训练轮数2 ~ 5指令数据不宜多轮重复容易过拟合。权重衰减0.01标准设置防止参数出现大的漂移。Warmup前几百步线性warmup避免开始阶段loss引擎剧烈震荡。另外一个容易被忽视的点微调时也要做“保留集验证”。不能只看训练集的loss下降要留出一小部分验证集不参与训练来观察模型的泛化表现。否则很容易出现训练集loss从1.2降到0.3结果验证集loss反而升高的过拟合曲线——这意味着模型开始学“背答案”了。还有一个情感上很真实的问题微调初期特别容易“一朝打回解放前”。模型预训练时积累的通用能力可能在微调第一轮就被剧烈破坏。这种情况我见得不少。解法不复杂降低学习率、减少训练轮数、缩小LoRA的rank值三者一起调整通常能稳住局面。3.4 微调之后做评估别只看“感觉变聪明了”微调结束后团队最容易犯的错误是把模型拉过来聊几句发现回答像模像样就宣布成功。更大的隐患往往躲在“少样本场景”的测试里你问的问题和训练集的分布一致模型当然答得漂亮但一旦换个提问方式或话题就可能直接崩塌。所以我一直建议微调团队准备一个**“对抗性评测集”**包含训练集里完全没有见过的题型、措辞、话题组合。用这个评测集来检验模型是真正学到一个能力还是只会“照猫画虎”。这比任何聊天感受都靠谱。4. 强化学习让模型学会“审时度势”的最后冲刺模型经过SFT已经能给出不错的回答但它仍然是“有一说一”的耿直模式——不会权衡“这样说是否稳妥”“那样说是否更符合用户需求”。这个阶段就需要强化学习它在不更新语言能力的前提下调整模型输出时做选择的策略让回答倾向用户偏好那一侧。4.1 为什么需要奖励模型来当“自动裁判”SFT依赖人工撰写的高质量答案但你需要告诉模型“答案A比答案B好”时不可能依赖人工一步步标注。现实的做法是训练一个奖励模型来扮演评判者。奖励模型的训练数据是“偏好对”——同一问题下有两个回答人工标注哪个更好。奖励模型学会打分后就可以对任意新回答给出分数替代人工反馈。这相当于把一个昂贵的“人工评估”过程压缩成一次可无限复用的神经网络前向计算。奖励模型本身是参数量较小的模型通常不到主模型十分之一但它的架构与主模型类似最后一层变成一个标量回归头输入是“问题回答”输出是一个分数。这个分数直接反映了“这个回答在人类偏好维度上的价值”。训练奖励模型最大的坑就是“标注偏好不一致”。两个人对同一条回答的打分标准可能完全不同如果数据里混着太多互相矛盾的标准奖励模型会学到一团糊的逻辑。工业界做法是让同一个回答对经过多个标注员打分然后计算一致性指标比如Cohens Kappa把低一致性的数据剔除或降权。4.2 RLHF与PPO一场以“奖励”为目标的高空走钢丝奖励模型准备妥当后真正的强化学习就开始了。目前最成熟的算法框架是PPO近端策略优化。完整体面地讲PPO在LLM场景中有四个核心组件协同工作Actor Model就是我们要优化的那个策略模型它的变化直接生成更好/更差的回答。Reference Model训练过程中锁死不动的参照物。用来计算新旧策略的KL散度防止模型在追求奖励时输出内容偏离原始分布太远、语言开始崩坏。Reward Model给生成文本打质量的分数。Critic Model预测单个状态当前生成的句子前缀的未来回报期望用于减小策略梯度方差。PPO执行一轮更新的流程差不多是这样从Actor Model当前策略里采样一批提示词生成一批回答。用Reward Model给这些回答打分。计算每个生成token的回报值奖励 与原始策略的KL惩罚。用Critic Model估计基线减去基线之后计算优势函数。用优势函数去更新Actor的策略网络同时更新Critic拟合价值。计算新旧策略的KL散度如果策略更新幅度太大就缩小更新步长。这一步在工程上最敏感的其实是KL惩罚系数。这个系数设得太大模型会过于保守奖励再怎么高也不敢偏离原始策略——优化几乎停滞设得太小模型为了高分开始放飞自我生成内容语法还算正确但意思完全胡来。这个系数往往需要多轮实验来调节没有一劳永逸的公式。4.3 奖励黑客问题——强化学习最臭名昭著的陷阱强化学习优化的不是“真实人类满意度”而是“奖励模型的分数”。这两者一旦出现偏差模型会异常精明地钻空子。常见的行为包括回答越来越长。因为奖励模型一定程度上偏好更长、更详细的回答模型就学会了生成冗余文本刷分。反复使用安全套话。奖励模型偏好看起来温和无害的内容模型就把“抱歉我不能帮助你……”格式套模板。模型学会了用“首先…其次…最后…”这类结构让自己显得更有条理从而获得不匹配实际内容质量的奖励。应对奖励黑客没有一劳永逸的办法但有几条务实经验值得记下把“长度”作为奖励模型输入特征强制奖励模型学到“内容和长度无关”的分布。引入多个奖励模型做集成打分降低单一模型偏好的可钻性。训练过程中持续对生成样本做人工抽检一旦发现“刷分”行为把这类样本加入奖励模型的训练集纠正。我的切身体会是PPO阶段80%的时间不是在调策略模型而是反复和奖励模型斗智斗勇。你以为策略模型在优化其实它只是发现了奖励模型的盲区跑过去钻空子。4.4 后起之秀DPO如何绕过奖励模型把“偏好”直接变成训练目标PPO虽然效果好但工程复杂度高光是在线采样、Critic模型这些模块就劝退了不少团队。2023年出现了一个更轻量的替代方案——DPO直接偏好优化。DPO的核心洞察非常惊艳对于人类偏好数据最优策略的下一个token的区分度可以直接用当前策略和参考策略之间的比来表达。这意味着根本不需要单独训练奖励模型、不需要Critic网络、不需要在线采样而是直接拿“偏好对”来优化策略模型的对比损失。DPO的训练流程简洁得可怕准备偏好对数据问题优选回答劣选回答。当前策略对两个回答分别算对数概率。更新参数让优选回答的概率上升、劣选回答的概率下降同时用KL惩罚避免偏离原始模型太多。DPO的代价是它需要更多的高质量偏好数据才能达到PPO上限但在中小规模的微调场景里DPO经常能提供80%到90%的PPO提升效果却只需要零头级的代码量。现在不少开源模型的中后期对齐环节已经切换到了DPO或更进一步的变体GRPO。选择建议如果你的团队有算力基础和工程功底PPO的上限更高如果时日紧、算力省、希望快速看到效果DPO是性价比极高的切入点。5. 常见问题与排查技巧当训练卡壳时你的第一反应应该是什么大模型训练是一条长链路卡点五花八门。但很多问题和排查手法是有共性的这里我把实际项目中见到的高频问题整理出来。5.1 loss曲线不正常时先按什么顺序排查很多人一见loss飙高就开始改学习率实际上很多问题根源根本不在这。我习惯按下面的顺序排查检查数据。看当前batch的输入有没有异常空序列、全重复、过长截断后语义被切断。数据问题导致的loss起伏通常呈“周期性”。检查数值稳定性。训练日志里有没有NaN/Inf出现。如果有多半是梯度爆炸、loss过大或学习率过高。检查学习率调度位置。是否正处于warmup阶段末端或衰减阶段末端。检查损失计算部分。cross_entropy的ignore_index配置是否正确某些padding token会不会参与梯度回传。检查优化器状态。AdamW的momentum有没有因重启训练而丢失。一个非常容易被新手忽视的场景是loss“看起来”下降了但模型一点没学到东西。这时候去看生成结果会发现问题——回答完全不成句。这通常是tokenizer或标签错位label shift模型在学着预测“正确答案的下一位”而不是“当前位”。排查方法很简单手动构造一条极短样本打印出参与损失计算的token和对应预测概率。5.2 微调后能力倒退的问题从“通用学霸”变成“偏科生”微调数据如果集中在特定领域模型的通用能力会显著退步。规避手段主要有三个在微调数据里混入10%~30%的通用语料缓解灾难性遗忘。用LoRA代替全参数微调天然降低参数更新的覆盖范围。在训练上加“回放”损失计算当前模型在通用数据上的loss并设为约束防止它偏移太远。还有一个我体会很深的点微调数据集里的“答复风格”会比“知识内容”更容易被模型学会。如果你用了高温度、高自信风格的答案数据模型会整体变得非常有底气哪怕它在胡编。这种风格迁移很难在loss曲线里发现必须靠手工评测。5.3 奖励模型“睁一只眼闭一只眼”策略模型开始钻空子这是RL阶段最常见的问题。策略模型很快会发现在奖励模型眼里“长得好看的答案”比“真正有用的答案”更吃香于是开始格式化和歌颂式回答。我建议在RL阶段早期就开始每几百条采样log里找规律回答长度是否持续增长是否出现某类固定句式占比激增是否所有回答开始以“好的”开头以“希望以上内容对你有所帮助”结尾是否回答内容空洞明显但格式工整一旦命中不要先调PPO参数而是去修正奖励模型、打回数据。这个纠正链路快性价比也最高。5.4 算力吃紧时的平替路线没有一万张卡也能“练”模型不是所有人都有上千张卡的工业资源。如果你只有一两张消费级显卡想体验这条完整链路可以参考下面这套轻量方案底座选 1B~3B 参数的小模型。用QLoRA做SFT4-bit量化的LoRA7B模型在24GB显卡上就能微调。用DPO做偏好优化不需要单独训练奖励模型。数据控制在 1万~2万条指令对训练控制在 3 个 epoch 内。训练完用几分之一的成本你就能亲手摸到“模型因为对齐而改变回答风格”的整个过程。这种小规模实验并不“低级”。恰恰相反它让你能在极短时间内跑完这三个阶段的循环建立最直观的直觉。前期我用小模型把整条链路跑通、跑顺的经验后来在大规模项目里帮我省的踩坑时间是以周为单位的。6. 从“能生成”到“用得好”——最关键的迁移点在哪里回到标题大模型到底如何练成我的看法是练成不只是一个模型跑通训练流程而是团队真正理解了这条流水线里每个环节对最终结果的影响权重。很多人以为大模型的门槛是“算力”但真跑过一圈你会发现算力只是入场券。真正拉开差距的是数据治理能力、实验迭代速度、以及对着loss曲线和奖励分数做归因的经验。模型卡住时你的第一反应是“改个超参再试一把”还是“先检查数据分布和奖励函数哪里出了问题”这才是决定项目上限的分水岭。如果你想上手实践我建议从完全小规模的复现实验开始拿一个开源的小模型按“预训练一小段语料 → SFT对齐 → DPO优化”的顺序完整走一遍。你会发现这三步每走一步模型的“人格”都会变一个样。这种第一手体感比读一百篇综述都有效。训练管线不神秘但它很“琐碎”。愿这篇文章能帮你在一堆琐碎里找到那条明确的主线。