Actor-Critic包括两部分:演员(Actor)、评价者(Critic)。其中Actor使用策略函数,负责生成动作(Action)并和环境交互,而Critic使用价值函数,负责评估Actor的表现,并指导Actor下一阶段的动作。在Policy-Gradient中,策略函数就是Actor,但是那里没有Critic,当时使用了蒙特卡罗法来计算每一步的价值部分从而替代了Critic的功能,但是场景比较受限。因此现在使用类似DQN中用的价值函数来替代蒙特卡罗法,作为一个比较通用的Critic。
所以Actor-Critic算法中做了两组近似:
策略函数的近似:
价值函数的近似:
也就是说,蒙特卡罗reinforce算法参数的参数更新公式(如下)中,vt的求取不再用蒙特卡罗法那样采样平均而是用近似价值函数求取。而分值函数部分∇θlogπθ(s,a)不变。
通常使用Q网络来近似价值函数,所以汇总来说,就是Critic通过Q网络计算状态的最优价值vt,而Actor利用vt这个最优价值迭代更新策略函数的参数θ,进而选择动作,并得到反馈和新的状态,Critic使用反馈和新的状态更新Q网络参数w,在后面Critic会使用新的网络参数w来帮Actor计算状态的最优价值vt。
Critic的评估点有多种选择:
a)基于状态价值,这是上面使用的评估点,其策略函数参数更新的算法公式是:
b)基于动作价值,在DQN中,一般使用的都是动作价值函数Q来做价值评估,其策略函数参数更新的算法公式是:
c)基于TD误差,δ(t)=Rt+1+γV(St+1)−V(St)或者δ(t)=Rt+1+γQ(St+1,At+1)−Q(St,At),其策略函数参数更新的算法公式是:
d)基于优势函数,A(S,A,w,β)=Q(S,A,w,α,β)−V(S,w,α),其策略函数参数更新的算法公式是:
e)基于TD(λ)误差,一般都是基于后向TD(λ)误差δ(t)E(t),其策略函数参数更新的算法公式是:
对于Critic本身的模型参数w,一般都是使用均方误差损失函数来做迭代更新,类似DQN系列中的迭代方法。
(评估点基于TD误差,Critic使用神经网络来计算TD误差并更新网络参数,Actor也使用神经网络来更新网络参数)
输入:迭代轮数T、状态特征维度n、动作集A、步长α、β、衰减因子γ、探索率ϵ、Critic网络结构、Actor网络结构
输出:Actor网络参数θ、Critic网络参数w
1. 随机初始化所有的状态和动作对应的价值Q
2 .for i in [ 1, T ]:
a)初始化S为当前状态序列的第一个状态,拿到其特征向量Φ(S)
b)把Φ(S)输入Actor网络,得到输出动作A,并由环境获得新状态S’、奖励R
c)把Φ(S)、Φ(S‘ )分别输入Critic网络,分别得到输出的Q值V(S)、V(S’ )
d)计算TD误差 δ = R + γV(S′ ) − V(S)
e)计算均方差损失函数 ∑(R+γV(S′)−V(S,w))^2,梯度反向传播更新Critic网络参数w
f)更新Actor网络参数:
(这里以TD误差为评估点, 分值函数∇θlogπθ(St,A)可以选择softmax或者高斯分值函数 )
基本版的Actor-Critic算法已经是一个很好的算法框架,但是离实际应用还比较远。主要原因是这里有两个神经网络,都需要梯度更新,而且互相依赖,所以难以收敛。
目前改进的比较好的有两个经典算法,一个是DDPG算法,使用了双Actor神经网络和双Critic神经网络的方法来改善收敛性。这个方法在从DQN到Nature DQN的过程中用过。另一个是A3C算法,使用了多线程的方式,一个主线程负责更新Actor和Critic的参数,多个辅线程负责分别和环境交互,得到梯度更新值,汇总更新主线程的参数。而所有的辅线程会定期从主线程更新网络参数。这些辅线程起到了类似DQN中经验回放的作用,但是效果更好。