1. Tittle
2. Label
- Model-Free
- off-policy
- Continuous action space
- 微小改动policy更新规则,可以用discrete action space
3. 总结
SAC算法相对于DDPG来说减少了一些超参数,使得算法更容易收敛,也更加稳定。例如DDPG在训练月球着陆LunerLander时,如果参数不好收敛效果很差,而SAC能够十分完美的解决这个问题,而且收敛速度更快。
这里有关于SAC算法的详细推导介绍:Springup-SAC
3.1 针对的问题及解决思路
- 对于复杂的sample收敛性很差,需要复杂的超参数调整(难调啊)
在SAC算法中,引入了entropy(熵) , Actor希望最大化的不仅仅是reward的数学期望,同时还有最大化entropy*
3.2 算法分析
3.2.1 Entropy
Entropy
熵,通俗来讲,就是用来衡量一个随机变量的随机程度。
例如,一个硬币如果某一侧重量比较大,那么抛硬币的时候总是某个面朝上,那么他的
熵
就低。如果两侧出现的次数接近相同,那么熵
就高,随机性越大。
Entropy的计算:
假设随机变量x的概率密度函数为P(x), x的交叉熵是根据x的概率密度P计算的:
H
(
P
)
=
E
x
∼
P
[
−
log
P
(
x
)
]
H(P) = E_{x\sim P}[-\log P(x)]
H(P)=Ex∼P[−logP(x)]
3.2.2 网络结构
算法的具体公式推导见原论文或者Springup-SAC。下面分析一下网络结构:
- Critic类网络,4个, 参数(s,a):
- Q1、Q2
- Q1target 、 Q2target
- Actor类网络,2个,参数 ( s ) :
- π \pi π
所以我们一共有5个网络。
所有的target网络更新都是根据非target网络进行软更新
Q1, Q2输出1维q-value,
π \pi π采用的是输出一个高斯分布,即输出mean和std。然后通过mean和std在这个高斯分布中随机采样,从而获得我们所需要的动作。
主要我们需要注意的就是对于两个Loss函数的计算,使用的是target网络还是非target网络。
另一个需要注意的地方是 l o g π θ ( a ′ ∣ s ′ ) log \pi_\theta(a'|s') logπθ(a′∣s′)的计算:
# pi_action 是通过高斯分布sample出来的动作。 pi_distribution是这个高斯分布
logp_pi = pi_distribution.log_prob(pi_action).sum(axis = -1) # 调用函数库计算log
#正则化:F:import torch.nn.functional as F
# 该正则化来源在论文中。