Actor-Critic 算法是 PPO 等语言训练算法的基础
Value Function 指的是状态价值函数,计算的是当前处在状态 s,如果之后一直按照策略 π 行动,未来期望能拿到多少累计奖励?
数学定义为:
Vπ(s)=Eπ[t=0∑∞γtrt∣s0=s]
Value 更多的可以评价当前的状态优劣程度,因为计算的是后续的奖励的期望。
相对应的 Q-function 是动作价值函数,计算的是:
当前处在状态 s,先采取动作 a,之后再按照策略 π 行动,未来期望能拿到多少累计奖励?
Qπ(s,a)=Eπ[t=0∑∞γtrt∣s0=s,a0=a]
Q-function 主要可以用来在当前状态 s 下采用动作 a 的优劣程度,同时关心状态和动作本身。
上一节中我们提到了一个基础的梯度策略算法
∇θJ(θ)≈N1i=1∑Nt=1∑T∇θlogπθ(ai,t∣si,t)(t′=t∑Tr(si,t′,ai,t′))
这里计算的是 st 采取了 at 之后,这一条具体采样轨迹最终拿到了多少回报,这是一个具体的采样值,如果这里把他替换成 Q-function 则可以表示成:
在状态 st 下采取动作 at,之后继续按照策略 π 行动,未来能获得的期望累计奖励是多少?
原来的算法(reward-to-go)是一个采样,这个采样的方差很大,也就是对同一个状态可能有非常多的选择,而且轨迹会因为连乘而更加发散,如果使用了 Q-function 则相比一次采样稳定很多。
所以经过优化后可以得到新的梯度策略
∇θJ(θ)≈N1i=1∑Nt=1∑T∇θlogπθ(ai,t∣si,t)Qπ(si,t,ai,t)
上章节中还会有一个减值 b,可以在无偏的情况下优化策略梯度,这里也同样可以使用
一般来说可以用 Vπ(st) 来作为 baseline,表达的在当前状态下使用当前策略的平均 reward
可以定义 Advantage Function(优势函数):
Aπ(st,at)=Qπ(st,at)−Vπ(st)
之前的减值代表的是全局的平均值,它对所有的状态都是同一个值
b=average reward=N1i∑Q(si,t,ai,t)
使用 Vπ(st) 可以针对状态本身,进一步细分平均的收益,减少梯度的噪声。
注意,在实际计算中这个 Aπ(st,at) 并不好算。
对于优势函数可以转化为仅关于 Vπ 的方程:
对于 Q-function 实际上就是第一步使用动作 at 然后后面就是一个 value function:
Qπ(st,at)=r(st,at)+Est+1∼P(⋅∣st,at)[Vπ(st+1)]
所以可以转化优势函数:
Aπ(st,at)≈r(st,at)+Vπ(st+1)−Vπ(st)
经过这样的简化,最后的目标就是如何来计算这个 value function,对此有以下几种方法:
训练一个神经网络来预测这个值,也就是训练一个网络来拟合 value function,用非常多的数据来对函数值进行预测拟合。
蒙特卡洛法直接使用完整的 trajectory 作为训练数据,对训练数据 (si,t,yi,t) 使用 神经网络拟合 V^ϕπ(si,t)≈yi,t
那么计算 Value 就需要整条轨迹跑完之后的所有数据,所有数据都来源于自当前策略 πθk
Bootstrapping learning 又称为 temporal difference learning
理想的用来训练的标签是:
yi,t=t′=t∑TEπθ[r(st′,at′)∣si,t]=Vπ(si,t)
指的是从 si,t (第 i 条轨迹的第 t 个 step)出发,按照当前策略 πθ,未来总回报的期望。
根据 Bellman 思想,当前状态的价值 = 当前一步奖励 + 下一状态的价值
Vπ(st)=Eat∼π,st+1∼P[r(st,at)+Vπ(st+1)]
所以可以把理想标签近似为(近似是因为当前 step 的行为 si,t 已经是一个确切的值了,但是 value function 的计算中实际上是一个期望):
yi,t≈r(si,t,ai,t)+Vπ(si,t+1)
但真实的 Vπ(si,t+1) 也不知道,于是用当前神经网络估计值代替:
yi,t≈r(si,t,ai,t)+V^ϕπ(si,t+1)
上式就是 Bootstrapping 的训练标签,其中 rt 来自于一次环境交互,是一个trajectory 上的 step 的结果
具体对对应一次状态转移 (st,at,rt,st+1) 中,at 是策略采样的结果,rt,st+1 是环境返回的值,使用这一个数据就可以构造一条标签(γ 是一个控制大小的因数)
yt=rt+γstopgrad(V^ϕ(st+1))
这个标签值就是 value function 估计的训练标签,stopgrad 表示构造标签的那一侧不反向传播梯度。
对于 value function 估计网络,一次正向传播预测出来的就结果是 V^ϕ(st) ,那么损失函数就是:
L(ϕ)=21(V^ϕ(st)−yt)2
这就完成了一次梯度传播流程,对于这个构造反复重复,直到最后会收敛到一个固定的点。
这里做的好处就是,不需要整个轨迹完成后才能对 value funtion 的网络做一次参数更新,而是能够在每一步都执行一次更新。
将 Monte Carlo 和 Bootstrapped 方法结合一下,一段轨迹使用蒙特卡洛,一段使用引导学习,就是 N-step 算法。

对于一个 trajectory 非常长,或者理论上无限长的情况下,Vπ(st) 会趋向于无穷,因此可以对这项引入折扣因子γ∈[0,1]:
yi,t≈r(si,t,ai,t)+γV^ϕπ(si,t+1)
由于 Bellman 方程本身是递归的,所以展开以后就是:
Vπ(st)=rt+γrt+1+γ2rt+2+γ3rt+3+⋯
折扣因子的作用就是鼓励更早的收益,对于同 reward 越早则权重越大。

到此为止算法已经完整了,这就是 actor-critic algorithm 的整体流程:
- 从当前的策略中收集一个 batch 的 trajectory 数据 {(s1,i,a1,i,…,sT,i,aT,i)}∼πθ 。这批次的数据是 on-policy 的,因为他来自目前正在使用的策略。
- 训练 critic 模型,用来估计 value function 的值,详细的流程参考上文的 N-step 算法。
- 使用拟合的网络估计某一个 step 的 value function 的值,并计算 TD error 来近似估计 advantage function
A^πθ(st,i,at,i)=r(st,i,at,i)+γV^ϕπθ(st+1,i)−V^ϕπθ(st,i)
- 计算策略梯度,也就是 actor 更新的方向
∇θJ(θ)≈t,i∑∇θlogπθ(at,i∣st,i)A^πθ(st,i,at,i)
- 最后更新策略参数 θ←θ+α∇θJ(θ) ,反复从头开始循环这个流程。
总结这整个算法就是,用当前策略采样轨迹,用奖励训练价值函数,用价值函数构造优势函数,再用优势函数加权 policy gradient 更新策略。