PyTorch强化学习实战(29)——深入解析强化学习中的探索策略
PyTorch强化学习实战29——深入解析强化学习中的探索策略0. 前言1. 探索策略的重要性2. -贪婪方法的问题3. 高效探索策略3.1 噪声网络3.2 基于计数的方法3.3 基于预测的方法4. MountainCar 环境4.1 DQN -greedy4.2 DQN 噪声网络4.3 DQN 状态计数4.4 近端策略优化方法4.5 PPO 噪声网络4.6 PPO 状态计数4.7 PPO 网络蒸馏5. Atari 环境5.1 DQN -贪婪5.2 DQN 噪声网络5.3 PPO小结系列链接0. 前言在本节中我们将讨论强化学习 (Reinforcement Learning, RL) 中的探索问题。探索/利用困境是RL的基础性问题对高效学习至关重要。然而在之前的学习中我们使用的是相对简单的环境探索方法——大多数情况下采用-贪婪动作选择。现在我们将深入RL的探索子领域因为更复杂的环境可能需要比-贪婪策略更高效的探索策略。我们将通过实现所述方法来解决一个看似简单但仍具挑战性的问题——MountainCar环境。这将帮助我们更好地理解这些方法的原理、实现方式及其行为特征。此后我们将尝试解决Atari游戏环境中的更具挑战性的问题。1. 探索策略的重要性本专栏已经讨论了许多环境和方法在几乎每一节中都提到了探索的重要性。我们已经对有效环境探索的重要性有所理解本节我们将重点阐述其主要原因。在此之前可能有必要先达成一致定义一下“有效探索”这个术语。在理论强化学习 (Reinforcement Learning, RL) 中存在严首先需要明确有效探索的定义。理论RL中对此有严格界定但其高层理念简单直观当智能体不再重复访问已熟悉的环境状态而是积极寻找新经验时探索就是有效的。正如我们多次讨论的探索必须与利用相平衡——后者指运用现有知识以最高效方式获取最佳奖励。接下来我们快速了解为何有效探索如此关键。首先良好的环境探索对学习优质策略具有根本性影响。若奖励稀疏且智能体仅在特定罕见条件下获得良好奖励可能多轮探索才偶遇一次正向回报。此时学习过程能否有效且全面地探索环境将直接决定能否获得更多可供学习的高奖励样本。其次在RL实际应用中经常出现这种情况缺乏良好探索可能导致智能体永远无法获得正向奖励使得所有学习努力付诸东流。如果没有优质样本可供学习即使采用最高效的RL方法智能体也只能学会无法获得好奖励的结论。我们周围的许多实际问题皆属此类。例如MountainCar环境——其动态规则简单但因奖励稀疏而颇具挑战性。另一方面即使奖励不稀疏有效探索也能通过提升收敛性和训练稳定性来加速训练进程。这是因为来自环境的样本变得更加多样减少了与环境交互的需求。因此RL方法有望在更短时间内学到更优策略。2. -贪婪方法的问题在本专栏中我们使用了-贪婪探索策略这作为一种简单但尚可接受的环境探索方法。其核心思想是以 的概率采取随机动作否则(1 − 1-1−概率)根据策略贪婪的选择动作。通过调整超参数0 ≤ ≤ 1 0 ≤ ≤ 10≤≤1我们可以改变探索的比例。这种方法被应用于本专栏中大多数基于价值的方法。类似思路也见于基于策略的方法——当网络返回动作概率分布时为避免网络对特定动作过度确信(对某个动作返回概率1其他动作概率0)我们添加了熵损失项(即概率分布的熵乘以某个超参数)。在训练初期熵损失通过正则化概率分布促使网络采取随机动作但在后期阶段当环境探索充分且奖励较高时策略梯度会主导熵正则化作用。不过该超参数需要精心调优才能正常工作。高层面上看这两种方法本质相同通过引入动作随机性来探索环境。但最新研究表明这种方法远非最佳方法在基于价值的迭代方法中轨迹中随机动作的引入会导致Q值估计出现偏差。贝尔曼方程假设下一状态的Q值来自最大Q值动作即轨迹剩余部分应遵循最优行为。但-贪婪策略可能采取非最优的随机动作这些轨迹片段会在回放缓存中存留很长时间(直到 衰减且旧样本被清除)在此期间我们将学习到错误的Q值当轨迹中注入随机动作时策略每一步都在变化。以 值或熵损失系数定义的频率我们的轨迹不断在随机策略与当前策略间切换。当需要多步才能到达环境状态空间中某些孤立区域时这种切换可能导致状态空间覆盖不足为说明最后一个问题我们参考Strehl和Littman论文《An analysis of model-based interval estimation for Markov decision processes》中的一个简单示例“River Swim”该环境模拟智能体渡河过程包含六个状态和两个动作(左/右)。状态1和6代表河岸状态2至5代表水中位置。下图展示了前两个状态(1和2)的转移示意图在第一个状态(标有1的圆圈)中智能体站在河岸地面上。唯一可采取的动作是向右(以实线表示)这意味着进入河流并逆流游向状态2。但由于水流湍急从状态1执行向右动作的成功概率仅为60%(状态1指向状态2的实线)。另有40%的概率水流会将我们冲回状态1(状态1指向自身的实线)。在第二个状态(标有2的圆圈)中我们有两个动作向左(以连接状态2和1的虚线表示该动作总能成功因为水流会将我们冲回河岸)和向右(以虚线表示)即逆流游向状态3。与之前相同逆流游泳十分困难因此从状态2到达状态3的概率仅为35%(连接状态2和3的虚线)。有60%的概率向左动作会使我们停留在原地(连接状态2自身的虚线)。但有时尽管我们努力向右仍有5%的概率会意外被冲回状态1(连接状态2和1上方的虚线)。如前所述河流游泳环境共有六个状态但状态3、4和5的转移规则与状态2完全相同。最后一个状态6与状态1类似只有一个可用动作向左(即游回)。在下图中可以看到完整的转移示意图(其中向右动作转移用实线表示向左动作转移用虚线表示)就奖励机制而言智能体在状态1到5之间的转移仅能获得1单位的小额奖励但进入状态6将获得1000单位的极高奖励——这是对所有逆流游泳努力的补偿。尽管环境简单但其结构对-贪婪策略完全探索状态空间的能力构成了挑战。为验证这一点我们实现该环境的简易模拟(代码详见 riverswim.py)。模拟智能体始终采取随机动作 ( 1 11)模拟结果是各状态访问频次统计。单回合步数限制为10步(可通过命令行调整)实验结果如下$ python3 riverswim.py1:402:393:174:35:16:0上述输出中每行显示状态编号及其在模拟过程中的访问次数。使用默认命令行选项进行100步(10回合)模拟时智能体从未到达状态6仅访问状态5一次。增加回合数后情况略有改善但仍不理想$ python3 riverswim.py-n10001:4412:4523:934:125:26:0即使将模拟回合数增加10倍我们仍未访问状态6因此智能体完全不知道该处存在高额奖励。只有当模拟达到10000回合时我们才得以进入状态6但仅5次(占全部步数的0.05%)$ python3 riverswim.py-n100001:40562:45063:10954:2815:576:5因此即使采用最优的RL方法训练效率也难言理想。需要注意的是本节仅包含六个状态。试想若存在20或50个状态(这种情况并不罕见例如在Atari游戏中可能需要做出数百次决策才能触发特定事件)效率将会及其低下。我们也可以使用riverswim.py工具进行实验该工具支持修改随机种子、回合步数、总步数甚至环境中的状态数量。这个简单示例揭示了随机动作探索的缺陷通过随机行动智能体并未主动探索环境而是寄希望于随机动作能带来新经验——这并非总是最优策略。接下来我们探讨更高效的探索问题解决方案。3. 高效探索策略在本节中概述一系列高效探索策略方案。我们将探讨以下三种探索方法策略中的随机性在用于采样的策略中加入随机性这一方法的代表是噪声网络基于计数的方法记录智能体访问特定状态的次数。我们将检验两种方法直接状态计数和伪计数方法基于预测的方法通过从状态中预测某些信息并根据预测质量判断智能体对该状态的熟悉程度。为说明该方法我们将研究策略蒸馏方法——该方法在《Montezuma’s Revenge》等难探索型Atari游戏上展现了先进性能在具体实现这些方法之前让我们先深入理解其原理。3.1 噪声网络我们首先从已熟悉的方法开始。在讨论深度Q网络 (Deep Q-Network, DQN) 扩展时我们参考Hessel等人的研究介绍了噪声网络方法。其核心思想是在网络权重中添加高斯噪声并通过反向传播学习噪声参数(均值和方差)这与学习模型权重的方式相同。该简单方法在《Pong》游戏训练中取得了显著提升。高层面上看这与-贪婪方法似乎非常相似但Fortunato等人指出了本质区别随机性的应用方式不同。-贪婪将随机性添加到动作选择中而噪声网络将随机性注入网络本身(靠近输出的若干全连接层)这意味着向当前策略添加了随机性。此外噪声参数可在训练过程中学习因此训练过程可根据需要增减策略随机性。根据论文所述噪声层需要定期采样噪声这意味着训练样本并非由当前策略产生而是由策略集合生成。通过这种方式我们的探索变得具有导向性——因为添加到权重中的随机值会产生不同的策略。3.2 基于计数的方法这类方法基于一种直观思想优先访问尚未探索过的状态。在简单情况下(当状态空间不大且不同状态易于区分时)我们直接统计状态或状态动作的出现次数并倾向于访问计数较低的状态。这可以通过额外奖励来实现——该奖励并非来自环境而是基于状态访问计数。文献中称此类奖励为内在奖励而环境提供的奖励则称为外在奖励。一种常见的奖励构建方式是使用赌博机 (bandits) 探索方法r t c 1 N ~ ( s ) r_t c\frac 1{\sqrt {\tilde N(s)}}rt​cN~(s)​1​其中N ~ ( s ) \tilde N(s)N~(s)表示状态s的访问计数或伪计数值c cc定义了内在奖励的权重。如果状态数量较少比如在表格学习的情况下我们可以直接对它们计数。在更复杂的情况下(状态过多时)需要引入状态变换机制如哈希函数或状态嵌入。对于伪计数方法N ~ ( s ) \tilde N(s)N~(s)可分解为密度函数和总访问状态数N ~ ( s ) ρ ( x ) n ( x ) \tilde N(s) ρ(x)n(x)N~(s)ρ(x)n(x)其中ρ ( x ) ρ(x)ρ(x)是表示状态x xx似然度的密度函数由神经网络近似。引入内在奖励的特殊情况称为好奇心驱动探索——完全忽略环境奖励训练和探索100%由智能体经验的新奇性驱动。令人惊讶的是这种方法不仅能高效发现环境中的新状态还能学习到相当优秀的策略。3.3 基于预测的方法第三类探索方法基于另一种思路通过环境数据预测某些信息。若智能体能做出准确预测说明已充分熟悉当前情境无需继续探索。但当异常情况发生且预测严重偏离时可能意味着需要关注当前状态。虽然存在多种实现方式但本节将重点讨论Burda等人2018年在论文《Exploration by random network distillation》中提出的方法。作者在Atari的难探索类游戏中取得了先进性能。该方法相当简洁我们添加内在奖励其计算基于一个神经网络(正在训练)预测另一个随机初始化(未训练)神经网络输出的能力。两个网络的输入都是当前观测值内在奖励与预测的均方误差 (Mean Squared Error,MSE) 成正比。4. MountainCar 环境本节将在一个简单但仍具挑战性的环境中实现并比较不同探索方法的有效性。该环境属于经典强化学习 (Reinforcement Learning, RL) 问题与CartPole问题非常相似。但与CartPole不同的是MountainCar问题从探索角度来看颇具挑战性。该问题的示意图如下图所示一辆小车从山谷底部出发可通过左右移动尝试到达右侧山顶。此处的难点在于环境动力学和动作空间的特殊设计。要到达山顶需要以特定方式施加动作使小车来回摆动以加速。换句话说智能体需要连续多个时间步施加动作才能使小车加速并最终抵达山顶。显然这种动作协调很难通过随机动作实现因此从探索角度来看该问题非常困难与River Swim示例非常相似。在Gymnasium中这个环境的名称是MountainCar-v0具有极其简单的观测和动作空间。观测值仅包含两个数字第一个表示小车的水平位置第二个表示小车速度。动作为0、1或2其中0表示向左推车1表示不施力2表示向右推车。以下是在Python REPL中的简单演示importgymnasium as gymegym.make(MountainCar-v0)e.reset()(array([-0.47614264,0.],dtypefloat32),{})e.observation_space Box([-1.2 -0.07],[0.60.07],(2,), float32)e.action_space Discrete(3)e.step(0)(array([-0.47749737, -0.00135472],dtypefloat32), -1.0, False, False,{})e.step(0)(array([-0.48019674, -0.00269938],dtypefloat32), -1.0, False, False,{})e.step(0)(array([-0.4842207 , -0.00402398],dtypefloat32), -1.0, False, False,{})可以看到每一步我们都获得-1的奖励因此智能体需要学会尽快到达目标以获得尽可能少的总负奖励。默认情况下步数限制为200步如果我们未能到达目标(这种情况经常发生)总奖励将为-200。4.1 DQN -greedy我们将使用的第一个方法是传统的-贪婪探索方法其实现位于源文件 mcar_dqn.py 中。该程序在深度Q网络 (Deep Q-Network, DQN) 方法基础上实现了多种探索策略允许通过-p命令行选项进行选择。要启动标准-贪婪方法需要传递选项-p egreedy。在训练过程中我们会在前10 5 10^5105个训练步数中将 从1.0线性衰减至0.02。训练速度相当快——完成10 5 10^5105个训练步数仅需两到三分钟。但从下图来看显然在这10 5 10^5105步(即500个回合)中我们从未到达过目标状态。结果并不理想因为 值已经衰减完毕意味着未来将不再进行探索。我们仍然执行的2%随机动作远远不够因为到达山顶需要数十个协调步骤(MountainCar环境中最优策略的总奖励约为-80)。即使继续训练数百万步从环境中获得的也只会是耗时200步、总奖励为-200的回合。这再次证明了探索的重要性。无论采用何种训练方法缺乏适当探索都可能导致训练失败。那么该如何解决若坚持使用-贪婪策略唯一选择是延长探索时间(通过调整衰减速度)。我们可以尝试-p egreedy模式的超参数调整但本节采取了极端方案实现了-p egreedy-long超参数集。在此模式下我们保持 1.0 1.01.0直到至少出现一个总奖励优于-200的回合。达到该条件后我们开始正常训练在后续10 6 10^6106帧中将 从1.0衰减至0.02。由于初始探索阶段不进行训练速度通常可提升5-10倍。启动该模式的命令为$ python mcar_dqn.py-nt1-pegreedy-long但即使改进-贪婪策略由于环境复杂性仍无法解决问题。实验表明使用该版本运行了五小时经过50万个回合后仍未遇到任何成功到达目标的样本最终只能放弃。当然我们也可以尝试更长的训练时间。4.2 DQN 噪声网络要将噪声网络方法应用于MountainCar问题只需将网络中的两个全连接层之一替换为NoisyLinear类架构将变为如下形式噪声线性层 (NoisyLinear) 类与噪声网络一节中的版本的唯一区别是当前版本具有显式的sample_noise()方法来更新噪声张量因此需要在每个训练迭代中调用该方法否则训练过程中噪声将保持恒定。这一修改是为后续基于策略方法的实验做准备因为这些方法要求噪声在相对较长的轨迹周期内保持稳定。无论如何修改很简单——我们只需定期调用该方法。在DQN方法中每个训练迭代都会调用该方法。与噪声网络一节相同NoisyLinear的实现取自TorchRL库代码保持不变。要激活噪声网络需使用-p noisynet命令行参数运行训练。如图所示训练过程未能达到代码要求的-130平均测试奖励但仅经过7000次训练步骤(20分钟训练)我们就发现了目标状态——与-贪婪方法经过5小时试错仍未找到任何目标状态相比这已是重大进展。从测试步骤图可以看到部分测试步骤少于100步这已非常接近最优策略。但这些成功案例出现的频率还不足以将平均测试奖励推至-130以下。4.3 DQN 状态计数我们将应用于DQN方法的最后一种探索技术是基于状态计数的。由于状态空间仅包含两个浮点值我们将通过对观测值保留三位小数进行离散化处理这既能提供区分不同状态的足够精度又能将相似状态分组。对于每个独立状态我们将记录其出现次数并据此给予智能体额外奖励。对于异策略方法而言在训练过程中修改奖励可能并非最佳方案但我们仍将检验其效果。首先我们通过环境包装器来维护计数器并计算内在奖励值。包装器代码位于 common.py 模块中。(1)首先查看构造函数classPseudoCountRewardWrapper(gym.Wrapper):def__init__(self,env:gym.Env,hash_functionlambdao:o,reward_scale:float1.0):super(PseudoCountRewardWrapper,self).__init__(env)self.hash_functionhash_function self.reward_scalereward_scale self.countscollections.Counter()在构造函数中我们接收待包装的环境、可选的观测值哈希函数以及内在奖励的缩放系数。同时创建计数器容器用于映射哈希状态到其出现次数。(2)然后我们定义辅助函数def_count_observation(self,obs)-float:hself.hash_function(obs)self.counts[h]1returnnp.sqrt(1/self.counts[h])此函数将计算状态的内在奖励值。它对观察进行哈希更新计数器并使用公式计算奖励。(3)包装器的最后一个方法负责环境步进处理defstep(self,action):obs,reward,done,is_tr,infoself.env.step(action)extra_rewardself._count_observation(obs)returnobs,rewardself.reward_scale*extra_reward,done,is_tr,info此处调用辅助函数获取奖励并返回外在奖励与内在奖励之和。(4)应用包装器时需要传递哈希函数defcounts_hash(obs:np.ndarray):robs.tolist()returntuple(map(lambdav:round(v,3),r))三位小数可能过于精细所以我们可以尝试使用不同的方式对状态进行哈希。启动训练需向程序传递-p counts参数。下图显示了训练和测试奖励图表。由于训练环境被PseudoCountReward包装器封装训练期间的奖励值会高于测试值。如图所示使用该方法我们未能达到-130的平均测试奖励但已非常接近该值。仅用10分钟就发现了目标状态。4.4 近端策略优化方法接下来我们在MountainCar问题上采用同策略方法——近端策略优化 (Proximal Policy Optimization, PPO) 。选择该方法的动机如下首先正如在DQN 噪声网络的示例中看到的当优质样本稀少时深度Q网络 (Deep Q-Network, DQN) 难以快速适应。这可以通过增大回放缓存容量并转向优先缓存来解决或者我们可以尝试同策略方法——它能根据获得的经验立即调整策略。选择这种方法的另一个原因是训练过程中对奖励的修改。基于计数的探索和策略蒸馏引入了内在奖励成分这可能会随时间变化。基于价值的方法对底层奖励的修改可能很敏感因为它们本质上需要在训练过程中重新学习价值。同策略方法则不应存在此问题因为奖励增加仅会在策略梯度方面更强调高奖励样本。为实现该方法我们在mcar_ppo.py文件中实现了PPO与多种探索策略的结合代码与PPO一节差异不大。要启动未添加额外探索调整的标准PPO应运行命令python mcar_ppo.py -n t1 -p ppo。该版本未专门进行探索——纯粹依赖训练初期的随机权重初始化。需要注意的是PPO是属于策略梯度方法方法通过限制新旧策略间的KL散度来避免剧烈的策略更新。我们的网络有两个输出头演员网络 (actor) 和评论家网络 (critic)。演员网络返回动作的概率分布(即策略)而评论员估计状态的价值。评论家使用MSE损失训练而演员由PPO替代目标驱动。除了这两个损失外我们还通过超参数β ββ缩放熵损失来正则化策略。PPO网络结构如下在三小时后停止了训练因为未显示任何改进。目标状态在1.5小时和3万个回合后被发现。由于PPO结果并不突出接下来我们尝试通过额外探索技巧进行扩展。4.5 PPO 噪声网络与DQN方法类似我们可以将噪声网络探索方法应用于PPO。为此需要将演员网络的输出层替换为NoisyLinear层。仅需修改演员网络因为我们希望仅向策略注入噪声而不影响价值估计。应用噪声网络存在一个细微差别随机噪声的采样时机。在首次接触噪声网络时噪声是在NoisyLinear层每次forward()传递时采样的。根据原始研究论文这对异策略方法可行但对同策略方法需要不同处理。实际上当进行同策略训练时我们获取当前策略产生的训练样本并计算策略梯度该梯度应推动策略改进。噪声网络的目标是注入随机性但正如我们讨论的我们更倾向于定向探索而非每步后随机改变策略。考虑到这一点NoisyLinear层中的随机成分不需要在每次forward()后更新而应大幅降低频率。在本节中我们在每个PPO批次(2048次状态转移)后重新采样噪声。像之前一样对PPO 噪声网络训练3小时。但这次目标状态在1.8万个回合后就被发现此外根据训练步数统计训练过程曾数次以最优方式驱动小车(步数少于100次)。但这些成功并未最终形成最优策略。4.6 PPO 状态计数在这种情况下我们为PPO方法实现了完全相同的基于计数的探索策略(采用三位小数哈希处理)可通过向训练过程传递-p counts参数来触发。实验表明该方法能够在1.5小时内解决环境问题(获得高于-130的平均奖励)共需要6.1万个回合。训练在2.3万个回合后发现了目标状态。随后又经过4万个回合的优化最终将策略优化至最佳步数。4.7 PPO 网络蒸馏接下来实现Burda等人提出的网络蒸馏方法。该方法引入了两个额外的神经网络两者都需要像价值头那样将观测值映射为一个数值区别在于使用方式第一个网络随机初始化并保持未训练状态(作为参考网络)第二个网络通过最小化与第一个网络的MSE损失进行训练。此外两个网络输出的绝对差值被用作内在奖励成分。其核心思想是智能体对某个状态的探索越充分第二个(已训练)网络对第一个(未训练)网络输出的预测就越准确这将导致添加到总奖励中的内在奖励减少从而降低分配给样本的策略梯度。论文作者建议训练独立的价值头来分别预测内在和外在奖励成分但本节中为保持简洁采用与基于计数的探索方法相同的方式——在包装器中直接合并两种奖励这将代码修改量降至最低。关于额外网络架构我们进行了小型实验并尝试了多种架构组合。最佳结果来自参考网络采用三层结构而训练网络仅使用单层的配置这有助于防止训练网络过拟合(因为我们的观测空间不大)。两个网络实现在ppo.py模块的MountainCarNetDistillery类中classMountainCarNetDistillery(nn.Module):def__init__(self,obs_size:int,hid_size:int128):super(MountainCarNetDistillery,self).__init__()self.ref_netnn.Sequential(nn.Linear(obs_size,hid_size),nn.ReLU(),nn.Linear(hid_size,hid_size),nn.ReLU(),nn.Linear(hid_size,1),)self.ref_net.train(False)self.trn_netnn.Sequential(nn.Linear(obs_size,1),)defforward(self,x):returnself.ref_net(x),self.trn_net(x)defextra_reward(self,obs):r1,r2self.forward(torch.FloatTensor([obs]))return(r1-r2).abs().detach().numpy()[0][0]defloss(self,obs_t):r1_t,r2_tself.forward(obs_t)returnF.mse_loss(r2_t,r1_t).mean()除了返回两个神经网络输出的forward()方法外该类还包含两个辅助方法用于计算内在奖励和获取两个网络间损失的方法。要启动训练需向mcar_ppo.py程序传递-p distill参数。实验表明解决问题需要3.3万个回合这比噪声网络方法几乎减少了一半。与之前相同由于内在奖励成分的存在训练回合显示出更高的奖励值。在智能体发现目标状态之前所有状态都是单调且可预测的但一旦它掌握了在200步之前提前结束回合的方法损失就显著增长。可以看到配备探索扩展功能的DQN和PPO方法都能解决MountainCar环境。具体方法选择取决于实际需求但重要的是要了解可用的不同探索策略。5. Atari 环境虽然MountainCar环境是测试探索方法的快速实验平台接下来我们采用探索策略调整的DQN和PPO方法解决Atari游戏环境以检验更复杂环境下的表现。本节主要使用Seaquest游戏作为测试环境——该游戏中潜艇需要射击鱼类和敌方潜艇并营救潜水员。该游戏可以视为中等难度的探索问题为了持续游戏需要控制氧气水平。当氧气不足时潜艇必须上浮至水面补充氧气否则回合将在560步后结束最高得分仅为20分。但一旦智能体学会补充氧气游戏几乎可以无限继续获得1-10万的高分。令人惊讶的是传统探索方法很难发现这一点——训练通常会在560步后陷入停滞此时氧气耗尽导致潜艇死亡。Atari的不足之处在于每个实验至少需要半天训练时间来验证效果因此本节使用代码和超参数可能并非最优但可作进行实验的起点。和之前一样提供两个程序文件atari_dqn.py (实现带-贪婪和噪声网络探索的 DQN 方法)和 atari_ppo.py (实现带可选噪声网络和网络蒸馏方法的 PPO 方法)需使用命令行选项-p切换超参数配置。接下来我们查看代码运行的结果。5.1 DQN -贪婪与Atari上尝试的其他方法相比-贪婪策略表现最佳但在MountainCar实验中它得到了最差结果现实中这种情况经常发生。经过训练后该方法平均奖励达到18分最高奖励为25分。从步数统计图表来看仅有少数回合成功发现了获取氧气的方法因此若增加训练时间该方法有机会能够突破560步的限制。下图展示了平均奖励和步数的变化曲线5.2 DQN 噪声网络噪声网络与DQN结合的表现较差——训练6小时后仅获得6分奖励下图展示了相关曲线5.3 PPOPPO实验则表现更差所有组合(原始PPO、噪声网络和网络蒸馏)均未显示奖励提升平均奖励仅为4分。小结在本节中我们探讨了为何-贪婪探索在某些情况下并非最优选择并介绍了常用的更高效的探索策略。系列链接PyTorch强化学习实战1——强化学习Reinforcement LearningRL详解PyTorch强化学习实战2——强化学习环境库GymnasiumPyTorch强化学习实战3——Gymnasium API扩展功能PyTorch强化学习实战4——PyTorch基础PyTorch强化学习实战5——PyTorch Ignite 事件驱动机制与实践PyTorch强化学习实战6——交叉熵方法详解与实现PyTorch强化学习实战7——表格学习与贝尔曼方程PyTorch强化学习实战8——Q学习详解与实现PyTorch强化学习实战9——深度Q学习PyTorch强化学习实战10——强化学习高级组件PyTorch强化学习实战11——N步DQNN-step DQNPyTorch强化学习实战12——Double DQNDDQNPyTorch强化学习实战13——噪声网络NoisyNet-DQNPyTorch强化学习实战14——优先经验回放机制PyTorch强化学习实战15——Dueling DQNPyTorch强化学习实战16——Categorical DQNPyTorch强化学习实战17——强化学习训练加速PyTorch强化学习实战18——基于DQN处理股票交易问题PyTorch强化学习实战19——策略梯度法PyTorch强化学习实战20——优势演员-评论家Advantage Actor-Critic, A2CPyTorch强化学习实战21——异步优势演员-评论家Asynchronous Advantage Actor-Critic, A3CPyTorch强化学习实战22——将强化学习应用于TextWorld互动小说游戏PyTorch强化学习实战23——强化学习在网页导航中的应用PyTorch强化学习实战24——连续动作空间中的强化学习PyTorch强化学习实战25——深度确定性策略梯度DDPGPyTorch强化学习实战26——提升随机策略梯度稳定性PyTorch强化学习实战27——进化策略在强化学习中的应用PyTorch强化学习实战28——遗传算法在强化学习中的应用

相关新闻

多智能体系统实战指南:从单Agent瓶颈到协作模式与框架选型

多智能体系统实战指南:从单Agent瓶颈到协作模式与框架选型

这一两年大模型应用里最明显的一个变化,是很多人从“调一个大模型”转向“组一支Agent团队”。我自己的感受很直接:单Agent在处理简单问答时足够轻快,可一旦任务变成“检索资料—写方案—做实现—再自检”这种多步骤长链路,它就开…

2026/10/16 2:15:50 阅读更多 →
PLC设备之间、PLC与智能仪表之间数据通讯的几种方式(一)

PLC设备之间、PLC与智能仪表之间数据通讯的几种方式(一)

IGT-DSER智能网关模块支持西门子、罗克韦尔AB,以及三菱、欧姆龙、倍福等各种品牌的PLC之间通讯,支持Ethernet/IP(CIP)、Profinet(S7),以及FINS、MC等工业自动化常用协议,同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器…

2026/10/17 8:12:36 阅读更多 →
(Linux)信号与中断

(Linux)信号与中断

信号是操作系统发给进程的通知,用于处理突发事件,如用户中断或程序错误,控制进程行为。信号的产生不影响进程的运行,二者是异步的。 信号的产生与处理 基本概念 给进程产生信号的信号源非常多,主要有四种&#xff0c…

2026/10/16 2:15:50 阅读更多 →

最新新闻

连续分配存储管理:覆盖、交换与存储碎片深度解析

连续分配存储管理:覆盖、交换与存储碎片深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 10:22:02 阅读更多 →
QPixmap绘图实战:从基础绘制到双缓冲与高分屏适配

QPixmap绘图实战:从基础绘制到双缓冲与高分屏适配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 10:22:02 阅读更多 →
Edu NSW ACT Foundation 字体全解析:澳大利亚 NSW/ACT 州写字教学字体的设计、开源许可与 Fontsource 自托管实践

Edu NSW ACT Foundation 字体全解析:澳大利亚 NSW/ACT 州写字教学字体的设计、开源许可与 Fontsource 自托管实践

前端CLI开发工具 【免费下载链接】fontsource Self-host Open Source fonts in neatly bundled NPM packages. 项目地址: https://gitcode.com/gh_mirrors/fo/fontsource 点击查看 免费下载 Edu NSW ACT Foundation 是 Google Fonts "Foundation Fonts for Au…

2026/10/17 10:22:02 阅读更多 →
C语言手撸雅可比、高斯-赛德尔与SOR迭代法解线性方程组

C语言手撸雅可比、高斯-赛德尔与SOR迭代法解线性方程组

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 10:22:02 阅读更多 →
图像识别原理与商业落地:从卷积神经网络到工业质检实践

图像识别原理与商业落地:从卷积神经网络到工业质检实践

“图像识别的工作原理是什么?商业上如何使用它?”——这两个问题放在一起问,其实很聪明。因为只谈原理,容易飘在学术里;只谈商业,又容易变成空泛的“AI赋能”。我见过太多企业负责人拿着这个标题来做技术选…

2026/10/17 10:22:02 阅读更多 →
Superpowers 技能库指南:让 AI 编码助手稳定执行复杂任务

Superpowers 技能库指南:让 AI 编码助手稳定执行复杂任务

前阵子接手一个老项目,代码结构乱到让人想摔键盘,同事甩给我一个叫 Superpowers 的开源工具,说“装上它,至少能让你在 AI 编码助手上找回一点尊严”。我抱着试试看的心态折腾了两天,结果发现这东西确实像名字说的那样&…

2026/10/17 10:21:01 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →