【LLM】RLHF机制(Reinforcement Learning from Human Feedback)

文章介绍了RLHF(基于人类反馈的强化学习)机制,包括有监督学习、奖励模型训练和PPO策略优化三个步骤。RLHF通过GPT3生成候选答案并由人类评分来训练奖励模型,然后使用PPO算法更新策略,控制策略更新幅度。PPO算法通过限制策略的KL散度来保证策略的稳定改进。此外,文章还提及了InstructGPT和ChatGPT的训练方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RLHF机制

在这里插入图片描述

  • 分为三个步骤
    • 我做你看:有监督学习,从训练集中挑出一批prompt,人工对prompt写答案
    • 你做我看:奖励模型训练,这次不人工写答案了,而是让GPT3给出几个候选答案,人工对其质量排序,Reward model学习一个打分器;这个让机器学习人类偏好的过程就是【对齐】,但可能会导致胡说八道,可以通过KL Divergence等方法解决。instructGPT中奖励模型的损失函数如下,其中 rθ(x,y) 是奖励模型对提示x和完成y的标量输出,具有参数θ, y w y_w yw y w y_w yw y l y_l yl中更受欢迎的补全,D是人类比较的数据集。 loss ⁡ ( θ ) = − 1 ( K 2 ) E ( x , y w , y l ) ∼ D [ log ⁡ ( σ ( r θ ( x , y w ) − r θ ( x , y l ) ) ) ] \operatorname{loss}(\theta)=-\frac{1}{\left(\begin{array}{c} K \\ 2 \end{array}\right)} E_{\left(x, y_w, y_l\right) \sim D}\left[\log \left(\sigma\left(r_\theta\left(x, y_w\right)-r_\theta\left(x, y_l\right)\right)\right)\right] loss(θ)=(K2)1E(x,yw,yl)D[log(σ(rθ(x,yw)rθ(x,yl)))]
    • 自学成才:PPO训练,利用第二阶段的打分器,RL对大量训练数据训练,PPO最大优化该目标函数:  objective  ( ϕ ) = E ( x , y ) ∼ D π ϕ R L [ r θ ( x , y ) − β log ⁡ ( π ϕ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] + γ E x ∼ D pretrain  [ log ⁡ ( π ϕ R L ( x ) ) ] \begin{aligned} \text { objective }(\phi)= & E_{(x, y) \sim D_{\pi_\phi^{\mathrm{RL}}}}\left[r_\theta(x, y)-\beta \log \left(\pi_\phi^{\mathrm{RL}}(y \mid x) / \pi^{\mathrm{SFT}}(y \mid x)\right)\right]+ \\ & \gamma E_{x \sim D_{\text {pretrain }}}\left[\log \left(\pi_\phi^{\mathrm{RL}}(x)\right)\right] \end{aligned}  objective (ϕ)=E(x,y)DπϕRL[rθ(x,y)βlog(πϕRL(yx)/πSFT(yx))]+γExDpretrain [log(πϕRL(x))]
      • π φ R L π^{RL}_φ πφRL是学习到的RL策略,
      • π S F T π^{SFT} πSFT是监督训练模型,
      • D p r e t r a i n D_pretrain Dpretrain 是预训练分布。
      • KL奖励系数β和预训练损失系数γ分别控制KL惩罚和预训练梯度的强度。对于“PPO”模型,γ 设为 0。除非另有说明,否则本文中InstructGPT指 PPO-ptx模型

在这里插入图片描述

二、PPO模型(近端策略优化)

  • 思想:保证策略改进同时,通过一些约束来控制策略更新的幅度;在每次迭代中,通过采样多个轨迹数据来更新策略:
    • 使用当前策略对环境交互,收集多个轨迹数据
    • 利用第一步的轨迹数据计算当前策略和旧策略之间的KL散度,通过控制KL散度大小来限制策略更新的幅度
    • 使用优化器对策略进行更新,使其更加接近当前的样本策略
  • KL散度(Kullback-Leibler Divergence),可以衡量两个概率分布之间的差异程度。在 PPO 算法中,KL 散度(Kullback-Leibler Divergence)的计算公式如下:
    K L ( π o l d ∣ ∣ π n e w ) = ∑ i π o l d ( i ) l o g ( π o l d ( i ) / π n e w ( i ) ) KL(π_old || π_new) = ∑i π_old(i) log(π_old(i) / π_new(i)) KL(πold∣∣πnew)=iπold(i)log(πold(i)/πnew(i))
    • 其中,π_old 表示旧的策略,π_new 表示当前的样本策略。KL 散度的含义是用 π_old 的分布对 π_new 的分布进行加权,然后计算两个分布之间的差异程度。
    • 具体来说,KL 散度的计算方法是首先计算 π_old(i) / π_new(i) 的比值,然后对其取对数并乘以 π_old(i) 来进行加权。最后将所有加权后的结果相加,即可得到 KL 散度的值。

注意:KL 散度是一个非对称的度量,即 KL(π_old || π_new) 与 KL(π_new || π_old) 的值可能不相等。在 PPO 算法中,我们通常使用 KL(π_old || π_new) 来控制策略更新的幅度,因为 KL(π_old || π_new) 的值通常比 KL(π_new || π_old) 更容易控制,并且更能够反映出策略改变的方向。

Reference

[1] 强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO
[2] “StackLLaMA”: 用 RLHF 训练 LLaMA 的手把手教程.huggingface
[3] ChatGPT的RLHF:AI时代的“调速器”,让AI真正可用的关键
[4] 【他山之石】如何正确复现 Instruct GPT / RLHF?
[5] https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback
[6] RLHF中的PPO算法原理及其实现.王嘉宁
[7] Training language models to follow instructions with human feedback(2022)
[8] InstructGPT论文解读.李响
[9] ChatGPT训练三阶段与RLHF的威力.oneflow

### 关于LLM模型的学习方法与资料 #### 一、多模态LLM的特点及其应用场景 多模态LLM是一种结合了文本与其他形式数据(如图像、视频、音频等)的大型语言模型。这种类型的模型通过接受多种类型的数据训练,能够找到不同模态间的关系并完成单一模态无法实现的任务,例如图片描述、音乐解读和视频理解等[^1]。 #### 二、大模型的基础理论与技术发展 对于希望深入研究LLM的人来说,了解其背景和发展历程至关重要。相关内容涵盖了人工智能简述、GPT系列模型的发展史以及模型工程的具体实践等内容[^2]。这不仅帮助初学者构建完整的知识体系,还提供了实际操作中的指导思路。 #### 三、预训练的重要性及其实现方式 在进入具体学习之前,掌握预训练的概念和技术细节是非常必要的。预训练是指利用大量未标注的数据来使模型获得语言统计规律及相关常识的过程。这一阶段产生的基座模型具有广泛的适用性和强大的泛化能力[^3]。 #### 四、扩展认知框架的新需求 随着技术进步,现代LLM开发者还需要熟悉诸如波束搜索解码(Beam Search Decoding)这样的概率算法, 知识蒸馏(Knowledge Distillation), 和基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)[^4]等方面的知识。这些都是超越传统编码技能之外的重要组成部分。 #### 推荐资源列表 为了更好地理解和运用上述概念,可以参考以下几类优质教程或文档: - **官方文档**: 各种主流框架如PyTorch,Hugging Face Transformers库都有详尽说明。 - **在线课程平台**: Coursera,Udacity提供由顶尖大学教授讲授的相关专项课程。 - **社区分享项目**: GitHub上有许多关于如何调整(LLaMA Factory)现有大规模模型以适应特定用途的例子。 ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("gpt2") model = AutoModelForCausalLM.from_pretrained("gpt2") input_text = "Once upon a time" inputs = tokenizer(input_text, return_tensors="pt").to('cuda') outputs = model.generate(**inputs,max_new_tokens=50) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` 以上代码片段展示了如何加载预先训练好的GPT-2模型并通过它生成一段连续的文字序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山顶夕景

小哥哥给我买个零食可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值