本笔记聚焦于在线的强化学习。
我们希望最大化策略的累积奖励值的期望。
符号化地,就是:
θ∗=argθmax J(θ)Eτ∼pθ(τ)[r(τ)]
其中 θ 代表模型的参数,也即我们采取的策略。
当我们要优化(此处是最大化)某个值的时候,我们会使用梯度下降。但是此处的 J(θ) 无法梯度下降的!因为在期望的计算过程中,有一个关键步骤是不可微分的,那就是从 pθ(τ) 中采样一个 τ. 这一步随机采样截断了反向传播路径,使得期望无法对 θ 求梯度!
因此,我们需要改造其数学形式。首先将期望写成积分形式,然后使用梯度和积分的可调换性:
∇θJ(θ)=∇θ∫pθ(τ)r(τ)dτ=∫r(τ)dτ ∇θ pθ(τ)
然后,使用对数拆分技巧(dx=x dlogx),并重新还原成期望形式:
∇θJ(θ)=∫r(τ)dτ pθ(τ)∇θlogpθ(τ)=Eτ∼pθ(τ)[r(τ)∇θlogpθ(τ)]
到这一步,我们发现,我们的梯度不再套在期望的外面,而进入了期望的里面。从期望的梯度变为了梯度的期望,现在可以求得梯度了:我们通过采样数据集,为每个样本计算相应梯度,然后通过上式计算期望,能够得到一个合理的整体梯度,从而进行梯度下降。
同时,展开 pθ(τ) 可得:
pθ(τ)=p(s1)t∏πθ(at∣st)p(st+1∣at,st)
因此上式中的 logpθ(τ) 实际上可以展开为:
logpθ(τ)=logp(s1)+t∑logπθ(at∣st)+t∑p(st+1∣at,st)
有由于是对 θ 取梯度,因此有:
∇θlogpθ(τ)=∇θt∑logπθ(at∣st)=t∑∇θlogπθ(at∣st)
因此:
∇θJ(θ)=Eτ∼pθ(τ)[r(τ)t∑∇θlogπθ(at∣st)]
此外,当 reward 函数可以分配到每一步的时候,有 r(τ)=t∑r(st,at),上式便还可以写成:
∇θJ(θ)=Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)] [t∑r(st,at)]
这基本上就是我们推导的最终版本,具有良好的性质。我们可以每次对当前 θ 采样多个 τ,分别计算 [t∑∇θlogπθ(at∣st)] [t∑r(st,at)],然后取平均,并认为随着采样变多,我们对真实梯度的估计就足够好。
同时,我们发现此处 logπθ(at∣st) 的计算和交叉熵是十分类似的。事实上,在监督学习(或者模仿学习)和强化学习里面,都是在求最大似然估计,而最大似然估计的损失函数就是交叉熵。
区别是,在监督学习(或模仿学习)里,我们始终希望交叉熵最大,因此损失函数是交叉熵的负数;
在强化学习里,我们通过一个 τ 的奖励函数 r(τ) 作为权重,来衡量这个样本的交叉熵是否值得被增大、增大多少。
从抽象的角度看,强化学习其实就是数学化的 Trial and Error.
然而,观察刚刚推导出的 ∇θJ(θ),会发现一个问题:由于我们的每一步“交叉熵”都会乘以整个轨迹的 reward 值,这导致一旦模型过往出现失误,未来不论做什么,即使是补救措施,也会被惩罚。但这是不合理的,因为后发生的 action 无法影响已经产生的 reward,因此也不应该用这些 reward 来奖励/惩罚后发生的 action. 为此,我们要让每一步的预测都只受到未来的 reward 的影响。
因此可以将公式改成:
∇θJ(θ)=Eτ∼pθ(τ)[t=1∑T∇θlogπθ(at∣st)t′=t∑Tr(st′,at′)]
这一步其实在数学上没有改变 J(θ) 的定义与取值,只是换成了方差更小的估计方式。
因为这相当于手动去掉了“期望一定是 0”的项。
设想有一个复杂的期望,其中一项是均值为 0 方差为 1 的正态分布。这一项的期望一定是 0,但如果通过多次采样求平均来隐式地计算,则方差很大,可能无法让这一项收敛到 0。因此不如通过数学推导,直接证明其期望为 0,然后将其从期望公式中消除。
下面推导新形式和原形式的期望是等价的(注意,对于单个 τ,二者计算结果不会相等,只是期望相等):
将原来的形式中的 r 分配进去,并拆分为过去和未来:
∇θJ(θ)=Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)] [t∑r(st′,at′)]=Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)t′∑r(st′,at′)]=Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)t′<t∑r(st′,at′)]+Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)t′≥t∑r(st′,at′)]
后一项就是新的形式。下面证明前一项在数学上是 0:
=Eτ∼pθ(τ)[t∑∇θlogπθ(at∣st)t′<t∑r(st′,at′)]t∑Eτ∼pθ(τ)[∇θlogπθ(at∣st)t′<t∑r(st′,at′)]
取其中一个时间点 t,由于 τ=(s1,a1,…,st,at,…,sT,aT),可以取 ht=(s1,a1,…,st),那么上式方括号内的取值是 ht 和 at 的函数。再结合全期望公式可得:
=Eτ∼pθ(τ)[∇θlogπθ(at∣st)t′<t∑r(st′,at′)]Eht[Eat[∇θlogπθ(at∣st)t′<t∑r(st′,at′)∣ht]]
由于 at 和 r(st′,at′) 是独立变量,因此可以化为:
=Eht[Eat[∇θlogπθ(at∣st)t′<t∑r(st′,at′)∣ht]]Eht[t′<t∑r(st′,at′) Eat[∇θlogπθ(at∣st)∣ht]](#)
下面,最终、最关键的一步:
=====Eat[∇θlogπθ(at∣st)∣ht]at∑πθ(at∣st)∇θlogπθ(at∣st)at∑∇θπθ(at∣st)∇θat∑πθ(at∣st)∇θ 1 0
或者,连续动作空间的情形:
=====Eat[∇θlogπθ(at∣st)∣ht]∫πθ(at∣st)∇θlogπθ(at∣st) dat∫∇θπθ(at∣st) dat∇θ∫πθ(at∣st) dat∇θ 1 0
由此得出 (#) 式等于 0,得证。
有了上面的经验,我们发现 reward 还有更多优化空间。比如对于一个 batch 的所有 τ,我们对 r(τ) 取平均得到 baseline,然后将每个 r(τ) 减去这个均值。这样做符合直觉:可以抑制低于 baseline 的行为,促进高于 baseline 的行为。而事实上,可以通过与上一节类似的方法证明减去 baseline 完全没有影响理想情况下 J(θ) 的取值,只是优化了对它的估计。
因此,我们最终的公式版本就会是:
∇θJ(θ)≈N1i=1∑N t=1∑T[∇θlogπθ(ai,t∣si,t)((t′=t∑Tr(si,t′,ai,t′))−b)]=∇θ N1i=1∑N t=1∑T[logπθ(ai,t∣si,t)((t′=t∑Tr(si,t′,ai,t′))−b)]
可以看到,我们通过采样有限个样本去近似期望;同时我们在最外层计算梯度,这样只需要反向传播一次,性能更好。
通常,当奖励较密集(Dense)的时候,可以使用随机初始化的 Policy 开始训练;但如果奖励较为稀疏(Sparse),则建议先进行模仿学习,再转移到在线的强化学习。