跳转至

十:前沿微调技术

什么是混合专家模型(MoE)微调?与传统密集模型微调有何不同?

混合专家模型(MoE)微调 是指在已经过预训练的MoE架构大语言模型上,使用特定任务或指令数据进行有监督的额外训练(SFT)或对齐训练(RLHF/DPO)。其目标是适配下游应用,同时保持MoE模型稀疏激活、高容量、低计算开销的优势。

与传统密集模型微调的核心差异:

查看内嵌表格

总结:MoE微调继承了密集模型微调的目标,但因其独特的稀疏激活和路由机制,带来了显存管理、负载均衡和路由稳定性等一系列新挑战。成功的MoE微调需要同时考虑专家的专长维护与负载平衡,通常需要结合特定的损失函数和微调策略。


MoE模型中,路由机制在微调时如何调整?需要特殊技巧吗?

MoE模型的路由器(Gate/Router)通常是一个或多个线性层,负责为每个token分配top-k个专家。在微调时,路由器参数可以与其他参数一同更新,也可以采用特殊策略单独调整。

路由机制的调整方式:

  1. 联合微调(默认) 在标准SFT中,将路由器参数视为模型的一部分,与专家和注意力层一起参与反向传播和梯度更新。此时,路由器的学习完全由下游任务的数据分布驱动。这是最简单直接的方法,但可能带来负载不均衡的风险。

  2. 固定路由 + 微调专家 冻结路由器参数,只微调专家权重和/或注意力层。这样可以保持原有的专家分工不被破坏,避免微调数据分布过窄导致路由坍塌。但缺点是无法根据新任务优化路由决策,可能导致某些专家始终被低效利用。

  3. 分离学习率 对路由器参数设置一个远小于专家参数的学习率(如1/10),以减缓路由器对数据分布的适应速度,防止其在少量数据上过拟合,维持一定的负载均衡。这是实践中常用的折中技巧。

  4. 渐进式解冻 先冻结路由器,训练专家数步;待专家对新任务有了一定适应之后,再以极低的学习率解冻路由器,进行联合微调。这有助于在专家能力建立后再优化分配。

需要特殊技巧吗?

是的,尤其是数据量较小时。主要有以下几点:

  • 保持辅助负载均衡损失:预训练中常用的负载均衡损失(如Switch Transformer的auxiliary loss)在微调时不应被移除,而是应继续保留并适当调整其权重。这是因为微调数据分布往往更窄,如果去掉平衡约束,路由器很容易坍塌到只激活少数几个“通才”专家。通过监控各专家的token分配比例,可以动态调整辅助损失的系数。

  • 专家容量限制与溢出策略:设置每个专家能够处理的最大token数(capacity),当某专家超载时,多余的token可以传递给下一层或直接通过残差连接跳过。这能避免某些专家因处理过多token导致显存峰值和计算延迟,同时也隐式地迫使路由器寻找次优专家。

  • 正则化与对抗扰动:对路由器输入添加微小噪声,或对路由概率施加熵正则化(鼓励分布更均匀),以提升路由的鲁棒性和泛化能力。

  • 数据多样性的重要性:微调数据应尽量覆盖广泛的任务类型,防止模型只在一个狭窄领域上训练导致路由偏见。可以在SFT数据中混入少量通用预训练数据或多样化的任务数据,维持路由器的均衡性。


如何避免MoE微调时的“专家坍塌”问题?

专家坍塌 是指MoE模型在训练或微调过程中,路由器几乎将所有token都分配给少数几个(甚至一个)专家,导致其他专家不被激活、形同虚设的现象。这会严重损害模型的容量和性能,使得MoE的优势荡然无存。

避免专家坍塌的策略:

  1. 持续施加负载均衡损失 负载均衡损失(Load Balancing Loss)是预训练MoE模型时防止坍塌的核心手段。微调时绝不应将其移除,反而应根据数据量调整其系数。公式通常基于专家接收的token比例和路由概率的乘积,鼓励每个专家在全局和每个batch中都有相对均衡的负载。在微调初期,可以适当增大该损失的权重,待路由器稳定后再逐步减小。

  2. 引入辅助熵损失或专家多样性损失 除了负载均衡,还可以加入熵最大化损失,惩罚路由器输出的概率分布过于集中。例如,对每个token的路由概率分布计算熵,并希望该熵尽可能大,从而促使模型探索不同的专家组合。

  3. 设置专家容量与随机路由 为每个专家设定一个最大处理容量(Capacity),当分配给某专家的token数超过容量时,超出的token被强制丢弃或通过残差连接绕过。这能强迫路由器寻找替代专家。此外,在训练时可以以一定概率随机将token分配给任意专家,增加探索,防止模型过早收敛到局部最优。

  4. 数据调度与课程学习 微调初期使用更加平衡、通用的数据,让路由器维持均匀的分配;后期再逐步加入领域专用数据。也可以在每个batch中刻意构造包含各类任务的混合数据,避免连续多个batch都来自同一狭窄领域。

  5. 使用Z-loss或正则化约束路由权重 Z-loss(对路由logits的平方和施加惩罚)可以稳定路由器的输出,防止其logits值过大导致softmax后分布极度尖锐。这有助于减缓坍塌。

  6. 冻结或部分冻结路由器 如果微调数据量很小,可以考虑冻结路由器参数,仅微调专家权重。这样从根本上杜绝了路由坍塌,但代价是无法优化任务特定的专家分配。可以在微调后期再以极小学习率解冻路由器。

  7. 监控与早停 在微调过程中持续监控每个专家被激活的频率、接收的token数以及负载均衡损失。一旦发现某些专家的激活率持续下降,立即停止训练并调整策略(例如增大负载均衡损失系数)。及早发现是防止不可逆坍塌的关键。


DeepSeekMoE的细粒度专家设计对微调有什么影响?

DeepSeekMoE(如DeepSeek-V2)提出了一种细粒度专家(Fine-grained Experts) 架构,将每个标准FFN大小的专家进一步切分为多个更小的“迷你专家”,通常还会保留部分共享专家(Shared Experts)。这种设计对微调带来了多方面的影响:

  1. 更高的微调灵活性

细粒度专家使得专家组合更加灵活。每个token可以激活多个迷你专家,由于每个专家体量很小,模型可以学习更精细、更稀疏的激活模式。微调时,任务特定的知识可以更准确地定位到少数几个细粒度专家上,而不会大幅干扰其他专家,有利于多任务学习和持续微调。

  1. 负载均衡更容易

专家数量的增加(例如从8个变为64个甚至更多)使得每个专家处理的token数自然更少,负载均衡的压力降低。即使某些专家被分配了相对较多的token,其绝对数量也远小于粗粒度专家的情况,因此专家坍塌的风险相对降低,对负载均衡损失的敏感性下降。微调时可以适当降低辅助损失的权重。

  1. 路由学习的挑战

细粒度专家意味着路由器的输出维度变大,需要从更多候选中选择top-k。在少量微调数据上,路由器可能难以充分训练,导致专家选择带有较大噪声。这要求微调数据具有足够的多样性和数量,或者采取冻结/部分冻结路由器的策略。同时,路由器参数量增大,微调时也需考虑其正则化。

  1. 微调显存与计算

细粒度专家虽然个体更小,但总参数量可能更大。所有专家依然需要全部驻留在显存中,因此对显存的要求并未降低。然而,由于单个专家参数极少,采用PEFT方法(如MoELoRA)时,可以为每个细粒度专家独立添加LoRA适配器,实现更精细的控制,并且由于每个专家上的适配器参数量极小,总可训练参数依然可控。

  1. 共享专家的作用

DeepSeekMoE中通常设有共享专家,这些专家对所有token始终激活,负责学习通用特征。微调时,可以冻结共享专家,只微调路由专家部分,以保护模型的通用能力不被破坏。或者,也可以针对共享专家采用更小的学习率。

总结:DeepSeekMoE的细粒度专家设计使微调更加灵活、负载更易均衡,但也对路由训练和微调数据多样性提出了更高要求。合理利用其细粒度特性,结合PEFT和分层学习率策略,可以高效地适配下游任务。


什么是“MoELoRA”?如何结合MoE和LoRA进行微调?

MoELoRA(Mixture of Experts LoRA) 是一种专门为MoE模型设计的参数高效微调方法。它将LoRA的低秩适配思想与MoE的稀疏专家结构相结合,为每个专家(或每个FFN层)独立添加可训练的LoRA适配器,从而实现极低成本的微调。

核心思想:

  • 对于MoE模型中的每一个专家(或每一个FFN层),都独立地注入一对低秩矩阵(A和B),构成该专家的LoRA适配器。

  • 在微调时,原始模型的所有参数(包括路由器、注意力层、专家权重)全部冻结,只训练这些新添加的、参数量极小的LoRA适配器。

  • 当某个token被路由到特定专家时,该专家的前向传播就变为:y = Expert(x) + α/r * B_i A_i x,其中 A_i, B_i 是该专家独有的LoRA矩阵。

  • 训练完成后,对于每个专家,可以将LoRA权重合并回原专家权重,推理时没有额外开销;或者保持分离,支持多任务动态切换。

为什么需要MoELoRA?

标准LoRA通常只应用在注意力层的Q、V等矩阵上,但在MoE模型中,专家FFN层占据了绝大部分参数量和计算量。如果只对注意力层应用LoRA,微调容量可能不足以适配那些需要深度改变专家行为的下游任务。MoELoRA将LoRA注入到每个专家FFN内部,直接调整专家的行为,大幅提升了PEFT在MoE模型上的表达力。

结合方式与实现要点:

  1. 选择注入位置:通常对每个专家FFN的两个线性层(如gate_projup_projdown_proj)分别注入LoRA。也可以只在down_proj注入以节省参数。

  2. 参数预算分配:由于专家数量众多(例如8个、64个甚至更多),为每个专家都添加LoRA会导致总可训练参数量增加。可以通过降低每个专家的LoRA秩(如 r=2r=4)来控制总参数量。也可以只为部分专家(如最重要的几个)添加LoRA,或者根据专家在预训练中的重要性进行动态分配。

  3. 路由与负载均衡:路由器依然保持冻结。但为了让LoRA学习到有效的适配,微调时应保留原始的负载均衡损失(或适当调整),以确保token依然会被路由到各种专家上,从而让各个专家的LoRA适配器都能得到充分训练。

  4. 训练与推理:训练时只需存储LoRA参数的梯度和优化器状态,显存开销极小。推理时,若追求极致速度,可将LoRA矩阵合并到专家权重中;若需要多任务服务,则保留独立加载,实现热插拔。

MoELoRA将MoE的稀疏表达能力与LoRA的参数高效性结合,是当前微调大规模MoE模型的首选方案之一,能够在保持极低资源消耗的同时,达到接近全参数微调的效果。


在MoE模型上做全参微调和LoRA微调的显存与效果对比。

在MoE模型上,全参数微调(Full Fine-Tuning)与LoRA微调的对比需要考虑MoE特有的总参数量大、稀疏激活的特点。

  1. 显存对比

查看内嵌表格

  1. 效果对比

  2. 全参微调:理论上限最高,能够彻底调整所有专家的知识和路由行为,对任务适应性最强。在数据量充足、计算资源充沛的情况下效果最好。但极易过拟合,且灾难性遗忘风险高。

  3. 标准LoRA(仅加在注意力层):对于MoE模型,专家FFN是知识存储的核心。仅微调注意力层的LoRA可能无法充分改变模型的行为,尤其是当任务需要注入大量新知识或改变专家分工时。效果往往不如在密集模型上的LoRA提升明显,存在性能瓶颈。

  4. MoELoRA:在专家FFN中注入LoRA,直接调节专家输出,能更有效地适配下游任务,性能显著优于仅注意力层LoRA,在很多任务上逼近全参微调。同时保留了LoRA的正则化优势,对防止遗忘和过拟合更友好。

  5. 结论

在资源充足时,全参微调依然是追求极致性能的选择;但在绝大多数场景下,MoELoRA以远低于全参微调的显存和计算成本,实现了接近的性能,是当前MoE微调的最优折中方案。若显存极度受限,则可先尝试标准LoRA,若不满足再转向MoELoRA。


如何微调MoE模型的路由策略?损失函数中需要加入负载均衡吗?

微调MoE模型的路由策略是指针对下游任务,有意识地调整路由器参数,以优化专家的分配,提高任务性能或推理效率。是否需要加入负载均衡损失,取决于微调目标和数据特性。

  1. 微调路由策略的方法

  2. 联合微调:直接将路由器参数设置为可训练,与专家、注意力层一同参与SFT的梯度更新。此时,路由器会根据下游任务数据学习更适合的专家分配。这是最直接的方法。

  3. 分离微调:先冻结路由器,训练专家和其他参数(如注意力层)数个epoch,使专家先获得任务特定能力;然后再以极小的学习率解冻路由器,进行少量步数的联合微调。这种渐进式策略能更好地平衡专家能力与路由决策,避免初期路由的错误引导。

  4. 离线知识蒸馏微调:如果不想通过SFT梯度直接训练路由器,可以先用一个强大的“教师”路由策略(如通过RL训练好的最优路由)对微调数据中的每个token进行专家分配标注。然后,冻结所有其他参数,只训练路由器来拟合这些标注好的决策,相当于将路由微调转化为一个分类任务。这种方法对路由的调整最为精细和可控。

  5. 强化学习微调路由:在RLHF框架中,可以专门针对路由策略设计奖励,例如奖励更低的推理延迟、更均衡的专家负载或更高的任务评分。通过PPO或GRPO等算法优化路由器,实现特定目标。

  6. 是否需要加入负载均衡损失?

通常需要,但需灵活调整。

  • 需要的原因:微调数据分布往往比预训练数据更窄。如果不加任何约束,路由器极易坍塌,将几乎所有token都分配给少数几个专家,导致其他专家“闲置”和模型退化。负载均衡损失是维持专家多样性的关键保障。

  • 调整策略:

  • 维持原有权重:如果微调数据多样性较好、量较大,可直接沿用预训练时的负载均衡损失权重。
  • 动态调整:在微调初期,由于专家尚未适应新任务,路由容易偏向,可适当增大负载均衡损失的权重,强制模型进行探索;待训练稳定后,再逐渐减小权重,让模型更专注于任务性能。
  • 减少约束:若微调任务非常专一,且已经通过其他手段(如容量限制、冻结部分专家)防止了坍塌,可以降低甚至移除负载均衡损失,让模型自由地将token集中到最相关的专家上,以最大化任务性能,代价是可能牺牲泛化能力。

  • 替代方案:如果不使用负载均衡损失,可通过容量限制(Capacity Factor) 来硬性防止某专家过载,超出的token通过残差连接跳过。同时,监控各专家token分配,一旦发现严重不均衡,即触发负载均衡损失的介入或调整学习率。

总结:微调MoE路由时,负载均衡损失是一个重要的稳定性工具。建议始终将其作为监控指标和可调节的杠杆,根据训练动态和下游任务需求灵活调整其权重,而不是一刀切地保留或移除。


推理时对齐(inference-time alignment)如o1风格,与微调的区别?

推理时对齐 是指在模型推理(生成)过程中,通过引导模型的“思考”过程、修改解码策略或调用外部工具,来实现更安全、更高质量的输出,而不改变模型参数。OpenAI的o1模型风格(即“深思熟虑再回答”)是推理时对齐的典型代表。与之相对,微调(SFT/RLHF/DPO) 是通过训练永久性修改模型参数来注入对齐目标。

  1. 核心区别

查看内嵌表格

  1. o1风格推理时对齐的具体体现

o1模型在回答前会经历一个隐式的“思维链”过程(内部推理),其核心是通过强化学习训练模型在回答前进行更深入的思考,从而提升复杂推理和安全性。但从广义上讲,推理时对齐的技术手段包括:

  • 系统提示(System Prompting):设置角色和规则,如“你是一个安全、有帮助的助手”。

  • 思维链提示(Chain-of-Thought):引导模型分步推理,减少错误和幻觉。

  • 多轮自我修正(Self-Correction):让模型生成答案后,自我批评并修正。

  • 检索增强生成(RAG):从外部知识库检索最新信息,提升事实准确性。

  • 工具调用(Tool Use):让模型调用计算器、代码解释器、搜索引擎等来辅助生成。

  • 解码策略调整:如调整温度、Top-P、重复惩罚等来控制输出多样性和安全性。

  • 两者的关系与协同

推理时对齐和微调不是互斥的,而是互补的。通常最佳实践是:先用微调(SFT+RLHF/DPO)建立一个强大的、基本对齐的基座模型,再用推理时对齐技术进行动态、精细化的控制。 例如,一个经过安全微调的模型,在面对高风险请求时,可以配合严格的系统提示和思维链要求,进一步增强安全性;而微调无法覆盖的新型攻击,则可通过推理时的上下文学习来临时防御。微调负责“打底子”,推理时对齐负责“调细节”。

总之,推理时对齐为模型行为提供了最后的、可解释的控制层,而微调则是根本性的能力与行为改造。两者结合,才能构建既强大又灵活的安全对齐系统。


如何通过微调让模型具备“自我反思”和“步步验证”的能力?

让模型具备自我反思和步步验证能力,本质上是将元认知过程外化为训练数据中的特定文本模式,通过SFT教会模型在回答前或回答后进行显式的思考与核查。

数据构造策略:

  1. 构造“先思考,再回答”的思维链数据 指令:“请计算一个长方体鱼缸的容积,长5米,宽2米,高3米。” 回答:
我需要计算长方体体积,公式是长 × 宽 × 高。
步骤1:确认单位统一为米。
步骤2:代入数字:5 × 2 × 3 = 30。
步骤3:单位是立方米。
结论:鱼缸容积为30立方米。
验证:长×宽得到底面积10平方米,再乘以高3米确实为30立方米,计算无误。

通过在回答中显式加入“验证”环节,模型学会了在输出最终答案前进行自我确认。

  1. 构造“错误-发现-修正”的反思数据 指令:“小明有3个苹果,每个2元,又买了5个橘子,每个3元,他一共花了多少钱?” 回答:
初步计算:苹果总价 3×2=5元,橘子总价 5×3=15元,合计20元。
等等,我犯了一个错误。3乘2应该是6,不是5。让我重新计算。
苹果总价 3×2=6元,橘子总价 5×3=15元,合计21元。
验证:6+15确实等于21。

关键:在训练时,对“初步计算”部分进行损失掩码(labels设为-100),只让模型学习反思和修正后的内容。这教会模型在发现错误后如何回溯并纠正。

  1. 构造“多角度验证”数据 对于同一个问题,提供用不同方法求解并互相印证的示范。例如,一道数学题既用代数法解,又用几何法验证。这让模型学会“一题多解,交叉验证”的思维模式。

  2. 构造“自我质疑”数据 在回答中加入对自己的提问:“我的这个假设成立吗?”“是否存在我没有考虑到的边界情况?”模型被训练得在关键时刻停顿下来,审视自己的推理过程。

训练与评估:

  • 这类数据应与常规SFT数据混合训练,占比通常为10%-20%,防止模型在所有问题上都过度思考而变得啰嗦。

  • 评估时,可通过需要多步推理的任务(如GSM8K、MATH)以及专门的反思能力测试集来检验模型是否真正具备了自我纠错能力,而非仅仅模仿格式。

本质:通过大量包含“显式反思语句”的对话数据,将模型的内在思考过程外化为可学习的语言模式,从而赋予其自我反思和验证的能力。


什么是“test-time compute scaling”?微调如何为此做准备?

Test-time compute scaling 是一种在模型推理阶段,通过投入更多计算资源来提升回答质量的技术范式。其核心思想是:不改变模型参数,而是让模型在回答一个问题时“思考更久、探索更多”,从而获得更好的结果。 OpenAI的o1模型是这一思想的典型实践。

具体表现形式:

  • 思维链长度增加:模型在输出最终答案前,产生更长的、更深入的内部推理(隐式或显式思维链)。

  • 自洽性采样:对同一问题独立采样多个回答,然后通过投票或奖励模型选出最优解。

  • 树搜索或蒙特卡洛树搜索:在生成过程中探索多个可能的推理路径,评估并选择最有希望的方向。

  • 多轮自我修正:模型生成初步答案后,自我批评并迭代修正。

微调如何为此做准备?

为了让模型能够在推理时有效利用额外的计算资源,微调阶段的数据和训练策略需要与之配合:

  1. 构造长程推理数据:在SFT数据中,包含大量需要进行多步推理、多路径探索、并最终收敛到正确答案的样本。例如,提供展示了多种解题思路并比较择优的“思维树”式对话。这能让模型习惯于生成结构化的、可扩展的推理链。

  2. 强化搜索与回溯能力:在数据中植入“死胡同”式的错误推理路径,并示范模型如何识别错误、回溯并尝试新路径。训练出的模型在推理时被赋予了更长的“思考预算”时,能够自发地进行更深入的探索和纠错。

  3. 奖励模型的过程监督:在训练奖励模型时,不仅对最终结果进行评分,还对中间推理步骤的正确性进行评分(过程奖励模型,PRM)。这样在推理时,可以使用树搜索算法,利用PRM评估每一步的推理质量,引导模型选择最有希望的路径。

  4. 使用RL训练探索策略:通过RLHF或GRPO等方法,奖励模型在复杂推理任务上生成正确且推理充分的回答。这鼓励模型主动延长思维链,学习如何分配计算资源以换取更高的准确率。

总结:微调为 test-time compute scaling 提供了“会思考”的基座模型。它通过数据将“如何思考”的模式注入模型,使得在推理时给予更多计算资源时,模型知道如何有效地利用它们,而不是产生重复或无意义的文本。


如何构造数据来微调出一个擅长“思维链+验证”的推理模型?

要微调出这样的模型,数据必须同时体现逐步推理和自我验证两个特征,且验证环节需显式、具体。

数据构造要点:

  1. 标准思维链+验证 在每道推理题的回答中,不仅包含分步的推导过程,还在每一步或最后加入验证语句。
  2. 示例:“因为速度=路程/时间,所以速度=120公里/2小时=60公里/小时。验证:如果以60公里/小时行驶2小时,路程为120公里,与题目一致。”
  3. 这种数据让模型养成“每输出一步就进行合理性检查”的习惯。

  4. 多路径比较与选择 对于一道题,数据中展示多种可能的解法,并分析各自的优劣,最终选择最优方案。

  5. 示范:“此题可用方法A(公式法)或方法B(画图法)。方法A更快捷但需注意单位;方法B更直观但较繁琐。这里我选用方法A。” 这能训练模型的策略选择与权衡能力。

  6. 包含错误与修正的链条 故意在初步推理中植入一个常见错误,然后让模型自己发现、指出并修正。

  7. 示例:“初步计算得到结果X。等等,我发现在第二步时我误用了公式,应该使用...。重新计算后得到正确结果Y。验证:将Y代入原条件,成立。”
  8. 这类数据对于培养鲁棒性至关重要。

  9. 纯验证型数据 给出问题和解答过程,让模型专门进行验证。

  10. 指令:“请验证以下数学解答是否正确,并详细说明每一步的检查过程。”
  11. 这能强化模型的批判性思维。

  12. 结构化验证维度 在回答中引入多维度的验证清单。例如,对于代码生成:“1. 语法检查:无错误。2. 逻辑验证:输入[示例],输出符合预期。3. 边界测试:空输入时能正确处理。”

  13. 这让模型的验证过程更加系统化。

数据来源:

  • 人工精写:质量最高,覆盖核心推理范式。

  • 强模型(GPT-4)蒸馏:给定大量推理题,用特定prompt让强模型生成包含“思维链+验证”的示范答案,再进行人工校验和筛选。

  • 从数学/代码数据集中扩充:在现有的解题数据上,追加一个“验证/反思”段落,可通过改写模型自动完成。

训练时注意:这类数据需与常规指令数据混合,维持模型对简洁问题的直接回答能力,防止过度“反思”导致冗长。


解释SPIN(Self-Play Fine-Tuning)如何通过自我对弈提升SFT模型。

SPIN(Self-Play Fine-Tuning) 是一种无需外部奖励模型或人类偏好数据,仅利用SFT数据集本身,通过模型与“旧我”对抗来实现自我提升的迭代微调方法。其核心思想是“今天的我要比昨天的我做得更好”。

SPIN的流程:

image.png

image.png

image.png

SPIN的提升原理:

  • 它没有引入任何新的外部知识,而是充分利用SFT数据中人类答案 y 的价值,迫使模型不断尝试去超越自己当前的最佳水平。

  • 每一轮迭代都是一种对比学习:模型不仅要靠近正例 y,还要远离自己上一轮产生的负例 y′,从而在分布空间中被推向更高质量的区域。

  • SPIN在理论上与RLHF的目标是一致的,但它以纯监督学习的方式实现,训练更稳定,且无需额外的奖励模型。


Self-Rewarding模型的微调流程是怎样的?如何生成奖励数据?

Self-Rewarding(自我奖励) 模型是一种不依赖外部奖励模型,能够自己为生成文本打分,并通过自我评判来实现对齐的模型。

微调流程:

  1. 初始SFT,注入评判能力:首先,基于一个强大的预训练模型,进行第一轮SFT。这个SFT数据集不仅包含标准的指令-回答对,还必须包含大量的“评判”数据。例如:“请评价以下回答的质量,并从准确性、流畅度、有用性打分。” 模型需要学会输出结构化的评判结果(如JSON格式)。通过这一阶段,模型同时具备了“考生”和“考官”的能力。

  2. 自我奖励循环:

  3. 生成候选回答:对于一批指令,让模型扮演“考生”,生成多个候选回答。
  4. 自我生成奖励与评判:让同一个模型切换角色,扮演“考官”,对自己生成的这批候选回答进行多维度打分和排序,输出奖励分数和理由。它需要学会区分不同质量回答的优劣。

image.png

  1. 偏好对齐训练(DPO):使用这些自我生成的偏好对数据,对模型进行一轮DPO训练,提升其指令遵循和对齐质量。此时,模型的能力得到提升。

  2. 迭代:新的、更强的模型再次回到步骤2,既可以生成更高质量的候选回答,也能给出更精准的评判,从而产生更高质量的偏好数据。如此循环,模型的能力和对齐程度不断自我进化。

如何生成奖励数据?

奖励数据完全来自模型自身的输出。关键在于第一步SFT时注入的评判能力。在构造评判Prompt时,需要设计详细的评分标准(量规),引导模型进行多维度、有理由的打分。例如:“请作为一个严格的评审,根据以下标准给回答打分:1. 准确性(5分) 2. 有用性(5分)... 并解释评分理由。” 通过这种方式,模型能够稳定地输出可解析的评分,作为后续DPO的奖励信号。

核心挑战:防止“自我表扬”和评判标准漂移。必须保留一部分人工标注的高质量偏好数据作为“校准锚”,定期对模型的评判能力进行验证和微调,确保其公正性和准确性。


什么是“self-improving”微调环路?如何避免模型退化?

Self-improving微调环路 是指模型能够利用自己生成的数据(或与环境交互产生的数据)来持续改进自身性能,形成一个自动化的、无需大量外部监督的训练闭环。这在SPIN、Self-Rewarding、和在线RLHF中都有体现。

典型的Self-improving环路:

  1. 数据生成:当前模型针对一批指令生成回答。

  2. 自动评估/过滤:利用模型自身或外部工具(如编译器、搜索引擎、规则)对生成结果进行评分或筛选,选出高质量样本。

  3. 模型更新:使用这些筛选出的高质量数据对模型进行微调(SFT)或偏好对齐(DPO)。

  4. 重复:用更新后的模型再次生成数据,进入下一轮循环。

如何避免模型退化?

Self-improving环路最大的风险是分布坍缩与偏差放大:模型倾向于重复生成自己所偏好的模式,导致多样性丧失,或放大自身的偏见和错误。避免退化的关键措施包括:

  • 注入外部“新鲜血液”:定期向数据生成或训练池中加入人工标注的高质量数据、新的指令集,或来自其他模型/来源的多样化数据,打破自我循环的封闭性。这相当于为基因池引入多样性,防止近亲繁殖。

  • 使用冻结的参考模型作为锚点:在训练时(如DPO),始终保持一个最初的、表现良好的SFT模型作为参考模型,通过KL散度约束防止当前模型偏离初始“安全”分布太远。

  • 严格的自动过滤与质量阈值:建立多维度的自动评估管道(如事实性检查、安全审核、多样性指标),只保留达到严格质量标准的生成样本。宁可数据量少,也要保证质量。

  • 对抗性测试与自我挑战:在环路中加入自我挑战机制,例如让模型刻意生成对抗性难题,或进行“自我博弈”(如SPIN),通过挑战旧我来寻找弱点,而非仅仅模仿自己。

  • 监控多样性与遗忘指标:持续监控模型生成文本的Self-BLEU、输出熵、以及在通用基准上的表现。一旦发现多样性骤降或通用能力退化,立即调整策略或回滚。


统一微调与对齐(如ORPO)相比分阶段方法的优势?

传统的分阶段方法(SFT → DPO/RLHF)将指令学习和偏好对齐作为独立的步骤。ORPO(Odds Ratio Preference Optimization) 等统一方法,则试图在一个训练阶段中,使用同一个数据集同时完成两个目标。

优势:

  1. 训练流程极大简化:分阶段方法需要准备两份数据(SFT指令数据 + DPO偏好数据),运行两次或多次训练。统一方法只需一份带有偏好标签的数据,一次训练即可完成,工程复杂度大幅降低。

  2. 避免SFT后的遗忘与分布偏差:分阶段方法中,SFT模型在进入DPO时已被冻结为参考模型。DPO训练可能会遗忘SFT学到的某些风格或能力。统一方法将指令学习和偏好对齐的梯度在每一步更新中融合,模型能够同时兼顾两者,可能找到更优的平衡点。

  3. 数据利用更高效:统一方法可以将SFT数据中的“黄金回答”视为正例,将需要避免的回答(如模型自己生成的次优回答)作为负例,整合进同一个损失函数中,充分利用了所有可用数据。

  4. 对齐成本降低:省去了单独收集或构造大规模偏好数据以及单独训练奖励模型的成本(对于RLHF),或省去了单独的DPO训练阶段。

  5. 潜在性能提升:ORPO等方法声称,在相同的偏好数据下,统一训练能取得比SFT+DPO组合更好的性能,因为模型在学习的早期就受到了偏好的直接约束,避免了先“学偏”再“纠正”的过程。

劣势与挑战:需要对数据格式进行特殊处理(指令+偏好标签),且损失函数的超参(如 λ)需要仔细调整,否则可能导致指令学习或偏好学习一方占据主导。


ORPO的损失函数中,SFT损失和偏好损失如何加权?

ORPO的损失函数是SFT损失和一种基于胜率比(Odds Ratio)的偏好损失之和。

ORPO损失函数:

image.png

如何加权:

  • λ 的设定控制了偏好对齐的强度。如果 λ 过大,模型可能会过度专注于增大胜负回答之间的差距,而牺牲了SFT的指令拟合能力(如回答格式变差)。如果 λ 过小,偏好信号太弱,对齐效果不明显。

  • 实践中,λ 通常通过小规模实验确定,可在 0.1 到 1.0 之间搜索。

  • 在ORPO原始论文中,作者发现将两种损失结合起来,即使 λ 不大(如0.1-0.5),由于SFT和偏好损失的梯度在训练过程中自然地协同,也能取得很好的效果。

  • 另外,ORPO中不涉及参考模型,因此没有DPO中 β 参数那样的KL散度控制。λ 在某种程度上兼任了控制更新幅度的角色。

核心思想:ORPO通过SFT损失提供正向学习信号,通过OR损失提供对比信号(惩罚负例),两者共同作用,使得模型在模仿正确回答的同时,主动远离错误回答。


有哪些新方法试图将SFT和RLHF/DPO融合在一个阶段完成?

除了ORPO,还有一些新方法尝试将指令微调和对齐合二为一:

  • RSO(Rejection Sampling Optimization):它从SFT模型生成大量候选回答,利用一个奖励模型(或强评判模型)进行打分,然后通过拒绝采样筛选出最高质量的回答作为新的SFT目标,同时可以用这些数据进行DPO训练。整个过程将数据生成、筛选和训练融合在一个迭代环路中,模糊了SFT和对齐的界限。

  • RAFT (Reward rAnked Fine-Tuning):从SFT模型生成多个样本,利用奖励模型对它们进行排序。然后,直接使用排名最高的样本作为标准SFT数据来微调模型。这种方法非常简单,没有使用复杂的RL或DPO损失,但通过高质量样本的筛选,间接实现了对齐。

  • Self-Play fIne-tuNing (SPIN):如前所述,它在一轮轮迭代中,将上一轮模型生成的回答作为负例,将人类标准答案作为正例,通过一个类似DPO的损失函数进行训练。它将SFT数据和对齐目标完美融合在自我博弈的框架下。

  • RLHF with SFT data mixing:一些实践直接在PPO训练中混合SFT损失,或者交替进行PPO和SFT步骤,以防止模型在强化学习过程中遗忘语言能力。这虽然不是一种全新的算法,但将两种训练目标在同一阶段进行融合。

  • KTO (Kahneman-Tversky Optimization):它直接利用人类对单个回答的二元反馈(好/坏),而无需成对的偏好数据。这使得数据收集更简单,并且可以直接在SFT数据上叠加“好/坏”标签,从而在一个阶段内同时进行指令和对齐训练。

这些方法共同趋势是简化pipeline,减少训练阶段,降低成本,同时试图在对齐过程中更好地保留模型的基础能力。


增量微调(continual fine-tuning)与终身学习,如何设计?

增量微调(Continual Fine-tuning)是指模型在初次SFT之后,不断使用新产生的、分布可能发生变化的数据进行多轮微调。终身学习 是其最终目标——在无限的数据流中持续学习新知识,同时不遗忘旧知识。

设计一套稳健的增量微调系统需要从数据、算法、架构三个层面入手:

  1. 数据层面——经验回放与核心集维护

  2. 核心记忆缓冲区:维护一个容量固定的缓冲区,里面存放最具代表性的历史数据。挑选原则是最大化任务多样性和数据代表性,覆盖所有核心能力(对话、推理、安全等)。每次增量微调时,新数据与缓冲区旧数据按一定比例混合(如新数据占30%)。这是防遗忘最有效、最基础的方法。

  3. 动态采样与数据配比:根据模型当前在各能力维度上的表现,动态调整不同来源数据的采样权重。对于表现退化的任务,提高其数据比例;对于已饱和的任务,降低比例。

  4. 数据版本控制与回溯:每次数据更新都生成一个不可变的版本号,并记录与模型版本的血缘关系,确保可复现和可回滚。

  5. 算法层面——正则化与知识蒸馏

  6. 弹性权重巩固(EWC):计算旧任务上参数的重要性(Fisher信息矩阵),在新任务训练时,对重要参数的更新施加更大的惩罚,从而保护旧知识。

  7. 知识蒸馏防遗忘(LwF):在训练新数据时,将旧模型作为教师,强制新模型(学生)在旧数据上的输出分布与旧模型保持一致。这不需要存储旧数据,但需要额外存储旧模型或进行前向传播。

  8. 极低学习率与早停:增量微调的学习率应远低于初次SFT(如1/10),防止参数剧烈变动。通过严格监控通用基准,在性能退化时触发早停。

  9. 架构层面——参数隔离与模块化

  10. PEFT(参数高效微调)与适配器插拔:每次增量微调时,冻结基座模型,只训练一个全新的LoRA适配器。旧适配器保留,推理时可根据需求动态挂载。这是从架构上彻底解决遗忘的最优雅方案,实现了能力的完全隔离和按需组合。

  11. MoE动态扩展:对于MoE模型,为每个新任务或新领域增加新的专家,或微调部分专家,而不改动其他专家。通过路由器学习不同任务的专家激活模式。

设计要点:增量微调不是一个“一次性”的训练任务,而是一个需要持续运营的系统。必须建立完善的评估监控体系,确保模型能力在长期迭代中不退化。在实际生产中,通常结合PEFT(如LoRA)和核心集回放,以较低成本实现稳健的终身学习。


模型合并(Model Merging)技术,如TIES、DARE等,能否替代部分微调?

模型合并(Model Merging)技术通过将多个分别在不同任务上微调过的模型(或适配器)的权重进行算术组合,形成一个单一的、具备多重能力的模型。它可以在某些场景下替代微调,但不是完全的替代,而是一种高效的补充和组合手段。

常见技术:

  • TIES (TrIm, Elect Sign, and Merge):通过裁剪小的delta参数(减少干扰)、解决不同模型参数更新的方向性冲突(选举符号),然后合并,实现多任务模型的融合。

  • DARE (Drop And REscale):在合并前,随机丢弃大部分delta参数(如90%),再将剩余的delta放大补偿,再进行合并。该方法能有效消除冗余,提升合并性能。

  • Linear / Spherical Interpolation:最简单的方法,直接将多个模型的权重进行线性或球面插值。

能否替代微调?

  • 可以替代的场景:
  • 多能力组合:当你已经拥有独立的“代码专家”、“数学专家”、“安全专家”等微调模型(或LoRA适配器)时,通过模型合并可以将它们融合成一个具备复合能力的模型,而不需要重新收集混合数据并运行一次大规模的多任务微调。这极大节省了算力。
  • 快速能力编辑:如果你想增强或削弱模型的某个能力,可以通过算术方式将“能力向量”(微调后模型与基座模型的差值)与现有模型合并,实现快速的能力调整,无需重新训练。

  • 不能完全替代的场景:

  • 需要深度知识注入或新能力学习:模型合并只能组合已有能力,无法凭空创造出新的能力。如果没有任何现有的微调模型具备目标能力,则必须进行微调。
  • 任务间存在严重冲突:当不同任务的能力难以通过简单的参数平均来调和时(如极度风格化任务),合并的效果可能不佳,仍然需要针对性地微调。
  • 追求极致单一性能:合并通常在组合模型的能力,可能以牺牲特定任务的极致性能为代价。对于追求单任务SOTA的场景,专项微调仍是必需。

总结:模型合并是“微调生态”中的高效组合器,它利用已有的微调成果,以极低成本实现能力的快速组合与编辑,是替代“多任务重训”的强大工具,但无法替代“从0到1”的能力注入过程。


如何通过“model souping”或“checkpoint averaging”提升微调模型性能?

这两种技术都是通过对多个模型权重进行平均,以获得一个性能更优、泛化性更强的模型,几乎零成本地榨取微调过程的“剩余价值”。

  1. 模型汤(Model Souping)

  2. 做法:针对同一个微调任务,使用不同的超参数(如学习率、随机种子、数据增强策略、不同epoch数)训练出多个模型。然后,将这些模型的权重进行简单的线性平均。

  3. 为什么有效:不同的微调配置会让模型收敛到损失曲面上不同的局部最优点。这些最优点在测试误差上可能各有高低。通过对这些点进行平均,最终的模型往往能落在这些最优点的中心,这个中心点在损失曲面上通常处于一个更宽泛、更平坦的“盆地”,具有更好的泛化性能。

  4. 优点:操作极其简单,无需任何额外训练。

  5. 检查点平均(Checkpoint Averaging)

  6. 做法:在一个微调任务的训练过程中,选取最后若干步(或泛化能力最好的一段区间)的模型checkpoint,将它们的权重进行平均。

  7. 为什么有效:训练后期的模型参数往往在最优区域附近来回震荡。直接使用最后一个checkpoint可能是刚好震荡到某个次优点。将这些checkpoint进行平均,能够平滑掉这种随机震荡,得到一个更接近局部最优中心点的模型。

  8. 优点:可以利用单次训练过程产生的中间结果,无需多次训练。

提升性能的原理(共同点):

这两者都利用了深度学习中损失曲面的几何特性——即平坦的极小值点比尖锐的极小值点具有更好的泛化能力。通过平均多个邻近的模型,可以消除掉模型在训练过程中对特定数据噪声的过拟合,并引导模型偏向更平坦的解。

实践应用:

  • 在微调结束时,保存最后5-10个epoch的checkpoint,进行平均,通常能带来稳定的小幅提升。

  • 若算力允许,用不同随机种子运行3-5次微调,然后对结果进行“模型汤”平均,往往能获得比任何单一模型都更好的泛化效果。

  • 这两种方法可以组合使用:对不同训练配置下的多个“平均checkpoint模型”再次进行模型汤平均。它们是微调流程中“免费的午餐”,值得作为标准收尾步骤。


MoELoRA如何实现多个LoRA专家的动态组合?

MoELoRA(Mixture of Experts LoRA) 是将MoE的稀疏激活思想引入LoRA适配器管理的一种方法,旨在让模型能够动态组合多个经过专项训练的LoRA专家,以处理复杂、多变的输入。

实现动态组合的关键机制:

  1. 为每个专家训练独立的LoRA适配器 针对不同的任务、领域或能力(如代码专家、数学专家、安全专家),分别训练独立的LoRA权重。这些LoRA适配器都被视为潜在的“专家”。

  2. 引入路由器(Router) 在模型的每一层(或每隔几层)插入一个轻量级的路由网络。该路由器以当前输入token的隐藏状态为输入,输出一个概率分布,决定该token应由哪些LoRA专家处理,以及各自的权重。这是一个典型的软路由或稀疏路由机制。

  3. 加权组合专家输出 对于每个线性层,其前向传播过程变为:

output = W₀x + Σ (α/r * gᵢ * BᵢAᵢx)

其中,W₀是冻结的原始权重,gᵢ是路由器为第i个LoRA专家分配的权重,Bᵢ和Aᵢ是该专家的LoRA矩阵。所有专家的输出被加权求和后,加到原始输出上。

  1. 端到端联合训练 将基座模型冻结,只训练所有LoRA专家的矩阵以及路由器的参数。训练数据通常是混合了多种任务的指令数据。通过梯度下降,路由器学会根据输入内容,自动激活最相关的LoRA专家组合。

优势:

  • 容量与效率的平衡:避免了为每个请求激活所有LoRA模块(那会增加巨大计算量),而只在需要时激活相关专家,保持推理效率。

  • 知识解耦与灵活泛化:不同的专家可以专注于不同的能力,路由器则掌握了“何时调用谁”的策略。对于训练时未见过的任务组合,路由器可以激活多个相关专家协同工作,展现出强大的泛化能力。


什么是“adapter soup”?与模型合并有何关系?

Adapter Soup(适配器汤) 是一种将多个独立训练的PEFT适配器(如LoRA)进行加权平均融合,以创建一个具备复合能力的新适配器的技术。它是模型合并(Model Merging)思想在PEFT领域的直接应用和延伸。

实现方法:

  • 分别训练多个LoRA适配器,例如专门针对代码、数学、安全、翻译等能力。

  • 对这些适配器的权重进行简单的线性加权平均:W_merged = Σ w_i * W_i,其中w_i是各适配器的权重。

  • 合并后的适配器可以直接加载到基座模型上,无需任何额外训练,即可让模型同时具备多种能力。

与模型合并的关系:

  • 本质一致:Adapter Soup本质上就是对模型的部分参数(适配器)进行合并,属于模型合并技术的一种特化应用。

  • 技术通用性:任何模型合并技术(如TIES、DARE)都可用于合并适配器。例如,可以先用DARE随机丢弃大部分适配器参数,再进行合并,以消除冗余和参数冲突。

  • 优势互补:相比合并整个大模型(需要TB级存储和大量GPU算力),Adapter Soup只需操作几兆到几十兆的适配器文件,成本极低,速度极快,非常适合快速实验、能力组合和个性化部署。它无需访问原始模型权重,只需在不同任务上微调的适配器即可。

应用场景:快速构建一个既能写代码,又能用中文解释代码,同时还能拒绝恶意代码请求的个性化编程助手。


如何在移动端或端侧进行高效微调?有哪些量化微调方案?

移动端/端侧设备(手机、IoT设备)资源极度受限(内存<8GB,无独立显存),无法运行标准的FP16/FP32微调。因此,必须采用参数高效微调(PEFT)与极致模型量化相结合的方案。

核心策略:

  • 基座模型极致量化:将预训练模型权重量化到4-bit甚至更低的精度,如使用GPTQ或AWQ进行4-bit权重量化,使其内存占用降至原本的1/4以下。

  • PEFT限制可训练参数:使用LoRA或其变体(如QLoRA),仅训练极少量适配器参数,冻结量化后的基座权重。

具体量化微调方案:

  • QLoRA(Quantized LoRA):这是目前端侧微调的事实标准。它将基座权重量化为4-bit NormalFloat(NF4),并冻结。前向和反向传播时,将4-bit权重动态反量化为BF16/FP16进行计算,计算完后释放。梯度只更新BF16/FP16精度的LoRA适配器。它能在单张8GB内存手机上微调7B模型。

  • PEQA(Parameter-Efficient and Quantization-Aware Adaptation):在模型量化后,不添加外部适配器,而是微调量化步长(scale)等参数。这使得微调的参数极少,且与量化推理引擎完全兼容。

  • 结合知识蒸馏:先让一个强大的云端模型生成面向端侧场景的合成微调数据,再用这些数据在端侧进行QLoRA微调。云端复杂推理+端侧轻量适配。

  • 使用端侧推理引擎:微调完成后,使用专门针对移动端优化的推理引擎(如llama.cpp, MLC-LLM, MediaPipe)进行部署,这些引擎对量化模型有极致的内存和CPU/GPU/NPU调度优化。

挑战:即使使用QLoRA,训练时仍需临时解量化,内存和计算压力依然存在。因此,端侧微调通常适用于小批量数据的个性化适配,而非常规大规模训练。


端侧微调(on-device fine-tuning)面临哪些挑战?如何解决?

端侧微调在隐私保护和个性化方面具有巨大潜力,但在资源极度受限的设备上面临严峻挑战。

  1. 计算与内存瓶颈

  2. 挑战:设备通常只有4-8GB共享内存,CPU/GPU算力远逊于云端。微调需要同时存储模型权重、梯度、优化器状态和激活值,极易OOM。

  3. 解决:使用QLoRA(4-bit基座+BF16 LoRA)将模型内存降至GB级别;使用更小的秩(如r=4);采用分页优化器(Paged Optimizers)将部分状态卸载到闪存;进行梯度检查点(Gradient Checkpointing)控制激活内存。

  4. 训练效率与功耗

  5. 挑战:微调是计算密集型任务,会迅速耗尽手机电量,并导致设备严重发热。

  6. 解决:利用手机NPU(神经网络处理器)进行部分计算卸载(如MLC-LLM支持);使用低功耗蓝牙/Wi-Fi连接云端进行混合训练(如联邦学习);限制训练的batch size和步数,通常仅微调极少量参数进行快速适配。

  7. 数据异构与隐私

  8. 挑战:端侧数据是高度个人化的,样本量极少(Few-shot),且绝对不允许上传。

  9. 解决:这正是端侧微调的意义所在。采用联邦学习(Federated Learning) 框架:用户在本地数据上微调,仅将梯度更新(或LoRA权重)加密上传到云端聚合,原始数据永不离设备。同时,可应用差分隐私(DP)向梯度中添加噪声,提供数学上的隐私保证。

  10. 软件栈碎片化与部署

  11. 挑战:不同设备的芯片(高通、苹果A/M系列、麒麟)、操作系统、AI框架差异巨大,导致模型格式和算子支持不统一。

  12. 解决:依赖跨平台的端侧推理引擎(如llama.cpp, ExecuTorch, MLC-LLM),它们为各平台提供了统一的模型格式和量化方案。模型训练完成后,可一键转换为目标格式。


合成数据飞轮在微调中的闭环是如何运作的?怎样保证质量不过度下降?

合成数据飞轮 是一个利用模型自身或强模型生成数据,再用这些数据训练更强模型的自动化、自循环系统。其闭环运作流程如下:

  1. 初始SFT模型(V1):使用人类标注数据训练一个基础SFT模型。

  2. 候选回答生成:对于大量无标签或仅有指令的数据,用V1模型以高温度和多样化的解码策略生成多个候选回答。

  3. 自动过滤与评分:通过多层过滤器(规则检查、困惑度过滤、安全审核)和一个强评判模型(如GPT-4或V1自身)对候选回答进行多维度打分。

  4. 构造高质量数据集:保留得分最高的回答,构造新的SFT或偏好对齐(DPO)数据集。

  5. 训练新模型(V2):使用该数据集训练出更强的V2模型。

  6. 循环:V2成为新的生成器,回到步骤2,生成更高质量的数据,再训练V3,如此循环。

如何保证质量不过度下降? 这是飞轮的核心风险——模型退化(Model Collapse)。防止措施包括:

  • 注入“新鲜血液”:定期向循环中加入新的人工标注数据、来自其他强模型的数据,或来自真实用户的新指令,打破数据的同质化和封闭性。

  • 使用冻结的高标准评判器:始终使用一个最初表现优异的、冻结的强模型(如GPT-4)作为评判器,而不是用不断进化的模型自身。这能确保评判标准不随时间发生漂移。

  • 多样性约束:在数据筛选时,加入多样性过滤器(如语义去重),确保数据集的分布不会坍缩。

  • 对抗性样本注入:在生成阶段,刻意生成对抗性、诱导模型犯错的问题,并将其加入训练,提升模型鲁棒性,避免其只学会生成“安全但平庸”的回答。

  • 持续监控通用基准:在每一轮迭代后,在独立的通用基准(如MMLU)和多样性指标(Self-BLEU)上评估模型。一旦指标恶化,立即停止飞轮并分析原因。


如何利用“rejection sampling”从大量生成中迭代提升微调数据?

拒绝采样(Rejection Sampling) 在微调数据迭代中是一种“择优录取”的精炼策略。它不直接使用模型生成的所有回答,而是先生成大量候选,再通过严格的评判系统只接受高质量样本,以此不断提升数据集的质量,进而训练出更强的模型。

迭代流程:

  1. 批量生成:对一批指令,使用当前最优模型以较高温度(>0.7)和不同随机种子生成4-8个候选回答,确保多样性。

  2. 多级过滤与评分:

  3. 规则过滤器:快速剔除格式错误、乱码、过短、不安全内容。
  4. 困惑度过滤器:用基座模型计算PPL,剔除过高(混乱)或过低(空洞)的回答。
  5. 强模型评判(LLM-as-Judge):让GPT-4等顶级模型根据准确性、有用性、流畅性等维度对剩余候选回答打分或排序。为消除位置偏差,可交换顺序评判两次。

  6. 择优录取:对每条指令,只保留评判模型得分最高的那个回答,并将其与指令配对,形成新的SFT数据集。

  7. 训练新模型:用这个高质量的筛选数据集训练下一代模型。新模型的能力更强,其生成质量也会更高。

  8. 开启下一轮迭代:用新模型再次生成、评判、筛选、训练,形成螺旋上升。

关键优势:它将数据生成与质量控制解耦。生成时鼓励模型大胆创造(高温度),质量控制时则严苛筛选,从而在保证质量的前提下,最大化数据的多样性。这个过程本质上是在模拟一个基于模型自身能力的进化过程。


解释“instruction backtranslation”结合自我改进的流程。

指令回译(Instruction Backtranslation) 是一种利用海量无标签文本数据来生成高质量微调指令-回答对的技术。它将“写回答”和“写指令”的过程逆转,从而极大地扩展了可用的训练数据。

结合自我改进的完整流程:

  1. 初始种子模型:拥有一个初步的SFT模型,它至少具备基本的指令遵循能力和一定的文本生成能力。

  2. 文本收集与回答生成:收集大量高质量、无标签的文本片段(如维基百科段落、技术文档、书籍章节)。这些文本将作为“标准回答”。

  3. 指令生成(回译):让初始种子模型扮演“指令生成器”:“请根据以下文本内容,推测用户可能提出了什么问题,才得到了这段回答?请生成相应的指令。” 这样,我们就为每段文本生成了对应的指令,形成了初始的 (指令, 回答) 对。

  4. 自我改进与迭代:

  5. 质量评分:用种子模型(或更强的模型)对生成的 (指令, 回答) 对进行质量打分,评估指令是否合理、与回答是否匹配。
  6. 筛选与重训:保留高质量的数据对,作为新的SFT训练数据,微调种子模型,得到更强的模型V2。
  7. 迭代:V2模型拥有了更强的文本理解和指令生成能力。用它再次对新的无标签文本进行“指令回译”,将能生成更精准、更多样的指令。同时,V2本身也可以作为更强的“回答生成器”。
  8. 形成闭环:无标签文本 -> 模型生成指令 -> 模型自评质量 -> 筛选高质量数据 -> 训练更强模型 -> 更强模型再来回译。这个闭环使得模型能够持续从无标签文本中自我学习和进化。

优势:它打破了高质量SFT数据对人工标注的依赖。只要有海量高质量文本,就能持续自动地生产高质量的多轮、多任务指令数据,实现模型的自我迭代。


在微调中应用“reinforcement learning from execution feedback”(RLEF)是什么?

RLEF(来自执行反馈的强化学习) 是一种将代码、数学等可执行任务的执行结果作为反馈信号,来微调语言模型的技术。

核心思想:对于代码、数学等有确定答案或可通过编译器/解释器验证的任务,奖励信号不是来自人类偏好或AI评判,而是来自客观的执行结果。这是一个极强的、无偏的奖励信号。

微调流程:

  1. 问题与模型生成:对于编程问题,SFT模型生成代码;对于数学题,模型生成解题过程并给出答案。

  2. 执行与验证:

  3. 代码:将生成的代码提交到沙箱环境中运行,编译并执行单元测试。根据通过测试的数量、运行时间等,给出一个二进制奖励(通过/失败) 或连续奖励(如通过的测试比例)。
  4. 数学:将模型生成的数学表达式与标准答案进行符号化验证(如通过SymPy),判断是否等价。奖励为正表示正确。

  5. 强化学习训练:使用这个“执行反馈”作为奖励信号,应用PPO或类似的强化学习算法来微调模型。模型为了最大化期望奖励(即写出能跑通的代码或算出正确结果),会不断学习如何生成更高质量、更正确的代码或推理链。

  6. 迭代:训练出的新模型能解决更难的问题,生成新的代码/答案,再次获得执行反馈,持续提升。

优势:奖励信号客观、无偏、可自动化大规模获取。它能引导模型去追求真正可执行的、正确的解决方案,而不仅仅是“看起来正确”。


如何微调模型使其能调用API并处理返回结果?多步工具调用微调。

这属于构建 AI Agent 的核心微调任务。需要教会模型“何时调用”、“如何调用”以及“如何基于返回结果继续行动”。

微调数据格式(单步与多步工具调用):

  1. 单步工具调用数据示例
<|im_start|>system
你可以使用以下工具:
{"name": "get_weather", "description": "查询指定城市的天气", "parameters": {"city": {"type": "string"}}}
<|im_end|>
<|im_start|>user
今天北京天气怎么样?
<|im_end|>
<|im_start|>assistant
<tool_call>{"name": "get_weather", "arguments": {"city": "北京"}}</tool_call>
<|im_end|>
<|im_start|>tool_response
{"temperature": 25, "condition": "晴"}
<|im_end|>
<|im_start|>assistant
北京今天晴天,气温25°C。
<|im_end|>

关键:使用特殊Token(如 <tool_call></tool_call>)标记工具调用的JSON,并为工具返回结果设立 tool_response 角色。训练时,对 system, user, tool_response 部分进行Loss Masking,只学习 assistant 生成的部分。

  1. 多步工具调用(串行依赖):模型需要根据第一个API的结果,决定调用第二个API。
... (上下文) ...
<|im_start|>assistant
<tool_call>{"name": "search", "arguments": {"query": "2024年诺贝尔物理学奖得主"}}</tool_call>
<|im_end|>
<|im_start|>tool_response
{"results": ["约翰·霍普菲尔德", "杰弗里·辛顿"]}
<|im_end|>
<|im_start|>assistant
<tool_call>{"name": "get_age", "arguments": {"name": "杰弗里·辛顿"}}</tool_call>
<|im_end|>
...

数据构造要点:

  • 覆盖多样的调用模式:并行调用(同时查询多个城市天气)、串行依赖调用、错误处理(API返回错误信息时模型如何修正或请求用户澄清)。

  • 包含“无需调用”的样本:数据中也必须有大量不需要调用工具就能直接回答的指令,训练模型判断“何时不应调用工具”。

  • 使用强模型生成数据:让GPT-4等模拟上述完整对话过程,可快速生成大量高质量、带有多步工具调用的训练数据。


代码执行反馈(如编译器输出)如何融入微调信号?

编译器、解释器、测试框架等工具的输出是客观、无偏且可自动获取的反馈信号。将这种执行反馈融入微调,能显著提升模型生成正确、可运行代码的能力。

融入方式一:构造“尝试-错误-修正”的SFT数据

这是最直接的方式。构造包含完整错误和修正过程的对话数据。

  • 用户指令:“写一个Python函数,计算两个数的最大公约数。”

  • 模型初始回答:生成代码,但故意包含一个逻辑错误(例如,使用了整数除法 // 但在循环中处理不当)。

  • 工具返回(模拟):<tool_response> Traceback (most recent call last): ... ZeroDivisionError: division by zero </tool_response>

  • 模型修正回答:“等等,我发现我的代码在处理0时出现了ZeroDivisionError。我应该先检查输入是否为0。修正后的代码如下:...”

  • 训练要点:对“错误初始回答”进行Loss Masking(labels=-100),只让模型学习“根据错误信息分析并给出修正代码”这一过程。

融入方式二:强化学习(RLEF)

  • 奖励信号:将生成的代码在沙箱中运行,根据单元测试的通过率、执行时间、内存消耗等给出一个客观的标量奖励。

  • RL训练:使用PPO等算法,以这个奖励信号为目标微调模型。模型为了最大化奖励,会主动学习如何生成能通过测试的代码,并能理解错误信息以进行自我修正。

融入方式三:拒绝采样

  • 生成大量代码候选。

  • 运行所有代码,只保留那些成功通过所有测试用例的代码作为SFT训练目标。这样能简单粗暴地保证训练数据的绝对正确性。

核心价值:将抽象的语言模型训练与具体、可执行的物理世界反馈相结合,让模型学会对自己的输出“负责”。


什么是“process supervision”微调?与结果监督有何区别?

过程监督(Process Supervision) 和 结果监督(Outcome Supervision) 是指导模型进行复杂推理时的两种不同反馈机制,尤其在数学、逻辑和代码领域。

查看内嵌表格

微调中的应用:过程监督微调要求SFT数据中不仅包含最终答案,还必须包含完整的、被逐行标注了正确性的思维链。或者,使用PRM在RLHF中对每个推理步骤提供奖励,引导模型进行“深思熟虑”的探索。


如何通过微调让模型具备使用外部知识库(RAG)的决策能力?

RAG(检索增强生成)的决策能力,是指模型能够自主判断何时需要查询外部知识库、如何查询、以及如何根据检索结果回答问题。这需要通过微调来注入。

  1. 构造决策训练数据

数据格式需模拟完整的RAG流程:

  • 需要检索的样本:问题超出模型内部知识(如新闻、特定文档内容)或要求实时信息。回答以特殊标记开始,如 <search> 关键字 </search>,随后是检索工具返回的文档片段,最后是模型基于文档的综合回答。

  • 不需要检索的样本:通用知识问答、创意写作、闲聊。模型直接给出回答,不输出任何检索标记。

  • 检索失败/信息不足的样本:检索到无关文档,模型应回复“根据现有资料无法回答”,或请求用户澄清。

  • 训练模型

使用这些数据对模型进行SFT。模型将学会:

  • 检索触发:当遇到特定类型的问题时,学会生成 <search> 标记作为动作。

  • 查询生成:学会如何将用户的自然语言问题,转化为高效的关键词搜索查询。

  • 结果整合:学会如何阅读、引用、综合多个文档片段,并生成连贯的回答。

  • 强化学习微调(可选)

设计一个奖励函数,当模型正确判断是否需要检索,并生成了高质量查询和准确回答时给予高分;当模型在不必要时检索(浪费资源)或在必要时不检索(导致幻觉)时给予低分。通过RL进一步优化模型的决策能力。


在微调中融入“检索增强”数据,模型需要学会何时检索。

这与上一问题紧密相关。核心是让模型掌握检索的“时机”。

实现方法:

  • 数据配比:在SFT数据中,刻意混合三种类型的数据:①需要检索并成功检索的例子(30%);②不需要检索,直接回答的例子(60%);③需要检索但检索不到,模型应表达不知道的例子(10%)。

  • 奖励模型设计:在RL阶段,为模型的行为设计精细的奖励。

  • +1:在应该检索时,正确发起了检索。
  • -1:在应该检索时,没有发起检索(导致生成幻觉)。
  • -0.5:在不应该检索时,却发起了检索(浪费计算资源)。

  • 推理时的系统提示:在系统提示中明确告知模型其具备检索能力,并给出何时检索的指导原则,如“如果你对答案不确定或需要最新信息,请使用检索工具”。

通过上述训练,模型可以内化一套有效的检索决策策略,从而成为一个高效、自主的RAG系统。