强化学习策略梯度:如何处理严格为正的奖励?
嘿,这个问题我当初学策略梯度的时候也踩过坑!当所有奖励都为正的时候,策略梯度确实会一直往参数增大的方向走,最后模型完全没法学到有效的策略——毕竟它会觉得“不管怎么选动作都有正奖励,那我把参数往大了调就完事了”,完全失去了学习的意义。结合David Silver RL课程第7讲里的REINFORCE算法思路,咱们来一步步解决这个问题:
核心问题根源
先明确下为什么会出现这种情况:单步REINFORCE的策略梯度更新公式(简化版)是:∇J(θ) = E[r_t * ∇logπ_θ(a_t|s_t)]
当$r_t$恒为正,梯度的方向会被正奖励牵着走,始终指向参数增大的方向,导致参数无限制膨胀,模型根本没法区分“好动作”和“更好的动作”。
最有效的解决方案:引入奖励基线(Reward Baseline)
这是David Silver课程里重点提到的解决思路,核心就是给奖励做一个“减法调整”,让奖励有正有负,这样模型才能知道哪些动作比平均水平好,哪些不好。
调整后的梯度公式
我们给原始奖励$r_t$减去一个与动作无关的基线值$b(s_t)$,新的梯度公式变成:∇J(θ) = E[(r_t - b(s_t)) * ∇logπ_θ(a_t|s_t)]
这样一来:
- 如果$r_t > b(s_t)$:说明当前动作带来的奖励超出了预期,梯度为正,会强化这个动作的选择概率;
- 如果$r_t < b(s_t)$:说明当前动作不如平均水平,梯度为负,会降低这个动作的选择概率。
常用的基线选择方法
- 状态值函数$V(s_t)$:这是最常用的基线,也就是状态$s_t$下的期望累积奖励。用它的逻辑很直观——我们要衡量当前动作是否“超预期”,比状态平均水平好就强化,差就弱化。在完整的REINFORCE算法里,其实用的优势函数$A(s_t,a_t)=Q(s_t,a_t)-V(s_t)$就是这个思路的延伸。
- 全局平均奖励:如果你的场景状态空间不大,或者奖励分布比较平稳,直接用所有已获得奖励的平均值当基线也完全可行,简单易实现。
- 可学习的基线网络:如果场景复杂,也可以单独训练一个神经网络来拟合基线值,和策略网络一起更新,但这种方法相对复杂,基础场景下前两种就足够用了。
为什么基线不会破坏梯度的无偏性?
这里要划个重点:基线必须和当前选择的动作$a_t$无关,这样才能保证梯度的期望和原始梯度一致,不会引入偏差。原因很简单:
根据概率的性质,E[∇logπ_θ(a_t|s_t)] = ∇E[π_θ(a_t|s_t)] = ∇1 = 0,所以减去基线后的梯度期望和原始梯度完全一样,只是减小了梯度的方差,让训练更稳定。
额外的辅助优化手段
除了基线,还有两个小技巧可以帮你避免参数膨胀:
- 参数正则化:在损失函数里加入L1或L2正则项,给参数的大小加个限制,防止无限制增长;
- 自适应学习率优化器:用Adam、RMSprop这类优化器,它们会根据参数更新的情况自动调整学习率,避免持续的正梯度导致参数跳得太猛。
补充:David Silver在第7讲里的REINFORCE算法(多步版本)其实已经默认用到了基线的思路,用优势函数代替原始奖励,本质就是在做奖励的基线调整。
内容的提问来源于stack exchange,提问作者foobar

