Chat Bot

    强化学习 Proximal Policy Optimization (PPO)

    参考: 李宏毅老师课件

    PPO: Default reinforcement learning algorithm at OpenAI

    PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint

    Policy Gradient#

    Basic Conception#

    • Actor: 动作执行者(智能体)

    • Env: 环境

    • Reward Function: 奖励函数

    • Policy π : a network with parameter θ.

      Input: 当前的 Env.

      Output: actor 要采取的下一个 action 的分布.

    • Trajectory τ: 一系列的 Env 和 Action, {s1,a1,s2,a2,}
      img
      在参数为 θ 情况下, 发生τ的概率: pθ(τ)=p(s1)pθ(a1|s1)p(s2|s1,a1)pθ(a2|s2)

    Optimization#

    Object#

    img
    给定 τ, 可以计算 τ 的 reward, R(τ).

    对于参数为 θ 的 Policy下, Trajectory τ 是采样得到的, 因此实际上需要计算的是 reward 的期望值Rθ. 我们希望 Rθ 越大越好.

    Policy Gradient#

    Reward 的期望:

    (1)Rθ=τR(τ)pθ(τ)

    θ 的梯度:

    (2)Rθ=τR(τ)pθ(τ)=τR(τ)pθ(τ)pθ(τ)pθ(τ)分子分母同乘pθ(τ)=τR(τ)pθ(τ)logpθ(τ)=Eτpθ(τ)[R(τ)logpθ(τ)]1Nn=1NR(τn)logpθ(τn)=1Nn=1Nt=1TnR(τn)logpθ(atn|stn)

    logpθ(τ)=pθ(τ)pθ(τ), 可得到第三行公式.
    此处可延伸出一个公式:

    (3)f(x)=f(x)logf(x)

    τpθ(τ)f(τ)=Eτpθ(τ)[f(τ)], 可得第四行

    通过采样的方式估计期望值, 采样 N 个 Trajectory, 既第五行公式

    最后将 pθ(τ) 展开代入, 得第六行公式

    Implementation#

    最大化 Reward 的期望 Rθ, 由公式(2)中梯度的计算, 可以反推出目标函数在实现时定义如下:

    (4)J(θ)=1Nn=1Nt=1TnR(τn)logpθ(atn|stn)

    最大化 object 等价于最小化 loss:

    (5)loss=1Nn=1Nt=1TnR(τn)logpθ(atn|stn)

    其中, atn,stn 是在参数为 θ 的 policy 下采样得到的.

    与交叉熵损失对比: 其实就是将采样得到的 atn 视作grand truth计算交叉熵, 区别在于针对不同的 Trajectory τn, 要多乘了一个 R(τn)

    对于RLHF来说, 就是:

    1. 对于某个指令 I, 采样多条输出 O={o1,o2,,on}(即多个Trajectory, 其中每个 oi 表示一个Trajectory) 或者用多个指令,每个指令采样一个输出,不重要,不影响后续操作。
      2.把这些 O 作为label, 用teacher forcing的方式计算交叉熵损失, 不过在对于每个样本 oi, 其损失最终要额外乘一个奖励值R(oi)

    Tips#

    Add a baseline#

    img
    R(τn) 可能总为正数, 这样在 training时, 相当于告诉 model, 不论时什么action 都要将它的概率提升.

    理想情况下, 这样是没有问题的, 因为 Reward 即使总是正的, 也有大有小.

    当时实际上, action 是采样得到的, 这会导致如果有的 action 没有被采样到, 它的概率相对于被采样到的 action 就会下降, 而这时, 并不能表示当前环境下采取这个 action 不好. 改进: 减去一个 baseline, b.

    直观上的解释是, 如果一个 τ 中的 action 导致reward 增加的不够多, 我们也认为这个 action 不够好. 改进后的目标函数如下:

    (6)J(θ)=1Nn=1Nt=1Tn(R(τn)b)logpθ(atn|stn)

    Assign Suitable Credit#

    img
    再来看一下目标函数:

    (7)J(θ)=1Nn=1Nt=1Tn(R(τn)b)logpθ(atn|stn)

    对于同一个 Trajectory τ 中, 针对每个状态 s 下, 执行动作 a, 都有相同的 Reward 系数. 这是不合理的.
    例如图的左边, 在 sb 执行 a2 不是一个好的选择, 他会导致接下来进入 sc, 并执行 a3, 得到 -2 分.
    由此, 提出改改进1: 每个时刻的 reward 改为, 当前时刻到结束时刻的 reward 的总和.

    img
    某时刻的 action, 经过越长时间, 它的影响力就越小. 也就是与该 action 间隔很久的 reward 与该 action 的关系很小. 由此提出改进2: 加一个衰减系数 γtt.

    最后, 将整个系数项称为 Advantage Function, Aθ(st,at).其含义为, 在某 state 下, at 相较于其他的 action, 有多好. (这个 A, 通常可以是用一个网络来预测,一般称作criic)

    对于LLM来说,可以参考这篇文章

    最终得目标函数与梯度的公式如下:

    (8)J(θ)=1Nn=1Nt=1TnAθ(st,at)logpθ(atn|stn)J(θ)=1Nn=1Nt=1TnAθ(st,at)logpθ(atn|stn)

    *公式中的 Aθ(st,at) 不是指 A 中含有参数 θ, 只是代表从 (st,at) 是从 θ 中采样来的.

    On-policy Off-policy#

    On-policy#

    梯度计算公式:

    (9)Rθ=Eτpθ(τ)[R(τ)logpθ(τ)]

    目前为止的做法其实是一种 on-policy 的方法:

    • 每次更新梯度前, 都需要从 πθ 中采样 τ.
    • 参数更新后, 又需要用更新后的参数重新采样 τ.

    目标是: 从另一个 policy, πθ 中采样数据, 用来训练 πθ. 这样就可以重复利用这些采样得到的数据.

    Importance Sampling(重要性采样)#

    x 服从 p 分布时, 计算 f(x) 期望 Exp[f(x)] 的做法: 一般是从 p 中采样一些 x, 带入 f(x) 求平均, 用这个值来估计所求期望.

    现在, 假设无法从 p 中直接采样 x, 但可以从另一个分布 q 中采样 x. 可以对 Exp[f(x)] 做如下变形:

    (10)Exp[f(x)]=f(x)p(x)dx=f(x)p(x)q(x)q(x)dx=Exq[f(x)p(x)q(x)]

    这样, 我们就可以用 q 中采样的数据来估计期望值 Exp[f(x)]. 这就是 Importance Sampling.

    Issue of Importance Sampling
    理论上, 我们已经得出两个期望值是相等的:

    (11)Exp[f(x)]=Exq[f(x)p(x)q(x)].

    那么它们的方差是否相等呢? Varxp[f(x)]==Varxq[f(x)p(x)q(x)]?

    由公式

    (12)Var[x]=E[x2](E[x])2

    可以得出:

    (13)Varxp[f(x)]=Exp[f2(x)](Exp[f(x)])2Varxq[f(x)p(x)q(x)]=Exq[(f(x)p(x)q(x))2](Exq[f(x)p(x)q(x)])2=(f(x)p(x)q(x))2q(x)dx(Exp[f(x)])2=f2(x)p(x)q(x)p(x)dx(Exp[f(x)])2=Exp[f2(x)p(x)q(x)](Exp[f(x)])2

    对比发现, 第一项中后者比前者多乘了一个 p(x)q(x), 也就是说当 pq 相差很多时, 它们的方差也会差很多.

    这样就会出现一问题: 理论上, 无论 p,q 的分布是什么样的, 当我们从 pq 采样足够多次时, 是可以得到 Exp[f(x)]=Exq[f(x)p(x)q(x)] 的.
    但是当 p,q 差距过大, 而我们采样的次数又不够多时, 因为它们之间的方差差距很大, 所以最后很可能导致期望差距很大.

    一个直观的例子:
    img
    图中 p,q两个分布的差异很大.

    当我们采样次数不够多, 导致没有采样到最左边那个样本时, 就会出现实际上 Exp[f(x)] 应是一个负值, 但我们用 Exq[f(x)p(x)q(x)] 计算出来的却是一个正值.

    而当我们采样到最左边那个样本时, 因为此时 p(x)q(x) 的值将会非常大, 所以可以把 Exq[f(x)p(x)q(x)] 拉回负值.

    Off-policy#

    将 Importance Sampling 用在 policy gradient 中, 我们就可以得到:

    (14)Rθ=Eτpθ(τ)[R(τ)logpθ(τ)]=Eτpθ(τ)[pθ(τ)pθ(τ)R(τ)logpθ(τ)]

    这样, 我们就可以从 θ 中采样数据, 然后多次利用这些数据来更新 θ.

    结合之前添加Tips后得到的公式(8), 有:

    (15)Rθ=E(st,at)πθ[Aθ(st,at)logpθ(atn|stn)]=E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)logpθ(atn|stn)]=E(st,at)πθ[pθ(at|st)pθ(st)pθ(at|st)pθ(st)Aθ(st,at)logpθ(atn|stn)]=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)logpθ(atn|stn)]假设pθ(st)=pθ(st)

    *为什么假设pθ(st)=pθ(st), 因为难以计算?

    再由公式(3)得:

    (16)Rθ=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)]

    反推目标函数:

    (17)Jθ(θ)=E(st,at)πθ[pθ(at|st)pθ(at|st)Aθ(st,at)]

    Add constraint#

    目前为止, 我们利用 Importance Sampling 完成了 Policy Gradient 从 On-policy 到 Off-policy 的优化.

    但是 Importance Sampling 在实际应用中有一个不得不考虑的限制, 就是我们无法保证能采样足够多的数据, 这时当两个分布 pθ,pθ差异过大时, 难以保证期望相等.

    PPO做的事情, 简单说就是, 限制两个分布 pθ,pθ 不能差太多.

    (18)JPPOθ(θ)=Jθ(θ)βKL(θ,θ)

    注: 此处 KL 散度指的不是将两个模型的参数看作分布,拉近两个模型的参数的距离. 而是两个模型行为上的距离, 就是当两个模型输入同样的 state 时, 希望输出的 action 的分布尽可能像

    Conclusion#

    PPO algorithm#

    img

    PPO2#

    PPO2: 简化 PPO 的计算.
    img
    首先, 我们将横坐标 x 设为 pθ(at|st)pθk(at|st), 则函数 y=xy=clip(x,1ϵ,1+ϵ) 的图像分别为图中的绿线和蓝线.
    其中, clip(x,a,b)={a,xax,a<x<bb,xb

    • A>0 时, JPPO2θk(θ) 就是左图中红线, 我们要最大化目标函数, 也就希望 x 越大越好, 但是当超过 1+ϵ 后, 对目标函数就没有 benefit 了. 这样就阻止了进一步优化.
    • A<0 时, 同理, 如右图.

    目的依旧是保证两个分布 pθ,pθk 差距不能过大.

    Experiment#

    img

    作者:JJVV

    出处:https://www.cnblogs.com/jjvv/p/17651945.html

    版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

    posted @   ㅤJJVVㅤ  阅读(476)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 周边上新:园子的第一款马克杯温暖上架
    · 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
    · Ollama——大语言模型本地部署的极速利器
    · DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
    · 使用C#创建一个MCP客户端
    more_horiz
    keyboard_arrow_up light_mode palette
    选择主题
    menu
    点击右上角即可分享
    微信分享提示