Actor-Critic从名字上看包括两部分,演员 (Actor) 和评价者 (Critic) 。其中 Actor 使用我们上一节讲到的策略函数,负责生成动作 (Action) 并和环境交互。而Critic使用我们之前讲到了的价值函数,负责评估Actor的表现,并指导Actor下一阶段的动作。
回想上一篇的策略梯度,策略函数就是我们的 Actor,但是那里是没有 Critic 的,我们当时使用了蒙特卡罗法来计算每一步的价值部分替代了 Critic 的功能,但是场景比较受限。因此现在我们使用类似 DQN 中用的价值函数来替代蒙特卡罗法,作为一个比较通用的 Critic 。
也就是说在Actor-Critic算法中,我们需要做两组近似,第一组是策略函数的近似:
第二组是价值函数的近似,对于状态价值和动作价值函数分别是:
对于我们上一节讲到的蒙特卡罗策略梯度 reinforce 算法,我们需要进行改造才能变成Actor-Critic算法。
首先,在蒙特卡罗策略梯度reinforce算法中,我们的策略的参数更新公式是:
梯度更新部分中,∇θlogπθ(st,at) 是分值函数,不用动,要变成 Actor 的话改动的是 vt ,这块不能再使用蒙特卡罗法来得到,而应该从 Critic 得到。
而对于Critic来说,这块是新的,不过我们完全可以参考之前DQN的做法,即用一个Q网络来做为 Critic , 这个 Q 网络的输入可以是状态,而输出是每个动作的价值或者最优动作的价值。
现在我们汇总来说,就是 Critic 通过Q网络计算状态的最优价值 vt , 而 Actor 利用 vt 这个最优价值迭代更新策略函数的参数 θ ,进而选择动作,并得到反馈和新的状态,Critic 使用反馈和新的状态更新 Q 网络参数 w , 在后面 Critic 会使用新的网络参数 w 来帮 Actor 计算状态的最优价值 vt。
在上一节已经对 Actor-Critic 算法的流程做了一个初步的总结,不过有一个可以注意的点就是,我们对于 Critic 评估的点选择是和上一篇策略梯度一样的状态价值 vt,实际上,我们还可以选择很多其他的指标来做为 Critic 的评估点。而目前可以使用的 Actor-Critic 评估点主要有:
这里给一个Actor-Critic算法的流程总结,评估点基于 TD 误差,Critic 使用神经网络来计算 TD 误差并更新网络参数,Actor 也使用神经网络来更新网络参数
算法输入:迭代轮数 T,状态特征维度 n, 动作集 A, 步长 α,β,衰减因子 γ ,探索率 ϵ,Critic 网络结构和 Actor 网络结构。
输出:Actor 网络参数 θ, Critic网络参数 w
1. 随机初始化所有的状态和动作对应的价值 Q。
2. for i from 1 to T,进行迭代。
a) 初始化 S 为当前状态序列的第一个状态, 拿到其特征向量 ϕ(S)
b) 在 Actor 网络中使用 ϕ(S) 作为输入,输出动作 A ,基于动作 A 得到新的状态 S′,反馈 R。
c) 在 Critic 网络中分别使用 ϕ(S),ϕ(S‘′) 作为输入,得到Q值输出 V(S),V(S′)
d) 计算 TD 误差 δ=R+γV(S′)−V(S)
e) 使用均方差损失函数 ∑(R+γV(S′)−V(S,w))2 作 Critic 网络参数 w 的梯度更新
f) 更新 Actor 网络参数 θ:
θ=θ+α∇θlogπθ(St,A)δ
对于 Actor 的分值函数 ∇θlogπθ(St,A) ,可以选择 softmax 或者高斯分值函数。
上述 Actor-Critic 算法已经是一个很好的算法框架,但是离实际应用还比较远。主要原因是这里有两个神经网络,都需要梯度更新,而且互相依赖。但是了解这个算法过程后,其他基于 Actor-Critic 的算法就好理解了。
基本版的Actor-Critic算法虽然思路很好,但是由于难收敛的原因,还需要做改进。
目前改进的比较好的有两个经典算法,一个是 DDPG 算法,使用了双 Actor神经网络和双Critic 神经网络的方法来改善收敛性。这个方法我们在从 DQN 到 Nature DQN 的过程中已经用过一次了。另一个是 A3C 算法,使用了多线程的方式,一个主线程负责更新 Actor 和 Critic 的参数,多个辅线程负责分别和环境交互,得到梯度更新值,汇总更新主线程的参数。而所有的辅线程会定期从主线程更新网络参数。这些辅线程起到了类似 DQN 中经验回放的作用,但是效果更好。
参考文章:强化学习(十四) Actor-Critic - 刘建平Pinard - 博客园 (cnblogs.com)