强化学习系列(7):软演员 - 评论家(Soft Actor-Critic,SAC)算法及其优势
一、软演员 - 评论家(SAC)算法原理
背景与动机
在传统的强化学习算法用于连续动作空间场景时,如DDPG和PPO等,虽然能取得一定成果,但往往侧重于最大化累计奖励,对探索和利用的平衡以及动作的多样性考虑不够全面。SAC算法引入了最大熵原理,旨在在最大化累计奖励的同时,尽可能增加动作的不确定性(熵),使得智能体在探索过程中能更充分地覆盖动作空间,找到更优的策略,尤其适用于复杂、动态的连续动作空间环境。
核心思想
SAC基于Actor-Critic架构,融合了最大熵强化学习的思想。它希望智能体在学习过程中不仅要追求高奖励,还要使策略的熵尽可能大,也就是让动作的分布更加均匀、多样化,避免过早陷入局部最优策略,通过这种方式来提升探索效率和最终策略的质量。
最大熵原理的融入
在传统的强化学习目标(如最大化累计奖励的期望)基础上,SAC添加了一个熵项来衡量策略的不确定性。具体来说,其目标函数变为最大化一个包含奖励和策略熵的综合量,公式如下:
[
J(\pi) = \mathbb{E}{\tau \sim \pi}\left[\sum{t = 0}^{T} \gamma^{t} (r(s_{t}, a_{t}) + \alpha H(\pi(\cdot|s_{t})))\right]
]
其中,(r(s_{t}, a_{t}))是在状态 (s_{t}) 下采取动作 (a_{t}) 获得的奖励,(H(\pi(\cdot|s_{t}))) 是策略 (\pi) 在状态 (s_{t}) 下的熵,(\alpha) 是一个调节熵的权重系数,用于平衡奖励和熵在目标函数中的重要性。
二、SAC的关键组件
策略网络(Actor)
- 功能与结构特点:和其他Actor-Critic架构中的策略网络类似,SAC的策略网络接收环境状态作为输入,输出连续的动作值。不过,它的输出通常是动作的概率分布相关参数(比如对于高斯分布,输出均值和方差等),以便通过采样得到具体的动作,同时这个分布会受到熵调节机制的影响,以鼓励动作的多样性。示例网络结构代码如下:
import torch
import torch.nn as nn
class PolicyNetwork(nn.Module):
def __init__(self, input_size, output_size):
super(PolicyNetwork, self).__init__()
self.fc1 = nn.Linear(input_size, 128)
self.fc2 = nn.Linear(128, 128)
self.fc_mean = nn.Linear(128, output_size)
self.fc_std = nn.Linear(128, output_size)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
mean = self.fc_mean(x)
std = torch.sigmoid(self.fc_std(x)) # 确保方差为正
return mean, std
- 动作采样方式:利用输出的均值和方差参数,通过重参数化技巧(Reparameterization Trick)从高斯分布中采样动作,这样便于在反向传播时计算梯度,示例代码如下:
mean, std = policy_net(state)
noise = torch.randn_like(mean)
action = mean + std * noise # 重参数化采样动作
action = torch.tanh(action) # 限制动作在合理范围,比如[-1, 1]
价值网络(Critic)
- 双价值网络设计:SAC采用了两个价值网络((Q_1) 和 (Q_2))来估计状态 - 动作对的价值,这样做可以减少价值估计的方差,提高估计的准确性和稳定性。两个网络结构相似,输入都是状态和动作的联合信息,输出对该状态 - 动作对的价值估计,示例代码如下:
class QNetwork(nn.Module):
def __init__(self, input_size, action_size):
super(QNetwork, self).__init__

最低0.47元/天 解锁文章
4113

被折叠的 条评论
为什么被折叠?



