036、从微调到预训练:理解大模型训练的全生命周期
上周排查一个线上问题,模型在业务场景里突然开始胡言乱语。查看日志发现,同事在微调时为了省显存,把学习率调高了一个数量级。“就改了个参数,怎么连基本常识都忘了?”——这个问题让我意识到,很多工程师把微调当成黑盒工具,却不知道它只是模型生命中的最后一环。
微调不是起点
我们通常接触大模型都是从微调开始的。拿到一个预训练好的模型,灌点业务数据,调几个epoch,看起来很简单。但这里有个认知陷阱:你以为自己在“训练模型”,其实只是在“唤醒”模型已有的能力。
举个例子,去年我们做客服助手,用LoRA微调Llama。训练loss降得很漂亮,但上线后模型突然开始用粤语回答技术问题。排查发现,训练数据里混了几条香港用户的日志。模型不是“学会”了粤语,而是激活了预训练时学到的语言模式。微调更像是在已有的知识网络上做局部强化,而不是重建网络。
反向穿越训练时间线
要真正理解微调,得倒着走一遍模型的生命周期。
现在你手上的微调模型,往前推是预训练阶段。那个阶段模型在做什么?它不是在“学习知识”,而是在构建一个高维的语言空间。每个token都被映射到空间中的一个点,相似的语义聚集在一起。预训练完成后,这个空间结构就固定了——微调只是在里面移动少数几个点。
再往前是数据清洗阶段。这里踩过大坑:早期我们以为数据越多越好,爬了几TB网页。结果模型学会了各种网络黑话和错误知识。后来才明白,预训练数据的质量决定了模型的天花板。你现在微调时遇到的很多诡异问题,可能三年前数据清洗时就埋下了种子。
最源头是架构设计阶段。为什么用RoPE而不是绝对位置编码?为什么FFN层要那样设计?这些选择在论文里是数学公式,在工程里就成了“模型性格”。有些模型微调时就是容易过拟合,有些就是学不会长序列——很多时候是架构决定的。
从实操看全貌
说个具体场景。我们最近在训一个行业大模型,完整走了一遍生命周期:
数据准备阶段:
# 别直接扔原始数据进去raw_texts=load_industry_docs()# 这里踩过坑:格式不统一# 关键步骤:构建训练信号processed=[