软演员评论家 (SAC)#

1. 引言#

SAC 是目前应用最广泛的强化学习 (RL) 算法之一。 它包含两个核心部分:

  • Actor (策略模型): 根据当前状态生成动作。

  • Critic (Q值模型): 评估当前状态与所选动作的价值。

SAC 是一种用于连续动作控制的 off-policy 深度强化学习算法。 它基于最大熵强化学习框架,用熵扩展标准的强化学习优化目标,以平衡利用与探索。 SAC 利用熵正则化的 Bellman 方程和自动温度调控,同时学习一个随机策略和多个Q函数。 因其样本效率和稳定性,SAC 在机器人控制领域有广泛应用。

更多细节请参考原始论文 SAC.

1. 目标函数#

设策略为 \(\pi\)。则 \(\pi\) 的 Q 值函数定义为: \(Q^{\pi}(s, a)\)。 在 SAC 里,Q 值函数满足如下松弛的 Bellman 公式:

\[Q^{\pi}(s, a) = \mathbb{E}_{s' \sim P, a \sim \pi} \left[ r(s, a) + \gamma (Q^{\pi}(s', a') + H(\pi(\cdot|s'))) \right] = \mathbb{E}_{s' \sim P, a \sim \pi} \left[ r(s, a) + \gamma (Q^{\pi}(s', a') - \alpha \log \pi(a'|s')) \right].\]

这里 \(\gamma\) 是折扣因子, \(H\) 是策略的熵, and \(\alpha\) 是温度参数(平衡熵和期望回报)。

因此,第 i 个 Q 值函数的损失函数 \(Q_{\phi_{i}}\) 如下:

\[L(\phi_{i}, D) = \mathbb{E}_{(s, a, r, s', d) \sim D} \left[ \frac{1}{2} \left( Q_{\phi_{i}}(s, a) - (r + \gamma (1 - d)(\min_{i} Q_{\overline{\phi_{\text{targ}, i}}}(s', a') - \alpha \log \pi_{\theta}(a'|s'))) \right)^2 \right],\]

这里 \(D\) 是回放缓冲区, \(\overline{\phi_{\text{targ}, i}}\) 是目标 Q 函数的参数,\(a'\) 是从当前策略 \(\pi_{\theta}\) 采样的动作。

策略 \(\pi_{\theta}\) 最大化熵和期望回报的期望。因此,策略损失如下:

\[L(\theta, D) = \mathbb{E}_{s \sim D, a \sim \pi_{\theta}} \left[ \alpha \log \pi_{\theta}(a|s) - \min_{i} Q_{\phi_i}(s, a) \right].\]

实践上,温度参数 \(\alpha\) 是可学习的参数。其损失函数如下:

\[L(\alpha) = - \alpha (H_{\text{targ}} - H(\pi(\cdot, d))),\]

这里 \(H_{\text{targ}}\) 是一个超参数,表示熵的目标大小,通常设成动作维度的相反数。

1. 配置#

目前,在我们的框架中,SAC 仅支持具身任务。 算法配置如下所示:

algorithm:
   update_epoch: 32
   group_size: 1
   agg_q: min # ["min", "mean"]. 选择如何聚合多个Q函数的值。


   adv_type: embodied_sac
   loss_type: embodied_sac
   loss_agg_func: "token-mean"

   bootstrap_type: standard # [standard, always]. 是否累积下一步 Q 值的判断准则。
   tau: 0.01  # 松弛更新目标Q值网络的比例
   target_update_freq: 1  # 目标Q函数的更新频率
   entropy_tuning:
      alpha_type: softplus  # ["softplus","exp","fixed_alpha"]
      initial_alpha: 0.01  # 初始温度值
      target_entropy: -4  # 目标熵(默认 -action_dim)
      optim:
         lr: 3.0e-4  # 温度参数学习率
         lr_scheduler: torch_constant
         clip_grad: 10.0

   # 回放缓冲区设置
   replay_buffer:
      enable_cache: True # 启用内存缓存以减少I/O开销
      cache_size: 6000 # 内存缓存的轨迹数量
      sample_window_size: 6000 # 滑动采样窗口大小
      min_buffer_size: 2  # 开始更新策略时缓冲区数据量最小值(以Trajectory为单位)