大语言模型(LLM)的微调,现在已经成了很多项目里的关键一步。通用模型能力很强,但落到具体场景时,往往还需要再'调教'一下。这篇文章整理了我对微调技术的理解,包括什么时候该用、主要的方法,以及一些实践中的取舍。
LLM 项目里的几步走
在聊微调之前,可以先看一个典型的 LLM 项目是怎么推进的。虽然每个团队的做法有差别,但大致绕不开这几件事:
- 定目标:一开始就得想清楚,这个模型是用来做通用助手,还是只解决一个特定任务(比如医疗报告生成)。目标越清晰,后面越省力。
- 选模型:从零训练一个新模型还是基于已有的模型来改?大部分时候,直接用现成的预训练模型做适配会高效很多,但也有一些场景值得从零开始。
- 性能与调整:拿到模型后先跑一跑,如果效果不达预期,先试试提示工程。还不够?那就考虑微调。整个过程里,要注意让模型的输出和人的偏好对齐。
- 评估与迭代:用指标和基准持续评估,然后在提示工程、微调和评估之间来回循环,直到结果满意。
- 部署:当模型表现稳定了,就推上线。这时候,计算效率和用户体验就得放在前面考虑了。
微调到底是什么
简单说,LLM 微调是把预训练模型在一个更小、更专门的数据集上再训练一轮,让它适应特定任务。它的作用就是把一个通才变成一个专才。
举个例子:OpenAI 的 GPT-3 是个通用 NLP 模型。假设一家医疗机构想用它帮医生从文本笔记自动生成患者报告。虽然 GPT-3 能写文字,但不懂那么多医学术语。于是机构拿了一批医疗报告和笔记数据,对 GPT-3 做微调。训练之后,模型就逐渐掌握了临床语言的惯用表达和报告格式,最后能协助医生写出准确连贯的报告。
微调听起来很美好,但它不是白来的——需要标注数据,还要算力。所以不是每个项目上来就微调。
什么时候才需要微调
处理 LLM 任务时,大家会先用一些低成本的方法:上下文学习、零样本推理、少样本推理。
- 上下文学习:在提示里塞几个例子,给模型一个完成任务的模样。
- 零样本推理:直接问,不给例子。如果效果不好,再试单样本或少样本——也就是加一两个完成示例。
这些小技巧能解决不少问题,但对较小的模型经常失效。而且,示例会吃掉宝贵的上下文窗口空间,挤占了其它信息的位置。
当这些方法搞不定的时候,就该微调上场了。和预训练时用的海量无标注文本不同,微调是监督学习,你需要准备一批'提示-应答'对这样的标注数据。模型会根据这些数据来更新权重,让它在特定任务上的表现更上一层楼。
有监督微调(SFT)是怎么做的
通常说的微调,指的就是有监督微调(Supervised Fine-Tuning)。流程大致是这样:
准备数据。有不少现成的数据集可以挖掘,即使它们不是现成的指令格式,也能转化成微调需要的提示-回答对。比如把亚马逊的产品评论数据集改造成指令数据集。网上有不少提示模板库可以用。
训练过程。把数据分成训练集、验证集和测试集。训练时,每次从训练集里取一批提示送给模型,让它生成完整的回答。模型会拿自己的预测和真实标签对比,算出一个误差,然后通过梯度下降反向传播去调整权重。简单讲,就是让模型学怎么把回答往标签上靠。
多轮迭代。在数据上反复训练多个 epoch,模型逐渐找到一种权重配置,让特定任务上的误差越来越小。目标是把之前学到的通用知识,调整去适应新数据的模式和细节。
举个实际的对比。
对一个'天空为什么是蓝色?'的问题,微调前的模型可能只回一句:'因为大气层散射阳光。'这对科普平台来说太简略了。收集一批相关的问答数据微调之后,模型的回答变成了:'天空呈现蓝色是因为一种叫瑞利散射的现象。太阳光进入大气层,不同颜色的光波长不同,蓝光波长短,容易被气体和颗粒向四面八方散射。直射的阳光看起来是白色的,但天空看起来就是蓝色的。' 这个回答详细得多,更适合科普场景。
几类主要的微调方法
微调方法这几年发展很快,这里挑几个最重要的说。
指令微调(Instruction Fine-Tuning)
这是一种提升模型泛化能力的策略。训练时,数据里不光有内容,还有明确的指令。比如你想提高模型的摘要能力,就给它一堆'请总结以下文本:'这样的提示和对应的摘要。做翻译就加'把这段话翻译成英文:'之类的。指令能让模型学会按特定的方式'思考',更聚焦任务。
全微调(Full Fine-Tuning)
就是把模型所有参数都放开更新。做完全微调你会得到一个全新的模型版本,效果通常最好,但代价也最大。和预训练类似,它需要大量的内存和算力来存梯度、优化器状态等。如果不是资源充足,全微调很难搞,而且在多个任务上微调会产出一堆巨大的模型文件,存储也是问题。


