SAC / SAC_NB

这一组方法体现了“最大熵 actor-critic”在离线强化学习中的工程化实现:既看收益,也保留一定随机性。

选择算法对

小白先看

可以把 SAC 理解成“既想学到高收益动作,也不想太死板”。SAC_NB 则在这个基础上再加一层行为克隆约束。

SAC:当前脚本实现更接近 AWAC-SAC,即 actor 更新里带有 advantage-weighted 思路。

SAC_NB:当前脚本实现更接近 SAC + BC。

这组方法适合展示随机策略网络和 alpha 自动调节。

方法流程

  1. 读取完整 transition 数据。
  2. 划分训练集与验证集。
  3. 计算状态标准化和 reward 统计量。
  4. 构建 Gaussian actor、双 critic 与 target critics。
  5. 更新 critic、actor 和 alpha。
  6. 保存训练历史和模型。

核心设计

随机策略网络

通俗理解:
SAC 不会只给一个死板动作,而是给出一类可能动作,再从里面采样。这样策略既能追求高收益,也能保留一点灵活性。

技术对应:
两者都使用 GaussianActor,网络输出 mu 与 log_std,通过重参数采样得到动作,并用 tanh 将动作压到合法范围。

Base 版本增强

通俗理解:
Base 版会更愿意学习那些“看起来比当前策略更好”的数据动作,相当于从离线数据里挑更值得模仿的经验。

技术对应:
SAC.py 的 actor 更新采用 AWAC 风格,根据 data_q 与 v_pi 的差值计算 advantage 权重,再对数据动作的 log_prob 做加权优化。

NB 版本增强

通俗理解:
NB 版除了 SAC 自己的策略优化,还加了一条“别偏离数据动作太远”的约束,适合离线场景里减少乱试动作。

技术对应:
SAC_NB.py 的 actor 更新采用 sac_loss + bc_loss:前者提升策略价值并考虑熵项,后者用行为克隆约束策略靠近数据集动作。

温度参数

通俗理解:
alpha 可以理解成“探索和收益的平衡旋钮”:alpha 大时策略更随机,alpha 小时策略更专注于当前认为好的动作。

技术对应:
两者都支持 alpha_init 与 learn_alpha,通过目标熵自动调整 alpha,使策略随机性和 Q 值优化保持平衡。

参数说明

常用参数

data_path / save_dir数据路径与输出目录
hidden_sizes隐藏层结构
lr_actor / lr_critic / lr_alpha学习率
batch_size / num_epochs训练规模
gamma / tau折扣与软更新

进阶参数

alpha_init / learn_alpha温度参数及是否学习
log_std_min / log_std_max策略方差范围
SAC.awac_lambda / weight_clipAWAC 权重相关参数
SAC_NB.bc_coef行为克隆约束系数
reward_scalereward 标准化开关

建议先理解常用参数,再看进阶参数。

代码块讲解

AIcodes/SAC.py -> GaussianActor

实现随机策略,输出动作和对数概率。

AIcodes/SAC.py -> OfflineAWACSACAgent

Base 版本的核心 agent,带 AWAC 风格 actor 更新。

AIcodes/SAC_NB.py -> OfflineSACAgent

NB 版本的核心 agent,actor 更新为 sac_loss + bc_loss。

AIcodes/SAC.py / SAC_NB.py -> alpha 更新

自动调节温度参数 alpha。

输入输出与产物

输入

  • 代码文件:AIcodes/SAC.py、AIcodes/SAC_NB.py
  • 数据文件:halfcheetah_medium-v2.hdf5
  • 完整 transition 数据

输出与产物

  • checkpoints/SAC/ 或 checkpoints/SAC_NB/
  • best_model.pt
  • train_config.json
  • training_history.csv
  • 训练曲线图

Base / NB 对比

对比项SACSAC_NB
actor 更新方式AWAC 风格加权 log_prob 学习SAC loss + BC loss
增强重点根据 advantage 调整学习权重直接加入行为克隆约束
共同特征Gaussian actor、双 critic、alpha 自动调节Gaussian actor、双 critic、alpha 自动调节
适合理解理解离线随机策略如何加权学习理解随机策略如何加入 BC 约束

小结

  • SAC 可以理解成“既追求高收益,也保留一定随机性”:它不会只输出一个固定动作,而是从一个动作分布中采样。
  • 双 critic 用来降低 Q 值高估,alpha 温度参数像一个旋钮,用来平衡“多探索一点”和“更贪心一点”。
  • SAC 的 Base 版本更偏 AWAC 风格,会更重视 advantage 更高的数据动作;SAC_NB 则额外加入 BC loss,强调不要偏离离线数据动作。
  • 这一组适合理解随机策略在离线场景里的难点:既要学到高收益动作,也要避免策略跑到数据集没有覆盖的地方。