Xiaobo's Blog

← 首页

第一性原理推导 PPO 算法

不依赖既有优化器,从策略梯度一步一步推到 PPO 的完整损失。

强化学习基础

对于大语言模型(LLM),在强化学习的语言中,状态是token序列的每个前缀,动作是新的token:

是一个长度为的token序列,其中初始状态是prompt。 我们假设:

  • prompt的分布为 与LLM无关,因为它是由人类选择的。
  • 新token的分布为 ,其中是LLM,通常是一个多头多层的Transformer神经网络。
  • 前缀和新token之间的状态转移关系是 。目前,由于是下一个token,所以这个关系是确定性的

优化目标

其中 是响应序列中每个token的平均奖励,并且

这是策略模型和参考模型之间下一个token分布的平均KL散度。

  • 四模型架构
    • 策略模型 (参与训练),一个LLM;
    • 参考模型 (冻结),一个LLM;
    • 价值模型 (参与训练),一个LLM + 线性头;
    • 奖励模型 (冻结),一个LLM + 线性头。

算法

是响应序列中的token数量。对于LLM,状态由token序列前缀定义 ,动作由下一个token定义

  1. 合并奖励和KL惩罚:

  1. 策略梯度:

其中  是优势函数。我们将使用神经网络  来估计价值函数 
  1. 估计策略梯度:通过蒙特卡罗采样估计梯度(注意我们不能直接获得优势函数)。

  1. 通过token级别采样估计KL散度:

  1. 使用广义优势估计(GAE)估计优势函数: 引入参数,通过降低长期奖励的权重来减少方差,但代价是引入偏差。优势函数的估计有两种直接的方法,但他们各有利弊:

    • TD残差(低方差但高偏差):

  • 累积(低偏差但高方差):

考虑多步TD残差:

GAE使用-指数加权的无限多步TD残差,这样可以平衡方差与偏差的tradeoff:

其中 。对于有限时域,取 在原始论文中都是方差减小参数。

  1. 最大化优势(Actor损失):

    【这里好像有误!PPO似乎也犯了用无偏估计的梯度来做梯度的无偏估计的错误!】

    我们想要更新的是分布中的参数,但却只能拿到从这个分布抽出来的样本,所以需要使用重要性采样技巧,利用一个proposal分布来估计target分布的期望,PPO中的proposal分布选取为 (外循环中的上一次迭代)。

更新分布参数的另一种方法是使用对数变换 ,但这可能导致高方差。然而,对于微调过的LLM,方差可能不会那么大。

  1. 最小化价值函数近似误差(Critic损失):

其中 是回报。 注意,回报中涉及的所有值都是由旧批次计算的,而策略使用当前批次。我们不使用当前批次中的值,因为它可能导致优势消失 (价值模型过拟合到当前批次上,导致更新时的优势值很小)。在实践中,我们在策略更新之前还会对价值函数先进行几步预热更新。

  1. 最终损失:

— Xiaobo Yang