Actor-Critic 结合了 值函数 和 策略函数的思想:
Actor 决定怎么行动,根据状态
Critic 评价动作的好坏,指导 Actor 优化
AC 方法的核心思想是:
-
Actor 负责决策:基于当前策略 policy
$\pi(a | s)$ 选择动作。 -
Critic 负责评价:使用 价值函数
$V(s)$ 或 优势函数$A(s, a)$ 来衡量 Actor 选择的动作是否比平均水平更好 -
Actor 依赖 Critic 进行更新:Critic 计算出的价值信号用于调整策略,使得高回报的动作被执行的概率更高
在策略梯度中,可以把梯度写成这个更一般的形式: $$ g = \mathbb{E} \left[ \sum_{t=0}^{T} \psi_t \nabla_\theta \log \pi_\theta(a_t | s_t) \right] $$ 其中,$\psi_t$可以有很多种形式:
-
$\displaystyle \sum_{t'=0}^{T} \gamma^{t'} r_{t'}$ :轨迹的总回报; -
$\displaystyle \sum_{t'=t}^{T} \gamma^{t'-t} r_{t'}$ :动作$a_t$之后的回报; -
$\displaystyle \sum_{t'=t}^{T} \gamma^{t'-t} r_{t'} - b(s_t)$ :基准线版本的改进; -
$Q^{\pi_\theta}(s_t, a_t)$ :动作价值函数; -
$A^{\pi_\theta}(s_t, a_t)$ :优势函数; -
$r_t + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t)$ :时序差分残差。
$\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)$ 优势估计,衡量动作
$a_t$ 的好坏,本质上就是$A^{\pi}(s_t,a_t)=Q^{\pi}(s_t,a_t)-V^{\pi}(s_t)$
虽然原始的 REINFORCE 对策略梯度的估计是无偏的,(采用蒙特卡洛),但是方差很大。
-
可以考虑引入一个 baseline function
$b(s_t)$ 减小方差。 -
也可以采用 Actor-Critic 估计一个动作价值函数
$Q$ ,代替蒙特卡洛采样,即形式$(4)$ -
也可以把状态价值函数
$V$ 当做 baseline,从$Q$ 函数减去这个$V$ 函数就得到了$A$ 函数,也就是优势函数,即形式$(5)$
这里主要讲形式6,也就是通过时序差分残差
Actor 的更新用策略梯度完成, Critic 的更新用时序差分残差的学习方式,定义损失函数: $$ \mathcal{L}(\omega) = \frac{1}{2} (r + \gamma V_{\omega}(s_{t+1}) - V_{\omega}(s_t))^2 $$ 与 DQN 中一样,采取类似于目标网络的方法,将上式中 $ r + \gamma V_{\omega}(s_{t+1}) $ 作为时序差分目标,不会产生梯度来更新价值函数
因此,价值函数的梯度为: $$ \nabla_{\omega} \mathcal{L}(\omega) = -(r + \gamma V_{\omega}(s_{t+1}) - V_{\omega}(s_t)) \nabla_{\omega} V_{\omega}(s_t) $$ 然后用梯度下降来更新就好了

for episode in range(num_episodes):
state = env.reset() # 复位环境,获取初始状态
while not done:
# 1. Actor 选择动作 a
action = actor.select_action(state)
# 2. 执行动作,获取奖励 r 和下一个状态 s'
next_state, reward, done, _ = env.step(action)
# 3. 计算 TD 误差 δ
td_error = reward + γ * critic.V(next_state) - critic.V(state)
# 4. 更新 Critic(基于 TD 误差)
critic_loss = td_error ** 2 # MSE 损失
critic.optimizer.zero_grad()
critic_loss.backward()
critic.optimizer.step()
# 5. 更新 Actor(策略梯度)
log_prob = actor.get_log_prob(state, action)
actor_loss = -log_prob * td_error # 乘以 TD 误差作为优势
actor.optimizer.zero_grad()
actor_loss.backward()
actor.optimizer.step()
# 6. 进入下一个状态
state = next_stateUpdate函数:
调用 update 函数时,是在一个 episode 完成后才进行的,所以这是 on-policy 方法,每一个 episode 里的 states = [s1,s2....] 的 s 个数不一定相同。
-
对于 actor 网络来说,输入 state,输出的是选择某个动作的概率。
-
对于 critic 网络来说,输入 state,输出的是 价值
$V(state)$
定义
td_target = rewards + gamma * critic(next_states) * (1 - done)
td_delta = td_target - critic(states)td_target 就是 时序差分方法中,估计的真实状态价值
Critic(states) 是 critic 网络当当前状态的估计值
Td Error =
Td 误差衡量的是当前 Critic 预测的
actor 输出概率,gather 选择当前的动作,log 对当前的概率取对数
log_probs = torch.log(self.actor(states).gather(1, actions))actor 的损失函数是:$\nabla J(\theta) \approx \log \pi(a_t|s_t) \cdot TD\ Error$
actor_loss = torch.mean(-log_probs * td_delta.detach())
为什么选择 Td 误差,而不是选择
$Q(s_t, a_t)$ Td 误差本质上是对 Q 值的增量更新:
- 直接用
$Q(s_t,a_t)$ 会受到 Critic 误差的影响,导致训练中数据的高方差- 使用 TD 误差作为优势估计,可以帮助策略更快收敛
critic_loss = torch.mean(F.mse_loss(self.critic(states), td_target.detach()))使用均方误差
$$
L=\frac{1}{2}(V_{\theta}(s_t) - TD\ Target)^2=\frac{1}{2}(V_{\theta}(s_t) - (r_t+\gamma V(s_{t+1})))^2
$$
TD 目标本身就是
这并不意味着是在学习动作价值函数
也就是说,优化的目标就是让 Critic 去学习,从某个状态
这个损失函数的意思是,Critic 通过最小化误差(即
$V_{\theta}(s_t)$ 和 TD Target$r_t + \gamma V(s_{t+1})$ 之间的差异),来不断地调整它对状态$s_t$ 的价值$V(s_t)$ 的估计
类比与监督学习,在 Actor-Critic 里:
-
Critic 负责估计
$V(s)$ ,但它的更新目标是 TD Target(即$r_t + \gamma V(s_{t+1})$ ,等价于$Q(s, a) $ )。 -
这个 TD Target 作为“监督信号”,类似于监督学习中的 ground truth,Critic 通过均方误差最小化它。
-
也就是说,Critic 用 TD Target 作为监督信号 来让
$V(s)$ 逼近$Q(s, a)$ 。
这表明,Critic 其实是在用 TD 误差来优化
Actor 和 Critic 的相互作用
-
Critic 估计
$V(s) $ ,帮助 Actor 评估策略的好坏。 -
Actor 通过 TD 误差(优势估计)来优化策略,选择更好的动作,使得长期收益最大化。
-
当 Actor 变得更好时,Critic 也会有更好的 TD Target,从而让 Critic 估计的
$V(s)$ 更接近$ Q(s, a) $。 -
一开始,Critic 估计
$V(s)$ 可能不准确,因此$Q(s, a)$ 和$V(s)$ 可能差距较大。 -
但随着 Actor 选择更好的动作(即 最大化
$Q(s, a$ ) ),$Q(s, a)$ 也会随着策略的改进而变化。 -
当训练趋于稳定,最优策略下,每个状态的动作都接近最优,导致
$Q(s, a)$ 和$V(s)$ 差距变小,最终趋向于:
因为在最优策略下,每个状态的最优动作动作都能带来相同的价值。
在策略梯度里,使用梯度上升来优化参数,使得策略
但是,在深度强化学习中,策略通常由神经网络参数化,沿着梯度更新会导致策略的剧烈变化,可能会使得策略性能突然下降,甚至破坏已经学到的良好策略。
TRPO(Trust Region Policy Optimization) 就是为了解决这个问题,它引入了一个信任区域 trust region,确保每次更新策略的时候,策略的变化不会太大,从而保证学习的稳定性。
对于两个概率分布
-
$P(x)$ 是真实分布(通常是目标分布)。 -
$Q(x)$ 是近似分布(通常是当前模型的分布)。 -
$\log \frac{P(x)}{Q(x)}$ 反映了在$x$ 处,$Q(x)$ 偏离$P(x)$ 的程度。 -
KL 散度是非对称的,即
$D_{\text{KL}}(P || Q) \neq D_{\text{KL}}(Q || P) $ 。
直观理解:
- 当
$P(x)$ 和$Q(x)$ 非常接近时,$D_{\text{KL}}(P || Q)$ 约等于 0。 - 如果
$Q(x)$ 在$P(x)$ 可能性较大的地方概率很低(即$Q(x)$ 没有很好地近似$P(x)$ ),那么 KL 散度会很大。 - KL 散度衡量的是 Q 相比于 P 的信息丢失。
KL散度可以看作是 P 分布下的 Q 分布的信息损失,或者说 P 期望的概率分布和 Q 之间的偏离程度。
衡量信息损失:
- 若用
$Q(x)$ 来近似$P(x)$ ,则 KL 散度衡量的是使用$Q(x)$ 而损失了多少信息 - 例如,$P(x)$ 是真实世界的分布,而
$Q(x)$ 是神经网络的拟合分布,那么 KL 散度告诉的是 模型还差多少
在 TRPO 和 PPO 中,KL 散度用于限制策略更新的幅度,防止策略突然崩坏,从而保证训练的稳定性。
KL 散度本质上1是一个衡量两个概率分布相似度的度量,帮助控制策略更新的稳定性。
重要性采样是一种统计方法,用于在不同的概率分布下进行样本估计。
核心思想是 通过调整样本的权重 来纠正因 采样分布和目标分布不同 所带来的偏差。
简单来说,重要性采样的目的是:
从一个易于采样的分布(通常能容易地采样的分布)中生成样本,然后使用这些样本来估计另一个目标分布(关心的分布)的期望。
在 RL 中,通常在某个策略下采样数据,但是实际关心的目标是另一个不同的策略下的数据的期望。
直接用一个策略的样本来估计另一个策略的期望会有偏差,重要性采样通过给样本加权重来纠正这个偏差。
假设有两个概率分布:
计算目标分布下的期望:
$$
\mathbb{E}_{q}[f(x)] = \int f(x) q(x) dx
$$
但实际上无法从
公式: $$ \mathbb{E}_{q}[f(x)] = \int f(x) q(x) dx = \int f(x) \frac{q(x)}{p(x)} p(x) dx $$ 其中:
-
$\frac{q(x)}{p(x)}$ 是重要性权重。它衡量了样本$x$ 在目标分布$q(x)$ 和行为分布$p(x)$ 之间的差异。 -
$p(x)$ 是从中采样的分布(行为分布)。 -
$q(x)$ 是关心的分布(目标分布)。
通过从 行为分布
在RL中,策略优化的一个关键问题是如何通过采样旧策略的数据来优化新策略。因为我们有一个旧策略
直接上来理解:
- 行为分布是从旧策略(行为分布)中采样数据,因为这些数据已经收集好了。
- 目标分布是希望优化的是新策略(目标分布)。
- 调整权重由于新旧策略不同,通过重要性采样的比率来调整权重,从而让旧数据对新策略的估计更准确。
首先,假设当前策略是
J(\theta) = \mathbb{E}{\pi\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r_t \right]
$$
由于初始状态
其中
其中,新策略的回报是 $\mathbb{E}{\pi{\theta'}} \left[ \sum_{t=0}^\infty \gamma^t r(s_t, a_t) \right]$.
将时序差分残差定义为优势函数: $$ A^{\pi_\theta}(s_t, a_t) = r(s_t, a_t) + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t) $$ 因此,性能差距简化为: $$ J(\theta') - J(\theta) = \mathbb{E}{\pi{\theta'}} \left[ \sum_{t=0}^\infty \gamma^t A^{\pi_\theta}(s_t, a_t) \right] $$
- 优势函数
$A(s,a)$ 衡量在状态$s$ 下选择动作$a$ 的相对价值,相对于策略$\pi_{\theta}$ 的值函数$V(s)$ - 若新策略
$\pi_{\theta'}$ 在优势函数为正的动作上增加概率,则性能差距$J(\theta')-J(\theta)$ 增大
在马尔可夫决策过程中,每个状态
新策略
直接优化这个公式很困难
难点1:$\nu^{\pi_{\theta{\prime}}}(s)$ 依赖于
- 也就是说,需要用新策略
$\pi_{\theta{\prime}}$ 来采样新的状态分布$\nu^{\pi_{\theta{\prime}}}(s)$ ,但问题是现在还没有这个新策略 - 直觉上,想评价一个新方法,但还没试过它,怎么能知道它的效果?
- 这就相当于:想换工作,但是只有在换了之后才能知道新的工作好不好,这种情况很麻烦。
难点2:遍历所有可能的新策略不现实
- 若要尝试所有可能的
$\pi_{\theta'}$ 然后逐个计算回报,这不可行,策略空间太大了
TRPO(信任区域策略优化) 采用了一种近似的方法来简化计算:
-
假设新策略
$\pi_{\theta{\prime}}$ 和旧策略$\pi_{\theta}$ 差别不大(即,每次更新策略的时候,不让它变化太大)。 -
如果策略变化不大,那么状态访问分布
$\nu^{\pi_{\theta{\prime}}}(s)$ 也不会变太多。- 也就是说,新策略访问的状态分布和旧策略差不多。
- 所以我们可以用旧策略的状态分布
$\nu^{\pi_{\theta}}(s)$ 来近似$\nu^{\pi_{\theta{\prime}}}(s) $ 。 - 这样就不需要重新采样新的数据了,而是直接用旧的数据来估计新策略的效果
于是,优化目标变成: $$ L_{\theta}(\theta{\prime}) = J(\theta) + \frac{1}{1 - \gamma} \mathbb{E}{s \sim \nu^{\pi{\theta}}} \mathbb{E}{a \sim \pi{\theta{\prime}}} [ A^{\pi_{\theta}}(s, a) ] $$ 这个公式的意思是:
我们用旧策略
重要性采样修正
状态分布用
采用重要性采样来修正偏差,即: $$ \mathbb{E}{\pi{\theta{\prime}}} [ A^{\pi_\theta}(s, a) ] = \mathbb{E}{\pi\theta} \left[ \frac{\pi_{\theta{\prime}}(a | s)}{\pi_\theta(a | s)} A^{\pi_\theta}(s, a) \right] $$
此外,还需要保证新旧策略足够接近,TRPO 用 KL 散步来衡量策略之间的距离,确保新旧策略状态访问分布变化很小。
TRPO 提出的优化目标是: $$ \max_{\theta{\prime}} L_{\theta}(\theta{\prime}) \quad \text{subject to} \quad \mathbb{E}{s \sim \nu^{\pi{\theta}}} \left[ D_{\text{KL}} (\pi_{\theta_k}(\cdot | s), \pi_{\theta{\prime}}(\cdot | s)) \right] \leq \delta $$ 不等式约束定义了策略空间中的一个 KL 球,被称为信任区域。
在这个区域中,可以认为当前学习的策略和环境交互的状态分布于上一轮策略最后采样的状态分布一致。
可以基于一步行动的重要性采样方法使当前学习策略稳定提升。
对于多变量函数
-
$g$ 是 梯度:$g = \nabla_{\theta} f(\theta)$ 表示函数在$\theta_k$ 处的变化速率(方向和大小)。 - H 是 黑塞矩阵: 二阶导数 的矩阵,表示函数在
$\theta_k$ 处的曲率,即函数的变化是如何加速或减速的。
在TRPO中,我们用黑塞矩阵来衡量 KL 散度的曲率,控制每次策略更新的步长,防止策略变化过快。
通过泰勒展开,能够在当前点附近做局部近似,利用梯度和曲率来决定更新策略的方向和幅度
在 TRPO 中,存在约束条件:
$$
\mathbb{E}{s \sim \nu{\pi_{\theta_k}}} \left[D_{\text{KL}}(\pi_{\theta_k}(\cdot | s), \pi_{\theta{\prime}}(\cdot | s))\right] \leq \delta
$$
希望找到一个新的策略参数
同时,不能让新旧策略的 KL 散度变化太大,即 策略更新不能过猛,必须控制在
这是一个带约束的优化问题。普通的梯度优化方法(比如梯度下降)无法直接解决这种问题,它们只适用于无约束优化。
KKT 条件是拉格朗日乘数法的推广,适用于约束的优化问题,可以用来找寻最优解。
假设要最大化一个函数:$\max_x f(x)$,同时存在一个约束
引入拉格朗日函数
KKT条件的四个主要部分
- 可行性条件:$g(x) \le0$,最优解
$x$ 必须要满足约束条件 - 拉格朗日乘子非负性:$\lambda^* \ge 0$,确保乘子有效,且能够约束目标函数
- 互补松弛条件:$\lambda^* g(x^*) = 0$
- 如果约束没有被“触及”(即 $g(x^) < 0$ ),那么拉格朗日乘子 $\lambda^$ = 0 ,即这个约束对优化目标没有影响
- 如果约束正好被触及(即 $g(x^) = 0$ ),那么拉格朗日乘子 $\lambda^$ > 0 ,说明约束在优化中起了作用。
- KKT站立条件:
最优解
怎么在 TRPO 中应用 KKT 条件
一个二次约束,即 KL 散度的约束,确保新旧策略之间的差异不超过
-
$g = \nabla_{\theta} L_{\theta}(\theta)$ 是目标函数的梯度。 -
$H^{-1}$ 是黑塞矩阵的逆,表示 KL 散度的曲率。 -
$\lambda$ 是拉格朗日乘子,控制约束对优化目标的影响。
接下来,通过 互补松弛条件,我们可以计算出
$$ \theta_{k+1} = \theta_k + \sqrt{\frac{2\delta}{g^T H^{-1} g}} H^{-1} g $$ 其中:
-
$g$ :目标函数的梯度,决定了更新的方向。 -
$H^{-1} g$ :调整了更新的幅度,考虑了 KL 散度的曲率。 -
$\sqrt{\frac{2\delta}{g^T H^{-1} g}} $ :确保每次更新都不会使 KL 散度超出阈值$\delta$ ,防止更新过大。
在神经网络中,策略函数有成千上万的参数。
若直接计算Hessian 矩阵的逆,所需的计算量和内存资源会非常庞大
TRPO 采用了共轭态度来解决这个问题,核心思想是:
直接计算梯度和黑塞矩阵的乘积,避免了直接计算Hessian 矩阵的逆
在 TRPO 中,假设 KL 散度的约束条件是:
$$
\frac{1}{2} (\beta x)^T H (\beta x) = \delta
$$
步长
PPO 基于 TRPO 的思想,有大量的实验结果表明,与 TRPO相比,PPO 能学的一样好,甚至更快
PPO-惩罚(PPO-Penalty)用拉格朗日乘数法直接将 KL 散度的限制放进了目标函数中,变成了一个无约束的优化问题,在迭代的过程中不断更新 KL 散度前的系数。
核心思想是在优化目标中引入惩罚项,防止新策略与旧策略差异过大。
PPO-Penalty 的优化目标函数为: $$ \arg \max_{\theta} \mathbb{E}{s \sim \nu{\pi_{\theta}}} \left[ \mathbb{E}{a \sim \pi{\theta}} \left[ \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)} A^{\pi_{\theta_k}}(s, a) - \beta D_{\text{KL}} \left( \pi_{\theta_k}(\cdot|s), \pi_{\theta}(\cdot|s) \right) \right] \right] $$ 其中:
- 第一项:基于重要性采样的策略梯度目标,通过新旧策略的概率比
$\frac{\pi_\theta}{\pi_{\theta_{\text{old}}}}$ 加权优势函数$A_t$ ,鼓励高优势动作 - 第二项:KL 散度惩罚项,用于约束新旧策略的差异,$\beta$ 为自适应惩罚系数。
为了动态调整惩罚系数
-
如果 KL 散度
$d_k$ 小于设定的阈值$\delta / 1.5$ ,则减小$\beta$ :
这意味着,若 KL 散度较小,策略更新幅度也较小,可以进一步放松 KL 散度的约束,从而增大学习步长
-
如果 KL 散度
$d_k$ 大于$\delta \times 1.5$ ,则增大$\beta$ :
这意味着,若 KL 散度过大,表示策略更新幅度过大,需要加大惩罚,限制策略变化
-
否则(即
$\delta / 1.5 \leq d_k \leq \delta$ ),不调整$\beta$ ,保持当前值:
PPO-Clip 方法,直接在目标函数中进行限制,以确保新策略和旧策略的参数差距不会太大。
PPO-Clip 的优化目标是: $$ \arg \max_{\theta} \mathbb{E}{s \sim \nu{\pi_{\theta_k}}} \mathbb{E}{a \sim \pi{\theta_k}(\cdot | s)} \left[ \min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)} A^{\pi_{\theta_k}}(s, a), \text{clip} \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}, 1 - \epsilon, 1 + \epsilon \right) A^{\pi_{\theta_k}}(s, a) \right) \right] $$
-
$\frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}$ 是新旧策略的概率比,衡量策略更新的幅度 -
$\epsilon$ 用于限制策略更新的范围 -
$clip(x, l, r) = max(min(x, r), l)$ ,即将$x$ 限制在区间$[l, r]$ 内
PPO-Clip 通过截断操作,限制策略的更新幅度,防止策略在单次更新时发生过大变化
-
如果
$A^{\pi_{\theta_k}}(s, a) > 0$ ,优化目标希望增大$\frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}$ ,但不会超过$1 + \epsilon$ -
如果
$A^{\pi_{\theta_k}}(s, a) < 0 $ ,优化目标希望减小$\frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}$ ,但不会低于$1 - \epsilon$
这个限制防止策略在单次更新时发生过大变化,提高训练的稳定性,同时仍然允许一定程度的优化。
Deep deterministic policy gradient 深度确定性策略梯度
DDPG 也属于 AC 算法,但是不同点在于,DDPG 是学习一个确定性策略,而不是像 REINFORCE 、TRPO 和 PPO 学习的是一个随机性策略。DDPG 的动作由函数直接确定,表示为
不过虽然叫 PG,但是实际上应该是属于 DQN 的一个扩展版本。
对于连续动作,Q-learning 和 DQN 没办法处理。
对于离散动作,有几个动作就输出几个概率,$\pi_{\theta}(a_t \mid s_t)$ 随机性策略。
对于连续动作,比如要输出机械臂弯曲的角度,输出一个具体的浮点数
对于确定性策略来说,输入某个状态
对于输出离散动作,加一个 softmax 确保所有的输出是动作概率
对于输出连续动作,一般可以在输出层 + tanh 函数。
其作用是,将输出限制到
DDPG 是 DQN 的扩展,可以扩展到连续动作空间。
在 DDPG 的训练中,它借鉴了DQN 的技巧:目标网络和经验回放。
经验回放与 DQN 是一样的,但目标网络的更新与DQN有点不同。
DDPG 在 DQN 基础上加了个策略网络来直接输出动作值,所以 DDPG 需要一边学 Q 网络,一边学习策略网络
Q 网络的参数用
最开始训练的时候,这两个神经网络的参数是随机的。
所以 critic 最开始是随机打分的,actor 也随机输出动作。但是由于有环境反馈的奖励存在,因此评论员的评分会越来越准确,所评判的演员的表现也会越来越好。
既然 actor 是一个神经网络,是我们希望训练好的策略网络,我们就需要计算梯度来更新优化它里面的参数
简单来说,希望调整actor的网络参数,使得 critic 打分尽可能高。
策略网络部分
DQN 的最佳策略是想要学出一个很好的 Q 网络,学出这个网络之后,我们希望选取的那个动作使 Q 值最大。
DDPG 的目的也是求解让 Q 值最大的那个动作。
actor 只是为了迎合critic的打分而已,所以优化策略网络的梯度就是要最大化这个 Q 值,所以构造的损失函数就是让 Q 取一个负号。
目标网络部分
除了策略网络要做优化,DDPG 还有一个 Q 网络也要优化。
critic一开始也不知道怎么评分,它也是在一步一步的学习当中,慢慢地给出准确的分数。
优化 Q 网络的方法与 DQN 优化 Q 网络的方法是一样的,用真实的奖励
然后让 Q 网络的输出逼近
DDPG 需要用到4个神经网络,Actor 和 Critic 各用一个网络,此外各有一个目标网络。
在 DQN 中,每搁一段时间将
DDPG中,目标$Q$网络的更新,采取的是一种软更新的方式,让目标
DDPG 在行为策略上引入一个随机噪声

最大熵强化学习是一种通过引入熵的概念来改善 RL 中探索与利用平衡的方法。
它不仅关注最大化回报,还通过最大化策略的熵来鼓励更多的探索,从而提高样本效率和策略的多样性。
SAC 是基于最大熵强化学习的算法,是 off-policy
在信息论中,熵用于衡量一个概率分布的不确定性。
在强化学习中,熵表示智能体选择动作的随机性或多样性。
如果策略选择某个动作的概率非常接近 0 或 1,那么熵会较低,表示策略很确定性。而如果策略在多个动作之间的选择概率比较均匀,熵则较高,表示策略更具探索性。
熵 衡量的是一个随机变量的不确定性,假设
-
如果熵比较高,说明随机变量的选择结果更加的不可预测和分散
-
如果熵比较低,说明随机变量的选择结果比较确定
-
在传统的强化学习中,智能体的目标通常是最大化回报。
-
而在最大熵强化学习中,目标变为最大化回报的同时,还要最大化策略的熵,即使得智能体在做决策时具有更多的不确定性,从而鼓励更多的探索。
最大熵强化学习的目标函数定义为: $$ \pi^* = \arg \max_{\pi} \mathbb{E}_{\pi} \left[ \sum_t \left( r(s_t, a_t) + \alpha H(\pi(\cdot|s_t)) \right) \right] $$
-
$\pi^*$ 是最优策略,它是最大化期望回报和策略熵的结果 -
$r(s_t, a_t)$ 是在状态$s_t$ 下采取动作$a_t$ 获得的奖励 -
$H(\pi(\cdot|s_t))$ 是在状态$s_t$ 下,策略$\pi$ 的熵,即智能体选择动作的随机性 -
$\alpha$ 是控制熵对目标函数影响的正则化超参数。它决定了策略的随机性:- 如果
$\alpha$ 较大,策略的随机性就较大,智能体将更倾向于探索; - 如果
$\alpha$ 较小,智能体将更多地利用当前的策略。
- 如果
Soft 贝尔曼方程: $$ Q(s_t, a_t) = r(s_t, a_t) + \gamma \mathbb{E}{s_{t+1}}[V(s_{t+1})] $$ 这个公式与传统的 Q-learning 非常相似,但区别在于最大熵学习办法中考虑了策略的熵,引入了更大的探索空间
状态价值函数
-
$\alpha$ 是温度参数,用于控制熵的影响,较大的$\alpha$ 值增加策略的探索性,而较小的$\alpha$ 值则倾向于更确定性的动作 -
$H(\pi(\cdot | s_t))$ 是策略的熵,即在状态$s_t$ 下,智能体选择动作的随机性。
Soft 策略评估涉及计算 Soft Q 函数,在有限状态和动作空间的情况下,Soft 策略评估通过最大化回报和增加策略的熵来评估策略的质量,然后评估得到的 Soft Q 函数进行策略提升。
在最大熵 RL 中,策略提升通过最小化 KL 散度来执行。策略更新的公式如下: $$ \pi_{\text{new}} = \arg \min_{\pi{\prime}} D_{KL}\left(\pi{\prime}(a_t | s_t) , || , \exp\left( \frac{1}{\alpha} Q^{\pi_{\text{old}}}(s_t, a_t) \right) / Z^{\pi_{\text{old}}}(s_t)\right) $$ 其中:
-
$D_{KL}$ 是KL 散度,用于度量两个策略之间的差异 -
$\exp\left( \frac{1}{\alpha} Q^{\pi_{\text{old}}}(s_t, a_t) \right)$ 是旧策略的 Soft Q 函数,用于计算给定状态下选择动作的概率。 -
$Z^{\pi_{\text{old}}}(s_t)$ 是归一化常数,确保概率分布的总和为 1。
两个动作值函数
每次计算的时候选一个
-
$Q_w(s_t, a_t)$ 是在状态$s_t$ 下,采取动作$a_t$ 后的$Q$ 值。 -
$V_{w-}(s_{t+1})$ 是在状态$s_{t+1}$ 下的值函数。
策略
在连续动作空间中,策略网络输出一个概率分布,agent 根据这个概率分布来选择具体的动作
采样的过程是一个随机过程,且不可导。
也就是说,当从某个概率分布中采样动作的时,采样操作并不依赖于网络的参数,所以无法通过网络的输出来反向传播。
重参数化技巧的做法是:
- 首先从标准高斯分布
$\mathcal{N}(0, 1)$ 中采样,得到噪声$\epsilon_t$ 。 - 然后通过一个确定性的函数$ f_{\theta}(\epsilon_t, s_t)$ 来将噪声转换为动作。这个函数依赖于策略网络参数
$\theta$ ,并且输入噪声和状态$s_t$ 。
通过这种方式,SAC 可以通过控制标准高斯分布的噪声来生成动作,从而实现更稳定的优化。
$$
L_{\pi}(\theta) = \mathbb{E}{s_t \sim R, \epsilon_t \sim \mathcal{N}} \left[ \alpha \log(\pi\theta(f_\theta(\epsilon_t; s_t) | s_t)) - \min_{j=1,2} Q_{\omega_j}(s_t, f_\theta(\epsilon_t; s_t)) \right]
$$
与前面的不同只在于
在某些状态下,智能体可能已经学会了最优的行为,因此在这种情况下,熵取值应该比较小。
在另一些状态下,智能体可能仍在探索阶段,因此熵取值应该较大,以鼓励更多的探索。
SAC 的目标是最大化回报 和 熵正则化项,并且保证策略的熵不低于一个预设的阈值
具体来说,这可以表示为一个优化问题: $$ \max_{\pi} \mathbb{E}{\pi} \left[ \sum_t r(s_t, a_t) \right] \quad \text{subject to} \quad \mathbb{E}{(s_t, a_t) \sim \rho_{\pi}} \left[ - \log (\pi(a_t | s_t)) \right] \geq H_0 $$
为了自动调整,SAC 引入了新的损失函数
- 当策略的熵低于
$H_0$ 时,损失函数会增加$\alpha$ 的值,从而加强探索 - 当策略的熵大于
$H_0$ 时,损失函数会减少$\alpha$ 的值,使得agent更多地利用现有策略,而不是继续随机探索。
