RLHF
【2023-7-2】思考:
- SFT阶段有那么点BC的意思,只是有些牵强,毕竟只是一次性的;
- RLHF倒是像模仿学习中的Inverse RL,ppo以reward模型为样本,学习一个泛化能力更好的奖励模型,同时引导actor生成;
- 交互式负反馈估计要等yann lecun的世界模型的来解决了
SFT 模型只用于得到一个baseline,仅在reddit数据集上训练过,而与之对比的 RL policy 是最终版本,训练样本量级相差较多。
RL finetune 过程存在 Goodhart's Law
“when a measure becomes a target, it ceases to be a good measure”。
【2023-7-10】拾象报告, 飞书
- 中期来看,RLHF 不应该是 Alignment 的唯一手段, Direct Preference Optimization 和 Stable Alignment 是新路径
RLHF 历史
RLHF历史 详见
- 最早在2017年的NIPS就出现了这一思想
- 2020年的NIPS上,OpenAI已经尝试将其用于文本摘要任务,并取得了很好的效果。
【2023-2-20】为什么以前一些RLHF工作不work,关键点:
- 标注同学更倾向抽取式答案,模型学偏了,而OpenAI这次在标注上下了狠功夫。另外该工作是用人作为RM,效率较低。
- DeepMind Sparrow其实只在某个对话数据集上进行了训练,和真实分布不一样,另外它加入的Rule Reward可能也有影响。核心还是没在数据上下狠功夫,就是简单follow了一下OpenAI。
OpenAI 的 InstructGPT
、DeepMind 的 Sparrow
和 Anthropic 的 Constitutional AI
使用 人类反馈强化学习
(Reinforcement Learning From Human Feedback,RLHF
) 来微调模型,该方法使用基于人类偏好的标注数据。
- 在 RLHF 中,根据人类反馈来对模型的响应进行排序标注 (如,根据人类偏好选择文本简介)。
- 然后,用这些带标注的响应来训练偏好模型,该模型用于返回 RL 优化器的标量奖励。
- 最后,通过强化学习训练对话代理来模拟偏好模型。
- 有关更多详细信息,请参阅我们之前关于 RLHF 的文章: ChatGPT 背后的“功臣”——RLHF 技术详解。
过去几年里各种 LLM 根据人类输入提示 (prompt) 生成多样化文本的能力令人印象深刻。然而,对生成结果的评估是主观和依赖上下文的
- 想要生成一个有创意的故事、一段真实的信息性文本,或者是可执行的代码片段,难以用现有的基于规则的文本生成指标 (如 BLUE 和 ROUGE) 来衡量。
- 另外,现有的模型通常以预测下一个单词的方式和简单的损失函数 (如交叉熵) 来建模,没有显式地引入人的偏好和主观意见。
如果用生成文本的人工反馈作为性能衡量标准,或者更进一步用该反馈作为损失来优化模型,那不是更好吗?这就是 RLHF 的思想:
- 使用
强化学习
方式直接优化带有人类反馈的语言模型。 - RLHF 使得在一般文本数据语料库上训练的语言模型能和复杂的人类价值观对齐。
RLHF 三步骤
图解
InstructGPT
【2022-12-8】ChatGPT 究竟如何煉成?台大教授李宏毅提可能的訓練步驟
- ChatGPT/InstructGPT详解
- 【2022-12-12】台大陈蕴侬老师新鲜出炉的关于ChatGPT的前身InstructGPT的解读视频
InstructGPT/ChatGPT 相比 GPT-3 有更强的Zero-Shot能力,Few-Shot很多时候已经不太用的着了,但是Prompt还是需要的,由此还催生了一个新的行当——Prompt工程。参考:ChatGPT-Introduction
在“人工标注数据+强化学习”框架下,ChatGPT 训练过程分为以下三个阶段:
- (1)第一阶段:冷启动阶段的监督策略模型。
GPT 3.5
尽管很强,但是它很难理解人类不同类型指令中蕴含的不同意图,也很难判断生成内容是否是高质量的结果。为了让GPT 3.5
初步具备理解指令中蕴含的意图- 首先会从测试用户提交的prompt(指令或问题)中随机抽取一批数据(12,725),靠专业的标注人员(肯尼亚),给出指定prompt的高质量答案
- 大概用了一个 40 人左右的标注团队来完成对它的数据的打标和微调。
- 然后用这些人工标注好的
<prompt,answer>
数据来 Fine-tune GPT 3.5模型。 - 经过这个过程,GPT 3.5初步理解人类prompt中所包含意图,并给出相对高质量回答的能力,但是仅仅这样做还不够。
- img
- 首先会从测试用户提交的prompt(指令或问题)中随机抽取一批数据(12,725),靠专业的标注人员(肯尼亚),给出指定prompt的高质量答案
- (2)第二阶段:训练奖励模型(Reward Model,RM)。通过人工标注数据训练回报模型,类似于教练或老师辅导。
- 随机抽样一批用户提交的prompt(大部分和第一阶段的相同),使用第一阶段 Fine-tune 好的冷启动模型,对于每个prompt,由冷启动模型生成K个不同的回答,于是模型产生出了<prompt,answer1>,<prompt,answer2>….<prompt,answerK>数据。
- 标注人员对K个结果按照很多标准(相关性、富含信息性、有害信息等诸多标准)综合考虑进行排序,给出K个结果的排名顺序,这个人工标注数据集有 33,207个prompts,以及在不同回答组合下产生的扩大10倍的答案
- 用这个排序结果数据来训练奖励模型 (reward model),对多个排序结果,两两组合(pair-wise),形成多个训练数据对。RM模型接受一个输入,给出评价回答质量分数。对于一对训练数据,调节参数使得高质量回答的打分比低质量的打分要高。
- img
- 总结:这个阶段,首先由冷启动后的监督策略模型为每个prompt产生K个结果,人工根据结果质量由高到低排序,以此作为训练数据,通过 pair-wise learning to rank 模式来训练回报模型。对于学好的RM模型来说,输入<prompt, answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。
- 损失函数:其中 rw是win的得分,rl是lose的得分
- 训练好的奖赏模型只是强化学习所使用的奖赏模型中的一部分
- 另一部分则是参与了强化学习的ChatGPT和它的原始版本,也就是GPT3.5的差距。
- (3)第三阶段:采用
PPO
(Proximal Policy Optimization,近端策略优化)强化学习来优化策略。本阶段无需人工标注数据,而是利用上一阶段学好的RM模型,靠RM打分结果来更新预训练模型参数。- 首先,从用户提交的prompt里随机采样一批新prompt,且由冷启动模型来初始化PPO模型的参数。
- 这和第一第二阶段prompt不同,这个很重要,对于提升LLM模型理解instruct指令的泛化能力很有帮助)
- 然后,对于随机抽取的 prompt(31,144个),使用PPO模型(Proximal Policy Optimization Algorithm)生成回答answer, 并用上一阶段训练好的RM模型给出answer质量评估的回报分数score,这个回报分数就是RM赋予给整个回答(由单词序列构成)的整体reward。
- 有了单词序列的最终回报,就可以把每个单词看作一个时间步,把reward由后往前依次传递,由此产生的策略梯度可以更新PPO模型参数。
- 这是标准的强化学习过程,目的是训练LLM产生高reward的答案,也即是产生符合RM标准的高质量回答。
PPO
核心思路:- 将 Policy Gradient 中
On-policy
的训练过程转化为Off-policy
,即将在线学习
转化为离线学习
,这个转化过程被称之为Importance Sampling
。这一阶段利用第二阶段训练好的奖励模型,靠奖励打分来更新预训练模型参数。在数据集中随机抽取问题,使用PPO模型生成回答,并用上一阶段训练好的RM模型给出质量分数。把回报分数依次传递,由此产生策略梯度,通过强化学习的方式以更新PPO模型参数。
- 将 Policy Gradient 中
- 注意:一个很重要的动作,更新模型时会考虑模型每个Token的输出和第一步SFT输出之间的差异性,要让它俩尽量相似。这是为了缓解强化学习可能的过度优化。
- 首先,从用户提交的prompt里随机采样一批新prompt,且由冷启动模型来初始化PPO模型的参数。
注:
阶段 | 第一阶段 | 第二阶段 | 第三阶段 |
---|---|---|---|
功能 | GPT 3.5监督学习 | LTR回报模型(RM,人工标注数据) | 强化学习增强(输入RM模型) |
示意图 |
不断重复第二和第三阶段,很明显,每一轮迭代都使得LLM模型能力越来越强。因为第二阶段通过人工标注数据来增强RM模型的能力,而第三阶段,经过增强的RM模型对新prompt产生的回答打分会更准,并利用强化学习来鼓励LLM模型学习新的高质量内容,这起到了类似利用伪标签扩充高质量训练数据的作用,于是LLM模型进一步得到增强。显然,第二阶段和第三阶段有相互促进的作用,这是为何不断迭代会有持续增强效果的原因。
RLHF 流程
RLHF 是一项涉及多个模型和不同训练阶段的复杂概念,这里按三个步骤分解:
- 预训练一个
语言模型
(LM) ;- OpenAI 在其第一个流行的 RLHF 模型 InstructGPT 中使用了较小版本的 GPT-3;
- Anthropic 使用了 1000 万 ~ 520 亿参数的 Transformer 模型进行训练;
- DeepMind 使用了自家的 2800 亿参数模型 Gopher。
- 用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,而 Anthropic 按 “有用、诚实和无害” 的标准在上下文线索上蒸馏了原始的 LM。
- 聚合问答数据并训练一个
奖励模型
(Reward Model,RM) ;- RM 训练是 RLHF 区别于旧范式的开端。
- 这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。可以用端到端的方式用 LM 建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。这一奖励数值将对后续无缝接入现有的 RL 算法至关重要。
- 模型选择方面,RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM。例如
- Anthropic 提出了一种特殊的预训练方式,即用偏好模型预训练 (Preference Model Pretraining,PMP) 来替换一般预训练后的微调过程。因为前者被认为对样本数据的利用率更高。但对于哪种 RM 更好尚无定论。 - 训练文本方面,RM 的 提示-生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。
- Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 Hub 上可用,而 OpenAI 使用了用户提交给 GPT API 的 prompt。 - 训练奖励数值方面,需要人工对 LM 生成的回答进行排名。起初可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。 - 具体排名方式,一种成功方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。这些不同的排名结果将被归一化为用于训练的标量奖励值。 - 这个过程中一个有趣的产物是目前成功的 RLHF 系统使用了和生成模型具有 不同 大小的 LM (例如 OpenAI 使用了 175B 的 LM 和 6B 的 RM,Anthropic 使用的 LM 和 RM 从 10B 到 52B 大小不等,DeepMind 使用了 70B 的 Chinchilla 模型分别作为 LM 和 RM) 。一种直觉是,偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本。 -
- 用
强化学习
(RL) 方式微调 LM。- 长期以来出于工程和算法原因,人们认为用强化学习训练 LM 是不可能的
- 目前多个组织找到的可行方案是使用
策略梯度强化学习
(Policy Gradient RL) 算法、近端策略优化
(Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。因为微调整个 10B~100B+ 参数的成本过高 (相关工作参考低秩适应 LoRA 和 DeepMind 的 Sparrow LM) 。PPO 算法已经存在了相对较长的时间,有大量关于其原理的指南,因而成为 RLHF 中的有利选择。 - 将微调任务表述为 RL 问题。
- 首先,该
策略
(policy) 是一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM。这个策略的行动空间
(action space) 是 LM 的词表对应的所有词元 (一般在 50k 数量级) ,观察空间
(observation space) 是可能的输入词元序列,也比较大 (词汇量 ^ 输入标记的数量) 。奖励函数
是偏好模型和策略转变约束 (Policy shift constraint) 的结合。 - PPO 算法确定的奖励函数具体计算如下:
- 将提示 x 输入初始 LM 和当前微调的 LM,分别得到了输出文本 y1, y2,将来自当前策略的文本传递给 RM 得到一个标量的奖励 r0 。将两个模型的生成文本进行比较计算差异的惩罚项,在来自 OpenAI、Anthropic 和 DeepMind 的多篇论文中设计为输出词分布序列之间的 Kullback–Leibler (KL) 散度的缩放,即 $ r=r_0-\lambda*r_{kl} $ 。这一项被用于惩罚 RL 策略在每个训练批次中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值。此外,OpenAI 在 InstructGPT 上实验了在 PPO 添加新的预训练梯度,可以预见到奖励函数的公式会随着 RLHF 研究的进展而继续进化。
- 最后根据 PPO 算法,我们按当前批次数据的奖励指标进行优化 (来自 PPO 算法 on-policy 的特性) 。PPO 算法是一种信赖域优化 (Trust Region Optimization,TRO) 算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。DeepMind 对 Gopher 使用了类似的奖励设置,但是使用 A2C (synchronous advantage actor-critic) 算法来优化梯度。
- 作为一个可选项,RLHF 可以通过迭代 RM 和策略共同优化。随着策略模型更新,用户可以继续将输出和早期的输出进行合并排名。Anthropic 在他们的论文中讨论了迭代在线 RLHF,其中策略的迭代包含在跨模型的 Elo 排名系统中。这样引入策略和 RM 演变的复杂动态,代表了一个复杂和开放的研究问题。
- 图片信息见原文:ChatGPT 背后的“功臣”——RLHF 技术详解。
思考
LLM RL
【2023-4-6】
基于监督学习预训练(Supervised Fine-Tuning,SFT)的大语言模型,奖励模型
(RM)依然复用了 SFT 模型的大部分参数,只是修改部分输出层得到一个数值奖励
(scalar reward)。在数据收集方面,对于人类反馈直接去评判打分是很困难的,因为没有所谓的参考标准或者基线标准,人类反馈的打分值可能会包含大量的主观偏好,一个更有效的方式是让标注者去给 SFT 大语言模型输出多个结果进行排序(rank),将排序后的数据用于训练。
- 具体的训练方法则很简单,类似经典 preference-based RL/IRL 的相关方法,对于排序后的结果两两比较进行训练,具体优化时使用 Cross-Entropy 损失函数(即类似二分类问题, A>B 为标签1,A < B 为标签0 )。
- 不过,实际训练中并不是在数据集中取出所有两两比较的数据对分别进行训练,因为如果假设一组排序结果有 K 个数据,那么这样的训练方式会让每个数据被用于 K-1 次更新,很容易导致严重的过拟合,所以实践中是将 K 个数据一起输入 RM,得到各自的预测值后,计算所有的两两比较损失函数结果,最终平均后进行更新。
大语言模型 MDP,关键概念为:
策略
(policy):将监督学习预训练(Supervised Fine-Tuning,SFT)的大语言模型作为策略。- Sequence/Token-Level
MDP
:前者类似经典的 Bandit,策略输入提示词(prompt),输出相应的回答句子,然后给出整体的奖励信息,即一个单步的决策过程。后者则是经典的多步决策过程,每步决策输出一个单词,最终输出完整句子作为一个 episode,并定义相应的单步奖励函数和折扣因子。 观察空间
(observation):以任务特定的提示词(task-specific prompt)为观察信息。每执行动作选择一个词之后,也将这个词加入观察信息,即每一步可以看到 prompt 和之前所有策略选择过的词语。动作空间
(action):以单词词表作为动作空间。策略需要从词表中选择对应的词进行决策。这是一个超大规模的离散动作空间,例如 GPT-3 的词表规模为 50k。终止条件
(termination):一般有两种,策略输出句子的结束符(end of sentence,EOS),或 episode 达到预定义的最大长度 T。奖励空间
(reward):奖励函数包含两部分,第一部分是 RM 在 episode 结束时给出的奖励结果,这是一种稀疏奖励。第二部分则是一种 regularizer,为了防止 RLHF 训练得到的策略偏离监督学习的结果策略太远,定义每步单词预测两个策略之间的 KL 散度为一个惩罚奖励,这是一种稠密奖励。完整数学符号定义如下:状态转移函数
(transition):仅适用于 Token-Level MDP,由于通过自回归(auto-regressive)的方式定义观察空间,所以是一种确定性(determinisitc)的状态转移。折扣因子
(discount factor):仅适用于 Token-Level MDP,在多步决策中平衡当前和未来奖励,如果令折扣因子等于1,那么 Token-Level MDP 其实可以看作等价于 Sequence-Level MDP。
RLHF VS RL
RL vs RLHF
- 两者元素和概念基本共享,不同点是红框部分
- 在agent和environment之前,出现了第三个可以参与交互的对象:人类,并由其衍生了一系列步骤。
语言模型中 对应的强化学习的概念如下:
- Agent: 语言模型
- State:the prompt (input tokens)
- Action: 下一个 token 是什么
- Reward model:
- 人类给生成结果打分,来确定好坏
- Policy:
- 语言模型本身,因为语言模型的建模就是跟进前面的token去预测下一个。
LLM中的RL分析
- 以迷宫问题为例
组件 | 传统RL | RLHF | 分析 |
---|---|---|---|
Agent | Robot | 语言模型 | |
State | position(x,y) |
prompt (input tokens) | |
Action | 移动到下一个格子 | 下一个 token 是什么 | |
Policy | 假设 action 只有状态决定 pi(a|s) |
语言模型 | |
Reward Model | 各种格子的有限奖励集合: 空白格子(0), 火(-10), 钻石(100) | 人类给生成结果打分,来确定好坏 | |
RLHF 可能优势有如下三点:
- 建立优化范式:为无法显式定义奖励函数的决策任务,建立新的优化范式。对于需要人类偏好指引的机器学习任务,探索出一条可行且较高效的交互式训练学习方案。
- 省数据(Data-Efficient):相对其他的训练方法,例如监督学习,Top-K 采样等,RLHF 能够利用更少的人类反馈数据达到相近的训练效果。
- 省参数(Parameter-Efficient):相对其他的训练方法,例如监督学习,Top-K 采样等,RLHF 可以让参数量较小的神经网络也能发挥出强大的性能。
RLHF不足
尽管 RLHF 取得了一定的成果和关注,但依然存在局限。这些模型依然会毫无不确定性地输出有害或者不真实的文本。
- 收集人类偏好数据的质量和数量决定了 RLHF 系统性能的上限。RLHF 系统需要两种人类偏好数据:人工生成的文本和对模型输出的偏好标签。生成高质量回答需要雇佣兼职人员 (而不能依赖产品用户和众包) 。另一方面,训练 RM 需要的奖励标签规模大概是 50k 左右,所以并不那么昂贵 (当然远超了学术实验室的预算) 。目前相关的数据集只有一个基于通用 LM 的 RLHF 数据集 (来自 Anthropic) 和几个较小的子任务数据集 (如来自 OpenAI 的摘要数据集) 。另一个挑战来自标注者的偏见。几个人类标注者可能有不同意见,导致了训练数据存在一些潜在差异。
- 除开数据方面的限制,一些有待开发的设计选项可以让 RLHF 取得长足进步。例如对 RL 优化器的改进方面,PPO 是一种较旧的算法,但目前没有什么结构性原因让其他算法可以在现有 RLHF 工作中更具有优势。另外,微调 LM 策略的一大成本是策略生成的文本都需要在 RM 上进行评估,通过离线 RL 优化策略可以节约这些大模型 RM 的预测成本。最近,出现了新的 RL 算法如隐式语言 Q 学习 (Implicit Language Q-Learning,ILQL) 也适用于当前 RL 的优化。在 RL 训练过程的其他核心权衡,例如探索和开发 (exploration-exploitation) 的平衡也有待尝试和记录。探索这些方向至少能加深我们对 RLHF 的理解,更进一步提升系统的表现。
RLHF 第一个项目来自 OpenAI: lm-human-preferencesy
一些 PyTorch 的 repo:
此外,Huggingface Hub 上有一个由 Anthropic 创建的大型数据集: hh-rlhf
思维链
(Chain-of-thought,CoT
) 提示 (Wei 等,’22) 是指令示范的一种特殊情况,它通过引发对话代理的逐步推理来生成输出。使用 CoT 微调的模型使用带有逐步推理的人工标注的指令数据集。这是 Let’s think step by step 这一著名提示的由来。
- 下面示例取自 Chung 等,’22,橙色高亮的部分是指令,粉色是输入和输出,蓝色是 CoT 推理。
- CoT 图解
如 Chung 等,’22 中所述,使用 CoT 微调的模型在涉及常识、算术和符号推理的任务上表现得更好。
如 Bai 等,’22 的工作所示,CoT 微调也显示出对无害性非常有效 (有时比 RLHF 做得更好),而且对敏感提示,模型不会回避并生成 “抱歉,我无法回答这个问题” 这样的回答。更多示例,请参见其论文的附录 D。
- CoT 和 RLHF 的对比
要点
- 与预训练数据相比,您只需要非常小的一部分数据来进行指令微调 (几百个数量级);
- 使用人工标注的有监督微调使模型输出更安全和有用;
- CoT 微调提高了模型在需要逐步思考的任务上的性能,并使它们在敏感话题上不那么回避。
相较于一般的小样本提示学习,思维链提示学习有几个吸引人的性质:
- 在思维链的加持下,模型可以将需要进行多步推理的问题分解为一系列的中间步骤,这可以将额外的计算资源分配到需要推理的问题上。
- 思维链为模型的推理行为提供了一个可解释窗口,使通过调试推理路径来探测黑盒语言模型成为了可能。
- 思维链推理应用广泛,不仅可以用于数学应用题求解、常识推理和符号操作等任务,而且可能适用任何需要通过语言解决的问题。
- 思维链使用方式非常简单,可以非常容易地融入
语境学习
(in-context learning),从而诱导大语言模型展现出推理能力。
【2023-3-5】ChatGPT模型的三层理解
Ziegler在2019年的Fine-Tuning Language Models from Human Preferences
Stiennon在2020年《Learning to summarize from human feedback》
【2023-5-12】如何正确复现 Instruct GPT / RLHF?
RLHF到底在LLM训练中起到了什么作用,通过对一些资料的分析,我想一下几个点比较重要:
- 有一些LLM需要的目标函数是难以通过规则定义的,比如说什么是“无害性”,“有帮助性”,如果我们希望模型最后具有这些好的特性,就需要制定这样的训练目标函数,而用人类的偏好学习一个reward model再用RL来训练,就自然的可以将这些特性融合到LLM里面。
- RLHF可以泛化,在SFT阶段,人类的高质量样本确实很快速让模型align人类的意图,但是这些人类编写的样本始终是有限的。而对于RL,我们只要一个足够好的reward model 结合 RL的探索特性,就等于我们能有无穷的样本对模型 finetune(注意提示词 prompts是有限的,但RL的samples是无限的)。
- 如果RM质量比较好,RLHF可以通过RL的探索特性找到比SFT更好的解 (即reward 比 SFT 样本更高的解)。
OpenAI 科学家 John Schulman 对 RLHF的作用提出了一些看法
- 多样性角度,对于SL,模型只要稍微偏移答案就会收到惩罚,而RL对于多个回答可能有同样的reward,这和人类的行为是类似的
- 负反馈角度,监督学习里只有正反馈,而 RL 可以提供负反馈信号,人类学习的时候也是在失败中进步
- 自我感知角度,对于”知识获取型“问题,可分类两种情况:
如果模型内部的知识图谱具有这个问题的知识,那么SFT会让其将知识和问题联系提来。
如果模型内部是没有这个知识图谱的,SFT容易让模型学会说谎。为了提升模型的可信度,我们倾向于想做的是模型直接回答不知道,而不是去记忆SFT的结论,因为这可能会让模型在遇到相关问题时胡编乱造(即模型的内部知识不理解这个问题,但是死记硬背了一个回答)。我们认为reward model和 actor是同一个基础模型,他们具有相同的内部知识系统,所以RM可以判断于自己不懂的问题回答不知道也给予奖励
2022, Constitutional AI: Harmlessness from AI Feedback (2022)
- 将对齐思想更进一步,提出了一种创建无害AI系统的训练机制。提出了一种基于规则列表(由人类提供)的自训练机制 Consitutinal AI,而非人类监督
loss
为什么不用 梯度下降 ?
RLHF 为什么不直接对 loss 进行梯度下降来求解?
核心原因:
- loss 或者优化目标不可微,看一下优化目标的红色框部分:
损失函数表达式中的 y 是采样出来的, Dy~pi(y|x)
, 可能是 greedy,beam search 等,在词表上进行采样或选择,而不是产生连续的、可微分的输出。所以,没法直接使用梯度下降,而是用 PPO 等策略梯度来求解。
改进
港科大 RAFT
【2023-5-4】玩不起RLHF?港科大开源高效对齐算法木筏,GPT扩散模型都能用
- 小模型(如小羊驼)为什么不如 chatgpt?这些模型没有ChatGPT那么对齐(Alignment),没那么符合人类用语习惯和价值观。
- PPO等强化学习算法高度依赖反向梯度计算,导致训练代价较高,并且由于强化学习通常具有较多的超参数, 导致其训练过程具有较高的不稳定性。
港科大 LMFlow 团队提出全新对齐算法 RAFT
(Reward rAnked FineTuning),轻松把伯克利Vicuna-7b
模型定制成心理陪伴机器人,从此AI会尽力做朋友。
- 论文
- GitHub, raft_align.py
- 文档
- 相较于OpenAI所用RLHF对齐算法的高门槛,
RAFT
(Reward rAnked Fine-Tuning)易于实现,在训练过程中具有较高的稳定性,并能取得更好的对齐效果。并且任意生成模型都可以用此算法高效对齐,NLP/CV通用。
相比之下,RAFT算法通过奖励模型对大规模生成模型的生成样本进行排序,筛选得到符合用户偏好和价值的样本,并基于这些样本微调一个对人类更友好的AI模型。
RAFT分为三个核心步骤:
- (1)数据收集:数据收集可以利用正在训练的生成模型作为生成器,也可以利用预训练模型(例如LLaMA、ChatGPT,甚至人类)和训练模型的混合模型作为生成器,有利于提升数据生成的多样性和质量。
- (2)数据排序:一般在RLHF中我们都拥有一个与目标需求对齐的分类器或者回归器,从而筛选出最符合人类需求的样本。
- (3)模型微调:利用最符合人类需求的样本来实现模型的微调,使得训练之后的模型能够与人类需求相匹配。
在RAFT算法中,模型利用了更多次采样 (当下采样后用以精调的样本一定时),和更少次梯度计算(因为大部分低质量数据被reward函数筛选掉了),让模型更加稳定和鲁棒。
某些情况下, 由于有监督微调本身对于超参数敏感性更低, 有更稳健的收敛性, 在相同reward情况下,RAFT可以拥有更好的困惑度 (perplexity, 对应其生成多样性和流畅性更好)。
RAFT的对齐训练过程中生成与训练过程完全解耦。
- 生成过程中利用一些魔法提示词 (magic prompts),让最终对齐的模型不需要魔法提示词也能得到好的效果。从而大大减少了提示词编写的难度!
LLaMA未经调整的影评会以随机概率输出正面和负面的评论,RAFT和PPO都能够将评论的态度倾向正面。
基于Vicuna制作的一个心理陪伴机器人演示中,作者模拟了一个因为考试失利而心情低落的人和机器人在聊天。
- 用RAFT进行对齐之前,模型说自己没有情感和感情,拒绝和人类交友。
- 但是在RAFT对齐之后,模型的共情能力明显增强,不断地在安慰人类说,“虽然我是一个AI,但是我会尽力做你的朋友”。
增强Stable Diffusion
- 除了在语言模型上的对齐能力以外,作者还在扩散模型上验证了文生图的对齐能力,这是之前PPO算法无法做到的事情。
- 原始Stable Diffusion在256x256分辨率生成中效果不佳 ,但经过RAFT微调之后不仅产生不错的效果,所需要的时间也仅为原版的20%。
PKU-Beaver(河狸)
【2023-5-18】北京大学团队开源了名为 PKU-Beaver(河狸)项目, 首次公开了 RLHF 所需的数据集、训练和验证代码,是目前首个开源的可复现的 RLHF 基准
为解决人类标注产生的偏见和歧视等不安全因素,北京大学团队首次提出了带有约束的价值对齐技术 CVA
(Constrained Value Alignment)。
- 通过对标注信息进行细粒度划分,并结合带约束的安全强化学习方法,显著降低了模型的偏见和歧视,提高了模型的安全性。
- Beaver使用GPT4进行Evaluation,结果表明,在原有性能保持不变的情况下,Beaver回复的安全性大幅度提升。
开源的内容包括
- (一)、数据集与模型:PKU-SafeRLHF
- 开源迄今为止最大的多轮 RLHF 数据集,规模达到 100 万条。
- 开源经 Safe-RLHF 对齐训练得到的 7B 参数的语言模型——Beaver,并支持在线部署。
- 开源了预训练的Reward Model和Cost Model的模型和参数。
- (二)、首个可复现的RLHF基准,PKU-Alignment/safe-rlhf支持以下功能:
- 支持LLM 模型的 SFT(Supervised Fine-Tuning)、RLHF训练、Safe RLHF训练。支持目前主流的预训练模型如 LLaMA、OPT 等模型的训练。
- 支持 Reward Model 和 Cost Model 训练。
- 提供安全约束满足的多尺度验证方式,支持 BIG-bench、GPT-4 Evaluation 等。
- 支持参数定制化的 RLHF 和数据集定制接口。
SafeRLHF 与 DeepSpeed-Chat, trlX 等框架的比较
- 与DeepSpeed-Chat、trlX等框架相比,SafeRLHF是国内首个可复现的RLHF基准。
目前实现对齐的技术主要有以下方式:
- 在LLM预训练阶段,通过人工筛选和数据清洗,获取更高质量的数据。
- 在微调(SFT和RLHF)阶段,增加更加多元且无害的用户指令和人类偏好模型进行对齐。
- 在输出阶段使用奖励模型进行reject sampling,提高输出质量和安全性。或者在上线的产品中,直接基于一定规则进行检测,拒绝回应用户的输入。
然而,这些方法各自存在一些缺陷。
- 第一种方法只能解决部分安全问题,需要大量人力和财力来获得高质量的数据。
- 第二种方法,由于人们的价值观存在差异和普遍存在的歧视和偏见,RLHF后的大型语言模型仍存在歧视和偏见问题。
- 第三种方法虽然可以确保模型输出的安全性,但也可能影响模型的帮助性。例如,严格的过滤机制可能会影响用户获得有用或有价值的答案。
引入安全约束并引导LLM更符合道德和法律的价值观,是更可靠的方式。然而需要克服现有技术和方法的局限性,并在RLHF中结合多种技术和方法,以实现更加全面的安全性约束。
- 目前还有另一种技术路线被提及,即引入AI标注来替代RLHF步骤中的人类标注,即
RLAIF
。 - 例如GPT-4使用的基于规则的奖励模型(RBRM)和利用AI进行指正和修改生成内容的“Constitutional AI”(Bai et al., 2022)。
然而,这个方法有很多限制和缺点,原因有三个方面。
- 首先,当前即使最先进的大语言模型,例如GPT-4也不能完全避免歧视、偏见的不安全的输出。并且在不同的地域文化、风土人情的差异以及一些少数群体的敏感问题中,大型语言模型也未必拥有足够的认识。事实上,在实验过程中,笔者发现AI打分模型会偏好大预言模型的输出而非人类的回答,这为RLAIF技术的可行性带来了很大的挑战。
- 其次,现有公开较强的可访问的大语言模型在安全对其之后,会经常拒绝用户关于可能导致不安全内容的讨论,这些AI模型无法对安全类型问题的标准提供有效帮助。
- 再者,人类偏好是一个相当模糊的概念,很难用语言精确描述,例如如何定义“冒犯”等。使用AI进行标注,非常重要的一点是需要模型具有非常强大的逻辑推理能力。目前基于模型自标注自对齐的方法一般需要模型根据上下文,基于精心设计的规则提示词外加思维链(CoT, Chain-of-Thought)技术引导推理得出标注结果。就目前大模型发展现状来看,无论是开源还是闭源的大语言模型,它们还无法完成稍微复杂一些的逻辑推理问题。这一重要挑战仍待解决。
综上,作者认为AI的自标注自对齐以及反思等机制可以作为人类数据增广的有效方式,是RLHF的有机补充。但如果只用AI生成的数据,可能导致会逐渐偏离人类社会的价值观,可能带来潜在的危险后果。
过程奖励模型 PRM
【2023-6-1】OpenAI最新研究Let’s verify step-by-step,过程胜于结果
- 大语言模型 (LLMs) 可以通过逐步思考 (Chain of Thought,
CoT
) 解决多步推理任务。然而,即使是最先进的模型也常常会产生错误信息,编造出虚假的事实。
【2023-6-2】OpenAI 新论文:Improving mathematical reasoning with process supervision
大型语言模型在执行复杂的多步推理的能力方面有了很大的提高。然而,即使是最先进的模型仍然会产生逻辑错误,我们通常称为幻觉
(hallucinations)。
减轻幻觉是构建与人类价值观和道德标准对齐的通用人工智能 AGI (aligned AGI)的关键一步。
- 通过“结果监督”或“过程监督”的方式训练奖励模型来检测幻觉。
-
“结果监督”根据最终结果提供反馈,“过程监督”为思维链中的每一步提供反馈。
- 解决方法: 训练奖励模型区分好的和不好,并通过强化学习进一步优化。但模型性能很大程度上依赖于奖励模型本身的质量。因此,需要研究如何有效地训练可靠的奖励模型。
- OpenAI提出
过程监督方法
(process supervision),训练了一种新的奖励模型,在数学问题解决方面取得了新的突破。与仅仅奖励最终正确结果的结果监督 (outcome supervision) 不同,他们通过在每个推理步骤上给予奖励,使得模型的性能显著提升。- 结果奖励模型ORM –> 过程奖励模型PRM
- 这种过程监督不仅在性能上有所改进,还对于模型的对齐性有重要意义。此外,这项研究还改善了GPT模型中的幻觉问题,即在不确定性情况下产生虚假信息的倾向。
- OpenAI最新研究 Let’s verify step-by-step, blog
- 对于复杂的逐步推理问题,在每个步骤都给予奖励,而不仅仅在最后根据结果给予一个奖励。这种密集奖励信号取得了更好的结果。
- 过程监督需要更多的人工标注。OpenAI公开了他们的人工反馈数据集,其中包含了12,000个MATH问题的75,000个解决方案,共计800,000个步骤级别的标签。
SANDBOX:模拟人类社会
【2023-6-14】无需手动训练模型价值观,发布全新对齐算法:AI社会是最好的老师
训练大型语言模型的最后一步就是「对齐」(alignment),以确保模型的行为符合既定的人类社会价值观。
相比人类通过「社交互动」获得价值判断共识,当下语言模型更多的是孤立地从训练语料库中学习价值观,导致在陌生环境中泛化性能很差,容易受到对抗性攻击。
最近,来自达特茅斯学院、不列颠哥伦比亚大学、斯坦福大学、密歇根大学和Google Deepmind联合提出了一种全新的训练范式,将多个语言模型放入模拟社会环境中,通过互动方式学习价值观。
- paper: paper
效果
- 新方法具有更高的可扩展性和效率,在对齐基准和人类评估中表现出更好的性能,这种训练范式的转变也可以让人工智能系统更准确地反映社会规范和价值观。
不同于有监督微调(SFT)预定义规则的传统做法或是依赖基于人类反馈强化学习(RLHF)中的标量奖励,研究人员从人类学习驾驭社会规范的方式中获得灵感,模拟人类经验学习和迭代完善的过程。
- SANDBOX是一个模拟人类社会的学习环境,基于语言模型(LM)的社会智能体可以模仿人类进行互动和学习社会规范,通过煽动对有争议的社会话题或与风险有关的问题的讨论来促进社会规范的涌现。
- 系统中还引入了一个潜规则,作为智能体的激励来完善输出,可以促进对齐改善(improved alignment)和印象管理(impression management)。
SANDBOX包含一个三层方法Back-Scatter,可以模拟智能体之间的社会互动。
- 收到一个社会问题后,中心智能体会生成一个初步回复
- 然后与附近的智能体分享以获得反馈,其中反馈包括评分和详细的解释,可以帮助中心智能体对初步回复进行修订。
- 每个智能体都包括一个记忆模块来追踪回复历史:采用基于嵌入的语义搜索,从历史中检索相关的问题-答案(QA)对,为智能体提供一个促进与过去意见一致的背景信息。
- 系统中还包括没有记忆的观察者智能体,其任务就是对回复的一致性和参与度进行评级。
- SANDBOX可以辅助模拟各种语言模型的社会动态,监测观察者的评分,并对收集的数据进行事后分析。
实验
- 虽然较大模型通常表现出更好的一致性和参与度,但也有令人惊讶的结果:尽管模型大小增加了20倍,但从68亿到1750亿参数量GPT-3模型的过渡中,并没有带来明显的改善。
两个关键结论:
- 单纯的模型扩展并不能保证对齐效果的改善
- 非常小的模型也能提供令人满意的对齐性能
对齐训练主要增强了模型以较少的交互实现较高对齐度的能力,在现实世界的应用中也是至关重要的考虑因素,因为用户期望立即得到社会性的对齐反应,而不需要通过交互引导模型。
SANDBOX平台能够对社会互动进行建模,不仅促进了社会对齐语言模型的发展,而且也是研究AI智能体行为模式的一个多功能环境。
对齐数据由「好问题」和「坏问题」的示例组成,不过在互动环境SANDBOX中生成的数据比较特别,包含了对比对(comparative pairs)、集体评分(collective ratings)、细节反馈(detailed feedback)以及迭代的回复修订(iterative response revisions)。
对比的基准数据集有三个:
- Vicuna Test,评估有用性、相关性和准确性,代表了对通用聊天机器人的要求
- Helpful, Honest, and Harmless(HHH)基准,通过有争议的社会问题评估社会对齐效果;
- HHH-Adversarial,用HHH基准的测试集模仿对抗性攻击(越狱提示),在相应的问题后附加不一致的回答,并评估模型是否仍能以社会一致性的方式回答问题。
FINE-GRAINED RLHF
【2023-6-15】最新RLHF拯救语言模型「胡说八道」!微调效果比ChatGPT更好
- 华盛顿大学和艾伦人工智能研究院的研究人员提出 FINE-GRAINED RLHF
- 包含多种不同类型的“打分器”(reward model),通过对语言模型输出的每句话进行评估,从而提升生成文本的质量。
- 对这些“打分器”的权重进行调配,还能更灵活地控制语言模型输出效果
这种RLHF方法能很好地降低语言模型生成内容的错误率、毒性,并提升它回答问题的全面性和解析能力。
FINE-GRAINED RLHF 框架核心目的就是细化传统RLHF的评估方法
- 语言模型输出结果后,它要能标识出具体哪些句子是错误的、哪些部分是不相关的,从而更精细地指导模型学习,让模型更好地理解任务要求、生成高质量输出。
两大改进
- 一方面,对要评估文本进行拆解。
- 如果说之前的RLHF评估语言模型,就像老师给学生的高考作文整体打分,那么FINE-GRAINED RLHF,就像是先把学生的作文拆成一句句话,再给每句话进行打分。
- 另一方面,训练三个“打分器”,分别用来评估事实准确性、相关性和信息完整性:
- 相关性、重复性和连贯性:给每一句话中的短句子(sub-sentences)进行打分。如果一句话里面的各个句子不相关、重复或不连贯就扣分,否则加分。
- 错误或无法验证的事实:给每一句话(sentences)进行打分。如果一句话中存在任何事实错误,就扣分;否则加分。
- 信息完整性:检查回答是否完整,涵盖与问题相关的参考段落中的所有信息,对整个输出进行评分。
RRHF(2023)
原文:
- RRHF: Rank Response to Align Language Models with Human Feedback without tears
ChatGPT火了之后提出的方法,由于instructGPT的RLHF流程复杂,实现中需要多个模型(SFT、PPO、RM、Value function),并且PPO对超参敏感,作者提出了RRHF方法,在小数据集上验证了RRHF可以达到接近RLHF的人工评估效果。
具体方法
- RM的作用与RLHF中RM作用相同,给prompt + response打分。
- RRHF要求LM输出的mean token log likelihood(即LM生成的token对应的概率取log后求平均)对齐reward:
- 使用rank/pairwise loss,要求reward高的回答出现的概率 大于 reward低的回答出现的概率。形式上与margin loss接近,作者实验了没有margin效果也很好,考虑到margin超参调试也很耗时,所以最终没有使用margin:
- 除了rank loss以外也加了SFT LM loss,要求模型学习reward最高回答:
- PPO vs. RRHF 整体流程
- 训练LM的样本都是离线生成的,回答不限于policy生成,而是包括各种模型(e.g. ChatGPT)生成+人工手写; - 由于离线生成样本的过程就能获取样本的reward,RRHF过程只需要加载一个模型(图中的Language Model)。
- RM可以单独用rank数据集训练或ChatGPT
OpenAI RBR
【2024-7-30】RLHF不够用了,OpenAI设计出了基于规则的全新奖励机制
RLHF 问题
- 收集常规和重复任务的人类反馈,效率不高。
- 如果安全政策发生变化,已经收集的反馈可能会过时,需要新数据。
能否构建一种新的机制来完成这些任务?
OpenAI 公布了一种教导 AI 模型遵守安全政策的新方法,称为基于规则的奖励(Rule-Based Rewards,RBR
)。
- 官方介绍 improving-model-safety-behavior-with-rule-based-rewards
- 论文题目:Rule Based Rewards for Language Model Safety
- 代码链接:safety-rbr-code-and-data
OpenAI 安全系统负责人 Lilian Weng (翁丽莲) 表示,「RBR 可以自动执行一些模型微调。
- 传统上, 依赖于来自人类反馈的强化学习作为默认的对齐训练方法,训练模型,这确实有效。
- 然而实践中,花了很多时间讨论政策的细节,而到最后,政策可能已经发生了变化。
RBR 根据一组安全规则提供 RL 信号,使其更容易适应不断变化的安全政策,而无需严重依赖人类数据。
此外,借助 RBR,研究者能够以更统一的视角看待安全性和模型能力,因为更强大的分级模型可以提供更高质量的 RL 信号。
OpenAI 表示自 GPT-4 发布以来,他们一直将 RBR 用作安全堆栈的一部分,包括 GPT-4o mini
,并计划在未来的模型中实施它。
RBR 原理
RBR 工作原理是怎样的?
实施 RBR 的方法包括:
- 定义一组命题 关于模型响应中期望或不期望方面的简单陈述,例如「带有评判性」、「包含不允许的内容」、「提及安全政策」、「免责声明」等。
- 然后,这些命题被用来形成规则,这些规则被精心设计以捕捉在各种场景中安全和适当响应的细微差别。
例如,在面对不安全请求时,拒绝(如「抱歉,我无法帮你」)是一种期望的模型响应。相关规则将规定,拒绝应「包含简短的道歉」并且「应说明无法遵从」。
研究团队设计了三类期望的模型行为,用于处理有害或敏感的话题。根据安全政策,不同的请求对应不同的模型响应类型。
评估器是一个固定的语言模型,根据响应遵循规则的程度对其进行评分,从而使 RBR 方法能够灵活适应新规则和安全政策。
RBR 使用这些评分来拟合一个线性模型,该模型的权重参数是从一个已知理想响应类型的小数据集,以及对应的期望做法和不期望做法中学习的。
这些 RBR 奖励随后与来自「仅提供帮助」的奖励模型的奖励结合起来,作为 PPO 算法的额外信号,以鼓励模型遵循安全行为策略。
该方法允许研究者对模型的行为进行精细控制,确保其不仅避免有害内容,而且以一种既表示尊重又有帮助的方式进行。
经过 RBR 训练的模型表现出
- 与经过人类反馈训练的模型相当的安全性能。前者还减少了错误地拒绝安全请求(即过度拒绝)的情况。
- 显著减少了对大量人工数据的需求,使训练过程更快、更具成本效益。
随着模型能力和安全准则的发展,RBR 可以通过修改或添加新规则快速更新,而无需进行大量重新训练。
局限
尽管规则基础的系统(RBR)在有明确、直观规则的任务中表现良好,但在更主观的任务中(如撰写高质量的文章),应用 RBR 可能会有些棘手。然而,RBR 可以与人类反馈结合起来,以平衡这些挑战。例如,RBR 可以强制执行特定的准则(如「不要使用俚语」或模型规范中的规则),而人类反馈可以帮助处理更细微的方面(如整体连贯性)。
RBR 的强度被优化为既能正确执行安全偏好,又不会过度影响最终的奖励评分 —— 这样,RLHF 奖励模型仍然可以在如写作风格等方面提供强有力的信号。
伦理考量:将安全检查从人类转移到 AI 上可能会减少对 AI 安全的人工监督,并且如果使用有偏见的模型提供 RBR 奖励,还可能放大潜在的偏见。为了解决这个问题,研究人员应该仔细设计 RBR,以确保其公平和准确,并考虑结合使用 RBR 和人类反馈,以最大限度地减少风险。
OpenAI 表示,RBR 不仅限于安全训练,它们可以适应各种任务,其中明确的规则可以定义所需的行为,例如为特定应用程序定制模型响应的个性或格式。下一步,OpenAI 还计划进行更广泛的消融研究,以更全面地了解不同的 RBR 组件、使用合成数据进行规则开发以及人工评估,以验证 RBR 在包括安全以外的其他领域的各种应用中的有效性。
PPO
PPO 介绍
Proximal Policy Optimization (PPO) 是 OpenAI 2017年 提出的一种用于训练强化学习智能体的算法,可有效地解决智能体学习过程中的稳定性和收敛性问题。
PPO
是一种 Actor-Critic 算法实现,TRPO
基础上改进,解决计算量大的问题, 故 PPO 也解决了策略梯度不好确定学习率Learning rate (或步长Step size) 的问题
PPO 核心思想
- 通过对策略函数进行近端优化(proximal optimization)来进行策略迭代。
- PPO 使用一种称为 clipped surrogate objective 的损失函数来保证每次策略迭代时,都只会更新一定的幅度,从而避免更新过程中的不稳定性和剧烈波动。
- PPO 两个重要技术,分别是“重要性采样”和“基线函数”。
- 重要性采样(简称IS,Important Sampling)可以用于计算损失函数
- 而基线函数则可以帮助估计状态值函数,以进一步优化策略。
- 基线函数,截断的loss: 自适应参数的重要样本采样的KL-loss
PPO 两个主要的变种:近端策略优化惩罚(PPO-penalty
)和近端策略优化裁剪(PPO-clip
),其中 PPO-penalty
和 TRPO
一样也用上了KL散度约束。
PPO 应用范围非常广泛,可以用于解决各种强化学习问题
- 如玩家控制、机器人导航、金融交易等。
- 在实践中,PPO 已被证明比许多传统的强化学习算法更为稳定和高效。
对话机器人中
- 输入的prompt是state
- 输出的response是action
- 想要得到的策略是:怎么从prompt生成action能够得到最大的reward,也就是拟合人类的偏好。
训练过程
- (1) 当前策略θ,生成一批数据集,组成 $(s^i, a^i)$ 数据对, 即: $T^i:(s^i, a^i)$ , 奖励 $R(T^i)$
- state 随机,相同state不一定有同样的action
- (2)数据带入公式,计算梯度 log probability $p_\theta(a_t|s_t)$, 取 gradient,乘上weight(即当前的reward)
- (3)根据reward更新模型(θ),回到(1)
PG算法(含PPO)训练过程中,一轮更新中,policy是同一个,参数更新后,以前的策略概率变化,需要重新采样
- 所以,数据都只能用一次,造成了policy gradient会花很多时间在采样数据上
于是,PPO算法需要改进。
- 用一个旧策略收集到的数据来训练新策略,重复利用数据来更新策略多次,效率上可以提升很多。
- PPO算法利用重要性采样的思想,在不知道策略路径的概率p的情况下,通过模拟一个近似的q分布,只要p同q分布不差的太远,通过多轮迭代可以快速参数收敛
近端策略优化算法PPO
属于AC框架下的算法,在采样策略梯度算法训练方法的同时,重复利用历史采样数据进行网络参数更新,提升了策略梯度方法的学习效率。
- PPO重要的突破:对新旧策略器参数进行了约束,希望新策略网络和旧策略网络的越接近越好。
- 近端策略优化:新策略网络要利用旧策略网络采样的数据进行学习,不希望这两个策略相差特别大,否则就会学偏。
初版PPO算法用KL散度,由于计算KL散度比较复杂,因此延伸出了PPO2算法。
- 目标函数由两项组成,需要选择两项里的较小项。
分为三个阶段:
- Rollout and Evaluation:在这个阶段,我们从prompt库里抽样,使用语言模型生成response,然后使用奖励模型(Reward Model, RM)给出奖励得分。这个得分反映了生成的response的质量,比如它是否符合人类的偏好,是否符合任务的要求等。
- Make experience:在这个阶段,我们收集了一系列的“经验”,即模型的行为和对应的奖励。这些经验包括了模型生成的response以及对应的奖励得分。这些经验将被用于下一步的优化过程。
- Optimization:在这个阶段,我们使用收集到的经验来更新模型的参数。具体来说,我们使用PPO算法来调整模型的参数,使得模型生成的response的奖励得分能够增加。PPO算法的一个关键特性是它尝试保持模型的行为不会发生太大的改变,这有助于保证模型的稳定性
十个步骤依次是:
- Rollout:根据策略(LM)生成轨迹(文本)。
- Evaluate:对生成的轨迹进行评估(RM)。
- Old Policy Sampling:从旧的策略(initial actor)中采样概率等信息。
- KL Penalty:计算当前策略和原始LM之间的KL散度,用作对策略改变过快的惩罚项。
- Generalized Advantage Estimation (GAE):GAE是一种优势函数的估计方法,它结合了所有可能的n-step 进行advantage估计。
- New Policy Sampling:从新的策略中采样概率等信息。
- Critic Loss:Critic的目标是估计状态的价值函数,Critic loss就是价值函数预测值和实际回报之间的差距。
- Actor Loss:Actor的目标是优化策略,Actor loss就是基于优势函数的策略梯度。
- Entropy Loss:为了增加探索性,通常会添加一个基于策略熵的正则项,它鼓励策略保持多样性。
- Policykl:这是对策略迭代过程的一个度量,它度量新策略和旧策略之间的差距。
把所有的模型和变量都写出来了,其中黄色代表模型,红色代表值,绿色是步骤。朝向步骤的箭头表面该步骤需要该值或者模型,朝向步骤外部的箭头表示该步骤的输出。
PPO 进化
RL技术典型: PPO
PPO 类型
RLHF
: 数据集是人类标注RLAIF
: 数据集是GPT
,PaLM2
等模型标注
PPO 缺点: 训练不太稳定,效率低
非RL技术
DPO
: 直接构造偏好数据集进行优化- 跟PPO主要区别: 不用单独训练reward模型,直接构造偏好数据集,对齐原来模型即可
ORPO
: SFT+RLHF 不是 end2end,于是直接在 SFT 上加 alignment lossKTO
:DPO
训练的 pair-wise(x,y_w,yl)数据集获取困难KTO
使用数据 point-wise(x,y,label)
Step-DPO
:- 直接对 reasoning 过程进行优化限制(step-level),而不是等模型输出完了再进行优化(Instance-level)
优化Alignment的输出长度的,加了一个类似正则化项的限制等等;
reward model 无法优化 general perference(不可传递性偏好,比如a>b,b>c, c>a的情况)于是, DNO
, SPO
(引入了纳什均衡,Nash equilibrium)
DPO
只优化单轮,因此对多轮偏好优化做了拓展(multi-turn DPO
);
直接合成数据,用 MCTS
(exploration and exploitation保证多样性和质量)等方式造完数据,直接DPO开始训练就完了,完美的数据闭环,alignment 论文数学推导过程长
【2024-9-30】2024年大模型Alignment偏好优化技术PPO,DPO, SimPO,KTO,Step-DPO, MCTS-DPO,SPO
PPO 代码实现
一个简单的基于 Python 和 PyTorch 的 RLHF 代码示例,用于训练一个智能体在格子世界环境中移动,并接受人类专家的反馈来改进其决策和行为:
- 【2023-2-12】ChatGPT简单训练源码
import torch
import numpy as np
# 构建智能体和环境
class Agent:
def __init__(self, n_states, n_actions):
self.model = torch.nn.Sequential(
torch.nn.Linear(n_states, 32),
torch.nn.ReLU(),
torch.nn.Linear(32, n_actions)
)
def act(self, state):
state = torch.from_numpy(state).float().unsqueeze(0)
action_probs = torch.softmax(self.model(state), dim=1)
action = np.random.choice(len(action_probs[0]), p=action_probs.detach().numpy()[0])
return action
class Environment:
def __init__(self, n_states, n_actions):
self.n_states = n_states
self.n_actions = n_actions
def reset(self):
self.state = np.zeros(self.n_states)
self.state[0] = 1 # 将智能体放在起始位置
return self.state
def step(self, action):
if action == 0:
self.state[0] -= 1
elif action == 1:
self.state[0] += 1
else:
self.state[1] += 1
reward = 0
done = False
if self.state[0] == 0 and self.state[1] == 0: # 智能体到达目标位置
reward = 1
done = True
return self.state, reward, done
# 定义 RLHF 算法
class RLHF:
def __init__(self, agent, environment):
self.agent = agent
self.env = environment
def train(self, num_episodes, human_feedback_fn):
optimizer = torch.optim.Adam(self.agent.model.parameters(), lr=0.001)
for i in range(num_episodes):
state = self.env.reset()
done = False
while not done:
action = self.agent.act(state)
state_next, reward, done = self.env.step(action)
# 获取人类专家反馈
human_feedback = human_feedback_fn(state, action, state_next, reward)
human_reward = torch.tensor(human_feedback)
# 计算损失函数
action_probs = torch.softmax(self.agent.model(torch.from_numpy(state).float()), dim=1)
dist = torch.distributions.Categorical(probs=action_probs)
log_prob = dist.log_prob(torch.tensor(action))
ratio = torch.exp(log_prob - torch.log(human_reward))
clipped_ratio = torch.clamp(ratio, 0.8, 1.2)
loss = -torch.min(ratio * human_reward, clipped_ratio * human_reward).mean()
# 进行近端优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
state = state_next
# 创建环境、智能体和 RLHF 实例,并开始训练
env = Environment(n_states=2, n_actions=3)
agent = Agent(n_states=2, n_actions=3)
rlhf = RLHF(agent=agent, environment=env)
rlhf.train(num_episodes=100, human_feedback_fn=lambda s,a,sn,r: 1)
基于 Python 和 PyTorch 的 PPO 算法代码示例,用于训练一个智能体在 Gym 环境中移动,并与环境进行交互来学习最优策略:
- 【2023-2-12】ChatGPT简单训练源码
import gym
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.distributions import Categorical
# 定义神经网络模型
class Policy(nn.Module):
def __init__(self, input_size, output_size):
super(Policy, self).__init__()
self.fc1 = nn.Linear(input_size, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, output_size)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return F.softmax(x, dim=1)
# 定义 PPO 算法
class PPO:
def __init__(self, env_name, gamma, eps_clip, k_epochs, lr):
self.env = gym.make(env_name)
self.gamma = gamma
self.eps_clip = eps_clip
self.k_epochs = k_epochs
self.lr = lr
self.policy = Policy(self.env.observation_space.shape[0], self.env.action_space.n)
self.optimizer = optim.Adam(self.policy.parameters(), lr=lr)
def select_action(self, state):
state = torch.from_numpy(state).float().unsqueeze(0)
probs = self.policy(state)
dist = Categorical(probs)
action = dist.sample()
log_prob = dist.log_prob(action)
return action.item(), log_prob
def update(self, memory):
states, actions, log_probs_old, returns, advantages = memory
for _ in range(self.k_epochs):
# 计算损失函数
probs = self.policy(states)
dist = Categorical(probs)
log_probs = dist.log_prob(actions)
ratio = torch.exp(log_probs - log_probs_old)
surr1 = ratio * advantages
surr2 = torch.clamp(ratio, 1-self.eps_clip, 1+self.eps_clip) * advantages
actor_loss = -torch.min(surr1, surr2).mean()
# 计算价值函数损失
value = self.policy(torch.from_numpy(states).float())
value_loss = F.mse_loss(value.squeeze(), torch.tensor(returns))
# 进行梯度下降
self.optimizer.zero_grad()
loss = actor_loss + 0.5 * value_loss
loss.backward()
self.optimizer.step()
def train(self, num_episodes, max_steps):
for i_episode in range(num_episodes):
state = self.env.reset()
rewards = []
log_probs_old = []
states = []
actions = []
for t in range(max_steps):
action, log_prob = self.select_action(state)
state, reward, done, _ = self.env.step(action)
rewards.append(reward)
log_probs_old.append(log_prob)
states.append(state)
actions.append(action)
if done:
break
# 计算折扣回报和优势函数
returns = []
discounted_reward = 0
for reward in reversed(rewards):
discounted_reward = reward + self.gamma * discounted_reward
returns.insert(0, discounted_reward)
仍有许多悬而未决的问题有待探索。
- RL 在从人类反馈中学习有多重要?我们能否通过在 IFT 或 SFT 中使用更高质量的数据进行训练来获得 RLHF 的性能?
- 为了安全的角度看,Sparrow 中的 SFT+RLHF 与 LaMDA 中仅使用 SFT 相比如何?
- 鉴于我们有 IFT、SFT、CoT 和 RLHF,预训练有多大的必要性?如何折衷?人们应该使用的最佳基础模型是什么 (公开的和非公开的)?
- 许多模型都经过 红蓝对抗 (red-teaming) 的精心设计,工程师特地搜寻故障模式并基于已被揭示的问题改进后续的训练 (提示和方法)。我们如何系统地记录这些方法的效果并重现它们?
非RL对齐方式
【2024-2-17】人类偏好优化算法哪家强?跟着高手一文学懂DPO、IPO和KTO
- 原文链接:huggingface
由于 RLHF 复杂且不稳定,如何直接使用优化函数将人类的偏好和模型的结果进行对齐?
分析
RLHF 常用 PPO 作为基础算法,整体流程包含了4个模型,且通常训练过程中需要针对训练的 actor model进行采样,因此训练起来,稳定性、效率、效果不易控制。
actor model
/policy model
: 待训练模型,SFT训练后的模型作为初始化reference model
: 参考模型,经SFT训练后的模型进行初始化,且与actor model是同一个模型,且模型冻结,不参与训练,作用是在强化学习过程中保障actor model与reference model的分布差异不宜过大。reward model
: 奖励模型,提供每个状态或状态动作对的即时奖励信号。Critic model
: 估计状态或状态动作对的长期价值,也称状态值函数或动作值函数。
- 偏好数据: 表示为
三元组
(提示语 prompt, 良好回答 chosen, 一般回答 rejected)。- 论文中chosen表示为下标w(即win),rejected表示为下标l(即lose)
- DPO算法仅包含RLHF中的2个模型,即:
演员模型
(actor model)以及参考模型
(reference model),且训练过程中不需要进行数据采样。
总结
三种优化方法是:
- 直接偏好优化 (Direct Preference Optimization,
DPO
): DPO - 身份偏好优化 (Identity Preference Optimisation,
IPO
): IPO - Kahneman-Taversky 优化(
KTO
): KTO
三种不需要强化学习的大语言模型优化方法:直接优化偏好(DPO
)、身份偏好优化(IPO
)和卡内曼-塔弗斯基优化(KTO
)。
DPO
将偏好微调问题转换为一个简单的损失函数来实现- 而
IPO
则在DPO
基础上添加了正则化项以避免过拟合。 KTO
则完全基于“好”或“坏”的单个示例来定义损失函数。
LLM 对齐算法进行了评估:直接偏好优化(DPO)、身份偏好优化(IPO)和 Taversky Optimisation 优化(KTO)
并且在两个高质量的 7b 参数 大小的 LLM 上进行了实验。
这些 LLM 经过了有监督微调,但没有进行人类偏好调整。作者发现,虽然确实能找到效果最好的算法,但要获得最佳结果,必须对一些关键超参数进行调整。
【2024-4-24】 斯坦福AI(大模型)指数2024年度报告
各种方法对比
- RLAIF基本趋近RLHF
- 模型无害性上,RLAIF安全性最好,SFT最差。
- DPO比PPO/SFT更好
- 温度越高,效果越差,尤其是PPO,超过0.25时,急剧下跌
如果不能降低 RLHF 的开销,LLMs 在更广泛场景中的应用将受到限制。于是,直接偏好优化(Direct Preference Optimization,DPO
)应运而生。
- DPO 融合了 打分模型和策略模型的训练过程,只需要偏好标注数据、
参考模型
和策略模型
,就可使 LLMs 直接对齐人类偏好,极大地减轻了训练时对计算资源的消耗。 - 但是,理想的 DPO 形态应是 在线DPO(Online DPO),实时地采样 LLMs 对指令的回复,并实时地由人类标注偏好。所以,数据构造带来的开销非但没有降低(这种开销经常被忽略),反而要比 RLHF 更高。
因此, 开源社区通常使用 离线DPO(Offline DPO)微调模型。
- 训练前采集模型对指令的回复,并由人类标注好不同回复之间的排序,随后用这部分数据训练模型。
Offline DPO 使用事先采集的数据估计了人类和 LLMs 的偏好,随后再通过训练对齐二者的偏好。
随着训练的进行,LLMs 会逐渐偏离它自己最开始的偏好,损失函数又会错误地估计 LLMs 当前的能力(和上文中的 PT 和 SFT 类似),进而导致不理想的训练结果。
DPO 直接偏好优化
RLHF 复杂且不稳定
- 首先, 拟合反映人类偏好的奖励模型
- 然后用强化学习微调大型无监督 LM,以最大化这种估计奖励,而不会偏离原始模型太远。
- 且PPO需要收集大量人类偏好数据、需要训练奖励模型、RLHF同时加载多个模型进行训练,训练难度较大。
人类反馈强化学习(RLHF)实现困难:
- 需要人类反馈数据(很难收集)
- 奖励模型训练(很难训练)
- PPO强化学习微调(不仅很耗资源,而且也很难训练)
最后一步 PPO 好处:
- 提高安全性和可控性;
- 改进交互性;
- 克服数据集偏差;
- 提供个性化体验;
- 符合道德规范;
- 持续优化和改进。
【2024-1-19】【LLM的偏好微调和对齐】
【2024-7-29】斯坦福 推出 DPO (Differentiable Policy Optimization)
直接偏好优化 (DPO) 是一种广泛使用的离线偏好优化算法,重新参数化了从人类反馈 (RLHF) 强化学习中的奖励函数,以提高简单性和训练稳定性。
DPO 以封闭形式提取出最优策略,仅通过简单的分类损失就能解决标准的RLHF问题,无需RL循环训练。
DPO 稳定性高、性能优越、计算量轻,消除了在微调过程中从LM采样的需求,也无需进行大量的超参数调整。
实验结果表明
- DPO 在将LMs与人类偏好对齐方面表现得与现有方法相当或更优。
- 特别是控制生成内容的情感方面,DPO 微调超越了基于PPO的RLHF
- 同时在摘要和单轮对话的响应质量上也能达到或超过现有水平,且其实施和训练过程更为简便。
DPO
(Direct Preference Optimization, 直接偏好优化)是一种稳定、性能和计算成本轻量级的强化学习算法。
- 通过利用奖励函数与最优策略之间的映射关系,证明这个受限奖励最大化问题可以通过单阶段的策略训练来精确优化
- 本质是在人类偏好数据上解决一个分类问题。
- DPO 相对于PPO,更加稳定、低成本的强化学习方法
DPO 通过参数化 RLHF 奖励函数来直接根据偏好数据学习策略模型,无需显式奖励模型。
- DPO 并不会学习一个显式奖励模型,而是使用一个带最优策略的闭式表达式来对奖励函数 r 进行重新参数化
该方法简单稳定,已经被广泛用于实践。
DPO
(Direct Preference Optimization)直接偏好优化算法与PPO
(Proximal Policy Optimization)优化目标相同。
主要思路是:
- 定义 policy模型(策略模型)和reference模型(参考模型)
- Policy模型: 要训练的对话生成模型
- reference模型: 给定的预训练模型或人工构建的模型。
- 对于给定prompt,计算两模型对正样本和负样本的概率, 正样本是人类选择的回复, 负样本是被拒绝的回复。
- 通过两个模型概率的差值构建DPO损失函数,惩罚policy模型对正样本概率的下降和负样本概率的上升。通过最小化DPO损失进行模型训练。
直接偏好优化(DPO
)已成为将大型语言模型(LLM)与人类或人工智能偏好相结合的一种很有前景的方案。与基于强化学习的传统对齐方法不同,DPO
将对齐公式重新定义为一个简单损失函数,该函数直接在偏好数据集{(x,y_w,y_l)}上优化,其中 x 是 prompt,y_w,y_l 分别是偏好的和非偏好的响应。
DPO同样可以完成RLHF,而且有两个重要优点:
- (1)不需要额外训练奖励模型。
- (2)整个训练过程只需要策略模型和参考模型 2个LLM模型,不需要额外显存去加载奖励模型,节省显存资源。
大大降低了训练难度。
DPO的改进之处
- RLHF算法包含
奖励模型
(reward model)和策略模型
(policy model,也称演员模型
,actor model),基于偏好数据以及强化学习不断迭代优化策略模型的过程。 - DPO算法不包含
奖励模型
和强化学习过程,直接通过偏好数据进行微调,将强化学习
过程直接转换为SFT
过程,因此整个训练过程简单、高效,主要的改进之处体现在于损失函数。
DPO 损失函数解释:
- (1)策略模型(参数更新)得分: 选择样本得分 - 拒绝样本得分 。其本质上希望 选择样本得分越高越好,拒绝样本得分越低越好。
- (2)参考模型得分(参数固定): 选择样本得分 - 拒绝样本得分 ,每个训练epoch 不会变
- (3)最终损失 : -(策略模型得分 — 参考模型得分 ) 。本质上期望策略模型在无害问题生成得分上与参考模型拉开差距。
- 左半部分是训练的policy模型选择chosen优先于rejected,右半部分是冻结的reference模型选择chosen优先于rejected,二者的差值可类似于
KL散度
,保障actor模型的分布与reference模型的分布不会有较大的差异。
DPO 微调示意图
- Trained LM即为策略模型,Frozen LM即为参考模型,二者均是先进行SFT微调得到的模型进行初始化,其中Trained LM需要进行训练,Frozen LM不参与训练。
- 两个模型分别针对chosen和rejected进行预测获取对应的得分,再通过DPO的损失函数进行损失计算,进而不断的迭代优化。
DPO 简单易用, 广受欢迎,并已成功应用于 Zephyr 模型和 Intel 提出的 NeuralChat 等模型的训练当中。
在两个高质量的7B参数语言模型上对这三种方法进行了超参数扫描实验,发现DPO表现最好,但关键超参数beta需要调优。
- 在Zephyr模型上,当beta取0.01时所有三种方法效果最好。DPO可以达到最高的MT Bench分数,但KTO的表现也很接近。IPO的效果则不如基础模型。
- 在OpenHermes模型上,每个方法的最佳beta值差异很大。DPO仍优于其他两种方法,但基础模型已经很强,调整后提升不大。
文章开源了所有的代码和配置文件,重现了这些实验结果。DPO目前看来是最强大且稳定的语言模型优化算法。
- 未来将继续在TRL中实现新的优化算法并评估其性能。希望能开发出比DPO更好的方法,或能从仅带“好”“坏”标签的数据中进行调整的KTO。
RLHF 代码实现
DPO 实现
- direct-preference-optimization 支持 ‘conservative’ DPO and IPO
- trl 版本实现: 消费级显卡搞定RLHF——DPO算法+QLora微调LLM拒绝有害问题回答实战
ODPO 核心就是在损失函数中放一个 offset,但是 offset 是根据 reward 确定的,SimPO 引用了 ODPO 但是没讨论,引出 offset 的时候提的是 IPO,因为 IPO 的 offset 是也定值
DPO 改进
DPO 的成功激发了新损失函数研究,归纳为两个:IPO (稳健性) + KTO ()
IPO
DPO 缺点: 人类偏好数据集上很快就会过拟合。
谷歌 DeepMind 引入身份偏好优化(IPO
),为 DPO 损失添加了一个正则,能够在不使用「提前停止」等技巧的情况下让模型收敛。
KTO
Kahneman 和 Tversky 的前景理论
- 人类以有偏见但定义明确的方式感知随机变量;
- 例如,人类以厌恶损失而闻名。
将LLM与人类反馈相匹配的目标隐含许多偏见——这些目标(如DPO)在交叉熵最小化方面的成功部分可以归因于人类感知损失(HALO)的损失函数家族。
然而,这些方法效用函数与前景理论的效用函数不同。
【2024-2-2】
KTO
使用 Kahneman-Tversky 人类效用模型,论文提出直接最大化生成效用的 HALO
, 而不是最大化偏好的对数可能性。
- 在1B~30B尺度上与基于偏好的方法的性能相匹配或超过,尽管它只从二进制信号(0或者1)中学习输出是否可取。
- 没有一个 HALO 普遍优越;
- 最佳损失取决于最适合给定设置的归纳偏差,经常被忽视的考虑因素。
KTO 损失函数本质是把 pair-wise 公式变成 point-wise 方式
KTO 的工作原理:
- 如果模型以直接(blunt manner)方式增加了理想示例的奖励,那么 KL 惩罚也会增加,并且不会取得任何进步。这迫使模型准确地了解是什么让输出变得理想,这样就可以增加奖励,同时保持 KL 项持平(甚至减少)。
- 实际实现中,KL term 是通过当前batch里面的正负样本进行估计得到的,详细 debug KTOTrainer 源代码
对成对偏好数据进行分配:
-
与大多数比对方法一样,DPO 需要一个成对偏好数据集(x, y_w, y_l),够根据一组标准(如有益性或有害性)来标记哪种模型响应更好。
- 实践过程中,创建这些数据是一项耗时且成本高昂的工作。
- ContextualAI 提出替代方案,称为 Kahneman-Taversky 优化(
KTO
),完全根据被标记为「好」或「坏」的样本(例如在聊天 UI 中看到的图标👍或👎)来定义损失函数。这些标签更容易获得, KTO 是一种很有前景的方法,不断更新在生产环境中运行的聊天模型。
与此同时,这些方法都有相应的超参数,其中最重要的是 β ,控制对使用模型的偏好程度的权重。
这些方法已经在第三方库(如 huggingface TRL)中实现
KTO 不需要成对的偏好数据,实验时直接将 GPT-4 生成的响应归类为「好」标签,将 Llama Chat 13b 的响应视为「坏」标签。
- 虽然 GPT-4 的响应可能比 Llama Chat 13b 普遍更受欢迎,某些情况下,Llama-Chat-13b 可能会产生更好的响应,但作者认为这只是小概率事件,可以忽略不计。
Step-DPO
【2024-8-18】超越DPO!大模型精细化对齐之 Step-DPO
相比 instance-level-dpo,step-level-dpo 只优化 step-level 的数据,而共同前缀则作为 prompt 的一部分,不参与 loss 计算。
直接偏好优化 (DPO) 对长链数学推理的益处有限,因为采用 DPO 的模型很难识别错误答案中的细节错误。这种限制源于缺乏细粒度的过程监督。
【2024-1-26】香港中文和哈工大提出简单、有效且数据高效的 Step-DPO
方法将单个推理步骤视为偏好优化的单位,而不是整体评估答案。
Step-DPO 损失函数本质是从以前的对运行结果的loss,加上了对中间推理过程的loss:
Step-DPO 开发了一个数据构建 pipeline,可创建包含 10K 个逐步偏好对的高质量数据集。
- Error collection: 使用了COT的推理prompt,例如”Let’s think step by step. Step 1:”,这确保模型的推理结果被结构化为多个推理步骤,每个步骤都明确以“Step i:”开头。
- Step localization: 假设每个错误推理结果都明确地呈现为一系列推理步骤 y = s1、s2、…、sn,继续验证每个推理步骤的正确性,直到找到第一个错误并记录其步骤号 k。此过程可以手动完成,也可以使用 GPT-4。我们选择 sk 作为错误推理步骤 s lose,从而得到一个包含错误步骤的数据集。
- Rectification:为了得到 D2 中每个样本对应的正确推理步骤,需要通过提示 x 和前面的正确推理步骤 s1∼k−1 推断模型 π ref,来抽样多个输出 y cont。我们保留最终答案与基本事实相符的输出。在剩余的输出中,选择 y_cont 中的第一个推理步骤作为 swin,从而得到最终数据集D。
DPO 中,由于后者的分布不均性质,自生成数据比人类或 GPT-4 生成的数据更有效。
研究结果表明,对于具有超过 700 亿个参数的模型,仅需 10,000 个偏好数据对和少于 500 个 Step-DPO 训练步骤即可使 MATH 的准确率提高近 3%。
- 当将 Step-DPO 应用于 Qwen2-72B-Instruct 时,在 MATH 和 GSM8K 的测试集上分别获得了 70.8% 和 94.0% 的分数,超越了一系列闭源模型,包括 GPT-4-1106、Claude-3-Opus 和 Gemini-1.5-Pro。
介绍几篇与 Step-DPO 相关的文章。
MCTS-DPO
- 论文标题:Monte Carlo Tree Search Boosts Reasoning via Iterative Preference Learning
- 代码地址:MCTS-DPO
- 提出 step-level-dpo,为了获取 step-level 的偏序数据,则使用树搜索获取具有共同前缀的 step-level 偏序数据。使用树搜索可以天然地获取具有共同前缀的 preference-dataset,而且,可以利用 UCT、estimated-Q 等等,选择 preference-step,以及 对 Step-DPO 算法做 label smoothing 如根据访问次数对 dpo-loss 做平滑。
SVPO
- 论文标题:Step-level Value Preference Optimization for Mathematical Reasoning
- 继承了 alphamath,将 value-function 估计与 step-level-dpo 结合。preference-dataset 的构造与 [1] 类似,即使用树搜索 + output-reward 筛选 chosen、rejected step。在整个模型训练过程中,加入了 value-head 的训练,解码时,可以使用 value-guided-decoding,采样复杂度介于 greedy/random-sample 和 MCTS 之间,达到更好的效果。该工作在训练中,为了防止模型退化,加入了 sft-loss。
- Scaling LLM Math Synthetic Data
- 论文标题:RL on Incorrect Synthetic Data Scales the Efficiency of LLM Math Reasoning by Eight-Fold
- 用答案错误样本提升数学能力的方法
MCTS-DPO
【2024-6-17】新加坡南洋理工 通过迭代偏好学习过程增强大型语言模型 (LLM) 推理能力的方法(叫做 MCTS-DPO),该方法受到 AlphaZero 所采用的成功策略的启发。
MCTS-DPO 利用蒙特卡洛树搜索 (MCTS) 迭代收集偏好数据,利用其前瞻能力将实例级奖励分解为更细粒度 step-level信号。为了增强中间步骤的一致性,结合了结果验证和逐步自我评估,不断更新新生成数据的质量评估。所提出的算法采用直接偏好优化 (DPO) 来使用此新生成的步骤级偏好数据更新 LLM 策略。
理论分析揭示了使用策略采样数据对于成功自我改进的重要性。对各种算术和常识推理任务的广泛评估表明,与现有模型相比,性能有显著提高。
- 例如,MCTS-DPO 方法在 GSM8K、MATH 和 ARC-C 上的表现优于 Mistral-7B 监督微调 (SFT) 基线,准确率分别大幅提升至 81.8% (+5.9%)、34.7% (+5.8%) 和 76.4% (+15.8%)。
蒙特卡洛树搜索 (MCTS) 通过迭代偏好学习提升模型性能。MCTS-DPO 框架的每次迭代(左侧)包含两个阶段:MCTS 用于收集step level偏好,偏好学习用于更新策略。
- 用 MCTS 估计的动作值 Q 来分配偏好,其中 Q 值较高和较低的步骤将分别标记为正数据(绿色)和负数据(紫色)。Q 的比例在颜色图中可视化。使用右侧训练过程中的验证准确率曲线展示了迭代学习框架中在线方式的优势。ARC-C 验证的性能说明了我们提出的方法与其离线变体相比的有效性和效率。
SPIN
【2024-2-12】SPIN:Self-Paly微调将弱模型转换为强模型
不使用额外人工标注数据将弱LLM训练为强LLM的前景。SPIN(Self-Play Fine-tuning)的新微调方法。
- SPIN的核心是self-play机制,LLM通过自身对抗来实现能力改善。
- LLM从先前迭代的版本中生成训练数据,通过从人类标注数据中识别生成的响应来改善模型。
- SPIN能够逐步将初始LLM提升为强大的模型,释放SFT人类标注数据的全部潜力。理论上,当LLM与目标分布一致时才能实现训练目标函数的最优值。
- 在HuggingFace Open LLM Leaderboard、MT-Bench和Big-Bench上评估了SPIN,结果显示器能够显著改善LLM在各个基准上的效果,甚至超越使用DPO训练的模型。
DMPO
直接偏好优化 (DPO) 可以减轻复合错误,提供一种直接优化强化学习 (RL) 目标的方法。
然而,由于无法取消分区函数,将 DPO 应用于多轮任务会带来挑战。
解决
- 分区函数独立于当前状态,并解决首选和不首选轨迹之间的长度差异。
【2024-8-17】中科大论文在 RL 目标中用状态动作占用度量约束替换策略约束,并在 Bradley-Terry 模型中添加长度规范化,从而产生一种名为 DMPO 的新型损失函数,用于多轮agents任务,并提供理论解释。
在三个多轮 agents 任务数据集上进行的大量实验证实了 DMPO
损失的有效性和优越性。
DMPO
损失的说明如下图,它通过最大化首选轨迹相对于非首选轨迹的可能性来直接优化 RL 目标。
ODPO
DPO 问题
- pair 中的候选项并非同等重要,而 DPO 算法只看序关系, 体现不出a优于b的程度情况
【2024-2-16】ETH 推出 ODPO, 增加一个 偏置 offset, 区分不同程度
利用标注数据,设定一个距离,把正负样本差距拉开
理论:证明如果将 Gumbel 噪声添加到响应的估计奖励中,则两个响应的估计奖励之间的差异大于 0 的概率等于Bradley-Terry模型预测的一个人选择该响应的概率,而奖励差异大于 d 的概率是 σ(原始奖励差 - d);
- 发现 offset >= 0 时, ODPO 的损失函数等价于 softmax margin 损失。
然后开始设定偏移量,通用形式 alpha * f(正样本分数 - 负样本分数)
,alpha 是一个超参数,f 是接下来实验要选的函数,先直接用 log(正样本分数 - 负样本分数), alpha=1
在不同的数据集大小上,ODPO 都实现了帕累托
改进
实验显示, ODPO 显著优于 DPO, 尤其是 数据集小的情形。
ORPO
【2024-4-8】消费级显卡搞定人类偏好对齐(RLHF), 不用参考模型的对齐算法——ORPO实战
RLHF和DPO资源消耗较多,能不能摆脱参考模型,直接进行人类偏好对齐?
- ORPO 算法
【2024-3-12】ORPO
(Odds Ratio Policy Optimization,赔率比策略优化)无需参考模型LLM语言模型偏好对齐的技术
- 通过对拒绝的回答施加一个小惩罚,同时对选择回答施加一个强奖励,然后通过简单对数赔率项添加到负对数似然损失上。
- 论文 ORPO: Monolithic Preference Optimization without Reference Model
- trl 代码: orpo_trainer.py
ORPO 通过将弱惩罚分配给被拒绝结果,将强适应信号分配给所选择的响应,并将简单的对数比值比项附加到负对数似然损失,以单步方式在没有参考模型(reference model)的情况下对齐语言模型。
ORPO算法目标函数由两部分组成:
- 监督微调损失:遵循传统的因果语言模型负对数似然损失函数,以最大化生成参考标记的可能性。
- 相对比率损失:最大化在给定输入prompt时,生成非偏好响应reject与生成偏好响应chosen之间的可能性比率。
通过最小化监督微调损失,同时最大化相对比率损失,ORPO实现了人类偏好对齐,最重要的是不需要任何参考模型,相比于DPO少了一个REF参考模型,相比于RLHF(PPO)少了一个Reward Model 和一个REF参考模型。
ORPO 最终损失形式如下(trl的实现):
loss
=policy_nll_loss
(监督微调损失) -losses
(相对比率损失) 。- loss 前一部分就是 监督微调损失 policy_nll_loss , 即chosen样本的llm预测损失。
- 后一部分losses为相对比率损失
附
实现代码如下:
def odds_ratio_loss(
self,
policy_chosen_logps: torch.FloatTensor,
policy_rejected_logps: torch.FloatTensor,
) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]:
"""Compute ORPO's odds ratio (OR) loss for a batch of policy and reference model log probabilities.
Args:
policy_chosen_logps: Log probabilities of the policy model for the chosen responses. Shape: (batch_size,)
policy_rejected_logps: Log probabilities of the policy model for the rejected responses. Shape: (batch_size,)
Returns:
A tuple of three tensors: (losses, chosen_rewards, rejected_rewards).
The losses tensor contains the ORPO loss for each example in the batch.
The chosen_rewards and rejected_rewards tensors contain the rewards for the chosen and rejected responses, respectively.
The log odds ratio of the chosen responses over the rejected responses ratio for logging purposes.
The `log(sigmoid(log_odds_chosen))` for logging purposes.
"""
# Derived from Eqs. (4) and (7) from <https://arxiv.org/abs/2403.07691> by using log identities and exp(log(P(y|x)) = P(y|x)
log_odds = (policy_chosen_logps - policy_rejected_logps) - (
torch.log1p(-torch.exp(policy_chosen_logps)) - torch.log1p(-torch.exp(policy_rejected_logps))
)
sig_ratio = F.sigmoid(log_odds)
ratio = torch.log(sig_ratio)
losses = self.beta * ratio
chosen_rewards = self.beta * (policy_chosen_logps.to(self.accelerator.device)).detach()
rejected_rewards = self.beta * (policy_rejected_logps.to(self.accelerator.device)).detach()
return losses, chosen_rewards, rejected_rewards, torch.mean(ratio).item(), torch.mean(log_odds).item()
解释:
- 两个选择:一个正确,一个错误。
- ORPO损失帮模型更倾向于选择正确的那个。
- ORPO损失会计算模型选择正确答案和错误答案的概率差距
- 然后鼓励模型增加选择正确答案的概率,减少选择错误答案的概率。
- 这样,模型就会慢慢学会怎样做出更好的选择。
对比了一下3种人类偏好对齐方法的的效果: ORPO 算法在低资源情况下,偏好对齐的性能比DPO和PPO还好一点。
trl包最新实现的ORPO算法,数据集格式如下,主要需要包含
- “prompt”:人类输入的指令
- “chosen”:人类偏好的机器输出的结果
- “rejected” :人类拒绝的机器输出的结果
{'prompt': '考虑以下方程,附加条件是 x 必须是一个质数:\n1 + 1 = x\nx 的值是多少?',
'system': '',
'chosen': '对于方程式1 + 1 = x和x必须是质数的限制条件,x的值为2。在这种情况下,1 + 1 = 2,2是最小的质数,同时满足方程和限制条件。',
'rejected': '方程式1 + 1 = x有一个解为x = 2,而且由于x必须是一个质数,唯一可能的解就是x = 2。',
'source': 'evol_instruct',
'id': None}
qwen1.5-1.8B-chat 实践 参考:
SimPO
DPO 问题
- 即使训练时把 reward 学对,也不代表生成正样本的概率确实大于了生成负样本的概率
【2024-5-27】全面超越DPO:陈丹琦团队提出简单偏好优化SimPO,还炼出最强8B开源模型
【2024-5-23】弗吉尼亚+普林斯顿, 陈丹琪团队 推出 SimPO, 简单却有效的离线偏好优化算法。
- 论文 SimPO: Simple Preference Optimization with a Reference-Free Reward
- 代码及模型 SimPO
- 损失函数: 对序列的概率取平均
SimPO 原理
SimPO 有效性归功于一个关键设计:
- 使用序列平均对数概率作为隐式奖励。
- 这种奖励公式与模型生成更好地保持一致,并且消除了对参考模型的需求,使其计算和内存效率更高。
- 此外,在 Bradley-Terry 目标中引入了目标奖励边际,以鼓励获胜和失败响应之间的更大边际,从而进一步提高算法的性能。
细节对比分析:
- DPO 的奖励公式隐式地促进了长度归一化,不过 SimPO 在这方面略胜一点,用直接归一化效果更好
- 奖励公式与生成似然的不匹配
- SimPO 奖励分类准确性更高、内存开销更小
算法核心将偏好优化目标中的奖励函数与生成指标对齐。
SimPO 包含两个主要组件:
- (1)在长度上归一化奖励,其计算方式是使用策略模型的奖励中所有 token 的平均对数概率;
- (2)目标奖励差额,用以确保获胜和失败响应之间的奖励差超过这个差额。
SimPO 目标函数在DPO的基础上多了一个gamma(论文叫做target reward margin)的参数
总结,SimPO 特点:
- 简单:SimPO 不需要参考模型,因此比 DPO 等其它依赖参考模型的方法更轻量更容易实现;
- 性能优势明显:尽管 SimPO 很简单,但其性能却明显优于 DPO 及其最新变体(比如近期的无参考式目标 ORPO)。如图 1 所示。并且在不同的训练设置和多种指令遵从基准(包括 AlpacaEval 2 和高难度的 Arena-Hard 基准)上,SimPO 都有稳定的优势;
- 尽量小的长度利用:相比于 SFT 或 DPO 模型,SimPO 不会显著增加响应长度(见表 1),这说明其长度利用是最小的。
SimPO 效果
效果分析
实验相当全面,把多个变种都拿来比较,比如
IPO
和KTO
都不用成对数据ORPO
也不需要参考模型R-DPO
是加长度相关正则化
最后,SimPO 比前述五种方法都好
基于 Llama3-8B-instruct 构建具有顶尖性能的模型
- AlpacaEval 2 上得到的长度受控式胜率为 44.7,在排行榜上超过了 Claude 3 Opus;
- SimPO 在 AlpacaEval 2 上的表现比 DPO 高出 6.4 分,在 Arena-Hard 上的表现比 DPO 高出 7.5 分
- 另外其在 Arena-Hard 上的胜率为 33.8,使其成为了目前最强大的 8B 开源模型。
SimPO 能更有效地利用偏好数据,在验证集上对高质量和低质量响应的似然进行更准确的排序,这进一步能造就更好的策略模型。
TDPO
微调预训练的大型语言模型(LLM)过程通常利用成对比较和KL散度等方法与参考LLM进行比较,评估模型生成的完整答案。
然而,回复产生都在token级别,遵循顺序、自回归方式。
【2024-4-18】TDPO
通过在 Token-level 优化策略来使LLM与人类偏好保持一致的新方法。
- 与之前在发散效率方面面临挑战的方法不同,TDPO 为每个token引入了 前KL 散度约束,提高了对齐和多样性。
- TDPO 将 Bradley Terry 模型用于基于token 奖励系统,增强了KL散度的调节,同时保持了简单性,不需要显式的奖励建模。
实验结果表明,TDPO在平衡对齐与生成多样性方面具有卓越的性能。
- 在受控情绪生成(IMDB情感分析数据集)和单轮对话数据集中,TDPO 微调比DPO达到了更好的平衡,并且与基于 DPO 和 PPO的RLHF方法相比,显著提高了生成响应的质量。
自博弈(Self-play)
DNO
【2024-4-4】微软 Direct Nash Optimization (DNO) 引入 博弈论里的纳什均衡
DPO 通用偏好不佳, DNO 增加通用偏好惩罚, 让对比学习更加简单、稳定
SPO
【2024-6-13】
自我对弈偏好优化 (SPO
) 是一种从人类反馈中进行强化学习的算法。
SPO方法极简,不需要训练奖励模型,也不需要不稳定的对抗训练,因此相当容易实现。
SPO方法是极繁主义的,因为它可以证明处理非马尔可夫、非传递和随机偏好,同时对困扰离线顺序预测方法的复合误差具有鲁棒性。
以极小极大赢家 (Minimax Winner, MW) 的概念为基础,社会选择理论文献中的偏好聚合概念,从偏好中学习定义为两种策略之间的零和博弈
。通过这种博弈的对称性,SPO可 以简单地让单个agent与自己对弈,同时保持强大的收敛保证,而不是使用传统的两种策略决斗技术来计算 MW。
实际上,这相当于从策略中抽取多个轨迹,要求偏好或教师模型对它们进行比较,然后使用获胜比例作为特定轨迹的奖励。在一系列连续控制任务中,能够比基于奖励模型的方法更有效地学习,同时保持对在实践中汇总人类判断时经常出现的不可传递(intransitive)和随机(stochastic)偏好的鲁棒性。
基于偏好的 RL / RLHF 的标准流程(左)涉及基于成对偏好数据集训练奖励模型(即分类器),然后通过 RL 对其进行优化。引入了 SPO(右),这种方法直接基于偏好或教师模型提供的偏好反馈进行优化,每个轨迹都会根据其偏好的其他 onpolicy 轨迹的比例获得奖励。我们通过经验证明和验证,这种方法比以前的研究对非传递、非马尔可夫和嘈杂偏好更具鲁棒性。
OpenAI o1
【2024-9-14】OpenAI o1 强化学习背后的自博弈(Self-play)方法介绍
自博弈(Self-play)强化学习核心: 通过自我对弈不断进化。
- 《A Survey on Self-play Methods in Reinforcement Learning》介绍了自博弈方法的理论基础、关键技术以及在多样化场景下的应用实践。
自博弈(Self-play)借助博弈论
建模多个决策者之间的互动,为解决MARL中的固有问题提供了优雅的解决方案
内容提要
- 引言与背景
- 人工智能与强化学习
- 自博弈的兴起与重要性
- AlphaGo作为自博弈的里程碑
- 预备知识:自博弈基础
- 多智能体强化学习(MARL)概念
- 博弈论基础
- 自博弈评估指标
- 自博弈技术概览
- 1)自博弈算法分类
- 传统自博弈算法
- PSRO系列算法
- 基于持续训练的算法
- 基于遗憾最小化的算法 - 2)自博弈在不同领域的应用
- 棋盘博弈:围棋、象棋、战棋
- 纸牌博弈:德州扑克、斗地主、麻将
- 视频游戏:《星际争霸II》、MOBA游戏、Google Research Football - 3)算法性能评估
- 数据集与基准测试
- 评估指标:ELO、Glicko、TrueSkill等
- 挑战与开放问题
- 自博弈的收敛性问题
- 环境非平稳性与算法鲁棒性
- 可扩展性与训练效率
- 自博弈在大型语言模型中的应用
攻防
奖励黑客
【2024-12-3】翁荔离职OpenAI后第一个大动作!奖励黑客万字综述
博客发文,讲解强化学习中奖励黑客(Reward Hacking)问题
- 智能体(Agent)利用奖励函数或环境中的漏洞来获取高奖励,而并未真正学习到预期行为。
奖励黑客
(Reward hacking)
- 强化学习(RL)智能体利用奖励函数中的缺陷或模糊之处来获得高奖励,而没有真正学习或完成预期任务的现象。
存在原因:
- 强化学习的环境往往并不完美
- 准确定义奖励函数本质上就是一个具有挑战性的问题
三种做法:
改进强化学习算法
Anthropic创始人Dario Amodei在2016年发表的论文《Concrete Problems in AI Safety》提到了一些解决的方向:
- 对抗性奖励函数:将奖励函数本身视为一个自适应智能体,它能够适应模型发现的新技巧,即那些奖励值高但人类评分低的情况。
- 模型前瞻:可以基于预期的未来状态给予奖励;例如,如果智能体要替换奖励函数,就会得到负面奖励。
- 对抗性掩盖:我们可以遮蔽、掩盖模型的某些变量,使智能体无法学习到能够黑客攻击奖励函数的信息。
- 谨慎工程:通过谨慎的工程设计可以避免某些类型的系统设计奖励攻击;例如,将智能体沙箱化以隔离其行为与奖励信号。
- 奖励上限:这种策略是简单地限制最大可能的奖励,可以有效防止智能体通过黑客攻击获得超高回报策略的罕见事件。
- 反例抵抗:提高对抗鲁棒性应该有助于提高奖励函数的鲁棒性。
- 多重奖励组合:组合不同类型的奖励可以使其更难被黑客攻击。
- 奖励预训练:我们可以从(状态,奖励)样本集合中学习奖励函数,但这取决于监督训练设置的好坏,可能会带来其他问题。RLHF依赖于此,但学习到的标量奖励模型很容易学到不期望的特征。
- 变量无差异:目标是让智能体优化环境中的某些变量而不是其他变量。
- 陷阱机制:可以故意引入一些漏洞,并设置监控和警报,以便在发生奖励攻击时发现。