Soft Actor-Critic (SAC) 算法详解与 PyTorch 实现
Soft Actor-Critic(SAC)是目前处理连续动作空间最流行的强化学习算法之一,属于 Actor-Critic 方法的变体。它引入了最大熵(Maximum Entropy)强化学习的思想,在最大化累计奖励的同时鼓励策略的随机性,从而有效解决了传统算法中探索与利用难以平衡、训练不稳定以及样本效率低等问题。
SAC 背景与核心思想
强化学习的挑战
传统强化学习在初期往往难以平衡对新策略的探索和对已有最优策略的利用。在连续动作空间中,训练容易出现发散或收敛缓慢的情况。此外,数据采集成本高,如何高效利用经验池中的数据也是关键。
SAC 针对这些问题提出了以下核心思路:
- 最大熵强化学习:在奖励函数中加入熵项,最大化策略的随机性以鼓励探索。
- 双 Q 网络:使用两个 Q 网络取最小值,缓解 Q 值过估计的问题。
- 目标网络:使用软更新的目标网络来稳定 Q 值的计算。
最大熵强化学习的目标
传统强化学习的目标是最大化期望累计奖励: $$J(\pi) = \mathbb{E}{\pi} \left[ \sum{t=0}^T \gamma^t r(s_t, a_t) \right]$$
SAC 则通过添加一个熵项,在奖励中加入策略随机性的权重,目标变为: $$J(\pi) = \mathbb{E}{\pi} \left[ \sum{t=0}^T \gamma^t \left( r(s_t, a_t) + \alpha \mathcal{H}(\pi(\cdot|s_t)) \right) \right]$$
其中 $\alpha$ 是熵系数,控制熵和奖励之间的平衡;$\mathcal{H}(\pi(\cdot|s_t))$ 表示策略的熵,鼓励策略更随机化。这样做的好处是能让策略更加多样化,避免陷入次优策略,同时保持学习的稳定性。
SAC 算法流程
SAC 使用了 Actor-Critic 框架,结合策略梯度和 Q 函数更新。以下是算法的关键步骤:
初始化
创建目标值函数网络 $V_{\psi'}$,并设置其参数为 $V_{\psi}$ 的初始值。初始化策略网络 $\pi_\phi$ 和值函数网络 $V_\psi$。初始化两组 Q 网络 $Q_{\theta_1}, Q_{\theta_2}$,用于计算 Q 值。
每一回合循环
- 采样动作:根据策略网络 $\pi_\phi$ 采样动作 $a \sim \pi(a|s)$。
- 执行动作:执行动作,记录 $(s, a, r, s', \text{done})$ 到经验池中。
- 更新 Q 网络:最小化损失函数 $J_Q = \mathbb{E} \left[ \left( Q_{\theta_i}(s, a) - y \right)^2 \right]$,使用 TD 目标更新 Q 值。
- 更新值函数网络:最小化损失函数 $J_V = \mathbb{E} \left[ \left( V_\psi(s) - y_V \right)^2 \right]$,逼近策略的长期价值。
- 更新策略网络:策略网络的目标是最大化奖励和熵,最小化损失 $J_\pi = \mathbb{E} \left[ \alpha \log \pi_\phi(a|s) - \min_{i=1,2} Q_{\theta_i}(s, a) \right]$。
- 更新目标值函数网络:使用软更新规则 $\psi' \gets \tau \psi + (1 - \tau) \psi'$,其中 $\tau \in (0, 1]$ 控制更新步长。
公式推导细节
Q 值更新
Q 值通过 Bellman 方程更新,目标是最小化 TD 误差: $$y = r + \gamma (1 - \text{done}) \cdot V_{\psi'}(s')$$ 损失函数为: $$J_Q = \mathbb{E}{(s, a, r, s') \sim D} \left[ \left( Q{\theta_i}(s, a) - y \right)^2 \right]$$
值函数更新
值函数估计策略的长期价值,目标值为: $$y_V = \mathbb{E}{a \sim \pi} \left[ \min{i=1,2} Q_{\theta_i}(s, a) - \alpha \log \pi_\phi(a|s) \right]$$ 损失函数为: $$J_V = \mathbb{E}\psi(s) - y_V \right)^2 \right]$$


