上一节中介绍了模仿学习, 模仿学习实际上永远无法超过 expert,今天的方法可以做到超过 expert 的表现。
Online RL 的大致步骤是:
- 初始化一个 policy,并运行这个 policy 收集到一些运行的结果
- 根据这些结果对 policy 执行优化,并反复迭代这个过程
用具体的数学表达式可以表达强化学习中的策略优化目标,找到一组最优策略参数 θ∗ ,使环境中交互得到的期望累计奖励最大。
θ∗=argθmaxJ(θ),
J(θ)=Eτ∼pθ(τ)[t∑r(st,at)]≈N1i=1∑Nt∑r(si,t,ai,t)
θ 是策略的参数。第一个式子的意思就是找到让 J(θ) 最大的那个 θ∗
第二个式子J(θ) 代表在策略 πθ 下,产生的 trajectory 累计奖励的期望值,也就是优化的目标,详细的关于 s 与 a 的说明可以参考之前章节。
下面推导的算法称为 Vanilla policy gradient
优化的式子已经有了,但是难点就在于计算 J(θ) 的梯度,因为这是一个期望,没有办法通过采样的方式来直接算梯度,所以下面要对这个式子操作一下。
首先根据 Eτ∼pθ(τ)[f(τ)]=∫pθ(τ)f(τ)dτ 将期望展开成积分形式,并交换梯度与积分的运算顺序:
J(θ)=∫pθ(τ)r(τ)dτ,Eτ∼pθ(τ)[f(τ)]=∫pθ(τ)f(τ)dτ
∇θJ(θ)=∫∇θpθ(τ)r(τ)dτ
注意这里默认奖励函数 r(τ) 本身不直接依赖 θ。它依赖的是轨迹,而轨迹分布由策略参数 θ 决定。
这里用到一个计算技巧,因为 log 计算的导数就是本身的倒数,再结合链式法则有:
∇θpθ(τ)=pθ(τ)∇θlogpθ(τ),∇θlogpθ(τ)=pθ(τ)∇θpθ(τ)
代入到最开始的式子中于是有:
∇θJ(θ)=∫pθ(τ)∇θlogpθ(τ)r(τ)dτ
对 trajectory 展开得到一个连乘的形式,通过对数我们可以转化为求和的形式:
pθ(τ)=p(s0)t=0∏Tπθ(at∣st)p(st+1∣st,at)
logpθ(τ)=logp(s0)+t=0∑Tlogπθ(at∣st)+t=0∑Tlogp(st+1∣st,at)
对 logp(s0) 和 logp(st+1∣st,at) 求关于 θ 的梯度实际上都是 0,将结果带回到计算式中有
∇θlogpθ(τ)=t=0∑T∇θlogπθ(at∣st)
∇θJ(θ)=∫pθ(τ)(t=0∑T∇θlogπθ(at∣st))r(τ)dτ=Eτ∼pθ(τ)[(t=0∑T∇θlogπθ(at∣st))r(τ)]
将 r(τ) 记作离散的 trajectory 求和,于是就得到了最常见的 policy gradient 计算形式:
∇θJ(θ)=Eτ∼pθ(τ)[t=0∑T∇θlogπθ(at∣st)R(τ)],R(τ)=t=0∑Tr(st,at)
这个式子的实际意义就是,当一个 trajectory 的奖励很高的时候,更新参数会让这个 trajectory 的出现概率上升。
这个算法和 imitation learning 的最大区别就是,不需要一个 expert,可以自己去收集数据。
但是这两个也不是互斥的,可以先用 imitaition learning 学习到一个基准,然后用 policy gradient 进一步优化。
这个算法实际上有一点点小问题,在于 R(τ)=∑t=0Tr(st,at) 实际上会把过去的所有的行为都加入梯度优化的策略中。
举个例子,假如说使用强化学习让机器人学习走路,那么向后摔倒一步再向前走一小步,这个轨迹中,应该能够给出对向前一小步的单独奖励,而不应该因为向后退了而全盘否定这个轨迹。
因此,可以优化式子的因果性:
∇θJ(θ)≈N1i=1∑Nt=1∑T∇θlogπθ(ai,t∣si,t)(t′=t∑Tr(si,t′,ai,t′))
继续考虑机器场景,假如策略是向前的速度,那么可能会同时有多重噪声情况,例如训练机器人中的向前摔一跤、走一步、跑过去。
这些场景都有正向的 reward,他们的对梯度的影响都是正向的。也就是说在某些情况下,机器人可能会选择向前摔一跤而不是选择跑过去。
从深度学习的角度看,这个有点像局部最小值,这种情况下模型的收敛也会相对困难一些。解决这个办法也很简单,就是加上一个 baseline 的偏置:
∇θJ(θ)=Eτ∼pθ(τ)[∇θlogpθ(τ)(r(τ)−b)],b=N1i=1∑Nr(τi)
注意这个并不会改变原始算式的优化目标,因为可以证明 E[∇θlogpθ(τ)b]=0 ,也就是不会改变期望的梯度。
简略的证明流程如下:
E[∇θlogpθ(τ)b]=∫pθ(τ)∇θlogpθ(τ)bdτ=∫pθ(τ)pθ(τ)∇θpθ(τ)bdτ
消掉 pθ(τ),提取常数 b,并交换积分与求导,即可证明
原式=b∫∇θpθ(τ)dτ==b∇θ∫pθ(τ)dτ=b∇θ1=0
这个操作并不会改变期望,是无偏(unbaised)的,并且能够降低梯度的方差(variance),方差的证明省略。
重要性重采样,是 off-policy policy gradient 的基础
经过上节的两轮优化,最终的目标可以记作:
∇θJ(θ)=Eτ∼pθ(τ)[t=1∑T∇θlogπθ(at∣st)(t′=t∑Tr(st′,at′)−b)]
算法的总体流程就是:
-
从 整体的策略中 πθ(at∣st) 中采样一个轨迹点 τi
-
计算这个轨迹点的 ∇θJ(θ) 梯度
-
梯度更新 θ=θ+α∇θJ(θ)
在第 3 步中更新了 θ ,也就是 策略 πθ(at∣st),那么在计算上面那个优化式子的时候,因为 τ∼pθ(τ) 所以整个概率分布全部都改变了,因此也就是说每一步的梯度更新都需要重新采样数据。
这里涉及到一个 online 和 offline 的区分,online 只会使用当前策略的数据来更新策略(策略更新后就需要重新采样);offline 的更新可以复用其他或者自己过去的数据。我们这里讨论的 Vanilla Policy Gradient 一个 online 算法。
如果我们没有办法从 p(x) 采样,但可以从另一个分布 q(x) 采样,那么可以用一个小技巧替换到 q(x) 分布下(假设 q(x)=0 ):
∫p(x)f(x)dx=∫q(x)q(x)p(x)f(x)dx
Ex∼p(x)[f(x)]=Ex∼q(x)[q(x)p(x)f(x)]
将这个算法代入到实际的学习目标中可以得到:
J(θ)=Eτ∼pˉ(τ)[pˉ(τ)pθ(τ)r(τ)]
这里 pˉ(τ)pθ(τ) 表示这条轨迹在当前策略下出现的概率,相对于在旧策略下出现的概率有多大,比值越大表示这个轨迹对当前的策略更重要,否则就更加偏向于旧策略的产物。
关于这个比值的计算,因为可以稍微化简一下,因为初始值的状态都是一致的。
pˉ(τ)pθ(τ)=p(s1)∏t=1Tπˉ(at∣st)p(st+1∣st,at)p(s1)∏t=1Tπθ(at∣st)p(st+1∣st,at)=t=1∏Tπˉ(at∣st)πθ(at∣st)
这里有个隐患,这个权重是非常多的项的连乘,这个值的数值会非常不稳定,导致分布的方差变大,在训练中就表现为训练不稳定。
这一节的算法已经很接近 PPO 了
把方案代入可以得到:
∇θ′J(θ′)=Eτ∼pθ(τ)[t=1∏Tπθ(at∣st)πθ′(at∣st)(t=1∑T∇θ′logπθ′(at∣st)((t′=t∑Tr(st′,at′))−b))]
上文中也提到了这个连乘的权重数值很不稳定。改进思路就是不再给整条轨迹乘一个统一的轨迹级权重,而是把策略梯度拆成每个时间步的贡献,然后每个时间步只用对应动作的概率比值修正。
∇θ′J(θ′)≈N1i=1∑Nt=1∑Tπθ(ai,t∣si,t)πθ′(ai,t∣si,t)∇θ′logπθ′(ai,t∣si,t)((t′=t∑Tr(si,t′,ai,t′))−b)
其中 i 就是 第 i 条轨迹,t 是轨迹中的第 t 个 step。
严格上这个式子并不完全严谨,具体来说就是
pθ(st,at)pθ′(st,at)=pθ(st)pθ′(st)πθ(at∣st)πθ′(at∣st)
这个式子中的 pθ(st)pθ′(st) 被当成了 1,也就是只考虑动作概率比值,忽略状态分布比值的变化情况。