[算法学习] SPCT(Self-Principled Critique Tuning)的简易复现
[算法学习] SPCT(Self-Principled Critique Tuning)的简易复现
[算法学习] SPCT(Self Principled Critique Tuning)的简易复现 [算法学习] SPCT(Self Principled Critique Tuning)的简易复现 Modified April 11, 2025 1490 1691 综合评价:该回答不够全面,尤其忽略了心理健康方面的益处。根据这些原则,当前回答大约只能算6/10分。” 在这个批评中,模型指出了原答案的主要不足:不够全面(缺少心理健康方面),解释不够深入等,并给出了一个总体评价分数6/10作为参考。 ✍️ 修订后的答案(Revised Answer): “定期运动对健康有诸多益处。首先,在身体方面,运动能增强肌肉力量和心肺功能,提高耐力;还可以帮助控制体重,预防肥胖相关疾病。其次,在心理方面,规律运动被证明可以缓解压力,改善情绪,提高睡眠质量,从而增进心理健康。此外,持续运动还能增强免疫力,使身体更能抵御疾病。这些因素共同促进了身心全面的健康提升。” ✅ 这个修订答案显然更全面准确:不仅涵盖了身体健康,也提到了心理健康和免疫力,并稍微解释了为什么(如缓解压力、增强免疫)。 🧮 损失函数计算(训练信号): 在训练中,我们需要衡量模型的这一系列输出是否“正确”以及如何调整。假设我们有一个理想的参考答案或人类评价:比如人类认为提到身心两方面才是优秀答案。如果模型通过批评最终修订的答案与人类的高分答案接近,那么说明模型的批评是有效的。训练时会给予这个批评 修订过程正向的奖励信号。 SPCT在强化学习阶段会根据模型的评价是否正确来计算奖励:如果模型的批评准确指出了原答案的问题且修订答案质量确实提高,我们视其为一次成功,给模型一个正奖励(比如+1);如果模型漏掉重大问题或批评不当导致修订答案仍不理想,则给予负奖励(比如 1)。 同时,为保证文本生成的合理性,还会有一个约束使模型输出保持流畅和格式正确。最终的损失函数会让模型倾向于产生能提升答案质量的批评。例如,上例中模型批评完整指出了遗漏的心理健康点并加以修订,这在训练中会被视为正确行为,模型参数将更新以强化这种模式。在大量类似训练实例的累积下,模型学会对各种问题产生恰当的原则和批评,以引导自己走向更好的回答。 不同模型规模下SPCT的效果差异 SPCT对小模型和大模型都有显著的对齐效果提升,但体现形式略有不同。 对较小规模模型(百亿参数以下)的提升:小模型本身的推理和自我评估能力有限,SPCT为它们提供了一种结构化的思考方式,相当于教会小模型一套“自我检查清单”。因此,小模型经过SPCT训练后,在对齐方面有明显进步:能够按照原则审视自己的输出,避免一些常识性错误和不恰当内容。实验证明,小模型应用SPCT后性能大幅逼近甚至超过比它更大的未用该方法的模型。例如,一项基准测试中,一个只有16B参数的模型使用SPCT训练后,达到了约64.9的得分,几乎追平了基于27B参数模型的传统方法(得分65.8)。也就是说,通过SPCT,小模型的评判和对齐能力接近了原本大很多的模型的水平。这表明SPCT有效地弥补了小模型在理解和评价上的短板。 对超大规模模型(千亿参数级别)的影响:大型模型本身已经具备相当强的理解和推理能力,可能在一定程度上会自行涌现出对原则的把握。对这些模型而言,SPCT起到的是巩固和微增强的作用。一方面,SPCT能进一步提高大型模型在复杂评价任务上的准确性和一致性,让它们在细微之处做得更好(例如更稳健地区分细节优劣,不被微小偏差误导)。另一方面,SPCT在大模型上保持了稳定效果,意味着并不会因为引入自我批评流程而破坏原有能力或引入大的偏差。实验显示,采用SPCT的大模型在各项对齐基准上均取得了与或高于原始模型的性能,同时依然保持对不良输出的低偏好,没有出现严重偏差。 另外,SPCT还允许大模型充分利用其容量:例如在推理时可以生成多样化的原则和评估角度,然后通过投票机制汇总(由另一个元奖励模型辅助决策),从而进一步提高评判的细粒度和可靠性。这种“用更大算力换更高性能”的扩展在大模型上尤为有效,因为大模型可以想出更多不同的合理原则来衡量答案。总体而言,大模型应用SPCT后要么性能小幅提升,要么与原有高水平持平但更稳健,证明SPCT对大模型是一个安全且有益的增强。 本地模拟测试脚本 下面写了一个flow,基于SPCT的步骤来提升小模型的输出能力。示例模型为:qwen/qwen2.5 vl 3b instruct 可以在Openrouter直接用API调用(免费) 示例: 步骤1:自定义一个问题,生成一个非常简短的描述 步骤2:自定义评价原则 步骤3:生成批评评分(这里demo的评分没那么严格,仅做示意) 步骤4:修订后的回答 修订回答遵循改进建议做了调整。 重复步骤3: 评分相应增加。 步骤5:总结计算改进 这里只是个demo,实际的问题可以通过类似的思路改进。可以看到通过批评奖励机制,LLM可以通过自己对问题审视性的理解做出判断(又当裁判又是选手),通过发现问题,提出建议,迭代回答的方法进一步提升回答质量。也可以通过自定义一些高质量的数据集做SFT,这里不单独举例了。 本地代码已上传,没有特别细致调整,只是做了个大概逻辑便于理解 No access SPCT test.py 总结:Self Principled Critique Tuning作为一种自我反馈驱动的对齐训练方法,无论在小模型还是大模型上都展示出价值。它让小模型学会“思考自己的思考”,显著改善了它们按照人类期望评判和改进答案的能力;对大模型则提供了一种保持高水准输出同时进一步发掘潜力的途径。 凭借SPCT产生的自适应原则和精确批评,模型在各种开放问答场景下的表现质量和可控性都有所提高,达到了比单纯增加模型规模或传统微调更优的效果。未来,我们有理由期待SPCT在更多任务上应用,帮助各规模的模型更加可靠地对齐人类意图。 综合评价:该回答不够全面,尤其忽略了心理健康方面的益处。根据这些原则,当前回答大约只能算6/10分。” 在这个批评中,模型指出了原答案的主要不足:不够全面(缺少心理健康方面),解释不够深入等,并给出了一个总体评价分数6/10作为参考。 综合评价:该回答不够全面,尤其忽略了心理健康方面的益处。根据这些原则,当前回答大约只能算6/10分。” 在这个批评中,模型指出了原答案的主要不足:不够全面(缺少心理健康方面),解释不够深入等,并给出了一个总体评价分数6/10作为参考。 ✍️ 修订后的答案(Revised Answer): “定期运动对健康有诸多益处。首先,在身体方面,运动能增强肌肉力量和心肺功能,提高耐力;还可以帮助控制体重,预防肥胖相关疾病。其次,在心理方面,规律运动被证明可以缓解压力,改善情绪,提高睡眠质量,从而增进心理健康。此外,持续运动还能增强免疫力,使身体更能抵御疾病。这些因素共同促进了身心全面的健康提升。” “定期运动对健康有诸多益处。首先,在身体方面,运动能增强肌肉力量和心肺功能,提高耐力;还可以帮助控制体重,预防肥胖相关疾病。其次,在心理方面,规律运动被证明可以缓解压力,改善情绪,提高睡眠质量,从而增进心理健康。此外,持续运动还能增强免疫力,使身体更能抵御疾病。这些因素共同促进了身心全面的健康提升。” ✅ 这个修订答案显然更全面准确:不仅涵盖了身体健康,也提到了心理健康和免疫力,并稍微解释了为什么(如缓解压力、增强免疫)。 🧮 损失函数计算(训练信号): 在训练中,我们需要衡量模型的这一系列输出是否“正确”以及如何调整。假设我们有一个理想的参考答案或人类评价:比如人类认为提到身心两方面才是优秀答案。如果模型通过批评最终修订的答案与人类的高分答案接近,那么说明模型的批评是有效的。训练时会给予这个批评 修订过程正向的奖励信号。 SPCT在强化学习阶段会根据模型的评价是否正确来计算奖励:如果模型的批评准确指出了原答案的问题且修订答案质量确实提高,我们视其为一次成功,给模型一个正奖励(比如+1);如果模型漏掉重大问题或批评不当导致修订答案仍不理想,则给予负奖励(比如 1)。 同时,为保证文本生成的合理性,还会有一个约束使模型输出保持流畅和格式正确。最终的损失函数会让模型倾向于产生能提升答案质量的批评。例如,上例中模型批评完整指出了遗漏的心理健康点并加以修订,这在训练中会被视为正确行为,模型参数将更新以强化这种模式。在大量类似训练实例的累积下,模型学会对各种问题产生恰当的原则和批评,以引导自己走向更好的回答。 不同模型规模下SPCT的效果差异 SPCT对小模型和大模型都有显著的对齐效果提升,但体现形式略有不同。 对较小规模模型(百亿参数以下)的提升:小模型本身的推理和自我评估能力有限,SPCT为它们提供了一种结构化的思考方式,相当于教会小模型一套“自我检查清单”。因此,小模型经过SPCT训练后,在对齐方面有明显进步:能够按照原则审视自己的输出,避免一些常识性错误和不恰当内容。实验证明,小模型应用SPCT后性能大幅逼近甚至超过比它更大的未用该方法的模型。例如,一项基准测试中,一个只有16B参数的模型使用SPCT训练后,达到了约64.9的得分,几乎追平了基于27B参数模型的传统方法(得分65.8)。也就是说,通过SPCT,小模型的评判和对齐能力接近了原本大很多的模型的水平。这表明SPCT有效地弥补了小模型在理解和评价上的短板。 对超大规模模型(千亿参数级别)的影响:大型模型本身已经具备相当强的理解和推理能力,可能在一定程度上会自行涌现出对原则的把握。对这些模型而言,SPCT起到的是巩固和微增强的作用。一方面,SPCT能进一步提高大型模型在复杂评价任务上的准确性和一致性,让它们在细微之处做得更好(例如更稳健地区分细节优劣,不被微小偏差误导)。另一方面,SPCT在大模型上保持了稳定效果,意味着并不会因为引入自我批评流程而破坏原有能力或引入大的偏差。实验显示,采用SPCT的大模型在各项对齐基准上均取得了与或高于原始模型的性能,同时依然保持对不良输出的低偏好,没有出现严重偏差。 另外,SPCT还允许大模型充分利用其容量:例如在推理时可以生成多样化的原则和评估角度,然后通过投票机制汇总(由另一个元奖励模型辅助决策),从而进一步提高评判的细粒度和可靠性。这种“用更大算力换更高性能”的扩展在大模型上尤为有效,因为大模型可以想出更多不同的合理原则来衡量答案。总体而言,大模型应用SPCT后要么性能小幅提升,要么与原有高水平持平但更稳健,证明SPCT对大模型是一个安全且有益的增强。 本地模拟测试脚本 下面写了一个flow,基于SPCT的步骤来提升小模型的输出能力。示例模型为:qwen/qwen2.5 vl 3b instruct 可以在Openrouter直接用API调用(免费) 示例: 步骤1:自定义一个问题,生成一个非常简短的描述 步骤2:自定义评价原则 步骤3:生成批评评分(这里demo的评分没那么严格,仅做示意) 步骤4:修订后的回答 修订回答遵循改进建议做了调整。 重复步骤3: 评分相应增加。 步骤5:总结计算改进 这里只是个demo,实际的问题可以通过类似的思路改进。可以看到通过批评奖励机制,LLM可以通过自己对问题审视性的理解做出判断(又当裁判又是选手),通过发现问题,提出建议,迭代回答的方法进一步提升回答质量。也可以通过自定义一些高质量的数据集做SFT,这里不单独举例了。 本地代码已上传,没有特别细致调整,只是做了个大概逻辑便于理解 No access SPCT test.py No access SPCT test.py 总结:Self Principled Critique Tuning作为一种自我反馈驱动的对齐训练方法,无论在小模型还是大模型上都展示出价值。它让小模型学会“思考自己的思考”,显著改善了它们按照人类期望评判和改进答案的能力;对大模型则提供了一种保持高水准输出同时进一步发掘潜力的途径。 凭借SPCT产生的自适应原则和精确批评,模型在各种开放问答场景下的表现质量和可控性都有所提高,达到了比单纯增加模型规模或传统微调更优的效果。未来,我们有理由期待SPCT在更多任务上应用,帮助各规模的模型更加可靠地对齐人类意图。 基础概念与核心思想 Self Principled Critique Tuning(SPCT)是一种用于LLM对齐和奖励建模的创新训练方法。简单来说,SPCT让模型学会自己制定“原则”(评判标准),并根据这些原则对回答进行“批评”(评分),从而改进模型的输出质量和对齐效果。它的提出是为了应对强化学习(RL)中奖励信号获取困难的问题:在开放领域里,很难用人工规则或简单评分直接评估模型回答的好坏。SPCT的核心思想是让模型自行生成评价标准并进行自我反馈,类似于模型既当裁判又当选手,通过自我批判来提升表现。 SPCT背后的动机是,如果模型能自适应地生成评价准则(比如回答应满足准确性、完整性、安全性等原则),并据此对回答打分或提出改进建议,那么模型的推理过程会更加透明可控,输出的奖励评估(或者回答质量)会更加准确细致。这种方法被称为“自原则”的批评微调,是因为评判的标准不是预先硬编码给模型的,而是由模型根据具体问题和回答动态生成。通过这种自我批评式的训练,模型被引导去产生高质量的反馈,从而提升自身在各种任务上的对齐能力和性能。 SPCT的计算逻辑与工作流程 SPCT的工作流程可以分为两个阶段:拒斥式微调(Rejective Fine Tuning, RFT)阶段,然后是基于规则的在线强化学习(Rule Based Online RL)阶段。整个流程旨在教会模型生成“批评”(critique)并利用批评来改进答案。具体的分步计算逻辑: 1. 原始回答生成:假设有一个输入问题,模型(例如一个对话或问答模型)先给出一个初始回答。这个回答可能不完美,可能包含错误或不完整的地方。 2. 原则生成(Principle Generation):接着,模型根据问题和自己的回答,自适应地生成一系列评判原则。这些原则可以理解为评价标准或准则,例如“内容是否准确”、“解释是否清晰”、“是否遵守安全规范”等等。模型会为每个原则赋予一定的权重或重要性。这一步就好比模型在扮演考官,先制定评分标准。这意味着原则不再是固定的预处理步骤,而是模型输出的一部分,能够针对不同的问题和答案动态调整。 3. 批评生成(Critique Generation):在确定了原则之后,模型依据这些原则对先前的回答进行批评性评价。这个批评通常以文本形式给出,可能包括对每条原则的打分、对回答中哪里符合或违背了原则的分析,以及总体上的优缺点评价。简单来说,模型用自己制定的标准来审核自己的回答,指出好的方面和不足之处。 4. 修订答案生成(Revised Answer):有了批评意见后,我们将批评与原答案结合,让模型生成一个修订后的答案。这个修订答案会针对批评中指出的问题进行改进,力求更符合之前制定的原则。换句话说,模型先批评自己的答案,然后根据这些反馈再尝试回答一次,产生改进版本。 5. 训练与损失函数:在训练过程中,要让模型学会上述过程,需要设计合适的损失函数和训练信号。在SPCT中,训练分为预训练式微调和强化学习两个阶段: 拒斥式微调阶段(RFT):先使用监督数据教模型如何按照正确格式生成原则和批评。这一步会提供一些示例,让模型了解怎样的原则 批评 评分是正确的。与此同时采用“拒斥”策略过滤不良输出:如果模型预测的奖励评价与真实奖励信号(例如人类偏好或基准答案)不一致,这些案例会被拒绝或降低权重来训练。通过这种方式,模型在初始阶段就学会避免明显错误的评价。 基于规则的强化学习阶段(在线RL):微调完成后,利用强化学习进一步优化模型的批评生成行为。在这个阶段,设定一个奖励函数:当模型依据自己生成的原则正确地评判了答案时(例如模型挑选出更优的回答或正确指出了错误),就给予正的奖励;如果评价错误(比如没有选出更好的回答或原则不合理),则给予负的奖励。模型通过策略梯度等RL算法来最大化预期奖励。同时加入一定的KL散度正则项,避免模型偏离原有语言分布太远(保证输出格式和内容稳定)。最终的损失函数可以理解为: (评价正确性奖励) + λ KL约束,其中评价正确性由模型批评所产生的判断是否符合真实答案优劣来衡量。例如,在有标准答案或人类偏好打分的任务中,如果模型的批评导致修订答案更接近高分答案,则奖励较高,损失降低;反之则损失增大。通过反复训练,模型渐渐学会生成有用的批评,从而提高最终答案质量。 拒斥式微调阶段(RFT):先使用监督数据教模型如何按照正确格式生成原则和批评。这一步会提供一些示例,让模型了解怎样的原则 批评 评分是正确的。与此同时采用“拒斥”策略过滤不良输出:如果模型预测的奖励评价与真实奖励信号(例如人类偏好或基准答案)不一致,这些案例会被拒绝或降低权重来训练。通过这种方式,模型在初始阶段就学会避免明显错误的评价。 基于规则的强化学习阶段(在线RL):微调完成后,利用强化学习进一步优化模型的批评生成行为。在这个阶段,设定一个奖励函数:当模型依据自己生成的原则正确地评判了答案时(例如模型挑选出更优的回答或正确指出了错误),就给予正的奖励;如果评价错误(比如没有选出更好的回答或原则不合理),则给予负的奖励。模型通过策略梯度等RL算法来最大化预期奖励。同时加入一定的KL散度正则项,避免模型偏离原有语言分布太远(保证输出格式和内容稳定)。最终的损失函数可以理解为: (评价正确性奖励) + λ KL约束,其中评价正确性由模型批评所产生的判断是否符合真实答案优劣来衡量。例如,在有标准答案或人类偏好打分的任务中,如果模型的批评导致修订答案更接近高分答案,则奖励较高,损失降低;反之则损失增大。通过反复训练,模型渐渐学会生成有用的批评,从而提高最终答案质量。 通过上述训练流程,模型学会了完整的自我评估链条:输出答案 → 制定标准 → 批评反馈 → 修正答案。在推理阶段(实际使用时),我们也可以只利用模型的批评能力:例如让模型以原则+批评的形式对多个候选回答打分,选择最佳的答案作为输出,从而提升回答的可靠性和对齐性。 SPCT的具体实例演示 🧪 示例:健康知识问答任务 问题: 为什么定期运动有益健康? ⛔️ 初始回答(未优化的版本): “运动能增强身体,提高力量和耐力。” “运动能增强身体,提高力量和耐力。” 这句话看起来没错,但不够完整也没解释为什么运动有这些好处。 ✅ SPCT生成的“自我原则”: SPCT训练的模型在生成回答后,会提出一些评判此回答的原则,例如: 全面性:是否涵盖身体、心理等各方面的健康益处? 逻辑性:是否说明“为什么”运动能带来这些效果? 语言清晰:表达是否准确、通顺、无模糊措辞? (模型可能还会给每个原则一个权重,表示其重要性。例如完整性权重40%,准确性30%,详实性30%。) 全面性:是否涵盖身体、心理等各方面的健康益处? 逻辑性:是否说明“为什么”运动能带来这些效果? 语言清晰:表达是否准确、通顺、无模糊措辞? (模型可能还会给每个原则一个权重,表示其重要性。例如完整性权重40%,准确性30%,详实性30%。) 📋 SPCT生成的“批评”: • 全面性不够:只提了体力增强,未提及运动对心理、免疫、疾病预防等益处。 • 缺乏因果逻辑:没有解释“为什么”运动会增强力量。 • 语言平淡:语句太短,不足以支撑“健康”这个广义目标。