实现 Actor-Critic 方法涉及多种设计选择,这些选择会显著影响性能和稳定性。Actor-Critic 方法以其分离的 Actor 和 Critic 组件为特点。构建这些智能体时会遇到的实际问题将在此讨论。
共享与独立网络参数
一个基本的架构决定是 Actor 和 Critic 应该使用完全独立的神经网络,还是共享某些层。
- 独立网络: Actor (πθ(a∣s)) 和 Critic (Vϕ(s) 或 Qϕ(s,a)) 被实现为不同的神经网络,每个都有自己的一组参数(分别为 θ 和 ϕ)。它们使用各自的损失函数独立优化。
- 共享网络: 一种常见做法,特别适用于图像等高维输入,是让网络共享初始层(例如,用于特征提取的卷积层),然后分支到单独的头部,分别用于策略输出(Actor)和价值输出(Critic)。
Actor-Critic 方法中共享与独立网络架构的比较。共享网络可以提升效率,而独立网络提供更大的独立性。
共享网络的优势:
- 参数效率: 减少参数总量,可能加快训练并降低内存使用。
- 特征共享: 共享层学习到的表示对预测状态值和决定该状态下的最佳行动都有用。这种共享学习有时能带来更好的性能。
共享网络的缺点:
- 优化干扰: Actor 损失和 Critic 损失的梯度会影响共享参数。如果目标没有很好地对齐,或损失量级差异很大,这可能产生冲突的更新。可能需要仔细调整学习率或损失权重。
- 表示的妥协: 共享层可能需要做出妥协以同时服务于 Actor 和 Critic 头部,这可能导致其中一个或两者产生次优的表示。
在实践中,共享参数很常见且通常有效,特别是在使用 A2C 或 A3C 等标准实现时。
Actor 损失函数
Actor 的目标是调整其策略参数 θ 以最大化预期回报。这通常通过对目标函数 J(θ) 执行梯度上升来实现。等效地,我们最小化该目标的负值,得到 Actor 损失 Lactor(θ)。
使用策略梯度定理和 Critic 的估计来降低方差,梯度更新通常基于以下形式:
∇θJ(θ)≈Et[∇θlogπθ(at∣st)At]
这里,At 表示在状态 st 下执行行动 at 的优势。这个优势通常使用 Critic 来估计。一个常用估计是基于 TD 误差 δt:
At≈δt=Rt+1+γVϕ(st+1)−Vϕ(st)
其中,Vϕ(s) 是由参数为 ϕ 的 Critic 网络提供的状态价值估计,Rt+1 是执行行动 at 后获得的奖励,γ 是折扣因子。请注意,在计算梯度 ∇θ 时,优势项 At(以及 Critic 的输出 Vϕ)被视为一个常数基线,不依赖于 θ。
需要最小化的 Actor 损失函数是:
Lactor(θ)=−Et[logπθ(at∣st)At]
这个损失鼓励那些带来高于预期优势(正 At)的行动,并抑制那些带来低于预期优势(负 At)的行动。
Critic 损失函数
Critic 的目标是学习状态价值函数 V(s)(或有时是行动价值函数 Q(s,a))的准确估计。它的训练方式与 DQN 或其他基于价值的方法中的价值函数类似,通常使用时序差分 (TD) 学习。
Critic 最小化其当前估计 Vϕ(st) 与目标值之间的差异。一个常用目标是 TD 目标,Yt=Rt+1+γVϕ(st+1),假设回合尚未结束。Critic 损失 Lcritic(ϕ) 通常是估计值与目标值之间的均方误差 (MSE):
Lcritic(ϕ)=Et[(Yt−Vϕ(st))2]=Et[(Rt+1+γVϕ(st+1)−Vϕ(st))2]
在计算梯度 ∇ϕ 时,目标 Yt(如果进行自举,包括 Vϕ(st+1) 项)通常被视为一个固定目标,类似于 DQN 中目标网络的工作方式。这有助于稳定 Critic 的训练。在实践中,梯度仅针对 Vϕ(st) 计算。
熵正则化
策略梯度方法,包括 Actor-Critic,有时可能会过早地收敛到次优的确定性策略。为了鼓励试探并防止策略过快地变得过于确定,通常会添加熵正则化。
熵 H(πθ(⋅∣st)) 衡量策略在状态 st 下行动分布的随机性或不确定性。通过在目标函数中添加熵奖励(或从损失中减去熵惩罚),我们鼓励策略保持一定程度的随机性。
修改后的 Actor 损失变为:
Lactor+entropy(θ)=−Et[logπθ(at∣st)At+βH(πθ(⋅∣st))]
这里,β 是一个超参数,控制熵正则化的强度。较高的 β 值会鼓励更多的试探。熵的计算取决于策略分布:
- 对于分类分布(离散行动):H=−∑aπθ(a∣st)logπθ(a∣st)。
- 对于高斯分布(连续行动):它取决于标准差。
添加熵正则化是 A2C 和 A3C 等现代 Actor-Critic 实现中的一种标准技术。
同步与异步更新
最初的 A3C(异步优势 Actor-Critic)使用多个工作线程,每个线程与其自身的副本环境进行交互。这些工作线程独立计算梯度,并将其异步应用于共享的全局网络。这种异步性有助于消除更新所用数据的相关性,从而提升稳定性。
然而,A2C(优势 Actor-Critic)作为一种流行的替代方案出现。A2C 使用多个并行工作线程收集经验,但它执行同步更新。一个中央控制器从所有工作线程收集经验批次,基于聚合的批次计算梯度,并一步更新网络参数。所有工作线程随后接收更新后的参数。
A2C 通常能达到与 A3C 相似或更好的性能,由于批处理倾向于更有效地使用 GPU 等硬件,并且实现起来更简单。许多现代实现偏好同步 A2C 方法,通常使用向量化环境来高效管理并行模拟。
处理状态和行动空间
网络架构必须适应特定的环境:
- 状态输入: 如果状态由原始像素表示(例如,来自游戏屏幕),通常使用卷积神经网络 (CNN) 作为初始层(通常在 Actor 和 Critic 之间共享)。如果状态是特征向量,则多层感知机 (MLP) 适用。
- 行动输出(Actor):
- 离散行动: Actor 网络为每个可能的行动输出 logits(原始得分)。这些 logits 参数化一个分类分布,从中采样一个行动。
- 连续行动: Actor 网络输出定义连续概率分布的参数,最常见的是高斯分布。例如,它可能为每个行动维度输出均值 μ 和标准差 σ。然后从 N(μ,σ2) 中采样一个行动。
- 价值输出(Critic): Critic 网络通常输出一个单一的标量值,表示估计的状态价值 V(s)。
这些实现选择、网络结构、损失函数、正则化和更新策略是相互依赖的,需要仔细考量和调整,才能在 Actor-Critic 智能体中实现有效的学习。通常需要对学习率(Actor 和 Critic 可能分开设置)、熵系数 β 和折扣因子 γ 等超参数进行实验。