本文参考 OpenAI Spin
文本介绍的 Soft Actor-Critic (SAC)算法, 它喝上一章介绍的 TD3 算法有些相似。 在阅读本章之前, 最好能够先搞清楚 TD3。
TD3 是一个Deterministic 的算法, 为了引入不确定性,以探索 Policy 空间 TD3使用了高斯噪音。 而 SAC 使用了另外一个办法引入不确定性: 熵。 SAC 吧 熵当做一个对算法的 Regularization, 增加其不确定性,进而增强对 Policy 的探索。
SAC 特点
- SAC 是 Off Policy 算法
- 本文介绍的SAC 用于连续型 Action ,但是稍微修改以后,SAC 可用于离散型 Action。
Entropy Regularization
如果对熵(Entropy) 不太清楚, 可以参考一下这篇文章: 信息熵 Entropy --- 不确定性的单位。
在SAC 计算 Policy的熵, 写成 , 意思是, 计算在
时, policy
给出 Action
的熵。 公式中
代表所有的Action。 熵越高,系统中不确定越强,也就是说Policy给出的 Action 不确定性越大。 为了控制这项熵对 Policy 的影响, SAC引入了一个超参数
来调控它。 最终 Entropy Regularization 写作:
Policy:
![](https://img.haomeiwen.com/i25067830/97fd38fc382de683.png)
Q Value:
![](https://img.haomeiwen.com/i25067830/f809dab608aaabbf.png)
V Value:
![](https://img.haomeiwen.com/i25067830/a95cdf5fc100afee.png)
Q 值的Bellman equation:
![](https://img.haomeiwen.com/i25067830/4f0fadd1f703d171.png)
SAC 和 TD3的异同
相同点:
- 都有2个Q Fucntion
- 都用 MSBE 优化 Q Fucntion
- 都用 Target Q Function, 都是用polyak averaging 更新 Q Function
不同点:
- SAC 用了entropy regularization
- SAC 用 Current Policy 而不是 Target Policy 来生成 next action
- SAC 是Stochastic Policy , 他不用加噪声
Q Fucntion
我们尝试用 Bellman equation 来展开 Q Fucntion。 首先吧 Entropy Regularization 的公式带入 Q Fucntion :
![](https://img.haomeiwen.com/i25067830/deecb038bdee6bdc.png)
因为是期望, 在实际中,我们可以用 Sample 来近似。 那么就可以得到:
![](https://img.haomeiwen.com/i25067830/faddbb517df9aee7.png)
其中:
-
: 下一个时刻的 state, 从Replay Buffer 中拿出来的 Sample (transition) 就有。
-
: 下一个时刻的 action, 从 Current Policy 中计算得到
-
: 其实就是
, 这样写是为了强调 Action 使用 Policy 中sample 出来的。
训练 SAC
Q Fucntion 的 Loss 函数
![](https://img.haomeiwen.com/i25067830/e2a112e542a84424.png)
其中 :
![](https://img.haomeiwen.com/i25067830/1ba6ae27502f7c6c.png)
Reparameterization Trick
训练 Policy 的目标是 让期望 Reward 最大, 也就是
![](https://img.haomeiwen.com/i25067830/28a295fbbaf642c5.png)
SAC 中在计算 Policy Loss 的时候, 使用了 reparameterization trick。在计算 Policy Loss 选择 Action的时候, 并不是直接使用 Policy 计算出来的值, 而是使用:
![](https://img.haomeiwen.com/i25067830/f75b7fbbafdbf3b6.png)
这是 OpenAI 的从论文里面拿出来的,有点难理解, 写成伪 Python 代码:
看了几份代码,都有不一样的地方, 推荐大家自己看一下Stable Baseline3 的实现。
stable_baselines3 SAC
torch.nn.Hardtanh
actions = actor(state)
mean = np.mean(actions)
std = np.std(actions)
normal = Normal(0, 1)
z = normal.sample()
action = torch.nn.Hardtanh(mean+ std*z, -2, 2)
这样的话, 优化 Policy 要做的事情就是 :
![](https://img.haomeiwen.com/i25067830/36044d2675d9093f.png)
这个很类似 TD3, 不过多加了一个 Entropy, 之所以 Entropy 之前是 - 号, 因为后面的 log 项是负值, 实际是加上 Entropy。
伪代码
![](https://img.haomeiwen.com/i25067830/58ae5a8081ced088.png)
网友评论