机器学习(ML)(二十) — 强化学习探析
ML-Agents
强化学习(RL
)的挑战之一是创建环境。幸运的是,我们可以使用游戏引擎来实现它。这些引擎(例如Unity
、Godot
或Unreal Engine
)是为创建视频游戏而开发的工具包。它们非常适合创建环境:它们提供物理系统、2D/3D
渲染等。Unity ML-Agents Toolkit
是一个Unity
游戏引擎的插件,可以使用Unity
游戏引擎作为环境构建器来训练智能体(Agent
)。Unity ML-Agents Toolkit
提供了许多出色的预制环境。
深度强化学习中的好奇心是什么?要理解好奇心是什么,我们首先需要了解强化学习(RL
)的两个主要问题:
- 稀疏奖励问题:即大多数奖励不包含信息,因此被设置为
0
。强化学习(RL
)基于奖励假设,即每个目标都可以描述为奖励的最大化。因此,奖励充当强化学习(RL
)智能体的反馈;如果没有收到任何反馈,就无法判定执行的动作合不合适。 - 奖励函数是人为创建的;在每个环境中,都必须创建奖励函数。
创建一个智能体(Agent
)固有的奖励函数,即由智能体(Agent
)自身生成的奖励函数。智能体(Agent
)将充当自学者,因为它将是学生和自己的反馈大师。这种内在奖励机制被称为好奇心,因为这种奖励会促使智能体(Agent
)探索新奇/不熟悉的状态。为了实现这一点,智能体(Agent
)在探索新轨迹时将获得高额奖励。这种奖励的灵感来源于人类的行为方式。人类天生就有探索环境、发现新事物的内在欲望。计算这种内在奖励的方法有很多种。经典方法是将好奇心计算为智能体(Agent
)在给定当前状态和所采取的动作的情况下预测下一个状态的误差。
Actor-Critic
在基于策略的方法中,我们的目标是直接优化策略,而不使用价值函数。更准确地说,Reinforce
是基于策略的方法的一个子类,称为策略梯度方法。这个子类通过使用梯度上升估计最优策略的权重来直接优化策略。虽然Reinforce
效果很好。但是,由于使用了蒙特卡洛抽样来估计回报(使用整个回合来计算回报),因此在策略梯度预测中存在显著差异。策略梯度预测是收益增长最快的方向。换句话说,如何更新策略权重,以便有更高的概率采取良好收益的动作。Actor-Critic
方法,这是一种结合价值和策略的方法的混合架构,它通过减少方差来帮助稳定训练:控制智能体(Agent
)动作的Actor
(基于策略的方法);衡量所采取动作好坏的Critic
(基于价值的方法)。
在Reinforce
中,根据回报率的高低按比例增加轨迹中动作的概率。记作:
- 如果回报很高,就将提高(状态,动作)组合的概率。
- 如果回报很低,就将降低(状态,动作)组合的概率。
此回报
利用Actor-Critic
方法减少方差:减少强化算法的方差并更快更好地训练智能体(Agent
)的办法是利用基于策略和价值的方法的组合,即Actor-Critic
方法。要理解Actor-Critic
,想象一下你正在玩电子游戏。你可以和一个朋友一起玩,他会给你一些反馈。你是演员,你的朋友是评论家。一开始你不知道怎么玩,所以你随机尝试一些动作。评论家观察你的动作并提供反馈。通过这些反馈,您可以更新您的策略并更好地玩该游戏。另一方面,你的朋友(评论家)也会更新来提供反馈,以便下次反馈得更好。这就是Actor-Critic
背后的思想。学习两个函数近似:控制智能体如何采取动作的策略:
Actor-Critic
过程:正如所见,使用Actor-Critic
方法,有两个函数近似(两个神经网络)。在每个时间步Actor
和Critic
。我们的策略输入状态并输出动作。
评论家(Critic
)将该动作作为输入,并使用Q
值。
在环境中执行的动作
演员(Actor
)使用Q
值更新其策略参数。记作:Actor
)在给定新状态Critic
)会更新其价值参数。
我们可以使用Advantage
函数作为评论家(Critic
)代替动作值函数来进一步提高学习的稳定性。其思想是Advantage
函数计算某个动作相对于某个状态下其他动作的相对优势:与该状态下的平均值相比,在某个状态下采取该动作更好,它从状态-动作对中减去状态的平均值,记作
- 如果
:梯度就会被推向那个方向。 - 如果
,梯度就会被推向相反的方向。
实现Advantage
函数需要两个值函数TD
误差作为Advantage
函数的良好预测值。记作
多智能体强化学习
之前我们研究了单智能体的强化学习,但是实际我们处在一个多智能体的世界,智能体与智能体之间互动。因此,我们的目标是创建能够与多个智能体互动的智能体。多个智能体在同一个环境中共享和交互。例如,你可以想象一个仓库,其中多个机器人需要导航来装载和卸载包裹,或者一条有几辆自动驾驶汽车的道路。在这些示例中,我们有多个智能体在环境中与其他智能体进行交互。鉴于在多智能体系统中,智能体与其他智能体交互,我们可以拥有不同类型的环境:
- 合作环境:您的代理商需要最大化共同利益的地方。例如,在仓库中,机器人必须协作才能高效地装卸包裹。
- 竞争/对抗环境:在这种情况下,智能体希望通过最小化对手的利益来最大化自己的利益。例如,在一场网球比赛中,每个智能体都想击败另一个智能体。
- 对抗与合作混合:就像在
SoccerTwos
(一款2vs2
游戏)环境中一样,两个智能体是团队的一部分,他们需要相互合作并击败对手团队。
目前有2
种方案来设计多智能体系统:集中式和去中心化式:
- 集中式:在这个方案中,有一个收集智能体(
Agent
)经验的流程:经验缓冲区。通过利用经验缓冲区的经验来学习一个通用的策略。 - 去中心化式:在分散式学习中,每个智能体(
Agent
)都独立于其他智能体(Agent
)进行训练。而不是关心其他智能体正在做什么。好处是代理之间不共享任何信息,因此可以像训练单个智能体一样设计和训练。然而这种方式的缺点是它会使环境变得不稳定,因为底层的马尔可夫决策过程会随着其他智能体在环境中交互而随时间而变化。这对于许多无法在非平稳环境中达到全局最优的强化学习算法来说是个问题。
在去中心化方式中,独立对待所有智能体,而不考虑其他智能体的存在。在这种情况下,所有智能体都将其他智能体视为环境的一部分。这是一个非平稳环境条件,因此无法保证收敛。在集中式方法中,从所有智能体中学习到单一策略。以环境的当前状态作为输入,并以策略输出联合动作,该奖励是全局性的。
在对抗游戏中训练智能体非常复杂。一方面,需要找到一个训练有素的对手来与你的智能体对战。另一方面,如果找到了一个训练有素的对手,当对手太强大时,你的智能体将如何改进其策略?想象一下一个刚开始学习足球的孩子。与非常优秀的足球运动员比赛是毫无意义的,因为获胜或拿到球太难了。所以孩子会不断失败而没有时间学习好的策略。解决方法是自我对弈。在自我对弈中,智能体使用自己的先前副本(其策略)作为对手。这样,智能体将与同一级别的智能体对弈(具有挑战性但不会太难),有机会逐步改进其策略,然后随着对手变得更好而更新其策略。这是一种引导对手并逐步增加对手复杂性的方法。这与人类在竞争中学习的方式相同:开始与水平相当的对手进行训练,然后从中学习,当掌握了一些技能后,就可以与更强大的对手走得更远。
在对抗类游戏中,跟踪累积奖励并不总是一个有意义的指标:因为这个指标取决于对手的技能。使用ELO
评级系统(以Arpad Elo
命名),计算零和游戏中两名玩家之间的相对技能水平。零和博弈:一个智能体赢,另一个智能体输。这是一种数学表示,即每个参与者的效用收益或损失恰好与其他参与者的效用收益或损失相平衡。ElO
系统是与其他玩家的输赢和打平情况得出的。这意味着玩家的评级取决于对手的评级和对手的得分结果。球员的表现被视为一个服从正态分布的随机变量。
近端策略优化(PPO)
近端策略优化(PPO
)是一种通过避免策略更新过大来提高智能体训练稳定性的架构。这样做可以保证我们的策略更新不会太大,并且训练更加稳定。训练期间较小的策略更新更有可能收敛到最优解。策略更新步调过大,很容易生成糟糕的策略,并且需要很长时间,甚至没有恢复的可能。为此,我们需要使用当前策略和上一个策略之间的比率来衡量当前策略与上一个策略相比的变化率。将这个比率限制在一个范围内
回顾移一下,策略目标函数,PPO
的目标函数来约束策略的更新,该函数使用clip
将策略变化限制在一个小的范围内。旨在避免破坏性的大规模权重更新:
其中
- 如果
,则在状态 下的动作 在当前策略中比旧策略中更有可能发生。 - 如果
,则当前策略采取该动作的可能性小于旧策略。
因此,这个概率比是预测旧策略和当前策略之间差异的简单方法。裁剪智能体的目标函数中未裁剪的部分:这个比率可以替代在策略目标函数中使用的对数概率。
如果没有约束,当前策略中采取的动作比之前策略中采取的动作更有可能发生,这将导致显著的策略梯度下降,从而导致过度的策略更新。裁剪代理目标函数的裁剪部分,通过裁剪比率,确保不会有太大的策略更新,因为当前策略不能与旧策略有太大差别。为此,这里有2
个方法:
TRPO
(Trust Region Policy Optimization
)利用目标函数外的KL
散度约束来约束策略更新,但该方法实现起来比较复杂,计算时间较长。PPO
将目标函数中的裁剪概率比直接与其裁剪后的替代目标函数相加。
他的剪辑部分是
如上图所示,这里有6
种情况:
- 情况
1
、2
的概率比范围介于之间,在情况 1
中,具有积极优势:该动作优于该状态下所有动作的平均值。因此,我们应该激励当前策略增加在该状态下采取该动作的概率;在情况2
中,具有负面优势:该动作比该状态下所有动作的平均值更差。因此,我们应该降低当前策略在该状态下采取该动作的概率。 - 情况
3
、4
的概率比低于范围,如果概率比 低,则在该状态下采取该动作的概率比旧策略低。在情况 3
中,优势预测为正(),那么应该增加在该状态下采取该动作的概率;在情况 4
中,优势预测为负,为了提升该状态下采取该动作的概率。由于(因为在一条水平线上),所以不用更新权重。 - 情况
5
、6
:概率比高于范围,如果概率比高于 ,则当前策略中该状态下采取该动作的概率远高于上一个策略。在情况 5
中,优势为正,与上一个策略相比,在该状态下采取该行动的概率已经很高,由于(因为在一条水平线上),所以不用更新权重;在情况 6
中,优势为负,希望降低在该状态下采取该动作的概率。
使用未裁剪的目标部分来更新策略。当最小值是裁剪的目标部分时,这里不会更新策略权重,因为梯度将等于0
。因此,仅会在以下情况下更新策略:
- 概率比在
范围内的时候。 - 概率比超出了
范围,但是概率比小于 且 ,或概率比大于 且 。
你可能会想,为什么当最小值为截断比时,梯度为0
。当概率比被截断时,在这种情况下,导数将不是0
。PPO Actor-Critic
的最终裁剪替代了目标损失,它利用裁剪替代目标函数、价值损失函数和熵奖励的组合:
其中
Sample Factory
是最快的强化学习(RL
)库之一,专注于同步和异步策略梯度(PPO
)实现。Sample Factory
具有的相关特性:
- 高度优化的算法架构,实现学习的最大吞吐量。
- 支持同步和异步训练机制。
- 支持串行(单进程)模式,方便调试。
- 在基CPU和GPU加速的环境下均实现了最优性能。
- 支持单智能体和多智能体训练,自我对弈,同时支持在一个或多个GPU上同时训练多个策略。
- 支持
PBT
(Population-Based Training
)模型训练方法。 - 支持离散、连续、混合动作空间。
- 支持基于矢量、基于图像、字典观察空间。
- 通过解析动作/观察空间规范自动创建模型架构。支持自定义模型架构。
- 支持自定义环境导入工程。
- 详细的
WandB
和Tensorboard
摘要、自定义指标。 - 整合了多个示例(调整参数和训练模型)并与环境集成。
Sample Factory
工作原理,如下图所示:
Sample Factory
的工作原理是由多个执行工作者(rollout workers
)、推理工作者(inference workers
)和一个学习工作者(learner worker
)进程构成。工作者进程之间通过共享内存进行通信,从而降低了进程之间的通信成本。执行工作者(rollout workers
)与环境进行互动,并将观察结果发送给推理工作者(inference workers
)。推理工作者查询策略的指定版本,并将动作发送回执行工作者(rollout workers
)。经过k步之后,执行工作者(rollout workers
)会将经验轨迹发送给学习工作者(learner worker
),以便学习工作者(learner worker
)能够更新智能体的策略网络。
Sample Factory
中的Actor Critic
模型由3
个组件构成:
- 编码器(
encoder
):处理输入观察值(图像、矢量)并将其映射到矢量,这部分可以自定义。 - 核心(
core
):整合一个或多个编码器的向量,可以选择在基于内存的智能体中包含单层或多层LSTM/GRU
。 - 解码器(
decoder
):在计算策略和值输出之前,将附加层应用于模型核心(core
)的输出。
有模型的强化学习(MBRL)
有模型的强化学习(MBRL
)与无模型的强化学习仅在学习动态模型方面有所不同,但这对于决策的制定方式有着重大的影响。动态模型通常对环境转移动态进行建模,MBRL
定义:
- 有一个智能体反复尝试解决一个问题,积累状态和动作数据。
- 利用这些数据,智能体可以创建一个结构化的学习工具,即动态模型,用来推理真实环境。
- 通过动态模型,智能体可以通过预测接下来采取的动作。
- 通过这些动作,智能体可以收集更多数据,改进所述模型,并且改进接下来的动作。
有模型的强化学习(MBRL
)采用智能体在环境交互中的框架,学习环境模型,然后利用该模型进行决策。具体来说,智能体在转换函数MDP
)中执行,并在每一步中返回奖励MPC
),使用学习到的动态模型,它从一组从均匀分布抽样的动作