Grid World示例

S
H
H
G
S: 起点 G: 目标 (+1) H: 陷阱 (终止)

SAC算法介绍

SAC(Soft Actor-Critic)由Haarnoja等人在2018年提出,是一种最大熵强化学习算法。它在最大化累积奖励的同时,也最大化策略的熵,从而鼓励探索并提高样本效率。SAC是目前最先进的连续控制算法之一。

核心思想

SAC的核心思想是最大化熵正则化的目标函数:

J(π) = Eτ~π[∑t r(st, at) + α H(π(·|st))]

其中H(π(·|st))是策略的熵,α是温度参数,平衡奖励和探索。

Grid World中的SAC

虽然SAC主要用于连续动作空间,但可以通过以下方式应用到Grid World:

  • 策略网络:输出动作的概率分布(离散动作空间)
  • Q网络:评估状态-动作对的Q值
  • 熵正则化:鼓励探索,避免过早收敛到次优策略
  • 软更新:使用目标网络提高训练稳定性

算法原理

SAC使用软Q学习更新Q函数:

Q(s,a) ← r(s,a) + γ Es'~p[V(s')]

其中软价值函数为:

V(s) = Ea~π[Q(s,a) - α log π(a|s)]

策略更新使用KL散度:

π* = argminπ DKL(π(·|s) || exp((Q(s,·) - V(s))/α))

关键技术

  • 最大熵原理:在最大化奖励的同时最大化策略熵
  • 双Q网络:使用两个Q网络取最小值,减少过估计
  • 目标网络:使用软更新(Polyak平均)更新目标网络
  • 自动温度调整:自动调整温度参数α,平衡探索和利用
  • 经验回放:存储经验并随机采样进行训练

算法特点

  • 样本效率高:使用经验回放和目标网络,样本效率很高
  • 探索能力强:熵正则化鼓励探索,避免过早收敛
  • 训练稳定:使用软更新和目标网络,训练非常稳定
  • 连续动作空间:主要用于连续动作空间,但也可以应用到离散环境
  • 鲁棒性强:对超参数不敏感,默认参数在很多任务上表现良好

优势

  • 在连续控制任务上表现优异
  • 样本效率高,训练速度快
  • 探索能力强,不容易陷入局部最优
  • 训练稳定,不需要太多调参
sac.py
from stable_baselines3 import SAC
from stable_baselines3.common.env_util import make_vec_env
import gymnasium as gym

# 注意:SAC主要用于连续动作空间
# 对于Grid World这样的离散环境,可以使用PPO或DQN
# 这里展示概念

# 创建Grid World环境(FrozenLake)
env = gym.make('FrozenLake-v1', is_slippery=False)

# 注意:Stable-Baselines3的SAC主要用于连续动作空间
# 对于Grid World,建议使用DQN或PPO
# 这里仅作为概念演示

print("SAC主要用于连续动作空间环境(如Pendulum、MountainCarContinuous)")
print("对于Grid World这样的离散环境,建议使用DQN或PPO算法")
print("SAC的核心优势在于最大熵原理和自动温度调整,能够有效平衡探索和利用")