本节内容为原书的cha4,原文见[Nathan Lambert]>(https://arxiv.org/abs/2504.12501)
指令微调
指令微调IFT,即监督微调SFT。本质上是基于统一框架的问答指令集对预训练模型进行监督学习,从而获得对类似问答集的泛化能力,通常作为RL的前置工作。
对话模板与指令结构
对话模板Chat Template
负责处理与用户交互结构的工具即为对话模板。
开源生态中,Jinja代码是定义对话模板最常用的工具,如transformers将聊天模板定义为分词器中chat_template属性中的Jinja模板。
具体来说,对话模板将格式化的信息(如字典)转换为带有特殊标记的一维语句。
最佳实践
- 高质量数据是关键。相比起提示,模型从补全的内容中学习
- 大约1M个提示即可训练出用于承接RLHF等后训练任务的模型
- 提示最好与下游任务的分布相近
- 指令微调的噪声可以在后续任务中恢复,关注整体的优化流程而非单一任务
实现细节
- 更小的batch size:相比预训练,监督微调的批次大小要小很多,且序列通常不会占满上下文。因此使用的GPU也要更少。
- 提示掩码:提示部分的词元会做掩码处理,从而只关心对回答的预测。
- 多轮对话掩码:策略一,只训练最后一轮回答(即assistant),前面的上下文全部掩码。长样本展开时(U1:A1:U2:A2:-->U1:A1:+U1:A1:U2:A2:),也是依次只训练当前轮次的最后一轮回答,其余的都做掩码。策略二,只对用户做掩码,训练所有回答。展开时,中间的回答会被训练多次。
- 损失函数同预训练一致 -学习率:通常比预训练学习率低一个数量级。所谓线性缩放法则,即更大批次-->梯度估计更小的方差-->更大的学习率。此外,对于学习率的搜索,可以做短期训练,通过预留的评估套件来选择最佳的学习率。