type
status
password
date
slug
summary
category
URL
tags
icon
Soft Actor-Critic (SAC) 是一种基于策略梯度的深度强化学习算法,它具有最大化奖励与最大化熵(探索性)的双重目标。SAC 通过引入熵正则项,使策略在决策时具有更大的随机性,从而提高探索能力。
一、9.5.1 熵正则
通常应用于策略网络,增加策略的探索性,使策略网络输出的概率分布的熵不要太小。熵只依赖于状态与策略网络参数。
二、基本思想
价值函数定义
- 状态价值函数
- 动作价值函数
注意与目标函数 有区别
熵正则中定义目标函数为
其中是个超参数,需要手动调。
价值评估
贝尔曼方程
策略提升
SAC中的策略不再是以往的高斯分布形式,而是用基于能量的模型(energy-based model)来表示策略:
下图展示了一般的高斯分布策略(左)与基于能量的策略(右)的区别。可以看出基于能量的模型在面对多模态(multimodal)的值函数()时,具有更强的策略表达能力,而一般的高斯分布只能将决策集中在值更高的部分,忽略其他次优解。

三、离散动作空间的具体实现
价值评估
如果在SAC中,我们只打算维持一个值函数,那么可以只用(13.6)式进行值迭代;如果需要同时维持两个值函数,就使用(13.7)(13.9)进行值迭代。
策略提升
通过KL散度令策略向值分布进行靠近,策略优化公式为:
四、连续动作空间的具体实现
在 SAC 算法中,我们为两个动作价值函数(参数分别为和)和一个策略函数(参数为)建模。
Critic更新
基于 Double DQN 的思想,SAC 使用两个网络,但每次用网络时会挑选一个值小的网络,从而缓解值过高估计的问题。任意一个函数的损失函数为:
其中,是策略过去收集的数据,因为 SAC 是一种离线策略算法。为了让训练更加稳定,这里使用了目标网络,同样是两个目标网络,与两个网络一一对应。SAC 中目标网络的更新方式与 DDPG 中的更新方式一样。
Actor更新
策略的损失函数由 KL 散度得到,化简后为:
可以理解为最大化函数,因为有。
损失函数推导
对连续动作空间的环境,SAC 算法的策略输出高斯分布的均值和标准差,但是根据高斯分布来采样动作的过程是不可导的。因此,我们需要用到重参数化技巧(reparameterization trick)。重参数化的做法是先从策略高斯分布采样,生成动作。并计算在动作的概率我们将其表示为,其中是一个噪声随机变量。同时考虑到两个函数,重写策略的损失函数:
Actor网络设计

自动调整熵正则项
在 SAC 算法中,如何选择熵正则项的系数非常重要。在不同的状态下需要不同大小的熵:在最优动作不确定的某个状态下,熵的取值应该大一点;而在某个最优动作比较确定的状态下,熵的取值可以小一点。为了自动调整熵正则项,SAC 将强化学习的目标改写为一个带约束的优化问题:
也就是最大化期望回报,同时约束熵的均值大于。通过一些数学技巧化简后,得到的损失函数:
即当策略的熵低于目标值时,训练目标会使的值增大,进而在上述最小化损失函数的过程中增加了策略熵对应项的重要性;而当策略的熵高于目标值时,训练目标会使的值减小,进而使得策略训练时更专注于价值提升。
算法流程
用随机的网络参数,和分别初始化 Critic 网络 和 Actor 网络复制相同的参数,,分别初始化目标网络和 初始化经验回放池 for 序列 do 获取环境初始状态 for 时间步 do 根据当前策略选择动作 执行动作,获得奖励,环境状态变为 将存入回放池 for 训练轮数 do 从中采样个元组 对每个元组,用目标网络计算,其中 对两个 Critic 网络都进行如下更新:对,最小化损失函数 用重参数化技巧采样动作,然后用以下损失函数更新当前 Actor 网络:更新熵正则项的系数 更新目标网络:end for end for end for