【强化学习RL入门】基础概念和框架介绍(一):Stable Baseline3和gym的下载

ops/2024/10/22 5:07:21/

前言

  • 相信各位深度学习炼丹师都或多或少听过近几年很火的强化学习的内容,强化学习作为新时代的产物,在人工智能领域异军突起,被视为深度学习(Deep Learning, DL)的“下一代”替代品。然而,在许多实际应用中,强化学习与深度学习并非替代关系,而是相互补充、相得益彰。二者的结合,为智能学习开启了新的纪元。
  • 那么我们今天就来看一看,强化学习RL究竟是什么,和尝试去配置当前主流的一个基础Pytorch的强化学习框架Stable Baseline3的环境。

1 强化学习RL

1-1介绍
  • 强化学习(Reinforcement Learning,简称RL)是一种机器学习方法,通过学习策略来达到某种目标。在强化学习中,智能体(agent)通过与环境(environment)的交互,从经验中学习并优化其行为,以获得最大的累积奖励(reward)。强化学习与监督学习不同,它不需要标注的输入输出对,而是通过与环境交互来学习。强化学习在许多领域都有应用,如游戏、机器人、自然语言处理等。
1-2 组成部分

请添加图片描述

  • 强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习如何做出决策的方法。它通常包括以下几个核心组成部分:
  1. 智能体(Agent):这是执行动作并学习策略的实体。智能体通过与环境的交互来学习最优策略,以最大化累积奖励。
  2. 环境(Environment):这是智能体与之交互的外部世界。环境提供状态信息,并基于智能体的动作给予奖励或惩罚。
  3. 状态(State):状态是环境的描述,智能体根据当前状态来决定下一步的行动。状态可以是离散的,也可以是连续的。
  4. 动作(Action):动作是智能体在特定状态下执行的操作。动作集定义了智能体可以执行的所有可能动作。
  5. 奖励(Reward):奖励是智能体执行某个动作后从环境中获得的即时反馈。奖励可以是正的、负的或零,它指导智能体学习哪些动作是有益的。
  6. 策略(Policy):策略定义了智能体在给定状态下应该采取的动作。策略可以是确定性的,也可以是随机的。
  7. 值函数(Value Function):值函数评估了在给定状态下遵循某个策略所能获得的期望累积奖励。值函数可以是状态值函数(评估单个状态的价值)或状态-动作值函数(评估在特定状态下执行特定动作的价值)。
  8. 模型(Model):模型是环境的数学表示,它描述了环境如何对智能体的动作做出响应。在一些强化学习算法中,模型是已知的,而在其他算法中,模型是未知的,智能体需要通过与环境交互来学习模型。
1-3 强化学习和深度学习的关系
  • 强化学习(Reinforcement Learning, RL)深度学习(Deep Learning, DL)机器学习领域中的两种重要方法,它们之间存在着密切的关系。
    • 强化学习是一种通过与环境交互来学习如何做出决策的方法,其核心思想是智能体通过与环境交互,根据环境反馈的奖励信号来学习最优策略。
    • 深度学习是一种通过神经网络来模拟人脑神经元结构和工作机制的方法,其核心思想是通过训练神经网络来学习数据的特征表示。
  • 强化学习和深度学习之间的关系主要体现在以下几个方面:
    1. 强化学习可以看作是深度学习的一种应用场景。深度学习可以用来训练强化学习中的智能体,使其能够更有效地学习最优策略。例如,在深度强化学习(Deep Reinforcement Learning, DRL)中,智能体使用深度神经网络来学习状态-动作值函数(Q函数)或策略函数,从而更有效地探索和利用环境。
    2. 强化学习可以解决深度学习中的过拟合问题深度学习在训练过程中容易出现过拟合现象,即模型在训练数据上表现良好,但在测试数据上表现不佳。而强化学习可以通过与环境交互来不断调整智能体的策略,从而避免过拟合现象的发生。
    3. 强化学习可以解决深度学习中的非平稳性问题深度学习在训练过程中需要使用大量的标注数据,而标注数据的获取往往需要花费大量的人力和物力。而强化学习可以通过与环境交互来不断获取新的数据,从而解决深度学习中的非平稳性问题。(不需要进行数据标注)
    4. 强化学习可以解决深度学习中的泛化性问题深度学习在训练过程中往往只能学习到训练数据中的特定特征,而难以泛化到其他场景中。而强化学习可以通过与环境交互来不断学习新的知识和技能,从而提高模型的泛化能力。
  • 总而言之,强化学习与深度学习的结合已经成为人工智能领域的一个重要趋势。这种结合不仅提升了深度学习模型的决策能力,也为强化学习带来了更强大的特征提取能力。随着算法的不断进步和应用的不断拓展,这种趋势将会在未来继续深化,并在更多领域发挥重要作用。

2 Stable Baseline3

2-1 介绍

请添加图片描述

  • Stable Baselines3 (SB3) 是一套基于PyTorch可靠的强化学习算法实现。它是 Stable Baselines 的下一个主要版本,旨在提供更稳定、更高效和更易于使用的强化学习工具。SB3 提供了多种强化学习算法,包括 DQN、PPO、A2C 等,以及用于训练和评估这些算法的工具和库。
  • Stable Baselines3 官方github仓库
  • Stable Baselines3文档说明
前置安装条件Pytorch和虚拟环境配置
  • 需要注意的是Stable-Baselines3需要python 3.8+PyTorch >= 1.13
    • 这里我们同样推荐使用Anaconda进行虚拟环境的配置(windows用户强烈推荐)
  • 我们使用conda创建一个基础的python=3.11的环境(一般基本上不是使用38就是311)
conda create -n RL python=3.11
  • 然后我们需要安装pytorch,Pytorch最新版官网下载,直接找到最新版请添加图片描述

  • 请务必记得下载在虚拟环境内(activate RL进行虚拟环境的激活)

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

请添加图片描述

  • 现在cuda这些有pypi包直接安装到虚拟环境,安torch时候会直接安装,就不需要额外安装了(狂喜)
  • 安装好后,我们直接上大法测试请添加图片描述
Stable Baseline3 安装
  • 很简单还是在虚拟环境中安装:
pip install stable-baselines3
  • 下载后可以正常被导入请添加图片描述

3 Gymnasium

3-1 介绍

请添加图片描述

  • Gymnasium是一个开源的 Python 库,用于开发和研究强化学习算法。它提供了一个标准的 API,用于创建和交互各种环境,这些环境可以模拟各种任务和场景,如游戏、机器人控制、资源管理等。
  • Gymnasium官网资源
  • 安装stable baseline的时候会默认帮你下载,如下请添加图片描述

4 入门-第一个程序

4-1 上手
  • 我们需要安装一些基础的控件帮助我们运行第一个代码
    • Pygame是一个开源的 Python 库,用于开发 2D 游戏。它提供了丰富的功能,包括图形、声音、事件处理等,使得开发者可以轻松地创建游戏。Pygame 是基于 SDL(Simple DirectMedia Layer)库构建的,但提供了一个更简单、更易于使用的接口。
pip install pygame
  • 然后我们运行一下官方提供的入门实例程序
import gymnasium as gym # 导入 Gym 库,用于创建和操作环境from stable_baselines3 import A2C # 导入 Stable Baselines 3 库中的 A2C 算法# 创建一个 CartPole-v1 环境,并设置渲染模式为 "rgb_array",这样可以得到环境的 RGB 图像数据
env = gym.make("CartPole-v1", render_mode="rgb_array")# 创建一个 A2C 模型,使用 MlpPolicy 作为策略网络,并传入环境 env。verbose=1 表示在训练过程中会输出一些信息
model = A2C("MlpPolicy", env, verbose=1)# 使用模型学习 10,000 个时间步长。这里的时间步长是指环境交互的次数
model.learn(total_timesteps=10_000)# 获取模型训练时使用的环境,这里是一个向量化环境(VecEnv)
vec_env = model.get_env()# 重置环境,得到初始观察值 obs
obs = vec_env.reset()for i in range(1000): # 进行 1000 次环境交互
# 使用模型预测动作,deterministic=True 表示使用确定性策略action, _state = model.predict(obs, deterministic=True)# 在环境中执行动作,得到新的观察值、奖励、是否完成和额外信息obs, reward, done, info = vec_env.step(action)# 渲染环境,以人类可读的格式显示vec_env.render("human")# 如果环境完成(例如,小车掉落或超出边界),则重置环境# VecEnv resets automaticallyif done:obs = vec_env.reset()
  • 上述代码主要是训练一个 A2C 模型来控制 CartPole 环境,在训练完成后,代码使用训练好的模型来与环境进行交互,并渲染环境的状态。
  • 我们下面来详细分析一下代码的内容
4-2CartPole环境
  • CartPole 环境是一个经典的强化学习环境,它经常被用来测试和开发强化学习算法。这个环境是由 OpenAI Gym 提供的,它是一个包含多种强化学习环境的库。
  • 在 CartPole 环境中,有一个小推车(cart)和一个杆(pole),杆的一端固定在推车上,另一端自由悬挂。推车可以在一条直线上左右移动,而杆可以绕着与推车连接的关节旋转。强化学习代理(agent)的目标是通过向左或向右移动推车来保持杆的直立,同时尽可能长时间地避免杆倒下。
  • 环境的奖励设置通常是每一步给予一个小奖励,例如 +1,当杆仍然直立时。当杆倒下时,环境会发出一个终止信号,并结束当前回合。
  • 如下图,是上述实例代码训练完模型渲染出来的效果:请添加图片描述在这里插入图片描述
  • 如上所示一直在调整位姿保持平衡。
4-3 A2C 模型
  • A2C(Actor-Critic with Asynchronous Advantage Learning)是一种基于策略梯度的强化学习算法,它结合了策略梯度方法和优势函数的概念,并通过异步方式训练模型。
  • A2C 模型由两个主要部分组成:一个策略网络(actor)和一个价值网络(critic)
    • 策略网络负责根据当前的状态选择动作
    • 价值网络则评估每个状态的价值。优势函数是实际奖励与期望奖励之间的差异,它帮助模型学习哪些动作更有可能带来好的结果。
  • A2C 算法的工作原理如下:
    1. 初始化策略网络和价值网络。
    2. 将多个代理(agents)同时运行在多个环境中,每个代理都会执行一些步骤并收集经验。
    3. 每个代理将收集到的经验发送回一个中央参数服务器,服务器更新策略网络和价值网络的参数。
    4. 更新后的参数被发送回各个代理,代理使用这些参数继续与环境交互。
    5. 重复步骤 2-4,直到达到预定的训练回合数或满足其他停止条件。
  • A2C 算法的优势在于它可以通过并行化训练来提高训练速度,并且由于使用了优势函数,它能够更好地学习哪些动作更有可能带来好的结果。然而,A2C 算法也有一些缺点,例如它可能需要大量的计算资源来训练,并且它的性能可能受到代理之间通信延迟的影响。
4-4 训练
  • 上述代码在训练过程中,会输出类似如下内容:![[Pasted image 20241020114055.png]]

  • Rollout 部分

    • ep_len_mean: 这是每个回合的平均长度(以时间步长为单位)。
    • ep_rew_mean: 这是每个回合的平均奖励。
  • Time 部分

    • fps: 这是每秒的帧数,表示模型训练的效率
    • iterations: 这是模型训练的迭代次数。
    • time_elapsed: 这是训练所花费的时间(以秒为单位)。
    • total_timesteps: 这是模型训练的总时间步数。
  • Train 部分

    • entropy_loss: 这是熵损失的值。熵损失用于鼓励模型探索不同的动作
    • explained_variance: 这是模型预测的方差解释率
    • learning_rate: 这是模型的当前学习率
    • n_updates: 这是模型更新的次数
    • policy_loss: 这是策略损失的值。策略损失用于训练模型选择更好的动作。
    • value_loss: 这是值损失的值。值损失用于训练模型预测更好的状态值。
  • 这些监控信息提供了关于模型训练过程的有用反馈,可以帮助w们理解模型的行为和性能。

  • 可以看到训练到最后一轮在这里插入图片描述


5 总结

  • 本文介绍了强化学习入门的StableBaseline3的基础知识和安装,前置依赖Pytorch的安装以及CartPole环境使用基础实例。
  • 如有错误,欢迎指出!

http://www.ppmy.cn/ops/127094.html

相关文章

「撸一手好代码」设计模式之开闭原则

「撸一手好代码」设计模式之开闭原则 什么是开闭原则? 开闭原则(Open-Closed Principle, OCP)是指软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭。这意味着软件系统的设计应当允许在不修改现有代…

Vue 文件类型声明

.vue后缀类型声明 我们在 main.ts 文件中引入其他vue文件的时候,是没有类型声明的,也就是说我们知道引入了一个vue文件,但是我们不知道这个文件是准备干嘛的。所以我们需要单独为这个加上一个类型的声明。如果说没有声明也没有报错的话&…

零基础Java第八期:一维数组(1)

目录 一、 一维数组的基本概念 1.1. 什么是数组 1.2. 数组的创建及初始化 1.3. 数组的使用 二、数组是引用类型 2.1. 初始JVM的内存分布 2.2. 基本类型变量与引用类型变量 2.3. 引用变量的理解 2.4. null 三、数组的应用场景 3.1. 作为函数的参数 3.2. 作为函数的返…

C#中的信号

在C#中,信号是用于线程间同步的工具,允许线程通过信号进行等待和通知,以控制并发执行。以下是几种常见的信号工具及其用法: 1. ManualResetEvent 和 AutoResetEvent 这两个类都是基于信号量的同步原语。它们都允许线程等待某个信号并决定何时继续执行,区别在于事件被触发…

rabbitmq 工作队列模式

工作队列模式 一、原理流程图 二、基本知识 工作队列模式(Work Queue Model)是一种消息队列模型,生产者将任务分发到队列中,多个消费者从队列中按顺序获取并处理任务。该模式主要用于负载均衡,确保任务能够均匀分配给…

ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误

让工作生活更高效:Parallels Desktop 20最新版本虚拟机的神奇之处 大家好!👋 今天我要跟大家安利一款让我工作效率飞升的神器——Parallels Desktop 20最新版本虚拟机。作为一个日常需要在不同操作系统间来回穿梭的人,这款软件简直…

白嫖正版xshell和XFTP

在哪里可以下载正版免费的xshell和XFTP,并且还能够获得官网免费持久更新 白嫖步骤 首先直接在浏览器搜索xshell官网 点进官网之后直接点击下载 接着点击免费授权页面 进入之后就可以免费下载了 下载安装完成后填写用户名和邮箱并提交,这里就以xshell为…

os.popen模块

一、前言 有时候在写一些脚本的时候,需要执行一些系统命令(windows/linux),因为这边会比较方便。用python原生的办法就比较复杂。下边就介绍集中常见的方法 二、os.system os.system是python 内置模块,执行命令非常简单。可以将要执行的命令传递进去。…