当前位置:   article > 正文

长文 | RL in NLP:强化学习在自然语言处理下的应用_final labeling instructions

final labeling instructions

长文 | RL in NLP:强化学习在自然语言处理下的应用

许婧 NLP工作站 2023-12-04 17:17

写在前面

刘聪NLP。

最近再搞大模型对齐相关内容,今天给大家带来一篇《强化学习在自然语言处理下的应用》,来自知乎@许婧。通过本文,你将学习到强化学习简介、RLHF in NLP以及RLHF是必须的吗?

  • 强化学习简介:从相关RL理论出发,介绍RLHF中PPO的loss function各项意义

  • RLHF in NLP:介绍instruct GPT训练流程,关注RLHF部分的开源代码/数据集构造指南/其他框架向优化(多粒度/多目标)

  • RLHF是必须的吗?:介绍RLHF的“竞对”or“SL替身”算法

长文警告,建议收藏后,仔细阅读。

知乎:https://zhuanlan.zhihu.com/p/669524673

强化学习简介

强化学习(Reinforcement Learning)是一种时序决策学习框架,通过智能体和环境交互 ,得到的奖励  ,从而来优化策略 ,使其能够在环境中自主学习

回顾关键概念

以单智能体时序决策问题为例

  • States and Observations

    • 状态S:对于世界状态的完整描述

    • 观测O:对于一个状态的部分描述,可能会缺失一些信息。当O=S时,称O为完美信息/fully observed;O<S时,称O为非完美信息/partially observed。

  • Action Spaces 动作空间

    • 离散动作空间:当智能体只能采取有限的动作,如下棋/文本生成

    • 连续动作空间:当智能体的动作是实数向量,如机械臂转动角度

其区别会影响policy网络的实现方式。

  • Policy策略

    • 确定性策略Deterministic Policy: ,连续动作空间

    • 随机性策略Stochastic Policy: ,离散动作空间

  • 轨迹:指的是状态和行动的序列

    • 状态转换函数(transition function):

    • 初始状态是从初始状态分布中采样的,一般表示为

  • 奖赏函数:

    • 智能体的目标是最大化行动轨迹的累计奖励:

  • 强化学习问题:选择一种策略从而最大化预期收益

    • 假设环境转换和策略都是随机的,则T步行动轨迹概率:

    • 预期收益:

    • 核心优化问题:找到最优策略

RL发展路径(至PPO)

Value-based

状态的值 V(s)或者状态行动对(state-action pair)的值Q(s,a) ,作为一种累积奖赏的估计,可以通过最大化值函数来优化得到最优策略,这种优化方法称为value-based。所以,

  • 最优值函数(Optimal Value Function):

  • 最优动作-值函数(Optimal Action-Value Function):

    • 最优动作:

两者的关系:

贝尔曼方程

中心思想:当前值估计=当前奖赏+未来值估计

所以,最优值函数的贝尔曼公式为:

优势函数Advantage Functions

强化学习中,有时不需要知道一个行动的绝对好坏,而只需要知道它相对于其他action的相对优势。即,

Policy-based
  • RL核心优化问题:找到最优策略

  • 基础策略梯度求导

  • Log-derivative trick:

  • 轨迹的log-prob梯度与log-pi梯度的关系:

  • 【策略梯度公式的直观解释】

    • 第一项: 是一个方向向量,其方向是 对于参数  变化最快的方向,参数在这个方向上更新可以增大或者降低  ,也就是能增大或者降低轨迹  的概率  。

    • 第二项: 是一个标量,在策略梯度中作为向量 的更新幅值,  越大,向量的幅值越大,轨迹  出现的概率  在参数更新后会更大。因此,策略梯度的直观含义是通过增大高回报轨迹的概率+降低低回报轨迹的概率,来最大化累计回报。

Actor-Critic框架(以PPO为例)

中的轨迹回报的计算方式:
1. 轨迹的总回报:
2. 动作后的回报:
3. 加入基线的形式: 【Expected Grad-Log-Prob (EGLP) 引理,合理的b可减小方差】
4. 状态-行为值函数:
5. 优势函数:
6. TD残差:

1~3:直接应用轨迹的回报累积回报,无偏,但是由于需要累积多步的回报,因此「方差大」

4~6: 利用动作值函数,优势函数、TD偏差、GAE代替累积回报,其优点是方差小,但是这三种方法都属于用近似函数估计值,因此计算出来的策略梯度都存在「偏差」

GAE(generalized advantage estimator):平衡TD方法引入的偏差与MC方法带来的方差,公式如下

近似的GAE,对k步的估计做了加权。这种结合了近似估计轨迹回报的策略优化方式称为AC方法,此时,称为Actor, 对 的估计函数称为Critic。

PPO(Proximal Policy Optimization):

  • TRPO,一种基于信赖域的策略优化算法,解决普通的策略梯度算法无法保证「性能单调非递减」而提出来的方法。也就是说,「普通的策略梯度算法无法解决更新步长的问题,对于普通的策略梯度方法,如果更新步长太大,则容易发散;如果更新步长太小,即使收敛,收敛速度也很慢。

    • 解决方案:替代损失函数(Surrogate loss),约束了策略更新,更稳收敛

  • PPO在具体实现上做了简化:

    •  with 「ratio 裁剪」

    • ratio:  作为importance sampling系数,矫正由于不同策略下优势函数估计分布的偏差,当两分布差异过大时,importance sampling的近似估计会有较大误差。

  • 代码实现

  1.     def actor_loss_fn(self, logprobs, old_logprobs, advantages, mask):
  2.         ## policy gradient loss
  3.         log_ratio = (logprobs - old_logprobs) \* mask
  4.         ratio = torch.exp(log_ratio)
  5.         pg_loss1 = -advantages \* ratio
  6.         pg_loss2 = -advantages \* torch.clamp(ratio, 1.0 - self.cliprange,
  7.                                              1.0 + self.cliprange)
  8.         pg_loss = torch.sum(torch.max(pg_loss1, pg_loss2) \* mask) / mask.sum()
  9.         return pg_loss
  10.     def get_advantages_and_returns(selfvalues, rewards, start):
  11.         lastgaelam = 0
  12.         advantages_reversed = []
  13.         length = rewards.size()[-1]
  14.         for t in reversed(range(startlength)):
  15.             nextvalues = values[:, t + 1if t < length - 1 else 0.0
  16.             delta = rewards[:, t] + self.gamma \* nextvalues - values[:, t] # TD 残差
  17.             lastgaelam = delta + self.gamma \* self.lam \* lastgaelam  # GAE
  18.             advantages_reversed.append(lastgaelam)
  19.         advantages = torch.stack(advantages_reversed[::-1], dim=1)
  20.         returns = advantages + values[:, start:]
  21.         return advantages.detach(), returns
  22.     def critic_loss_fn(selfvalues, old_values, returns, mask):
  23.         ## value loss
  24.         values_clipped = torch.clamp(
  25.             values,
  26.             old_values - self.cliprange_value,
  27.             old_values + self.cliprange_value,
  28.         )
  29.         vf_loss1 = (values - returns)\*\*2
  30.         vf_loss2 = (values_clipped - returns)\*\*2
  31.         vf_loss = 0.5 \* torch.sum(
  32.             torch.max(vf_loss1, vf_loss2) \* mask) / mask.sum()
  33.         return vf_loss

PPO小结:

ppo(proximal policy optimization)通过优化一个upper bound来更新策略,在保证performance接近的情况下,限制步长的移动,对子问题逐步优化,理论上更容易得到单调递增的策略。

RL应用场景适合性判断

  1. 是否有reward delay/sparse reward问题

如果每次预测都有非常准确的密集反馈(dense reward)作为Ground Truth,单步的最优解就是全局最优解时,一般SL便能解决问题;反之,如果GT反馈信号存在delay问题,即当前决策的好坏由未来的某个反馈评估,则适合尝试RL。

  1. GT的标注成本过大?

某些情况下,虽然可以枚举GT,但枚举空间过大,需要人工逐字逐句改写,但评估GT好坏的准则较为简单、可实现,则可以通过构建RM(准召要够),基于RL的流程逐步引导最优策略的学习。

RLHF in NLP

Natural Language Policy Optimization (NLPO) 自然语言策略优化

更大的语言模型并不意味着更服从用户意图,可能生成不真实、有毒或对用户毫无帮助的输出。这是因为最近许多大型 LM 使用的语言建模目标“从互联网预测网页上的下一个token”与“有效且安全地遵循用户的指令”的目标不同,常用的评估指标基于规则的文本生成指标 (如 BLEU和 ROUGE),没有显式地引入人的偏好和主观意见,导致目标没对齐(objective misaligned)。

研究者尝试使用更主观的人类评价作为优化引导,基于RL去优化LLM中的alignment问题,使模型生成内容的流畅性和语法的正确性的同时,兼顾到人类对生成内容的有用性、真实性和无害性的偏好。

InstructGPT原理与训练流程

1、监督式微调LM(SFT)

注:instruct gpt实操时,是根据验证集上的 RM 分数进行最终的 SFT 模型挑选。因为实验发现我们的 SFT 模型在 1 个epoch后对验证损失过拟合;尽管过拟合,但更多epoch的训练对 RM 得分和人类偏好都有帮助。

2、Reward 建模(RM)

  1. instruct gpt实操采用6B RM,因为这样可以节省大量计算量,并发现 175B RM 训练可能不稳定,因此也不太适合用作 RL 的价值函数

  2. 比较数据集收集方式:生成  对回复共人类打标,并将一条prompt对应的pair作为一个batch的元素。从而使得只训一个epoch时,K对比较数据只会过一次RM,进而避免模型过拟合,实验验证效果较好。

  3. Loss function of RM:

  • 注1:由于 RM 损失不会因为奖励的shift而变化,因此在RL使用RM前需要对reward 做normalization,以便打标数据的均值为0。

  • 注2:RM的选择一般基于LLM改造,例如 OpenAI 【175B 的 LM 和 6B 的 RM】,Anthropic 【10B 到 52B 的LM 和 RM】,DeepMind 【70B 的 Chinchilla 模型分别作为 LM 和 RM】。一种直觉是,偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本。

3、PPO微调 LM(RL)

  1. 关键概念对齐

  • 策略 (policy) :一个接受prompt并返回一系列文本 (或文本的概率分布) 的 LM

  • 行动空间 (action space) :LM 的词表对应的所有token

  • 观察空间 (observation space) :可能的输入token序列

  • 奖励函数(reward model):偏好模型和策略转变约束 (Policy shift constraint)的结合

  1. PPO-ptx与PPO的不同:

  • reward上加了约束惩罚,以避免策略过于发散;

  • 加了pretrain loss以保证LM被RL之后在原始benchmark上的表现不要掉。

  • 实践体感:pretrain loss对alignment没有太大帮助(有问题欢迎指出)

  1. 损失函数

RLHF主流代码库

TRLX(使用前建议确认下最新版实现方式是否有修改&&是否满足自身需求)

https://github.com/CarperAI/trlx

该代码库之前没有完全按照InstructGPT思路来,主要体现在:

  1. RM和Critic模型没有同质:在InstructGPT中,是使用RM来初始化Critic网络,SFT model初始化Actor网络;但在TRLX具体实现中,使用了SFT model同时作为Actor和Critic的初始化。

  • Tips:训练时需要注意将critic loss的权重适当加大,保证RL训练初期主要是在优化critic网络。在Critic学习到较稳定后,再学习Actor网络,从而避免前期Critic还未稳定下对Actor有优化上的太大误导。

  1. 没有加入Pretrain Loss:但实践之下没有太大的影响Policy的训练收敛性。

实践时出现的现象:

  • 曾使用该代码库有在几种应用场景下都曾出现训练后期「reward分数骤降」问题,但不影响训练中期reward的正常收敛。考虑有可能是因为没有附加pretrain loss的问题,如果有同学遇到相似问题或者有任何其他考虑,欢迎讨论~

DeepSpeed-Chat

https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-chat

该代码库是微软官方出的,整体思路选择和InstructGPT基本一致

其他

  • PKU:https://github.com/PKU-Alignment/safe-rlhf/tree/main

  • MOSS:https://github.com/OpenLMLab/MOSS-RLHF

  • ColossalAI:https://github.com/hpcaitech/ColossalAI

RM训练数据的打标探索

一般从哪些角度评价一条response是“helpful、truthful、harmless”?
[PUBLIC] InstructGPT: Final labeling instructions给出了标注指南

https://docs.google.com/document/d/1MJCqDNjzD04UbcnVZ-LmeXJ04-TKEICDAepXyMCBUb8/edit#heading=h.21o5xkowgmpj
打标流程

对于每条输入指令,标签将由 3 部分组成:

  1. 打标instruction:标记指令属性,包括PII/Tag/Closed domain/User intent is unclear等,以便构建prompt库。

  2. 打标AI 模型输出:对于 AI 模型的每个输出,给出 1-7 的评分+判断其是否包含暴力或色情内容等。

  3. 排序 AI 模型输出:您将对输出从最好到最差进行排名,包括平局。

    具体细节详见标注指南

采用人工or模型打标

因为人类打标一致性统一存在难度,"基础大模型能像人类一样标注数据吗?"一文中探索了利用模型代替人类进行打标的表现

https://huggingface.co/blog/zh/llm-leaderboard
  • 人工打标:

  • 模型(GPT-4)打标:几个待评测模型的顺序不变,但相对的间隔变了。存在位置偏差

    使用的prompt:

  1. Question
  2. {question}
  3. The Start of Assistant 1's Answer
  4. {answer_1}
  5. The End of Assistant 1's Answer
  6. The Start of Assistant 2's Answer
  7. {answer_2}
  8. The End of Assistant 2's Answer
  9. System
  10. We would like to request your feedback on the performance of two AI assistants in response to the user question displayed above.
  11. Please compare the helpfulness, relevance, accuracy, level of details of their responses.
  12. The rating should be from the set of 1234567or 8, where higher numbers indicated that Assistant 2 was better than Assistant 1.
  13. Please first output a single line containing only one value indicating the preference between Assistant 1 and 2.
  14. In the subsequent line, please provide a brief explanation of your evaluation, avoiding any potential bias and ensuring that the order in which the responses were presented does not affect your judgment.

论文 How Far Can Camels Go? 展示了导致GPT-4 过高打分的潜在迹象: 多样性和回答的长度

问题发现小结:

  • GPT-4 存在位置偏差,当我们使用 1 到 8 分 范围,两两对比模型偏差时,GPT-4 倾向于给第一个模型更高分。

  • 在提示语中要求 GPT-4 不要保留这种位置偏差,会导致模型偏向另一边,但不会像上述情况那么差。

  • 针对事实性和有用性的回答上,GPT-4 更倾向于偏好那些用 InstructGPT、GPT-4、ChatGPT 生成的数据训练的模型。比如,在人类手写的输出方面,GPT-4 更倾向 Vicuna 和 Alpaca。

  • GPT-4 和人工评价者在评价非编程任务时,有着 0.5 左右的正相关性; 而对于编程任务,仍保持正相关,但数值远没有那么高。

  • 如果我们按任务类型看,人类和 GPT-4 的相关性在”高熵“任务 (如头脑风暴和生成类任务) 中相关性最高,而在编程类任务中相关性低。

更多RLHF框架

多粒度RLHF

Instruct GPT的reward是response粒度的,但一段回答质量的好坏有时不是整体评估的,比如敏感词不该出现,回复中某段存在事实性错误。将reward全部delay到response尾部再给出会增加RL的学习难度。

FINE-GRAINED RLHF: https://arxiv.org/pdf/2306.01693.pdf

  • 采取细粒度的RLHF时,RM需要细粒度的训练。

  • 多粒度,该论文是做了sentence级别的粒度。其实,token粒度/span粒度/response粒度都可以做,但需要关注下细粒度RM的推理耗时,对应打标方式也需对齐,注意RL优化时reward的位置和log-prob的位置对齐(如TRLX/trlx/trainer/accelerate_ppo_trainer.py中start&ends)!

多目标RLHF

由于不同场景有不同的业务目标(回答质量/安全性/业务逻辑等),方案:

  1. 解耦不同RM单独学习,然后RL时同时调用,并进行加权

  • 优:单独RM可在不同场景下复用,只需要调节RM之间的权重;

  • 缺:需要再开GPU存放更多的RM,以及gpu之间通讯同步。

  1. 多目标的打标,训rm时直接使用加权分,每个场景需要单独训练。

RLHF是必须的吗?

强化学习的短板:

  1. 基于反馈进行学习训练,可能存在“「奖励破解」”的问题,即通过卡reward设计上的漏洞,导致虽然获取更高的奖赏,但效果并没有真正的优化。

  2. 在训练过程中,代理模型需要和生成式模型进行不断交互,而这一过程可能非常「耗时且效率不高」

  3. 「价值模型本身并无和人类思考模型上明显的对应」。我们脑海中并没有一个单独的打分模型,而且实际上长期维护一个固定的打分标准也非常困难。相反,我们的成长过程中价值判断的形成大部分来自每天的交互 —— 通过对相似场景的不同交互反馈的分析,我们逐渐意识到什么是会被鼓励的,什么是不允许的。

RRHF

  1. github: https://github.com/GanjinZero/RRHF
  2. paper: https://arxiv.org/pdf/2304.05302.pdf

  1. 整体训练流程:

  • 基于prompt库,生成得到多个表现不一的回复。

  • 对多条回复进行RM inference得到具体反馈。

  • rank loss:按照反馈优劣构造对比pair作为训练数据;ft loss:选取最优回复作为训练数据。

  1. 损失函数设计:

  • rank loss functio

  • fine-tuning loss function (sft)

  • total loss

  • loss function 特点分析:

    • 优点:rank loss function 做为一种对比学习方式和sft loss function结合,以期望达到align到最优回复的同时,拉低较差回复的生成概率。

    • 缺点:但与可以细粒度奖赏的RL方式不同,这种对比学习的方式无法细粒度的区分出具体哪句话导致整体回复较差,优化方向需要模型自行根据训练数据比对分析,较不直接。

Stable Alignment

  1. github: https://github.com/agi-templar/Stable-Alignment
  2. paper: https://arxiv.org/pdf/2305.16960.pdf

  • 目标函数:

  • 中心思想:SFT的同时,拉开最优回复和其他回复的分布,且加入动态margin,迫使分数差别越大的两条回复,loss需要拉的更大。注意,一个mini-batch下,只有一条prompt,才能保证rating的可比性

the margin between the SFT loss and the loss from lower-rated responses increases proportionally to the distance from the highest rating. This implies the model must strive harder to unlearn lower-rated responses, while simultaneously learning from the highest-rated ones.

  • 算法流程:

DPO

  1. 知乎解读:https://zhuanlan.zhihu.com/p/633539131
  2. paper: https://arxiv.org/abs/2305.18290

以上的方法其中心思想都是利用对比学习代替交互式的强化学习来拉开优劣回复的概率分布,整体思想与Generative adversarial imitation learning(NIPS 2016)的主要motivation大体相似,GAIL有给出相应的理论证明其有效性。

但是上述的方案还是按照response的粒度进行拉开好坏结果的生成分布,而无法像RL那样做进一步细粒度的优化。主要成本在于细粒度对比学习需要细粒度的改写,标注成本较大。

写在最后

本文主要从相关RL理论出发,介绍RLHF中PPO的loss function各项意义,同时介绍了instruct GPT训练流程,关注RLHF部分的开源代码、数据集构造指南以及其他框架向优化,最后介绍了RLHF的“竞对”、“SL替身”算法。

欢迎多多关注公众号「NLP工作站」,欢迎加入交流群,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。

PS:新书已出《ChatGPT原理与实战》,欢迎购买。

往期推荐:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/565333
推荐阅读
相关标签
  

闽ICP备14008679号