SFT 训练模式选择
在进行领域任务的监督微调(SFT)时,通常有以下几种训练模式可供选择。根据领域任务、领域样本情况及业务需求,选择合适的训练模式至关重要。
模式一: 基于 Base 模型 + 领域任务的 SFT; 模式二: 基于 Base 模型 + 领域数据 Continue Pre-train + 领域任务 SFT; 模式三: 基于 Base 模型 + 领域数据 Continue Pre-train + 通用任务 SFT + 领域任务 SFT; 模式四: 基于 Base 模型 + 领域数据 Continue Pre-train + 通用任务与领域任务混合 SFT; 模式五: 基于 Base 模型 + 领域数据 Continue Pre-train(混入 SFT 数据) + 通用任务与领域任务混合 SFT; 模式六: 基于 Chat 模型 + 领域任务 SFT; 模式七: 基于 Chat 模型 + 领域数据 Continue Pre-train + 领域任务 SFT。
a. 是否需要 Continue Pre-train
大模型的知识主要来自于预训练阶段。如果你的领域任务数据集与预训练的数据集差异较大(例如领域任务数据来自公司内部,预训练样本基本不可能覆盖到),则一定要进行 Continue Pre-train。 如果领域任务数据量较大(Token 在 1B 以上),且只追求领域任务的效果,不考虑通用能力,建议进行 Continue Pre-train。
b. 是选择 Chat 模型还是 Base 模型
如果有好的 Base 模型,在 Base 模型与在 Chat 模型上进行领域数据的 SFT,效果上差异不大。 基于 Chat 模型进行领域 SFT,很容易导致灾难性遗忘,在进行领域任务 SFT 之后,模型的通用能力会降低。如果只追求领域任务的效果,则不用考虑此问题。 如果领域任务与通用任务有很大的相关性,这种二阶段 SFT 会提升领域任务的效果。 如果既追求领域任务的效果,并且希望通用能力不下降,建议选择 Base 模型作为基座模型。 在 Base 模型上进行多任务混合训练时,需要关注各任务间的数据配比。
c. 其他情况的选择方案
在资源允许的情况下,如只考虑领域任务效果,我会选择模式二;在资源允许的情况下,如考虑模型综合能力,我会选择模式五;在资源不允许的情况下,我会考虑模式六。
SFT 训练参数设置
a. 学习率
学习率是非常重要的参数,如果设置不当,很容易让 SFT 模型效果变差。在 SFT 数据集不是特别大的情况下,建议设置较小学习率,一般 SFT 的学习率设置为 Pre-train 阶段学习率的 0.1 左右。如在 Pre-train 阶段的学习率为 9e-5,则 SFT 学习率设置为 9e-6。在 10 万 SFT 样本上,采用与 Pre-train 一样的学习率,发现 Loss 一直不收敛,在调低学习率至原来 0.1 之后,Loss 在两个 Epoch 之后就收敛。
b. Warmup Ratio
通常 Pre-train 训练的 Warmup Ratio 在 0.01~0.015 之间,Warmup Steps 在 2000 左右。在 SFT 的时候,建议使用更小的 Ratio,因为相较于 Pre-train,SFT 样本非常小,较小 Warmup Ratio 可以使模型收敛更平滑。但如果你的学习率设置较大,那可以增大你的 Warmup Ratio,两者呈正相关。
c. Epoch
Epoch 设置可以根据 Loss 收敛情况设置。如果 SFT 样本较少,可以设置较大 Epoch,在较小的 Epoch 上 Loss 会不收敛,指令都很难遵循。较大 Epoch 会容易导致过拟合,但过拟合要优于欠拟合。如果 SFT 样本数量较多,如在十万以上,一般 2 个 Epoch 即可收敛。
SFT 训练注意事项
- 如果 SFT 任务类型较多,可以尝试添加
_system_prompt,不同的任务使用不同的 System Prompt。 - 一个好的基座模型非常重要!模型的参数量也非常重要。
- 在 SFT 的时候,Loss 依然是你最重要的指标!一般在 SFT 过程中,Loss 会先升后降。
- 可以尝试多种模式训练方案,如在 Continue Pre-train 中添加 SFT 数据,在 SFT 数据中添加高质量的 Pre-train 数据。
关于微调的一些新尝试
- 全参数 SFT+LoRA 微调模式: 尝试将全参数 SFT 与 LoRA 进行结合。具体微调方式:前 10%-30% Step 采用全参数 SFT 的方式,后面的 Step 采用 LoRA 的方式。比单纯的 LoRA 更加稳定,比全部采用全量参数 SFT 更加节省资源。动机在于,通常大模型微调的时候,前面 Step 中模型参数变化最快,Loss 也是下降的最快,后面 Step 模型参数变化幅度越来越小,Loss 变化幅度变小,逐渐收敛。因此,可以在微调的最开始 Step 采用全参数 SFT,让模型能够尽快学习到指令,后面采用 LoRA 的方式,让模型能够更好地遵循指令。全参数 SFT 与 LoRA 训练 Step 配比,可以依据自己的 Tokens 来定。


