Files
2026-05-16 17:16:51 +08:00

176 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 03-AC-A2C
draft: false
tags:
- AC
- A2C
- Actor-Critic
- 强化学习
- 深度强化学习
---
## 1. 理论源头:策略梯度定理 (Policy Gradient Theorem)
在 Policy-based 方法中,我们参数化策略 $\pi_\theta(a|s)$。我们的目标是最大化累积回报的期望 $J(\theta) = \mathbb{E}_{\pi_\theta}[G_t]$。
根据策略梯度定理,其梯度为:
$$\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) \Psi_t \right]$$
其中 $\Psi_t$ 可以有多种选择:
1. $\Psi_t = \sum r_t$: 轨迹总奖励REINFORCE方差极大
2. $\Psi_t = Q^\pi(s, a)$: 动作价值函数。
3. $\Psi_t = A(s, a) = Q^\pi(s, a) - V^\pi(s)$: **优势函数 (Advantage Function)**
**直觉理解:** 优势函数衡量"这个动作比平均好多少"。如果 $A(s,a) > 0$,说明这个动作比该状态下的平均动作更好,应该增加其概率;如果 $A(s,a) < 0$,说明动作低于平均水平,应该降低概率。
---
## 2. Actor-Critic (AC) 的数学架构
AC 架构通过引入一个参数化的 Critic $V_\phi(s)$ 来估计 $\Psi_t$。
### 2.1 结构拆解Actor 与 Critic 的分工
| 组件 | 网络 | 输入 | 输出 | 更新目标 |
|------|------|------|------|----------|
| **Actor (策略网络)** | $\pi_\theta(a\|s)$ | 状态 $s$ | 动作 $a$ 的概率分布 $\pi_\theta(a\|s)$ | 增加高优势动作的概率,降低低优势动作的概率 |
| **Critic (价值网络)** | $V_\phi(s)$ | 状态 $s$ | 标量价值 $V_\phi(s) \approx \mathbb{E}[G_t\|s_t=s]$ | 最小化 TD 误差,精确估计状态价值 |
**直觉理解:**
- **Actor** 如同一个 **运动员**根据裁判Critic的评分来调整自己的动作技术。评分高就多练习这个动作评分低就少做。
- **Critic** 如同一个 **教练**,负责客观评价运动员当前状态的好坏。它不直接决定动作,只提供"这个状态值多少分"的估计。
**两者的协作关系:** Actor 的梯度方向由 Critic 给出的优势值决定Critic 的更新依赖 Actor 采集的样本。两者的优化目标相互耦合,形成"评价-决策"的闭环。
### 2.2 更新公式推导
在最基础的 AC 中,我们利用 **TD 误差 (Temporal Difference error)** 来更新。
**TD 误差 $\delta_t$ 定义为:**
$$\delta_t = r_{t+1} + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)$$
其中 $\delta_t$ 的物理意义是"实际奖励与期望的偏离程度":若 $\delta_t > 0$,说明该过渡带来了超出预期的价值更新。
数学上可以证明,$\delta_t$ 是 $A(s_t, a_t) = Q(s_t, a_t) - V(s_t)$ 的无偏估计:
$$\mathbb{E}_{s_{t+1} \sim P(\cdot|s_t, a_t)}[\delta_t | s_t, a_t] = \mathbb{E}[r_{t+1} + \gamma V(s_{t+1}) - V(s_t) | s_t, a_t] = Q(s_t, a_t) - V(s_t) = A(s_t, a_t)$$
这意味着 **TD 误差是优势函数的无偏采样**,我们可以直接用 $\delta_t$ 作为优势函数的估计来更新 Actor而无需知道完整的 Q 函数或 V 函数。
**Actor 更新 (梯度上升):**
$$\theta \leftarrow \theta + \alpha_\theta \nabla_\theta \log \pi_\theta(a_t|s_t) \delta_t$$
**Critic 更新 (梯度下降):**
其目标是最小化均方误差 (MSE)
$$L(\phi) = \mathbb{E} [ (r_{t+1} + \gamma V_\phi(s_{t+1}) - V_\phi(s_t))^2 ]$$
$$\phi \leftarrow \phi - \alpha_\phi \nabla_\phi L(\phi)$$
---
## 3. A2C (Advantage Actor-Critic) 的严谨化
A2C 在 AC 的基础上进行了两项重大数学改进:**优势函数的规范化**和**熵正则化**。
### 3.1 优势函数 $A(s, a)$ 的多步推导 (n-step Return)
为了平衡偏差 (Bias) 和方差 (Variance)A2C 经常使用 $n$ 步回报来计算优势:
1. **n-step 回报:** $G_{t:t+n} = r_{t+1} + \gamma r_{t+2} + \dots + \gamma^{n-1}r_{t+n} + \gamma^n V_\phi(s_{t+n})$
2. **优势估计:** $\hat{A}(s_t, a_t) = G_{t:t+n} - V_\phi(s_t)$
### 3.2 完整目标函数 (Objective Function)
A2C 的总损失函数通常由三部分组成:
$$L_{total} = L_{policy} + c_1 L_{value} - c_2 L_{entropy}$$
其中超参数 $c_1, c_2$ 用于平衡三个目标的权重(通常 $c_1=0.5, c_2=0.01$)。
1. **策略损失 (Policy Loss):**
$$L_{policy} = -\mathbb{E}_{s_t, a_t} [ \log \pi_\theta(a_t|s_t) \hat{A}(s_t, a_t) ]$$
**物理意义:** 这是策略梯度的负号版本。当 $\hat{A} > 0$(好动作)时,$\log \pi_\theta(a_t|s_t)$ 增大,即提高该动作的概率;当 $\hat{A} < 0$ 时,降低该动作概率。
2. **价值损失 (Value Loss):**
$$L_{value} = \mathbb{E}_{s_t} [ (G_{t:t+n} - V_\phi(s_t))^2 ]$$
**物理意义:** 使估计的价值函数逼近实际的 n 步回报,减少价值估计的偏差。
3. **熵正则项 (Entropy Regularization):**
$$L_{entropy} = \mathbb{E}_{s_t} [ -\sum_a \pi_\theta(a|s_t) \log \pi_\theta(a|s_t) ]$$
- **数学意义:** 熵越大表示策略越“随机”。在 $L_{total}$ 中减去熵(或加上 $-H$),相当于鼓励 Actor 保持一定的随机性,防止模型太快收敛到某个次优的确定性动作上。
---
## 4. 训练流程细节:同步 vs 异步
### 4.1 A2C同步 Advantage Actor-Critic
A2C 的”同步”体现在梯度的累积上:
1. **Worker 采样:** $N$ 个线程Worker各自在环境里跑 $n$ 步,得到样本 $\{(s_i, a_i, r_i, s'_{i})\}_{i=1 \dots n \times N}$。
2. **计算梯度:**
- 每个 Worker 计算自己的策略梯度 $g_{\theta, i}$ 和价值梯度 $g_{\phi, i}$。
3. **聚合更新:**
- 计算平均梯度:$\bar{g}_\theta = \frac{1}{N} \sum_{i=1}^N g_{\theta, i}$(以及 $\bar{g}_\phi$)。
- 主网络执行一次参数更新:$\theta \leftarrow \theta + \eta \bar{g}_\theta$$\phi \leftarrow \phi - \eta \bar{g}_\phi$。
4. **分发权重:** 更新后的 $\theta, \phi$ 同步给所有 Worker等待所有 Worker 到达同步点后开始下一轮。
### 4.2 A3C异步 Advantage Actor-Critic
A3C 与 A2C 的核心区别在于**异步更新**
| 特性 | A2C同步 | A3C异步 |
|------|------------|-------------|
| 梯度更新 | 等待所有 Worker 完成采样后,聚合梯度,统一更新 | 每个 Worker 独立更新主网络,无需等待 |
| 通讯开销 | 高(需等待同步) | 低(独立更新) |
| 数据吞吐 | 受最慢 Worker 限制 | 利用多线程并行,环境交互与计算重叠 |
| 收敛稳定性 | 更高(批量更新更稳定) | 稍低(异步更新可能带来梯度噪声) |
**直觉理解:** A3C 就像一支 **独立训练、偶尔交流** 的运动员团队——每个人自己练自己的,定期把训练成果(梯度)汇报给教练(主网络),教练整合后把新策略分发给所有人。而 A2C 是所有人**同时训练、然后对答案**的方式。
**为什么 A3C 反而更常用?** 虽然 A2C 更新更稳定,但 A3C 的异步机制让环境交互(慢速操作)和梯度计算(快速操作)可以重叠进行,实际训练速度往往更快。
---
## 5. A2C 面临的数学挑战与 PPO 的引子
### 5.1 采样效率与 Off-policy 缺失
A2C 是一种 **On-policy** 算法。这意味着一旦参数 $\theta$ 更新了,之前采样的所有数据就“失效”了,不能再用于训练。这导致 A2C 对数据的消耗量极大。
### 5.2 步长敏感度 (The Step Size Problem)
在 $L_{policy}$ 中,梯度的量级受 $\hat{A}(s, a)$ 影响。如果某次采样的优势函数极大,会导致 $\nabla \theta$ 剧烈跳变。这种跳变可能导致策略分布 $\pi_\theta$ 发生根本性改变(例如从原来的平滑分布直接变成倾向于某一个极端动作),从而使智能体进入一个“无法回头”的糟糕状态空间。
### 5.3 开启 PPO约束下的优化
为了解决 A2C 步长难调的问题,**PPO (Proximal Policy Optimization)** 引入了新的数学工具:
- **重要性采样 (Importance Sampling):** 允许利用旧策略采集的数据来更新新策略。
- **KL 散度限制/剪切 (Clipped Objective):** 在数学上强制要求新策略 $\pi_{\theta_{new}}$ 和旧策略 $\pi_{\theta_{old}}$ 的概率比值在 $[0.8, 1.2]$ 之间。
> **下章预告:** PPO 如何利用一个简单的 `clip` 函数,就解决了困扰强化学习多年的“训练崩溃”难题。