强化学习PPO算法
大模型后训练需要用到人类反馈强化学习RLHF,该方法使用PPO算法结合奖励函数实现对LLM的微调,后来出现了DPO算法,即"直接偏好优化"算法,可以直接使用偏好数据对SFT之后的LLM模型进行训练,实现与PPO+Reward同样的效果, 这里的Reward主要指的是结果监督奖励函数,即对LLM输出的整个句子给与一个奖励值,以此引导PPO对LLM的训练优化方向。
参考论文:
《Proximal Policy Optimization Algorithms》
https://arxiv.org/pdf/1707.06347
大模型后训练需要用到人类反馈强化学习RLHF,该方法使用PPO算法结合奖励函数实现对LLM的微调,后来出现了DPO算法,即"直接偏好优化"算法,可以直接使用偏好数据对SFT之后的LLM模型进行训练,实现与PPO+Reward同样的效果, 这里的Reward主要指的是结果监督奖励函数,即对LLM输出的整个句子给与一个奖励值,以此引导PPO对LLM的训练优化方向,后面又出现了过程监督奖励函数,仍然要使用PPO算法。
近端策略优化 (PPO) 是一种流行的强化学习 (RL) 的算法,它在优化策略时平衡了探索和利用。该算法旨在提高策略更新期间的稳定性和效率。PPO 在保持信任区域策略优化 (TRPO) 优势的同时简化了其复杂性。下面将详细解释 PPO算法和其背后的数学概念。
1. 强化学习的基本设置
- 在 RL 中,智能体与环境交互并学习最大化预期累积奖励 E[∑t=0∞γtrt]\mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t r_t \right]E[∑t=0∞γtrt],其中:
- rtr_trt:时间 ttt 的奖励
- γ\gammaγ:折扣因子
目标是学习一个由参数 θ\thetaθ 定义的策略 πθ(a∣s)\pi_\theta(a | s)πθ(a∣s),它将状态 sss 映射到动作 aaa 的概率分布。
2. 策略梯度基础
基于策略的方法最大化目标函数:
J(θ)=Eτ∼πθ[∑t=0Trt], J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} r_t \right], J(θ)=Eτ∼πθ[t=0∑Trt],
其中 τ\tauτ 是从策略 πθ\pi_\thetaπθ 中采样的轨迹。
使用策略梯度定理,我们写出:
∇θJ(θ)=Est,at∼πθ[∇θlogπθ(at∣st)⋅Aπ(st,at)], \nabla_\theta J(\theta) = \mathbb{E}_{s_t, a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot A^\pi(s_t, a_t) \right], ∇θJ(θ)=Est,at∼πθ[∇θlogπθ(at∣st)⋅Aπ(st,at)],
其中 Aπ(st,at)A^\pi(s_t, a_t)Aπ(st,at) 是优势函数,衡量动作 ata_tat 比平均策略好多少。
3. TRPO 中的信任区域优化
TRPO 对策略更新施加约束以确保稳定性。它解决以下问题:
maxθE[πθ(at∣st)πθold(at∣st)Aπ(st,at)], \max_\theta \mathbb{E} \left[ \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_\text{old}}(a_t | s_t)} A^\pi(s_t, a_t) \right], θmaxE[πθold(at∣st)πθ(at∣st)Aπ(st,at)],
受KL 散度约束:
Est[DKL(πθold(⋅∣st) ∣∣ πθ(⋅∣st))]≤δ. \mathbb{E}_{s_t} \left[ D_\text{KL} \left( \pi_{\theta_\text{old}}(\cdot | s_t) \,||\, \pi_\theta(\cdot | s_t) \right) \right] \leq \delta. Est[DKL(πθold(⋅∣st)∣∣πθ(⋅∣st))]≤δ.
尽管有效,但求解此优化问题是计算密集型的。
4. PPO:简化 TRPO
PPO 通过使用剪切函数简化 TRPO,确保稳定的更新而不需要显式地要求 KL 约束。关键思想是对代理目标进行优化,限制对策略的大规模更新。
目标函数
PPO 的目标函数为:
LCLIP(θ)=Est,at[min(rt(θ)At, clip(rt(θ),1−ϵ,1+ϵ)At)], L^\text{CLIP}(\theta) = \mathbb{E}_{s_t, a_t} \left[ \min\left(r_t(\theta) A_t, \, \text{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right) A_t \right) \right], LCLIP(θ)=Est,at[min(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)],
其中:
- rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_\text{old}}(a_t | s_t)}rt(θ)=πθold(at∣st)πθ(at∣st):新旧策略间的概率比。
- ϵ\epsilonϵ:剪切参数(例如,ϵ=0.2\epsilon = 0.2ϵ=0.2)。
- AtA_tAt:优势函数。
术语解释:
- rt(θ)Atr_t(\theta) A_trt(θ)At:鼓励改善策略的更新(当优势 At>0A_t > 0At>0 时)。
- clip(rt(θ),1−ϵ,1+ϵ)At\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_tclip(rt(θ),1−ϵ,1+ϵ)At:限制概率比 rt(θ)r_t(\theta)rt(θ) 保持在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon][1−ϵ,1+ϵ] 内,防止过大的更新。
直觉:
最小函数选择在更新时不会导致策略大幅变化的剪切项,从而避免不稳定性。
防止策略更新过大:
- 如果策略更新导致rt(θ)r_t(\theta)rt(θ)(概率比值)增幅过大,优势函数AtA_tAt 会被过度放大,从而破坏训练的稳定性。
- 剪切机制通过限制rt(θ)r_t(\theta)rt(θ) 在[1−ϵ,1+ϵ][1 - \epsilon, 1 + \epsilon][1−ϵ,1+ϵ] 范围内,使策略更新保持在合理的信任区域内。这类似于 TRPO 的约束效果,但更简单。
悲观更新:
- min\minmin 函数确保只会选择未剪切目标和剪切目标中较小的值。这种设计防止策略更新幅度过大,始终倾向于保守更新(即较小的更新)。
通过这种方式,PPO 保持了策略更新的稳定性,避免了因为过大更新导致的训练崩溃或性能退化,同时摒弃了 TRPO 复杂的优化约束。
5. 优势估计
PPO 常用广义优势估计 (GAE) 来计算 AtA_tAt:
At=∑l=0∞(γλ)lδt+l, A_t = \sum_{l=0}^\infty (\gamma \lambda)^l \delta_{t+l}, At=l=0∑∞(γλ)lδt+l,
其中:
- δt=rt+γV(st+1)−V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)δt=rt+γV(st+1)−V(st):时间差分(TD)误差。
- λ\lambdaλ:控制偏差-方差权衡的 GAE 参数。
6. PPO 算法
完整的 PPO 算法如下:
- 采样轨迹:运行策略 πθ\pi_\thetaπθ 收集轨迹 {st,at,rt}\{s_t, a_t, r_t\}{st,at,rt}。
- 计算优势:使用 GAE 估计 AtA_tAt。
- 更新策略:对 LCLIP(θ)L^\text{CLIP}(\theta)LCLIP(θ) 进行梯度上升。
- 更新价值函数:最小化价值函数损失:
LVF=Est[(Vθ(st)−Rt)2], L^\text{VF} = \mathbb{E}_{s_t} \left[ \left( V_\theta(s_t) - R_t \right)^2 \right], LVF=Est[(Vθ(st)−Rt)2],
其中 Rt=∑l=0∞γlrt+lR_t = \sum_{l=0}^\infty \gamma^l r_{t+l}Rt=∑l=0∞γlrt+l 是折扣回报。 - 重复:直到收敛。
7. PPO 的优点
- 稳定训练:剪切机制避免了导致不稳定的较大的策略更新。
- 高效:比 TRPO 更简单且计算更高效。
- 通用:适用于许多 RL 问题,包括连续和离散的动作空间。
8. 数学挑战和推导
- 梯度偏差:剪切引入了梯度偏差,但实证结果显示这种偏差稳定了训练过程。
- KL 正则化:PPO 在训练过程中通常监控 KL 散度 DKL(πθold ∣∣ πθ)D_\text{KL} \left( \pi_{\theta_\text{old}} \,||\, \pi_\theta \right)DKL(πθold∣∣πθ) 以确保更新保持在合理范围内,即使它不像KL散度那样拥有显式约束。
PPO论文原文第4-5页(中文翻译)
图2:替代目标函数,展示了我们在初始策略参数 θold\theta_{\text{old}}θold 和更新后的策略参数之间进行插值的过程。更新后的策略与初始策略的KL散度约为0.02,并且这是 LCLIPL^{CLIP}LCLIP最大化的点。该图对应于使用第6.1节中提供的超参数在Hopper-v1问题上的第一次策略更新。
4 自适应KL惩罚系数
除了使用裁剪替代目标函数外,或者作为其补充,另一种方法是引入对KL散度的惩罚,并调整惩罚系数,以使得每次策略更新时达到某个目标KL散度 dtargetd_{\text{target}}dtarget。在我们的实验中,我们发现KL惩罚的效果不如裁剪替代目标函数,但我们仍然将其包含在此,因为它是一个重要的基线。
在这种算法的最简单实现中,我们在每次策略更新时执行以下步骤:
-
使用多个小批量SGD轮次优化带有KL惩罚的目标函数
LKLPEN(θ)=Et[πθ(at∣st)Δt−β KL[πθold(⋅∣st),πθ(⋅∣st)]] L^{KL PEN}(\theta) = \mathbb{E}_t \left[ \pi_\theta(a_t \mid s_t) \Delta_t - \beta \; \text{KL} [\pi_{\theta_{\text{old}}}(\cdot \mid s_t), \pi_\theta(\cdot \mid s_t)] \right] LKLPEN(θ)=Et[πθ(at∣st)Δt−βKL[πθold(⋅∣st),πθ(⋅∣st)]] -
计算 d=E^t[KL[πθold(⋅∣st),πθ(⋅∣st)]]d = \hat{\mathbb{E}}_t [\text{KL} [\pi_{\theta_{\text{old}}}(\cdot \mid s_t), \pi_\theta(\cdot \mid s_t)]]d=E^t[KL[πθold(⋅∣st),πθ(⋅∣st)]]
-
如果 d<dtarget/1.5d < d_{\text{target}} / 1.5d<dtarget/1.5,则 β←β/2\beta \leftarrow \beta / 2β←β/2
-
如果 d>dtarget×1.5d > d_{\text{target}} \times 1.5d>dtarget×1.5,则 β←β×2\beta \leftarrow \beta \times 2β←β×2
-
更新后的 β\betaβ 将用于下一次策略更新。用这个方案,我们偶尔会看到策略更新中KL散度显著不同于 dtargetd_{\text{target}}dtarget;然而,这种情况很少见,β\betaβ 会迅速调整。上面的参数1.5和2是启发式选择的,但算法对它们并不敏感。β\betaβ 的初始值是另一个超参数,但在实践中并不重要,因为算法会快速调整它。
5 算法
前几节中的替代损失可以通过对典型策略梯度实现做少量改动来计算和微分。对于使用自动微分的实现,只需构建 LCLIPL^{CLIP}LCLIP 或 LKLPENL^{KL PEN}LKLPEN损失而不是 LPGL^{PG}LPG,并对该目标执行多步随机梯度上升。
大多数用于计算方差减少的优势函数估计器的技术都利用了学习到的状态价值函数 V(s)V(s)V(s);例如,广义优势估计 [Sch+15a],或[Mni+16] 中的有限范围估计器。如果使用共享策略和价值函数参数的神经网络架构,则必须使用结合策略替代和价值函数误差项的损失函数。此目标还可以通过添加熵奖励来增强,以确保足够的探索,如过去的工作所建议 [Wil92, Mni+16]。结合这些项后,我们得到以下目标,在每次迭代中(近似)最大化:
LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)−c1LtVF(θ)+c2S[πθ](st)], \begin{equation} L_t^{CLIP+VF+S}(\theta) = \hat{\mathbb{E}}_t[L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_\theta](s_t)], \end{equation} LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)−c1LtVF(θ)+c2S[πθ](st)],
其中 c1,c2c_1, c_2c1,c2 是系数,SSS 表示熵奖励,而 LtVFL_t^{VF}LtVF 是平方误差损失 (Vϕ(st)−Vtarget)2(V_\phi(s_t) - V^{\text{target}})^2(Vϕ(st)−Vtarget)2。
一种流行的策略梯度实现方式,由 [Mni+16] 推广并适用于递归神经网络,是运行策略 TTT 步(其中 TTT 远小于剧集(episode)长度),并使用收集的样本进行更新。这种风格需要一个不超过时间步 TTT 的优势估计器。[Mni+16] 使用的优势估计器为:
A^t=−V(st)+rt+γrt+1+⋯+γT−t+1rT−1+γT−tV(sT) \hat{A}_t = -V(s_t) + r_t + \gamma r_{t+1} + \cdots + \gamma^{T-t+1} r_{T-1} + \gamma^{T-t} V(s_T) A^t=−V(st)+rt+γrt+1+⋯+γT−t+1rT−1+γT−tV(sT)
这里 ttt 指定了给定长度为TTT 的轨迹段中的时间索引 [0,T][0, T][0,T]。概括这个选择,我们可以使用广义优势估计的截断版本,当 λ=1\lambda = 1λ=1 时,上面公式简化为:
A^t=δt+(γλ)δt+1+⋯+(γλ)T−t−1δT−1,其中δt=rt+γV(st+1)−V(st) \begin{align} \hat{A}_t &= \delta_t + (\gamma \lambda) \delta_{t+1} + \cdots + (\gamma \lambda)^{T-t-1} \delta_{T-1}, \\ \text{其中} \quad \delta_t &= r_t + \gamma V(s_{t+1}) - V(s_t) \end{align} A^t其中δt=δt+(γλ)δt+1+⋯+(γλ)T−t−1δT−1,=rt+γV(st+1)−V(st)
6 近端策略优化(PPO)算法
一个使用固定长度轨迹段的 近端策略优化(PPO) 算法的流程如下。在每次迭代中:
- NNN 个(并行)actor 收集 TTT 步的数据。
- 在这些 NTNTNT 步的数据上构建替代损失。
- 使用小批量 SGD(或 Adam,通常性能更好)对损失进行优化,优化 KKK 个 epoch。
算法:PPO(Actor-Critic 风格)
输入:
- NNN: 并行 actor 的数量
- TTT: 每个 actor 的时间步数
- KKK: 优化的 epoch 数量
- MMM: 小批量大小(M≤NTM \leq NTM≤NT)
输出:
- θ\thetaθ: 更新后的策略参数
步骤:
- 初始化策略参数 θold\theta_{\text{old}}θold。
- 每次迭代重复以下步骤:
- 对于每个 actor i=1,2,…,Ni = 1, 2, \ldots, Ni=1,2,…,N:
- 使用策略 πθold\pi_{\theta_{\text{old}}}πθold 在环境中运行 TTT 步。
- 计算优势估计 A^1,A^2,…,A^T\hat{A}_1, \hat{A}_2, \ldots, \hat{A}_TA^1,A^2,…,A^T。
- 优化替代损失 LLL,对 θ\thetaθ 进行 KKK 个 epoch 的优化,使用小批量大小 M≤NTM \leq NTM≤NT。
- 更新旧策略:θold←θ\theta_{\text{old}} \leftarrow \thetaθold←θ。
- 对于每个 actor i=1,2,…,Ni = 1, 2, \ldots, Ni=1,2,…,N:
实验
替代目标的比较
我们在不同的超参数下比较了几种替代目标。具体来说,将 截断的替代目标 LCLIPL^{\text{CLIP}}LCLIP 与以下变体进行比较:
无截断或惩罚: Lt(θ)=rt(θ)A^t \text{无截断或惩罚: } \quad L_t(\theta) = r_t(\theta) \hat{A}_t 无截断或惩罚: Lt(θ)=rt(θ)A^t
截断: Lt(θ)=min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t) \text{截断: } \quad L_t(\theta) = \min\big(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t\big) 截断: Lt(θ)=min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)
KL 惩罚(固定或自适应): Lt(θ)=rt(θ)A^t−β⋅KL[πθold,πθ] \text{KL 惩罚(固定或自适应): } \quad L_t(\theta) = r_t(\theta) \hat{A}_t - \beta \cdot \text{KL}[\pi_{\theta_{\text{old}}}, \pi_\theta] KL 惩罚(固定或自适应): Lt(θ)=rt(θ)A^t−β⋅KL[πθold,πθ]
说明:
- rt(θ)r_t(\theta)rt(θ) 是概率比值:rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}rt(θ)=πθold(at∣st)πθ(at∣st)。
- A^t\hat{A}_tA^t 表示优势估计。
- KL\text{KL}KL 是 Kullback-Leibler 散度。
- ϵ\epsilonϵ 是截断的超参数,β\betaβ 控制 KL 惩罚。
更多推荐
所有评论(0)