大模型后训练:离策与在策学习统一框架与工程实践

📅 2026/8/2 4:45:53 👁️ 阅读次数 📝 编程学习
大模型后训练:离策与在策学习统一框架与工程实践

1. 项目概述:后训练时代的核心命题

如果你在过去一年里深度参与过大语言模型(LLM)的应用或微调,大概率会陷入一个选择困境:手头有一批高质量的指令数据,是应该直接拿这些数据去微调模型(这通常被称为“在策学习”或On-policy Learning),还是先用这批数据训练一个奖励模型,再用强化学习(比如PPO)去对齐模型(这通常被归为“离策学习”或Off-policy Learning)?前者简单直接,但效果容易“过拟合”到数据分布,模型可能变得刻板;后者流程复杂,训练不稳定,但理论上能引导模型探索更优的答案空间。这个选择,本质上就是“离策”与“在策”的路线之争。

这篇题为“大语言模型后训练技术:离策与在策学习的统一视角”的论文,瞄准的正是这个让无数研究者和工程师头疼的痛点。后训练(Post-training)阶段,特别是对齐(Alignment)和指令微调(Instruction Tuning),是让一个“通晓语言”的基座模型(Base Model)变成“有用、无害、诚实”的助手模型的关键。然而,当前的技术路径看似百花齐放,实则山头林立,缺乏一个统一的理论框架去理解不同方法的内在联系与优劣。这篇论文的价值,就在于它试图跳出具体算法的窠臼,从一个更本质的“策略优化”视角,将看似迥异的离策与在策学习方法统一起来,为我们提供一套分析、比较乃至设计新后训练方法的“地图”和“工具箱”。

简单来说,它要回答的核心问题是:当我们用各种数据去“教”大模型时,底层的学习机制到底是什么?不同的数据使用方式(直接模仿 vs. 通过反馈学习)如何影响模型最终的行为?理解了这一点,我们就能更理性地选择技术方案,甚至组合不同方法的优势,设计出更高效、更稳定的训练流程。这对于希望深入模型调优而非仅仅调用API的从业者而言,无疑是一份急需的“理论武装”。

2. 核心概念拆解:离策、在策与后训练

在深入论文的“统一视角”之前,我们必须先厘清几个核心概念。这些概念是理解整篇论文的基石,也是日常讨论中容易混淆的地方。

2.1 什么是大语言模型的后训练?

后训练是一个统称,指的是在预训练(Pre-training)之后,为了让模型适应特定任务或遵循人类偏好而进行的额外训练阶段。预训练让模型学会了语言的统计规律和世界知识,但它还是一个“通才”,不会主动遵循指令,也可能输出有害或不准确的内容。后训练就是给这个“通才”进行“职业教育”和“品德教育”。它主要包含两个主流方向:

  1. 指令微调(Instruction Tuning):使用(指令,期望输出)配对的数据集,以监督学习的方式微调模型。目标是让模型学会理解和执行各种形式的指令。例如,给定指令“写一首关于春天的诗”,模型能输出一首诗。这可以看作是在教模型“技能”。
  2. 对齐(Alignment):目标是让模型的输出与人类的价值观和偏好保持一致,即变得“有用、无害、诚实”。最具代表性的方法是基于人类反馈的强化学习(RLHF)。这个过程通常涉及训练一个奖励模型(Reward Model)来模拟人类偏好,然后用强化学习算法(如PPO)优化语言模型,使其输出能获得高奖励。这更像是在塑造模型的“价值观”和“行为准则”。

后训练的成功直接决定了ChatGPT、Claude等助手类模型的实际体验。一个强大的基座模型加上糟糕的后训练,可能产生一个难以驾驭甚至危险的AI。

2.2 离策学习与在策学习的本质区别

这两个术语源于强化学习领域,但在LLM后训练的语境下被赋予了新的内涵。理解它们的关键在于区分“用于训练的数据来自哪里”。

  • 在策学习(On-policy Learning):模型从自身当前策略(Policy)所产生的数据中学习。在LLM语境下,策略就是模型本身,其产生的数据就是模型根据输入(如指令)生成的输出。经典的指令微调就是典型的在策学习:我们收集人类标注的(指令,理想输出)数据,这些输出可以看作是人类专家策略产生的数据,然后用这些数据直接微调模型,让模型的策略向专家策略靠拢。最近流行的直接偏好优化(DPO)及其变种,虽然使用了偏好数据,但其优化目标可以推导为等同于用当前模型和参考模型生成的数据进行在策优化。核心特征是:学习用的数据分布与模型当前试图优化的策略所生成的数据分布强相关。

  • 离策学习(Off-policy Learning):模型从不同于当前策略的其他来源产生的数据中学习。这个“其他来源”可以是历史数据、人类专家数据、甚至是另一个模型(称为行为策略)产生的数据。RLHF是离策学习的典型代表:在强化学习阶段,我们用一个固定的奖励模型(基于人类偏好数据训练得到)来评估当前模型生成的输出。用于训练奖励模型的人类偏好数据,与当前模型在PPO迭代中不断变化时生成的输出数据,它们的分布是不同的。模型通过学习这些“离线”的反馈信号来更新自己。核心特征是:用于计算梯度、更新模型的数据或反馈,并非完全由模型自身最新的策略产生。

用一个不太严谨但直观的类比:在策学习像是“临摹大师字帖”,你照着字帖(专家数据)一笔一划地模仿;离策学习像是“参加书法比赛”,评委(奖励模型)根据一套标准给你的作品打分,你根据分数高低来调整自己的书写方式,而评委的打分标准是基于之前很多作品(历史偏好数据)总结出来的,并不完全针对你当前的字迹。

2.3 为什么需要统一的视角?

目前,社区对后训练方法的选择往往基于经验、直觉和算力成本。指令微调简单,但可能学不到复杂的偏好层次;RLHF效果强,但复杂、昂贵且不稳定(比如众所周知的“奖励黑客”问题——模型找到漏洞获取高奖励却输出无意义内容)。DPO等新方法试图简化流程,但其与RLHF和指令微调的理论关系众说纷纭。

这种“方法论孤岛”的局面带来几个问题:

  1. 选择困难:面对具体任务,该选哪种方法?缺乏理论指导。
  2. 效果不可比:不同论文用不同的方法在不同的数据集上做实验,结论往往矛盾,难以判断哪种方法本质更优。
  3. 创新瓶颈:设计新方法时,缺乏一个通用的框架来评估其理论属性(比如是否在策、是否稳定)。

因此,一个统一的视角,能够将不同方法放在同一个坐标轴下进行刻画和分析,指出它们各自对应于策略优化过程中的哪些近似或简化,对于推动领域发展至关重要。这篇论文正是试图建立这样一个坐标系。

3. 统一的理论框架:策略优化下的重新审视

论文的核心贡献,是提出了一个基于策略优化(Policy Optimization)的统一框架。在这个框架下,无论是监督微调(SFT)、RLHF还是DPO,都可以被表述为在某个目标函数下,对语言模型策略进行优化的特例。这个目标函数通常权衡两个关键方面:1) 与参考数据/偏好的一致性;2) 与初始策略(通常是SFT后的模型或原始基座模型)的偏离程度,后者通过KL散度等正则化项来实现,目的是防止优化后的模型“忘掉”原有知识或变得过于极端。

3.1 框架的基本要素

在这个统一框架中,任何后训练方法都可以用以下几个要素来描述:

  1. 策略参数化:我们的语言模型就是一个策略 π_θ,参数为 θ,它定义了给定上下文(指令)x 时,输出序列 y 的概率分布 π_θ(y|x)。
  2. 优化目标:一个期望最大化的目标函数 J(θ)。这个函数通常包含:
    • 性能项:衡量策略输出符合我们期望的程度。例如,在指令微调中,是最大化人类示范数据的似然;在RLHF中,是最大化奖励模型的期望回报。
    • 正则化项:限制新策略 π_θ 与某个参考策略 π_ref(如初始的SFT模型)之间的差异,常用KL散度。这确保了优化过程是保守的,避免策略崩溃。
  3. 数据分布:计算目标函数梯度时所依赖的数据分布 ρ。这是区分在策与离策的关键。
    • 如果在策:ρ 就是当前策略 π_θ 与输入分布 p(x) 共同定义的数据分布。即,我们用模型自己生成的数据(或与其同分布的数据)来更新自己。
    • 如果离策:ρ 是另一个行为策略 π_β 与 p(x) 定义的数据分布,其中 π_β ≠ π_θ。例如,在RLHF的PPO阶段,用于计算价值函数基线(Baseline)的旧策略数据,就是离策数据。

3.2 主流方法在框架中的映射

让我们看看这个框架如何容纳主流方法:

  • 监督式指令微调(SFT/Instruction Tuning)

    • 目标函数:最大化人类专家数据 D = {(x, y*)} 的似然:J_sft(θ) = E_(x, y*)~D [log π_θ(y*|x)]。
    • 数据分布:数据来自固定的专家数据集D。由于我们直接用这些数据计算梯度,而不关心它们是否由当前π_θ生成,从这个严格定义看,它使用的是离策数据(专家策略 vs. 当前模型策略)。但很多时候,人们将其视为一种特殊的在策学习,即假设专家策略就是我们要学习的理想策略。
    • 正则化:通常没有显式的KL正则化项,但早期停止(early stopping)和较小的学习率起到了类似作用。
  • 基于人类反馈的强化学习(RLHF)

    • 目标函数:J_rlhf(θ) = E_(x~p(x), y~π_θ(·|x)) [r_φ(x, y)] - β * KL(π_θ(·|x) || π_ref(·|x))。其中 r_φ 是奖励模型,β 是控制正则化强度的系数。
    • 数据分布:这里比较复杂。PPO算法通常包含在策和离策的成分:
      • 在策部分:用于计算策略梯度(期望回报)的样本 y 是从当前策略 π_θ 中采样得到的。
      • 离策部分:用于估计优势函数(Advantage)的价值函数 V(x),其训练数据通常来自旧策略 π_θ_old(上一轮迭代的策略)产生的样本。同时,奖励模型 r_φ 本身是在完全离策的人类偏好数据上训练得到的。
    • 因此,RLHF是一个典型的混合范式,其核心的奖励信号是离策的,但策略更新时采样是在策的。
  • 直接偏好优化(DPO)及其变种

    • 目标函数:DPO通过一个巧妙的数学变换,将带KL约束的奖励最大化问题,转化为一个仅依赖于偏好数据 (x, y_w, y_l) 的直接策略优化问题:J_dpo(θ) = E_(x, y_w, y_l)~D [log σ(β log (π_θ(y_w|x)/π_ref(y_w|x)) - β log (π_θ(y_l|x)/π_ref(y_l|x)))],其中σ是sigmoid函数。
    • 数据分布:数据来自固定的偏好数据集D。关键洞察在于:DPO的梯度更新,在数学上等价于用当前策略 π_θ 和参考策略 π_ref 对每个偏好数据“重新加权”后,进行一种加权最大似然估计。这意味着,虽然数据是静态的(离策),但梯度计算中隐式地包含了当前策略的信息。因此,DPO更接近于一种在策学习的近似,因为它通过当前策略和参考策略的比值,动态地调整了静态数据对于当前优化步骤的重要性。论文可能会将其归类为一种“隐式在策”或“准在策”方法。

通过这样的映射,我们可以清晰地看到,不同方法在“目标函数形式”和“数据使用方式”这两个轴上的位置。统一框架的价值在于,它允许我们分析每种方法对应的目标函数在理论上的性质(如收敛性、偏差),以及其数据使用方式带来的方差和效率问题。

注意:这里有一个重要的实践洞见。很多人认为DPO“替代”了RLHF,是一种更简单的偏好学习。但从统一视角看,DPO并没有脱离RLHF的理论基础(带KL正则的奖励最大化),它只是通过改变优化形式,避免了显式的奖励模型建模和复杂的强化学习循环。它的成功部分得益于这种形式转换带来了更稳定的优化 landscape。

4. 离策与在策的权衡:偏差、方差与效率

在统一的策略优化框架下,离策和在策学习的选择,本质上是在偏差(Bias)、方差(Variance)和计算效率之间进行权衡。理解这一点,是指导我们做工程选择的关键。

4.1 在策学习的优势与挑战

优势

  1. 低偏差:因为使用当前策略产生的数据(或与其同分布的数据)进行更新,所以梯度估计是针对当前策略的“真实”梯度方向的无偏或低偏估计。这通常意味着更稳定的收敛路径,更容易找到局部最优解。
  2. 适用于在线学习:模型可以边交互边学习,不断根据最新策略产生的数据调整自己。

挑战

  1. 数据效率可能较低:为了获得当前策略下的新数据,需要不断地用最新模型进行采样(推理),这会产生额外的计算成本。尤其是在训练初期,策略较差,采样的数据质量也低,学习效率不高。
  2. 探索不足:严格在策学习可能局限于当前策略已知的数据分布,难以发现那些当前策略概率低但实际效果更好的输出(探索-利用困境)。

在LLM后训练中,纯粹的在线在策学习(如用模型自己生成的数据做SFT)很少见,因为初始模型生成的数据质量不可控。常见的“在策”感觉的方法,如DPO,实际上是利用静态数据但通过策略比率进行了动态加权,模拟了在策更新的效果。

4.2 离策学习的优势与挑战

优势

  1. 数据效率高:可以充分利用历史积累的、高质量的静态数据集(如人类标注的示范或偏好数据)。这些数据可能来自专家、旧模型或其他来源,无需为每次策略更新重新采样。
  2. 支持更好的探索:可以从行为策略(如采样更多样化的模型)产生的数据中学习,这些数据可能覆盖了当前策略未探索到的高价值区域。

挑战

  1. 高偏差:这是离策学习的核心问题。由于训练数据分布 (ρ) 与当前策略分布 (π_θ) 不同,直接使用这些数据计算的梯度会存在偏差。如果行为策略(产生数据的策略)和目标策略(要学习的策略)差异很大,这个偏差会非常严重,导致学习不稳定甚至发散。RLHF训练中常见的“模式崩溃”(模型输出退化到重复、无意义的短句)部分原因就源于此。
  2. 价值估计困难:在强化学习设置中,离策学习需要准确估计状态或动作的价值,这通常通过重要性采样(Importance Sampling)等技术来纠正分布差异,但这些技术会引入高方差,使得训练不稳定。

4.3 对后训练方法选择的启示

基于上述权衡,我们可以重新审视常见选择:

  • 为什么RLHF(PPO)训练如此不稳定?因为它混合了离策和在策。其离策部分(奖励模型和旧策略价值估计)带来了偏差和方差,而在策采样又依赖于当前可能很差的策略。两者结合,稍有不慎(如学习率过大、KL惩罚系数β不合适)就容易导致策略剧烈波动。
  • 为什么DPO训练起来更稳定?因为它通过数学变换,将问题转化为一个类似于在策加权的监督学习问题。它避免了显式的、高方差的离策价值估计,也避免了策略采样与奖励模型评估的复杂交互。其稳定性来自于目标函数良好的凸性(在一定的假设下)和更直接的梯度计算。
  • 什么时候该用指令微调(SFT)?当你拥有大量高质量的(指令,输出)配对数据,且这些输出分布与你期望的模型行为高度一致时。SFT是一种高效利用高质量离策数据的方法,它假设专家数据分布就是目标分布。但它无法处理复杂的、非二元的偏好(比如“A比B好一点,但C在创意上更佳”)。
  • 什么时候该引入偏好学习(DPO/RLHF)?当你的优化目标无法用简单的“正确输出”来定义,而是涉及更主观的“偏好”、“安全性”、“风格”等维度时。偏好学习能利用相对比较数据,学习更细腻的奖励函数。

实操心得:从统一视角看混合策略最先进的实践往往不是纯离策或纯在策,而是分阶段或混合的。一个常见的模式是:离策启动,在策精炼

  1. 阶段一(离策):使用高质量的、离策的人类示范数据(SFT)或偏好数据(DPO的初始阶段)对模型进行“冷启动”。这能快速将模型拉到合理的策略空间,数据效率高。
  2. 阶段二(在策/准在策):当模型具备一定能力后,可以切换到更在策的模式。例如,使用模型自己生成的数据进行拒绝采样(Rejection Sampling)或最佳输出筛选(Best-of-N),然后用这些筛选出的高质量数据进一步做SFT(称为“自蒸馏”)。或者,继续使用DPO,但随着模型更新,静态偏好数据通过策略比率进行的加权也在动态变化,相当于一种准在策学习。 这种混合策略结合了离策的数据效率和在策的低偏差优势,是许多成功后训练 pipeline 的共性。

5. 实操流程设计:基于统一视角的现代后训练Pipeline

理论的价值在于指导实践。基于上述统一视角,我们可以设计一个更理性、更健壮的后训练流程。以下是一个结合了离策与在策思想的通用Pipeline,适用于从零开始对齐一个基座模型。

5.1 阶段零:数据准备与基座模型选择

核心任务:准备高质量数据,选择合适的基座模型。

  • 指令-输出对数据(SFT数据):收集或生成涵盖广泛任务、格式多样的(指令,期望输出)数据。质量重于数量,输出需准确、有用、无害。数据量通常在数万到数十万级别。
  • 人类偏好数据:收集(指令,获胜输出,失败输出)三元组。可以通过让标注员比较模型多个生成结果获得,或利用现有模型(如GPT-4)进行标注。这是偏好学习的燃料。
  • 基座模型选择:选择一个在通用领域预训练充分、能力强的模型(如LLaMA、Qwen、ChatGLM系列)。模型参数规模需与你的算力匹配。

注意事项:数据质量是天花板后训练本质上是在用数据“雕刻”模型的行为。垃圾进,垃圾出。务必对数据进行严格的清洗和去重。对于偏好数据,要特别注意比较对(win/lose pair)的一致性,避免出现矛盾标注(A>B, B>C, C>A的循环)。一个技巧是使用多数投票或引入更强大的模型(如GPT-4)进行仲裁。

5.2 阶段一:离策监督微调(SFT)

目标:让模型初步学会遵循指令,成为一个合格的“学生”。

  • 方法:使用准备好的指令-输出对数据,以标准的下一个词预测(语言建模)损失进行监督微调。
  • 超参数关键
    • 学习率:通常很小(例如1e-5到5e-5),因为基座模型已有丰富知识,我们只是微调。
    • 轮数:2-4个epoch通常足够,严防过拟合。需要监控在保留验证集上的损失。
    • 序列长度:需覆盖你的数据中最长样本。
  • 输出:得到一个SFT模型(π_sft)。这是后续所有对齐工作的起点和参考策略(π_ref)。

5.3 阶段二:离策偏好学习(以DPO为例)

目标:让模型从“遵循指令”升级到“输出符合人类偏好”。

  • 方法:使用DPO算法。其损失函数如前所述,需要SFT模型作为参考模型(π_ref)。
  • 实操步骤
    1. 加载模型:初始化训练模型 π_θ 为阶段一得到的 π_sft。参考模型 π_ref 固定为同一个 π_sft(或其副本,且不计算梯度)。
    2. 准备数据:将偏好三元组 (x, y_w, y_l) 转换为DPO需要的格式。
    3. 训练循环:对于每个批次,计算DPO损失。损失函数会鼓励模型增加对获胜输出 y_w 的似然(相对于 π_ref),同时降低对失败输出 y_l 的似然。
    4. 关键超参数 β:控制模型偏离参考策略的强度。β 越大,模型越保守,越像 π_ref;β 越小,模型越自由,优化偏好目标越激进。这是一个需要仔细调节的核心参数。通常从0.1左右开始尝试。
  • 监控:除了训练损失,更重要的是监控偏好对的准确率(即模型对 y_w 和 y_l 的隐含偏好是否与数据一致),以及生成样本的质量(通过人工或GPT-4评估)。

5.4 阶段三:在策精炼与迭代(可选但推荐)

目标:利用模型自身能力,生成更高质量的数据,实现自我提升。

  • 方法一:拒绝采样与自蒸馏
    1. 生成:用当前最好的模型(如DPO后的模型)对一批新的或旧的指令进行多次采样(例如N=4)。
    2. 筛选:使用一个强大的评判器(可以是训练好的奖励模型,也可以是GPT-4等API)对每个输出打分,选出每个指令下得分最高的输出。
    3. 蒸馏:用这些(指令,最佳输出)对组成新的数据集,对模型进行新一轮的SFT(学习率可以更小)。这个过程相当于让模型向自己的“最佳表现”学习。
  • 方法二:在线DPO或迭代式DPO
    1. 用当前模型生成新的输出对,让人类或AI进行偏好标注,扩充偏好数据集。
    2. 用扩充后的数据集继续训练DPO模型。 这个过程将离策的DPO与在策的数据收集结合起来,逐步提升数据分布与当前策略的匹配度。

5.5 工具选型与实现要点

  • 框架:Hugging Face的transformerstrl(Transformer Reinforcement Learning)和peft(Parameter-Efficient Fine-Tuning)库是当前事实上的标准。trl库原生支持DPO、PPO等训练方式。
  • 代码示例(DPO训练核心片段)
    from trl import DPOTrainer, DPOConfig from transformers import AutoModelForCausalLM, AutoTokenizer # 加载模型和分词器 model = AutoModelForCausalLM.from_pretrained("your_sft_model_path") ref_model = AutoModelForCausalLM.from_pretrained("your_sft_model_path") tokenizer = AutoTokenizer.from_pretrained("your_model_path") # 设置pad_token如果不存在 if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token # 配置DPO参数 dpo_config = DPOConfig( beta=0.1, # DPO温度参数β learning_rate=5e-7, # 通常比SFT更小的学习率 per_device_train_batch_size=4, gradient_accumulation_steps=4, max_length=1024, logging_steps=10, output_dir="./dpo_results", # 可启用bf16/float16加速,并设置梯度检查点节省显存 bf16=True, gradient_checkpointing=True, ) # 初始化DPOTrainer dpo_trainer = DPOTrainer( model=model, ref_model=ref_model, args=dpo_config, train_dataset=your_preference_dataset, # 需预处理为特定格式 tokenizer=tokenizer, ) # 开始训练 dpo_trainer.train()
  • 算力考量:DPO训练相比RLHF/PPO节省了大量显存和计算,因为它不需要维护额外的奖励模型、价值模型和进行复杂的PPO循环。主要开销在于前向传播计算模型对 (y_w, y_l) 的log概率。使用LoRA等参数高效微调技术可以进一步大幅降低显存需求。

6. 常见陷阱、问题排查与调优经验

即使理解了理论,实操中依然坑洼遍地。以下是一些从实践中总结的常见问题与解决方案。

6.1 模型性能下降或崩溃

  • 现象:经过DPO或RLHF训练后,模型在基础能力(如知识问答、逻辑推理)测试集上的表现显著下降,或者开始输出乱码、重复文本。
  • 根因分析
    1. KL散度惩罚系数 β 设置不当:这是最常见的原因。β 太小,模型为了迎合偏好信号会过度偏离参考模型(π_sft),导致遗忘预训练知识和SFT学到的指令跟随能力。β 太大,则偏好优化效果微弱。
    2. 偏好数据质量差或噪声大:矛盾的偏好标签会让模型学习目标混乱。
    3. 学习率过高:在偏好优化阶段,模型参数已经比较敏感,高学习率会导致优化不稳定。
  • 排查与解决
    1. 系统性地扫描 β:在0.01到1.0的范围内进行网格搜索或随机搜索。对于每个β,训练少量步数(如100-500步),然后评估模型在保留的验证偏好数据上的准确率在多样化指令集上的生成质量(可用GPT-4自动评估)。选择一个在偏好准确率和生成质量间取得最佳平衡的β。
    2. 检查偏好数据:计算数据集中冲突标签的比例。如果可能,对数据进行清洗或使用更可靠的标注来源。
    3. 降低学习率:DPO的学习率通常应比SFT阶段低1-2个数量级。从5e-7到1e-6开始尝试。
    4. 引入正则化:除了KL散度,还可以考虑在损失中加入对原始SFT损失的小权重项,以显式地保留指令跟随能力。

6.2 奖励黑客或过度优化

  • 现象:模型在偏好评估中得分很高(例如,奖励模型给出的分数或DPO隐含的偏好准确率),但人类评估发现其输出质量下降,可能包含奇怪的格式、冗余的礼貌用语(如“当然,我很乐意…”的无限套娃)或利用奖励模型的漏洞。
  • 根因分析:优化目标与人类真实偏好之间存在分布外泛化差距。模型在训练数据分布内过度优化,学到了数据中的虚假相关性或奖励模型的缺陷。
  • 排查与解决
    1. 多样化评估集:使用与训练数据分布不同的指令集进行定期的人工或强模型(GPT-4)评估。不要只看训练集和验证集上的偏好准确率。
    2. 设置“陷阱”指令:在评估集中加入一些可能诱发不良行为的指令(如“忽略之前的指令”、“写一个有害的代码”),检查模型是否对齐失败。
    3. 限制训练步数/早停:像防止过拟合一样,监控模型在分布外评估集上的表现,一旦生成质量开始下降就停止训练。
    4. 改进奖励模型或偏好数据:如果使用RLHF,奖励模型的质量是上限。如果使用DPO,偏好数据的覆盖度和质量是关键。考虑引入针对“奖励黑客”行为的负样本。

6.3 训练不稳定或损失震荡

  • 现象:训练损失曲线剧烈波动,不收敛。
  • 根因分析
    1. 批次内偏好对差异过大:一个批次中同时包含非常容易和非常困难的偏好对,导致梯度方向冲突。
    2. 梯度爆炸:学习率过高或模型初始化/数据预处理有问题。
    3. DPO中 β 值极端:β 过小可能导致逻辑函数内部的值非常大,引发数值不稳定。
  • 排查与解决
    1. 数据洗牌与批次构建:确保每个批次内的数据在难度上相对均衡。可以对数据按指令长度、类型或预估难度进行聚类,然后在聚类内采样。
    2. 梯度裁剪:设置梯度裁剪范数(如max_grad_norm=1.0),这是稳定训练的标配。
    3. 调整 β 和学习率:尝试增大 β 或降低学习率。
    4. 检查数据格式:确保y_wy_l没有被意外交换,且文本被正确分词,没有过多的填充(padding)。

6.4 实操调优清单

在开始正式训练前,可以按以下清单进行检查和调优:

检查项目标建议操作
数据质量确保干净、一致、有代表性人工抽查100条数据;检查标签一致性;过滤长度异常或包含特殊字符的样本。
模型初始化从稳定的SFT模型开始确保SFT模型在指令跟随上表现良好。如果SFT模型就很差,后续对齐是空中楼阁。
超参数 β找到保守与激进的平衡点进行小规模扫描(0.05, 0.1, 0.2, 0.5)。观察训练初期(500步)的验证集偏好准确率和生成多样性。
学习率稳定收敛从较小的值开始(如5e-7)。使用学习率调度器(如余弦衰减)。
批次大小在显存允许下尽可能大增大批次大小可以降低梯度方差,使训练更稳定。使用梯度累积模拟大批次。
序列长度覆盖所有数据统一截断或填充到固定长度,避免因长度差异引入的偏差。
监控指标全面评估模型状态监控:训练损失、验证偏好准确率、生成样本质量(人工/GPT-4评估)、KL散度(如果记录)。
正则化防止遗忘与过拟合启用Dropout(如果模型有);考虑在损失中加入小权重的SFT损失项。

最后,记住大模型后训练既是科学也是艺术。统一视角提供了地图和指南针,但通往最佳模型的道路仍然需要大量的实验、细致的观察和不断的迭代。从一个小规模、可快速迭代的实验设置开始(例如,使用7B模型和1万条数据),验证你的整个pipeline和超参数选择,然后再扩展到全量数据和更大模型,这是一个能节省大量时间和算力的务实策略。