LLM强化学习算法演进之路:Q-Learning->DQN->PPO->DPO等
本文中各方法的分布:
| 位置 | 方法1 | 方法2 | 方法3 | 方法4 | 方法5 | 方法6 | 方法7 |
|---|---|---|---|---|---|---|---|
| 第一章节 | MC | TD | QL | DQN | PG | AC | PPO |
| 第二章节 | LLM的PPO | ||||||
| 第三章节 | LLM的DPO | ||||||
| 第四章节 | LLM的GRPO |
一、强化学习理论基础
Q值:代表智能体选择某个动作后,一直到最终状态奖励总和的期望, Q值评价动作。 V值:代表智能体在这个状态下,一直到最终状态的奖励总和的期望,V值评价状态。
如何在不知道真实环境分布的情况下估算V值,已经诞生了多种方法,大体归纳为基于价值、基于策略两种:
1.1)基于价值的方法
代表:MC(Monte-Carlo,蒙特卡洛)方法、TD(Temporal-Difference,时序差分),基于TD的变体包括SARSA、Q-learning、DQN)
MC方法
思路:通过样本回合(episode,也叫trajectory,即轨迹)的完全体验来估计状态值函数V(s)。具体来说,它使用从一个状态开始到回合结束的真实收益来进行估计。 缺点:算法要求采样必须走到最终状态;面对巨大的状态空间,小概率能到达最终状态。
TD方法
思路:不必等待一个完整的回合结束才能进行更新,而是可以在每个时间步进行增量更新。 延展方法:SARSA、Q-learning、DQN。
TD方法的变体之——SARSA(State-Action-Reward-State-Action)
思路:SARSA算法更新的是状态-动作价值函数(Q值),通过五元组(当前状态S、当前动作A、收到的奖励R、下一个状态S’、下一个动作A’)来进行学习。SARSA被称为“on-policy”算法,因为它更新的Q值是基于当前策略选择的动作。
TD方法的变体之——Q-learning
思路:采用Q表(Q-table)来存储状态-动作对的价值。通过不断更新Q表来学习一个最优策略,使得Agent能够在环境中最大化累积奖励。这是一种“off-policy”算法,即更新Q值时不依赖于当前执行的策略。它使用贪心策略来更新Q值,即选择下一个状态中的最大Q值进行更新。Q表是一个二维表格,其中:行代表环境中的所有可能状态s;列代表在每个状态下所有可能的动作a;表中的每个元素 Q(s,a)表示在状态s采取动作a后的预期累积奖励。 缺点:它只能解决离散的、有限状态、有限动作空间的任务。 选取action的策略——greedy-epsilon(又叫ε-greedy):即以概率1−ε选择当前已知的最优动作(即利用)。这通常是基于当前的Q值或策略评估选出的动作。以概率ε随机选择一个动作(即探索),以确保算法有机会尝试不同的动作,可能发现更优的策略。其实从下图中Q-learning的公式就可以看出,即形式如Q=(1-α)Q+αG=Q+α(G-Q)。
Q-learning方法的改进版本之——DQN(Deep Q-Network)
思路:使用神经网络解决Q-learning中状态不连续的问题。在DQN中,Q值函数不是用表格存储,而是用神经网络来近似。神经网络Q(s,a;θ)参数化Q值函数,其中θ是神经网络的参数。计算细节包括:经验回放(Experience Replay)、目标网络(Target Network)、损失函数(Loss)等,如下图。
DQN代码学习:https://github.com/louisnino/RLcode/blob/master/tutorial_DQN.py
1.2)基于策略的方法
代表:PG(Policy Gradient,策略梯度)、AC、PPO(Proximal Policy Optimization,近端策略优化)
PG方法
思路:利用reward奖励直接对选择行为的可能性进行增强和减弱,好的行为会被增加下一次被选中的概率,不好的行为会被减弱下次被选中的概率。 缺点:数据使用效率低(每次收集的数据只用一次就丢弃了,即on-policy);采用蒙特卡洛的思想,每次要走到最后,太慢了。
PG代码见https://github.com/louisnino/RLcode/blob/master/tutorial_PG.py,其执行逻辑梳理如下:
Actor-Critic(AC)方法
思路:为了解决PG中采用蒙特卡洛必须走到最后的状态才计算G值,改为TD的思路。但是,PG需要计算G值,那么在TD中,我们应该怎样估算每一步的Q值呢?即神经网络。AC采用两个神经网络:Actor网络负责对网络输入状态S输出策略&选择动作,Critic网络负责计算每个动作的分数。 缺点:仍然是一个在线策略,即on-policy。
AC代码学习见https://github.com/louisnino/RLcode/blob/master/tutorial_AC.py,其执行逻辑梳理如下:
PPO方法
概念:从离散问题到连续问题
用AC来解决连续型控制问题。方法是输入avg和var,构造一个正态分布来表示策略。 avg表示平均数,也就是整个正态分布的中轴线,avg的变化,表示整个图像向左右移动。 var表示方差,当sigma越大,图像越扁平;sigma约小,图像越突出,而最大值所在的位置,就是中轴线。 如何实现:神经网络可以直接输出mu和sigma,就能获得整个策略的概率密度函数。
概念:两种策略
行为策略:不是当前策略,用于产出数据。 目标策略:会更新的策略,是需要被优化的策略。 如果两个策略是同一个策略,那么称为On Policy=在线策略;如果不是同一个策略,那么称为Off Policy=离线策略。
概率:重要性采样(Important-sampling)
目标:用行为策略获取的数据,能够更新目标策略,把AC从在线策略,变成离线策略。 含义:目标策略出现动作a的概率 除以 行为策略出现a的概率。
概念:N步更新
之前的TD叫做TD(0),而N步更新为TD(n),可以看成TD(0)其实是TD(n)的一种特殊情况。 实际上我们只需要计算最后的V(s'),根据这个估算的V(s'), 我们反推经过的所有state的V值。这个其实和PG估算G的过程是一样的,只不过我们并不需要走到最后,而是中途截断,用网络估算。
PPO代码学习见https://github.com/louisnino/RLcode/blob/master/tutorial_PPO.py,其执行逻辑梳理如下:
训练流程的1-4步代码解读分别见下面四幅图:
快速背诵:收(收集轨迹数据)、计(计算折扣回报)、策(策略迭代优化)
1.3)PG->AC->TRPO->PPO->DPO方法演进公式对比
二、LLM的PPO模型
首先,看下PPO算法的四个模型:
| 模型名 | 解释&目标 |
|---|---|
| Actor模型 | 解释:待训练的策略模型 |
| 目标:生成/采样Experience数据。 | |
| Reference模型 | 解释:通常为初始的Actor模型; |
| 目标:防止"Actor模型在训练过程中学习的分布"走偏。 | |
| Critic模型 | 解释:待训练的判别模型(或称为价值模型); |
| 目标:对每个状态打分,有时用Reward模型热启。 | |
| Reward模型 | 解释:通常指ORM(Outcome Reward Model); |
| 目标:对生成的结果打分。 |
需要采样经验(Experience)数据的原因:
LLM中实际使用的公式:
代码参考Open_RLHF库的PPO实战:https://github.com/OpenRLHF/OpenRLHF/blob/main/openrlhf/trainer/ppo_trainer.py
三、LLM的DPO(Direct Preference Optimization)模型
背景:目前RLHF的流程太复杂,不仅需要单独训练reward模型,还需要从LLM的输出采样。 优势:DPO通过理论证明,可以不需要引入reward模型,就可以完成LLM的偏好训练。实验证明,在生成情感、摘要、单论对话质量方面,DPO比基于PPO的RLHF更好。
DPO最终公式见表1-2,推导过程如下:
step1:明确目标
一个是Reward最大化,一个是positive的样本得分大于negative样本得分。因此,公式推导采用的策略是先最大化Reward,在带入"positive的样本得分大于negative样本得分"公式。
step2:表征positive的样本得分大于negative样本得分
step3:Reward最大化
step4:带入step2
代码参考Open_RLHF库的DPO实战:https://github.com/OpenRLHF/OpenRLHF/blob/main/openrlhf/trainer/dpo_trainer.py
四、LLM的GRPO(Group Relative Policy Optimization)模型
背景(PPO的缺点):
需要训练一个与策略模型大小相当的价值模型(Critic模型),这带来了巨大的内存和计算负担; 在 LLM 的上下文中,通常只有最后一个 token 会被奖励模型打分,这使得训练一个在每个 token 上都准确的价值函数变得困难。
GRPO的优势:
避免了像 PPO 那样使用额外的价值函数近似,而是使用"同一问题下多个采样输出的平均奖励"作为基线。
1)优化目标
2)优势函数计算
五、参考文献
绯红之刃:强化学习公式理解 芒果草莓:DQN基本概念和算法流程(附Pytorch代码) 一辄:强化学习 | Policy Gradient | Natural PG 详细推导(1) 张斯俊:如何理解策略梯度(Policy Gradient)算法?(附代码及代码解释) 张斯俊:理解Actor-Critic的关键是什么?(附代码及代码分析) https://zhuanlan.zhihu.com/p/13043187674 张斯俊:如何直观理解PPO算法?[理论篇] arXiv reCAPTCHA 怪兽:详细推导DPO算法 Plunck:【LLM】GRPO:改进PPO增强推理能力
作者 | 假如给我一只AI
原文链接:https://zhuanlan.zhihu.com/p/20949520788
作者 | 假如给我一只AI
原文链接:https://zhuanlan.zhihu.com/p/20949520788
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫 等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递