强化学习锦标赛:DDPG、SAC、PPO、I2A、决策变换器 原文towardsdatascience.com/the-tournament-of-reinforcement-learning-ddpg-sac-ppo-i2a-decision-transformer-6c1e42f394f0?sourcecollection_archive---------6-----------------------#2024-08-23训练仿真类人机器人进行对抗使用五篇新的强化学习论文https://medium.com/almond.maj?sourcepost_page---byline--6c1e42f394f0--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--6c1e42f394f0-------------------------------- Anand Majmudar·发布于Towards Data Science ·阅读时间 13 分钟·2024 年 8 月 23 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b2543b4652d2b4021438fd08240435f9.png由 GPT-4 生成最近我想起了旧电视节目《机器人战斗》Battlebots并且想为它加上一些自己的特色。因此我训练了仿真类人机器人通过五篇新的强化学习论文让它们进行对抗。阅读下文你将学习这五种强化学习算法的理论和数学看到我如何实现它们并见证它们一较高下决出冠军深度确定性策略梯度DDPG决策变换器软演员-评论家SAC带有近端策略优化PPO的想象增强智能体I2A设置仿真环境我使用了 Unity 机器学习代理模拟器并为每个机器人身体构建了 21 个执行器分布在 9 个关节上通过虚拟摄像头在其头部实现 10×10 的 RGB 视觉此外还配备了剑和盾。我随后编写了 C#代码定义了它们的奖励和物理交互。智能体可以通过三种主要方式获得奖励用剑击中对手‘击败’对手保持头部的 y 位置高于身体以鼓励它们站立起来比之前更接近对手以鼓励智能体收敛并进行对抗智能体在 1000 个时间步后重置并且我对环境进行了大规模并行化以进行训练。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/384f5e631a16dd1220b37f6485276dc9.png大规模并行化的训练环境我的截图然后是编写算法的时刻。为了理解我使用的算法了解什么是 Q 学习至关重要所以让我们来探究一下Q 学习(如果你已经熟悉可以跳过)在强化学习中我们让智能体采取行动以探索其环境并根据与目标的接近程度给予正向或负向奖励。智能体如何调整其决策标准以获得更好的奖励Q 学习提供了一种解决方案。在 Q 学习中我们追踪 Q 函数 Q(s,a)它追踪从状态 s_t 执行动作 a_t 后的期望回报。Q(s, a) R(s, a) γ * E[Q(s_t 1, a_t 1)] γ² * E[Q(s_t 2, a_t 2) …]其中 R(s,a)是当前状态和动作的奖励y 是折扣因子一个超参数E[]是期望值。如果我们正确地学习了这个 Q 函数我们就可以简单地选择返回最高 Q 值的动作。我们如何学习这个 Q 函数从回合的结束处开始在那里我们可以确定 Q 值就是我们当前的奖励我们可以使用递归来填充之前的 Q 值更新公式如下Q(s,a) ← (1 — α) Q(s,a) α * [r γ * max_a’ Q(s’,a’)]其中α是学习率r 是即时奖励γ是折扣因子权重参数s’是下一个状态max_a’ Q(s’,a’)是下一个状态下所有可能动作的最大 Q 值本质上我们的新 Q 值等于旧 Q 值加上当前奖励与下一个最大 Q 值之间差异的小部分百分比。现在当智能体想要选择一个动作时它们可以选择返回最大 Q 值期望奖励的动作。你可能会注意到一个潜在的问题我们在每个时间步长上评估每个可能的动作的 Q 函数。如果我们在离散空间中有有限的动作数这没有问题但在连续动作空间中无法高效地评估 Q 函数因为可能的动作数是无限的。这使得我们需要考虑第一个竞争算法DDPG深度确定性策略梯度DDPGDDPG 尝试以一种新颖的方式在连续动作空间中使用 Q 网络。创新 1演员和评论员我们不能直接使用 Q 网络来做决策但我们可以用它来训练另一个独立的决策函数。这就是演员-评论员设置演员是决定动作的策略评论员则基于这些动作来确定未来的期望奖励目标评论员Q_target(s,a) r γ * Q’(s’, μ’(s’))其中 r 是即时奖励γ是折扣因子s’是下一个状态μ’(s’)是目标策略网络对下一个状态的动作Q’是目标评论员网络目标演员相对于策略的期望回报的梯度≈ 1/N * Σ ∇a Q(s, a)|aμ(s) * ∇θ_μ μ(s)本质上如何通过 N 个样本衡量策略选择的动作的 Q 值相对于策略变化策略变化又与策略参数相关为了更新两者我们使用随机梯度上升更新其中学习率 * 当前 Q 和目标 Q 的 MSE 损失的梯度。请注意演员和评论家都被实现为神经网络。创新 2确定性动作策略我们的策略可以是确定性的为每个状态保证一个动作或随机性的根据概率分布为每个状态抽取一个动作。确定性动作策略有助于高效评估 Q 函数每个状态只有一个动作因此进行单次递归评估。那么如何在确定性策略下进行探索呢我们不会被困在一遍又一遍地执行相同的动作吗这种情况确实可能发生然而我们可以通过添加随机生成的噪声来增加智能体的探索性以鼓励探索有点像突变如何通过允许探索独特的遗传可能性来促进进化创新 3交互式环境中的批量学习我们还希望在每个观察到的时间步上获得更多收益它由状态、动作、奖励和下一状态组成因此我们可以存储之前的时间步数据元组并将其用于未来的训练这使我们能够离线使用批量学习即使用之前收集的数据而不是通过环境交互并且允许我们通过 GPU 并行化以提高训练速度。现在我们还拥有独立同分布的数据而不是我们通常得到的有偏的顺序数据在这种数据中一个数据点的值依赖于之前的数据点创新 4目标网络通常使用神经网络的 Q 学习过于不稳定且不容易收敛到最优解因为更新过于敏感/强大因此我们使用目标演员和评论家网络它们与环境互动并在训练过程中部分接近真实的演员和评论家但不是完全接近大因子目标 小因子新算法演练与代码初始化评论家、演员、目标评论家和目标演员、重放缓冲区对于视觉我在任何其他层之前使用 CNN这样视觉的最重要特征会被算法利用对于每一集观察状态选择并执行动作 mu 噪声获取奖励下一状态将 (s_t, a_t, r_t, s_(t1)) 存储在重放缓冲区中从缓冲区中随机抽取一个小批次更新 y_i reward_i gamma Q(s 给定 theta)递归评估更新评论家以最小化 L y_i — Q(s,a|theta)使用策略梯度 J 更新演员期望递归 Q 给定策略更新目标为大因子 * 目标 (1 — 大因子) * 实际[## Knights-of-Papers/src/DDPG/DDPG.py at main · AlmondGod/Knights-of-PapersDDPG、决策变换器、I2A 与 PPO、SAC 自我博弈模拟战斗类人形机器人……github.com软演员评论员SACDDPG 确实存在一些问题。特别是评论员更新包括贝尔曼方程Q(s,a) r max Q(s’a’)但作为 Q 网络近似器的神经网络会产生很多噪声噪声的最大值意味着我们过高估计因此我们对我们的策略过于乐观奖励了平庸的动作。众所周知DDPG 还需要广泛的超参数调整包括噪声添加并且除非其超参数在一个狭窄的范围内否则无法保证收敛到最优解。创新 1最大熵强化学习不再让演员纯粹地最大化奖励演员现在最大化奖励 熵为什么使用熵熵本质上是我们对某个结果的不确定性例如硬币的最大熵偏向硬币较少的熵硬币始终是正面时熵为 0展示公式。通过将熵作为最大化因子我们鼓励广泛探索从而提高对局部最优解的敏感性允许对高维空间进行更一致、稳定的探索为什么这比随机噪声更好。Alpha用于加权熵优先级的参数自动调整怎么调整创新 2两个 Q 函数这一变化旨在通过独立训练两个 Q 网络并在策略改进步骤中使用两个中的最小值来解决 Q 函数的贝尔曼过高估计偏差。算法运行与代码初始化演员2 个 Q 函数2 个目标 Q 函数回放缓冲区alpha重复直到收敛对于每个环境步骤从策略中采样动作观察下一个状态和奖励将s_t, a_t, r_t, s_t1存储在回放缓冲区对于每个更新步骤采样批次更新 Q 值计算目标 y 奖励加上策略的最小 Q 值 alpha 熵最小化 Q 预测 — y更新策略以最大化策略的 Q 值 alpha 奖励更新 alpha 以满足目标熵更新目标 Q 网络软更新目标使目标 大因子 * 目标 1 — 大因子 * 实际值[## Knights-of-Papers/src/SAC/SAC.py at main · AlmondGod/Knights-of-PapersDDPG、决策变换器、I2A 与 PPO 以及 SAC 自对弈于模拟战斗类人形……github.comI2A 与 PPO这里有两个算法附加算法层可以在任何算法之上工作近端策略优化PPO我们的方法不同于 DDPG 和 SAC我们的目标是一个可扩展、数据高效、具有鲁棒性收敛性的算法对超参数的定义不敏感。创新 1代理目标函数这个代理目标允许离策略训练因此我们可以使用更广泛的数据这对于现实世界场景尤其有利因为现有的数据集庞大。在讨论代理目标之前理解优势的概念至关重要。优势是在状态 s 执行行动 s 后的期望奖励与状态 s 的期望奖励之间的差异。实质上它量化了行动 a 相较于“平均”行动的好坏。我们将其估算为 A Q(a,s) — V(a)其中 Q 是行动价值在行动 a 后的期望回报V 是状态价值从当前状态出发的期望回报两者都通过学习获得现在代理目标是J(θ) Ê_t [ r_t(θ) Â_t ]其中J(θ) 是代理目标Ê_t […] 表示在有限样本批次上的经验平均值r_t(θ) π_θ(a_t|s_t) / π_θ_old(a_t|s_t) 是新策略下行动的似然度 / 旧策略下行动的似然度Â_t 是时间步 t 的估计优势这相当于量化新策略如何提高高回报行动的似然性并降低低回报行动的似然性。创新 2剪切目标函数这是另一种解决过大策略更新问题的方法从而实现更稳定的学习。L_CLIP(θ) E[ min( r(θ) * A, clip(r(θ), 1-ε, 1ε) * A ) ]剪切目标是实际代理目标和剪切比例在 1 — epsilon 与 1 epsilon 之间的代理目标的最小值基本上是未修改比例的信任区域。epsilon 通常为 ~0.1/0.2。它本质上选择剪切比例和正常比例中较为保守的那一个。实际的 PPO 目标L^{PPO}(θ) Ê_t [ L^{CLIP}(θ) — c_1 * L^{VF}(θ) c_2 * Sπ_θ ]其中L^{VF}(θ) (V_θ(s_t) — V^{target}_t)²Sπ_θ 是策略 π_θ 在状态 s_t 下的熵本质上我们优先考虑较高的熵、较低的价值函数和较高的剪切优势PPO 还使用小批量处理并交替进行数据训练。算法执行和代码每次迭代对于每个 N 个智能体运行策略 T 个时间步计算优势针对策略优化代理函数进行 K 次迭代并且小批量大小 M NT更新策略[## Knights-of-Papers/src/I2A-PPO/gpuI2APPO.py at main · AlmondGod/Knights-of-PapersDDPG、决策变换器、结合 PPO 的 I2A以及 SAC 自我对战在模拟战斗类人型机器人上的应用……github.com](https://github.com/AlmondGod/Knights-of-Papers/blob/main/src/I2A-PPO/gpuI2APPO.py?sourcepost_page-----6c1e42f394f0--------------------------------)想象增强智能体我们的目标是为任何其他算法创建一个额外的嵌入向量输入以提供关键的有价值信息并充当环境的“心理模型”创新想象向量想象向量使我们能够向代理的观察中添加一个额外的嵌入向量以编码多个“想象的未来运行”及其奖励评估目标是“看到未来”并“在行动前思考”。我们如何计算它我们使用一个学习到的环境逼近函数试图模拟环境这被称为基于模型的学习因为我们尝试学习环境的模型。我们将它与一个 rollout 策略配合使用rollout 策略通常是一个非常简单且执行速度快的策略通常是随机的用来决定行动从而“探索未来”。通过在 rollout 策略上运行环境逼近器我们可以探索未来的行动及其奖励然后找到一种方法将这些所有的想象未来的行动和奖励表示为一个向量。一个值得注意的缺点是正如你所预期的它增加了大量的训练工作并且需要更多的数据。结合的 I2A-PPO 算法流程与代码每次我们收集 PPO 的观察数据时初始化环境模型和 rollout 策略对于多个“想象的运行”从当前状态开始运行环境模型并使用 rollout 策略决策直到达到某个时间范围从而生成一个想象轨迹sar 序列想象编码器将这些想象轨迹转换成单一的输入嵌入以供实际的决策网络使用决策 Transformer我们在这里的目标是利用 Transformer 架构的优势来进行强化学习。通过决策 Transformer我们可以在稀疏/分散的奖励中识别出重要奖励享受更广泛的分布建模以获得更好的泛化和知识迁移并从预先获得的有限次次优数据中学习称为离线学习。对于决策 Transformer我们实际上是将强化学习视为序列建模问题。创新点 1Transformer如果你想真正理解 Transformer我推荐观看 Karpathy 从零构建 GPT-2 的视频。这里有一个关于 Transformer 的简要回顾适用于 DT我们有表示状态、动作、期望获得的未来奖励之和返回奖励以及时间步的 token 序列。我们的目标是现在输入一系列 token 并预测下一步的动作这将作为我们的策略。这些 token 都有键、值和查询我们通过复杂的网络将它们结合起来以表达各个元素之间的关系。然后我们将这些关系结合成一个“嵌入”向量用以编码输入之间的关系。这个过程被称为注意力机制Attention。请注意“因果自注意力掩码”确保嵌入只能与序列中之前的嵌入相关联因此我们不能使用未来的信息来预测未来而是使用过去的信息来预测未来因为我们的目标是预测下一步的动作。一旦我们获得了这个嵌入向量就将其通过神经网络层Karpathy 使用的类比是我们在这里‘推理 token 之间的关系’。这两者的结合通过 Attention 找到 tokens 之间的关系通过我们的神经网络层推理关系是 Transformers 的一种头部我们将其堆叠多次。在这些头部的末尾我们使用一个学习到的神经网络层将输出转换为我们的动作空间大小和要求。顺便说一下在推理时我们预定义回报以作为我们期望的总奖励。算法演示和代码对于 dataloader 中的(R,s,a,t)预测动作模型将 obs、视觉通过卷积网络层、rtg 和时间步长转换为唯一的嵌入并将时间步长嵌入添加到其他嵌入中所有三个输入都作为输入提供给 Transformer 层最后使用动作嵌入计算 MSElossa_pred-a**2对决策 Transformer 模型执行 SGD通过这个损失的梯度更新参数[## Knights-of-Papers/src/Decision-Transformer/DecisionTransformer.py 在主分支下·…DDPG、决策 Transformer、I2A 与 PPO以及 SAC 自对战模拟类人战斗机器人…github.com结果为了训练这些模型我将算法运行在 NVIDIA RTX 4090 上利用这些算法的 GPU 加速创新。感谢vast.ai以下是损失曲线DDPG 损失2000 个回合https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dac56145748bf3104d9f46fef457ddc0.pngMatplotlib 损失图表由我制作I2APPO 损失3500 个回合https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e3551e86cfeb767b73048b843d6f103e.pngMatplotlib 损失图表由我制作SAC 损失5000 个回合https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cb81f1216c1bbde245f0a961454a3976.pngMatplotlib 损失图表由我制作决策 Transformer 损失1600 个回合每 40 个回合记录一次损失https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2f1780c8ad215f4e2521a1f752613ae9.pngMatplotlib 损失图表由我制作通过比较算法的结果主观比较并根据训练时间加权我发现决策 Transformer 表现最好考虑到 DT 是专门为充分利用 GPU 而设计的这一点是有道理的。请观看我制作的视频查看算法的实际表现。模型学会了爬行并停止摔倒但仍有一段路要走才能成为专家级战斗者。改进的领域我深刻体会到了训练类人机器人有多么困难。我们在一个高维输入空间包括视觉 RGB 和执行器的位置/速度中操作同时还结合了一个极其高维的输出空间27 维连续空间。从一开始我最希望的只是它们能爬到彼此面前并碰触剑锋尽管即便如此也充满挑战。大多数训练运行甚至没有经历到触剑的高奖励因为光是走路本身就太难了。主要的改进维度就是简单地增加训练时间和使用的计算量。正如我们在现代 AI 革命中所见这些增加的计算量和数据趋势似乎没有上限最重要的是我学到了很多下次我会使用 NVIDIA 的技能嵌入或终身学习方法让机器人在学习对战之前先学会走路要查看我制作的展示创建这个项目过程的视频并看到机器人对战请查看下面的视频我尝试使用新的强化学习论文来让模拟机器人进行对战感谢你看到最后如果你对更多内容感兴趣可以在 Twitter 上找到我AlmondGodd