原文towardsdatascience.com/navigating-soft-actor-critic-reinforcement-learning-8e1a7406ce48?sourcecollection_archive---------11-----------------------#2024-12-12在生物工程背景下理解 SAC 强化学习的理论与实现https://medium.com/mo.abusadeh?sourcepost_page---byline--8e1a7406ce48--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--8e1a7406ce48-------------------------------- Mohammed AbuSadeh·发布于 Towards Data Science ·阅读时长 10 分钟·2024 年 12 月 12 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/117e5ac1c7be96924a7201b5185fd59e.png由作者使用 ChatGPT-4o 生成的图像介绍强化学习RL研究领域在过去几年里取得了巨大进展。深度强化学习方法的使用如近端策略优化PPOSchulman2017和深度确定性策略梯度DDPGLillicrap2015使得智能体能够在高维环境中解决任务。然而许多这些无模型的强化学习算法在训练过程中存在稳定性问题。这些挑战源于脆弱的收敛性、高方差的梯度估计、非常高的样本复杂度以及在连续动作空间中对超参数的敏感性。鉴于这些问题有必要考虑一种新开发的强化学习算法避免这些问题并扩展其在复杂现实世界问题中的适用性。这个新算法就是软演员评论家SAC深度强化学习网络。Haarnoja2018https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/719d9f7573dce860add1e140432f1fdb.png软演员评论家网络的模型架构。图像来源于(Du, 2023)SAC 是一种离线策略off-policyActor-Critic 深度强化学习算法旨在解决其前辈算法的稳定性和效率问题。SAC 算法基于最大熵强化学习框架目标是让网络的演员部分最大化预期奖励同时最大化熵。它结合了离线策略更新和更稳定的随机 Actor-Critic 方法的表述。与 PPO 等在线策略方法不同离线策略算法通过经验回放实现更快的学习和更好的样本效率后者需要为每一步梯度更新收集新的样本。对于像 PPO 这样的在线策略方法在学习过程中的每一步梯度更新都需要收集新的样本。使用随机策略和最大化熵的目的是通过鼓励行为中的更多随机性促进算法的鲁棒性和探索性。此外与 PPO 和 DDPG 不同SAC 使用了双 Q 网络、独立的演员网络和熵调整以提高将离线学习与高维非线性函数逼近相结合时的稳定性和收敛性。离线策略强化学习方法对改善患者生活的生物工程系统产生了广泛的影响。更具体地说强化学习已被应用于诸如机器人手臂控制、药物递送方法以及最著名的去 novo 药物设计等领域。Svensson, 2024Svensson 等人使用了多种在线和离线框架及不同类型的回放缓冲区以学习基于 RNN 的分子生成策略该策略能有效作用于 DRD2一种多巴胺受体。该论文指出使用经验回放处理高、中、低评分分子在提高结构多样性和生成活性分子的数量方面产生了效果。回放缓冲区提高了训练代理的样本效率。他们还报告指出使用离线策略方法特别是 SAC有助于通过防止模式坍塌来促进结构多样性。理论解释SAC 通过引入带有熵项的目标函数使用“软”价值函数Η(π(a|s))。因此网络试图最大化终身奖励的预期回报和策略的熵。策略的熵被定义为一个随机变量的不可预测性随着可能值范围的增大而增加。因此新的熵正则化目标变为https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/57384bbf7ccc74498e77313443dd16e2.png熵正则化目标α是一个温度参数用于平衡探索与利用之间的关系。在软值函数的实现中我们的目标是最大化熵因为算法会将相似 Q 值的动作分配相等的概率。最大化熵还有助于防止智能体选择利用近似 Q 值中的不一致性的动作。最终我们可以理解 SAC 如何通过允许网络进行更多探索而不是对一类动作赋予过高的概率从而改善脆弱性。这部分内容灵感来自 Vaishak V.Kumar 在《软演员-评论家解密》一文中对熵最大化的解释。SAC 论文的作者讨论了由于状态值函数逼近软值因此实际上并不需要为策略训练单独的函数逼近器因为它们根据以下公式与状态值相关联。然而训练三个独立的逼近器能提供更好的收敛性。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8bb99c228fae7e880d122184030b8231.png软状态值函数三个函数逼近器网络的特征如下策略网络Actor随机策略输出一组从高斯分布中采样的动作。策略参数通过最小化 Kullback-Leibler 散度来学习公式如下https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/79a5cd826f332f6b5fec21de2400c762.png最小化 KL 散度KL 散度比较的是两个概率分布之间的相对熵或差异。因此在该公式中我们试图最小化策略函数与经过 Z 函数规范化的指数化 Q 函数之间分布的差异。由于目标密度函数是可微分的 Q 函数因此我们对策略应用了重新参数化技巧以减少方差的估计。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9b4eb81490bd4799501b1cea4cd7cba4.png重新参数化策略ϵₜ 是一个从高斯分布中采样的向量描述了噪声。然后策略目标被更新为以下表达式https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/61de771ed85419f7cf722c7582dcd7c9.png策略目标策略目标通过以下梯度估计来优化https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3247348d35c518e313d104bcdaef9c3d.png策略梯度估计器Q 网络Critic包含两个 Q 值网络用于估计状态-动作对的期望回报。我们通过使用以下软贝尔曼残差来最小化软 Q 函数的参数https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/326b8933dff984f1c5106331d3507e28.png软 Q 函数目标其中https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4333f2dc897ce235348f2991d1cb661a.png即时 Q 值Soft Q-函数目标最小化网络 Q 值估计与即时 Q 值之间的平方差。即时 Q 值Q hat是通过当前状态-动作对的奖励与下一时间戳中目标值函数的折扣期望之和得到的。最终目标通过以下给定的随机梯度估计进行优化https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8739f195eadfd70126df462e16384612.png随机梯度估计器目标值网络Critic一个独立的 Soft 值函数有助于稳定训练过程。Soft 值函数逼近器通过以下方式最小化平方残差误差https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/084c54806c06bf551bded6f9f54b245a.pngSoft 值函数目标这个 Soft 值函数目标最小化值函数与 Q 值的期望加上策略函数π的熵之间的平方差。此目标的负对数部分描述了策略函数的熵。我们还知道信息熵是通过负号来计算从而输出正的熵值因为概率值介于 0 和 1 之间的对数总是负数。类似地目标通过以下表达式进行优化使用无偏的梯度估计器https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/94ecdcd4eacc2213b4ba1a9c2dcc2ef8.png无偏梯度估计器代码实现本文中实现的代码来自以下 GitHub 仓库quantumiracle2023 年[## GitHub - quantumiracle/Popular-RL-Algorithms: PyTorch 实现 Soft Actor-Critic (SAC)…Soft Actor-Critic (SAC)、Twin Delayed DDPG (TD3)、Actor-Critic (AC/A2C)、Proximal Policy 的 PyTorch 实现…github.com](https://github.com/quantumiracle/Popular-RL-Algorithms?sourcepost_page-----8e1a7406ce48--------------------------------)pip install gymnasium torchSAC 依赖于使用连续动作空间的环境因此所提供的仿真大多使用了机器人臂‘Reacher’环境以及 Gymnasium 包中的 Pendulum-v1 环境。Pendulum 环境在另一个仓库中运行该仓库实现了相同的算法但使用了较少过时的库MrSyee2020 年[## GitHub - MrSyee/pg-is-all-you-need: Policy Gradient is all you need! 一个详细的 PG 方法教程…Policy Gradient 就是你所需要的一个详细的 PG 方法教程。- MrSyee/pg-is-all-you-needgithub.com](https://github.com/MrSyee/pg-is-all-you-need?tabreadme-ov-filesourcepost_page-----8e1a7406ce48--------------------------------)在网络架构方面如理论解释中所提到有三个主要组件策略网络实现一个高斯演员网络计算动作分布的均值和对数标准差。classPolicyNetwork(nn.Module):def__init__(self,state_dim,action_dim,hidden_dim):super(PolicyNetwork,self).__init__()self.fc1nn.Linear(state_dim,hidden_dim)self.fc2nn.Linear(hidden_dim,hidden_dim)self.meannn.Linear(hidden_dim,action_dim)self.log_stdnn.Linear(hidden_dim,action_dim)defforward(self,state):xF.relu(self.fc1(state))xF.relu(self.fc2(x))meanself.mean(x)log_stdtorch.clamp(self.log_std(x),-20,2)# Limit log_std to prevent instabilityreturnmean,log_std软 Q 网络估计给定状态-动作对下的期望未来回报对于定义的最优策略而言。classSoftQNetwork(nn.Module):def__init__(self,state_dim,action_dim,hidden_dim):super(SoftQNetwork,self).__init__()self.fc1nn.Linear(state_dimaction_dim,hidden_dim)self.fc2nn.Linear(hidden_dim,hidden_dim)self.outnn.Linear(hidden_dim,1)defforward(self,state,action):xtorch.cat([state,action],dim-1)xF.relu(self.fc1(x))xF.relu(self.fc2(x))returnself.out(x)价值网络估计状态值。classValueNetwork(nn.Module):def__init__(self,state_dim,hidden_dim):super(ValueNetwork,self).__init__()self.fc1nn.Linear(state_dim,hidden_dim)self.fc2nn.Linear(hidden_dim,hidden_dim)self.outnn.Linear(hidden_dim,1)defforward(self,state):xF.relu(self.fc1(state))xF.relu(self.fc2(x))returnself.out(x)以下代码片段展示了更新与 SAC 算法相关的不同变量的关键步骤。首先它从重放缓冲区采样一个批次进行经验回放。然后在计算梯度之前先将梯度初始化为零以确保不会累积来自前一批次的梯度。接着执行反向传播并在训练过程中更新网络的权重。最后更新 Q 网络的目标值和损失值。这些步骤适用于所有三种方法。defupdate(batch_size,reward_scale,gamma0.99,soft_tau1e-2):# Sample a batchstate,action,reward,next_state,donereplay_buffer.sample(batch_size)state,next_state,action,reward,donemap(lambdax:torch.FloatTensor(x).to(device),[state,next_state,action,reward,done])# Update Q-networkstarget_valuetarget_value_net(next_state)target_qreward(1-done)*gamma*target_value q1_lossF.mse_loss(soft_q_net1(state,action),target_q.detach())q2_lossF.mse_loss(soft_q_net2(state,action),target_q.detach())soft_q_optimizer1.zero_grad()q1_loss.backward()soft_q_optimizer1.step()soft_q_optimizer2.zero_grad()q2_loss.backward()soft_q_optimizer2.step()# Update Value Networkpredicted_qtorch.min(soft_q_net1(state,action),soft_q_net2(state,action))value_lossF.mse_loss(value_net(state),predicted_q-alpha*log_prob)value_optimizer.zero_grad()value_loss.backward()value_optimizer.step()# Update Policy Networknew_action,log_prob,_,_,_policy_net.evaluate(state)policy_loss(alpha*log_prob-predicted_q).mean()policy_optimizer.zero_grad()policy_loss.backward()policy_optimizer.step()# Soft Update Target Networkfortarget_param,paraminzip(target_value_net.parameters(),value_net.parameters()):target_param.data.copy_(soft_tau*param.data(1-soft_tau)*target_param.data)最后要运行 sac.py 文件中的代码只需运行以下命令python sac.py--train python sac.py--test结果与可视化https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/77207902ecc4b682d7a475496bd4b932.png训练“Reacher”机器人手臂由作者生成在两个环境中训练 SAC 智能体时我注意到问题的行动空间会影响训练的效率和表现。事实上当我在简单的摆动环境中训练智能体时学习收敛得更快且波动较小。然而由于 Reacher 环境包含了更复杂的连续动作空间算法虽然训练得相对不错但奖励的巨大跳跃并没有像预期那样显著。Reacher 环境的训练回合数是摆动环境的 4 倍。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6196e06d1570d595e76a5cff6916d1bf.png通过最大化奖励的学习表现由作者生成下面的动作分布图显示了策略在训练过程中探索的多样化动作直到它收敛到一个最优策略。像 SAC 这样的熵正则化算法的特点来自于探索性的增加。我们还可以注意到峰值对应于具有高预期回报的动作值这推动策略收敛到更具确定性的行为。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1231b79d7ed7b5a2561e80ac55eea9aa.png行动空间使用分布由作者生成说到更具确定性的行为我们观察到熵在训练回合数上平均有所减少。然而这种行为是可以预期的因为我们希望最大化熵的唯一原因是鼓励更多的探索。更高的探索主要发生在训练过程的早期目的是耗尽大多数可能的状态-动作对从而获得更高的回报。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/206dded1ba5479ad51d65ff6055f4164.png训练回合的熵评估由作者生成结论SAC 算法是一种离策略强化学习框架通过引入新的熵项平衡了开发和探索。SAC 算法的主要目标函数包括最大化期望回报和训练过程中的熵这解决了传统框架中存在的许多问题。使用双 Q 网络和自动温度调节来应对高样本复杂性、脆弱的收敛性和复杂的超参数调整问题。SAC 在连续控制任务领域中已经证明非常有效。关于动作分布和熵的结果表明算法在早期训练阶段偏向于探索和多样化的动作采样。随着智能体的训练它趋向于一个更具体的策略减少了熵并达到了最优动作。因此它已被有效地应用于生物工程中的各种领域如机器人控制、药物发现和药物传递。未来的实现应着重于将该框架扩展到更复杂的任务并降低其计算复杂性。参考文献Lillicrap, T.P., Hunt, J.J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., Silver, D. 和 Wierstra, D. (2015)。使用深度强化学习进行连续控制。[在线] arXiv.org。可用链接arxiv.org/abs/1509.02971.Schulman, J., Wolski, F., Dhariwal, P., Radford, A. 和 Klimov, O. (2017)。邻近策略优化算法。[在线] arXiv.org。可用链接arxiv.org/abs/1707.06347.Haarnoja, T., Zhou, A., Abbeel, P. 和 Levine, S. (2018)。软演员-评论家带有随机演员的离策略最大熵深度强化学习。arXiv:1801.01290 [cs, stat]。[在线] 可用链接arxiv.org/abs/1801.01290.Du, H., Li, Z., Niyato, D., Yu, R., Xiong, Z., Xuemin, Shen 和 Dong In Kim (2023)。在无线边缘网络中启用 AI 生成内容AIGC服务。doi: https://doi.org/10.48550/arxiv.2301.03220.Svensson, H.G., Tyrchan, C., Engkvist, O. 和 Morteza Haghir Chehreghani (2024)。利用强化学习进行新药设计。机器学习, 113(7), 第 4811–4843 页。doi: https://doi.org/10.1007/s10994-024-06519-w.quantumiracle (2019)。GitHub — quantumiracle/Popular-RL-Algorithms: PyTorch 实现的软演员-评论家SAC双延迟 DDPGTD3演员-评论家AC/A2C邻近策略优化PPOQT-OptPointNet…[在线] GitHub。可用链接github.com/quantumiracle/Popular-RL-Algorithms[访问时间2024 年 12 月 12 日]。MrSyee (2019).GitHub — MrSyee/pg-is-all-you-need: 策略梯度就是你所需要的一切一步一步教你掌握著名的 PG 方法。[在线] GitHub. 可用链接github.com/MrSyee/pg-is-all-you-need?tabreadme-ov-file.https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b852f22c4c64850f1155b42ffaf02eb7.png