PyTorch强化学习——PyTorch+Gym强化学习环境搭建

发布时间:2026/7/19 15:40:11
PyTorch强化学习——PyTorch+Gym强化学习环境搭建 1. 搭建PyTorch环境工欲善其事必先利其器。为了更专注于学习强化学习的思想而不必关注其底层的计算细节我们首先搭建相关深度学习环境主要包括Python以及PyTorch。Python更具体说使用Python3.7作为我们实现强化学习算法进行实战的编程语言。PyTorch是我们将要使用的主要深度学习框架PyTorch由Facebook AI Research基于Torch开发是主流的机器学习库之一。在PyTorch中使用张量 (Tensors) 代替了NumPy中的ndarray数据类型从而提供了更强大的灵活性和与GPU的兼容性。由于其强大的计算图特性和简单的上手难度使得PyTorch受到了广泛的欢迎并且它已被越来越多的科技巨头所采用。关于Python的安装和配置在此不再赘述。可选的由于深度学习中模型的训练需要大量时间因此通常使用GPU加速计算在安装PyTorch之前需要根据选用的 PyTorch 版本和显卡安装CUDA和cudnn关于CUDA和cudnn的安装和配置可以参考官方文档建议在安装之前根据自己的操作系统认真查看官方的安装文档可以避免踩不必要的坑。然后在 PyTorch 官方网页根据自己实际的环境进行相应的选择在Run this Command栏中将给出安装PyTorch的命令在此我们以Linux、pip、Python和CUDA10.2为例复制并在终端执行安装命令shell pip3 install torch torchvision torchaudio为了确认PyTorch已正确安装可以在Python shell中运行以下代码python import torch test torch.empty(2,2) print(test) tensor([[2.9685e-26, 4.5722e-41], [2.9685e-26, 4.5722e-41]])如果能够正确调用PyTorch相关函数表明PyTorch已正确安装。需要注意的是以上代码中使用torch.emty()中创建了一个尺寸为2 x 2的张量它是一个空矩阵这里的“空”并不意味着所有元素的值都为Null而是使用一些被认为是占位符的无意义浮点数需要在之后进行赋值这与NumPy中的空数组类似。2. OpenAI Gym简介与安装深度学习环境配置后我们继续安装OpenAI GymOpenAI Gym提供多种环境可以在其中开发和比较强化学习算法通过提供标准API用于学习算法和环境之间的通信。Gym事实上已经成为用于强化学习中的基准涵盖了许多功能全面且易于使用的环境。这类似于我们经常在监督学习中用作基准的数据集例如MNISTImagenet和Reuters新闻数据集。OpenAI是一家致力于建立安全的人工智能并确保其对人类有益的非营利性研究公司。OpenAI Gym是一个功能强大的开源工具包可用于各种强化学习模拟和任务包括从赛车到Atari游戏等多种类型Gym提供的完整环境列表可以参见官方网页。我们可以使用任何机器学习库包括PyTorchTensorFlow或Keras等训练智能体与OpenAI Gym环境进行交互。Gym的安装与其它标准第三方库一样可以通过pip命令方便的安装shell pip install gym安装完成后可以在命令行中使用以下代码来查看可用的gym环境python import gym print(gym.envs.registry.all()) dict_values([EnvSpec(Copy-v0), EnvSpec(RepeatCopy-v0), EnvSpec(ReversedAddition-v0), EnvSpec(ReversedAddition3-v0), EnvSpec(DuplicatedInput-v0), EnvSpec(Reverse-v0), EnvSpec(CartPole-v0), EnvSpec(CartPole-v1), EnvSpec(MountainCar-v0), EnvSpec(MountainCarContinuous-v0), EnvSpec(Pendulum-v0),...可以看到如果正确安装了Gym使用gym.envs.registry.all()可以返回Gym中所有可用的环境。3. 模拟 Atari 环境Atari环境中包含各种Atari电子游戏例如AlienAirRaidPong和Space Race等。接下来我们按照以下步骤安装模拟Atari环境要运行Atari环境需要在终端中运行以下命令安装Atari依赖项shell pip install gym[atari]安装Atari依赖项后我们可以使用Python导入Gym库来验证安装是否成功python import gym使用Gym可以通过使用环境名称作为参数调用make()方法创建环境实例。以创建SpaceInvaders环境的实例为例python env gym.make(SpaceInvaders-v0)重置SpaceInvaders环境可以看到reset()方法返回环境中的初始状态python env.reset() array([[[ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], ..., [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0]], ..., [[80, 89, 22], [80, 89, 22], [80, 89, 22], ..., [80, 89, 22], [80, 89, 22], [80, 89, 22]]], dtypeuint8)使用render方法渲染SpaceInvaders环境可以看到弹出的游戏窗口python env.render() True在以上游戏窗口中可以看到其中包含三个红色太空飞船表示飞船包含三条命。使用sample()方法可以随机选择智能体执行的动作step()方法使智能体根据给定参数执行相应动作。通常在强化学习中我们将使用复杂的智能体选择要执行的动作。在这里仅仅为了演示如何模拟环境以及智能体如何采取行动而不管结果如何。通过随机选择动作并执行所选择的动作python action env.action_space.sample() new_state, reward, is_done, info env.step(action)step()方法可以返回执行动作后的情况包括以下内容new_state对游戏环境新的观测值 (observation)在单智能体环境中也可以理解为新状态reward执行动作后在新状态下得到的相应奖励is_done用于指示游戏是否结束的标志,例如在SpaceInvaders环境中如果飞船三条命耗尽或所有外星敌人都被消失则为True否则为Falseinfo与环境有关的其他信息例如在SpaceInvaders环境中info中包含当前状态下飞船剩余生命的数量info通常用于程序的调试可以通过action_sapce查看智能体能够执行的动作数量即动作空间大小python print(env.action_space) Discrete(6)在SpaceInvaders环境中从0到5的动作分别代表不进行任何操作开火向上向右向左和向下这是飞船在游戏中可以做的所有动作。对环境的观察值new_state是一个形状为210 x 160 x 3的矩阵即游戏屏幕的每一帧都是大小为210 x 160的RGB图像python print(new_state.shape) (210, 160, 3)接下来我们打印is_done和info查看其具体内容python print(is_done) False print(info) {ale.lives: 3}然后继续渲染环境render()方法根据对环境的最新观察值来更新显示窗口可以看到游戏窗口中的内容有所改变但由于飞船只做了一个动作因此改变并不明显python env.render()为了使智能体执行更多动作我们接下来使用while循环python while not is_done: ... action env.action_space.sample() ... new_state, reward, is_done, info env.step(action) ... env.render() ... print(info) ... True {ale.lives: 3} True {ale.lives: 3} True ... {ale.lives: 1} True {ale.lives: 0}可以看到游戏的运行情况飞船和外星人都会不断移动和射击。最后在游戏结束时窗口如下所示在这场游戏中获取30分并且最终的生命值为0额外安装Atari依赖项的原因是由于其并不包含在gym环境中此外Box2dClassic controlMuJoCo和Robotics等环境也并不在gym环境中这些环境的安装与Atari的安装类似以Box2d环境为例在首次运行环境之前安装Box2d依赖项shell pip install gym[box2d]安装完成后我们就可以使用LunarLander环境如下所示python env gym.make(LunarLander-v2) env.reset() array([-1.2830734e-03, 1.4214842e00, -1.2998608e-01, 4.6951649e-01, 1.4936496e-03, 2.9443752e-02, 0.0000000e00, 0.0000000e00], dtypefloat32) env.render() True如果并不确定要模拟环境在make()方法中应使用的名称可以在官方环境列表中进行查找。该表除了给出用于调用环境的名称外还列出了游戏窗口画面矩阵的尺寸和可以采取的动作数量。4. 模拟 CartPole 环境为了加深对gym环境的了解本节我们将模拟另一个强化学习中的经典环境——CartPole。CartPole是一项经典的强化学习任务在CartPole环境中一根直立的杆置于推车的顶部。智能体在一个时间步中会将推车向左或向右移动1个单位其目的是平衡推车顶部的杆并防止其跌落。如果杆与垂直方向的夹角超过12度或者推车离原点的距离超过2.4个单位则我们认为杆已跌落。遇到以下任何情况之一我们可以认为一个回合/情节 (episode) 终止推车上的杆跌落时间步数达到200接下来我们在gym中模拟CartPole环境为了对CartPole环境有所了解我们首先导入gym库实例化CartPole-v0环境并打印其状态空间和动作空间python import gym env gym.make(CartPole-v0) print(env.observation_space) Box(4,) print(env.action_space) Discrete(2)可以看到CartPole-v0环境的状态空间以4维数组表示并且有2个可能的动作。 接下来重置环境将返回4个浮点数数组表示的初始状态python env.reset() array([ 0.0461389 , -0.0080376 , 0.03944101, 0.03537847])渲染环境可以看出弹出的游戏窗口python env.render() True接下来我们使用while循环使智能体执行尽可能多的随机动作python is_done False while not is_done: ... action env.action_space.sample() ... new_state, reward, is_done, info env.step(action) ... env.render() ... print(new_state) ... True [ 0.04970809 -0.0091745 0.03525649 0.06046739] True [ 0.0495246 -0.20478375 0.03646584 0.36406219] ...... True [-0.0470163 -1.19033894 0.21028888 2.08433865]我们在每个时间步中打印出当前状态数组中的包含4个浮点数可以在Gym的 GitHub Wiki 页面上找到关于这4个浮点数的更多信息这4个浮点数分别表示推车位置范围在区间[-2.4, 2.4]之内任何超出此范围的位置都会导致回合终止推车速度杆与垂直方向夹角小于-0.209(-12度)或大于0.209(12度)的值将导致回合终止杆端点处的速度动作的可能值为0和1分别对应于将推车向左和向右推动。在回合终止之前的每个时间步中智能体都能从环境中得到奖励1因此总奖励等于一个回合中的时间步总数。在代码执行过程中可以看到推车和杆都会移动并最终停止停止时游戏窗口如下所示由于向左或向右的动作是随机选择的因此一个回合仅持续几个时间步。我们也可以记录整个过程以便进行回顾。为了录制视频记录游戏过程我们首先需要安装ffmpeg对于Linux可以使用以下命令进行安装对于其他操作系统可以参考官方文档shell sudo apt-get install ffmpeg为了进行记录需要创建CartPole实例后使用Monitor对象记录游戏窗口中显示的内容并将其存储在指定目录中其余的步骤和以上过程完全一致python # monitor_gym.py import gym env gym.make(CartPole-v0) env.reset() video_dir ./cartpole_video env gym.wrappers.Monitor(env, video_dir) is_done False while not is_done: action env.action_space.sample() new_state, reward, is_done, info env.step(action) env.render()运行以上代码回合终止后我们可以看到在video_dir文件夹中包含了一个.mp4文件其中记录了一个回合的游戏过程。为了评估智能体的表现我们可以模拟多个回合计算每个回合的总奖励然后计算平均值。平均总奖励可以用于评估采取随机动作的智能体性能我们使用10000个回合在每个回合中我们通过累积每个时间步中的奖励来计算总奖励python # multi_episodes.py import gym env gym.make(CartPole-v0) n_episode 10000 total_rewards [] for e in range(n_episode): state env.reset() total_reward 0 is_done False while not is_done: action env.action_space.sample() state, reward, is_done, info env.step(action) total_reward reward total_rewards.append(total_reward) # 最后我们计算平均总奖励 print(Average total reward over {} episodes: {}.format(n_episode, sum(total_rewards) / n_episode))运行以上代码可以看到以下输出shell Average total reward over 10000 episodes: 22.1942可以看出采取随机动作的平均总奖励为22.25采取随机动作过于简单我们将在之后的学习中实现更加有效的算法策略。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。领取方式我会放在下面希望领取了的朋友不要忘了下方名片放心添加