强化学习快餐教程(1) - gym环境搭建

简介: # 强化学习快餐教程(1) - gym环境搭建 欲练强化学习神功,首先得找一个可以操练的场地。 两大巨头OpenAI和Google DeepMind都不约而同的以游戏做为平台,比如OpenAI的长处是DOTA2,而DeepMind是AlphaGo下围棋。 下面我们就从OpenAI为我们提供的gym为入口,开始强化学习之旅。 ## OpenAI gym平台安装 安装方法很简

强化学习快餐教程(1) - gym环境搭建

欲练强化学习神功,首先得找一个可以操练的场地。
两大巨头OpenAI和Google DeepMind都不约而同的以游戏做为平台,比如OpenAI的长处是DOTA2,而DeepMind是AlphaGo下围棋。

下面我们就从OpenAI为我们提供的gym为入口,开始强化学习之旅。

OpenAI gym平台安装

安装方法很简单,gym是python的一个包,通过pip安装即可。
例:

pip3 install gym --user

源代码的下载地址在:https://github.com/openai/gym

gym平台的目的就是提供一个供强化学习进行比较和交流的标准化平台。

第一个gym游戏:cart pole

cart pole是一个最简单的小游戏模型,它是一个一维的小车上竖起一根棍子,然后通过调整左右来保证棍子不倒。

我们先来一个随机输入的例子,大家先让这个小游戏跑起来:

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample()) # take a random action
env.close()

通过运行可以看到,别说棍子不倒了,绕着圈带着小车不知道飞到哪里去了。

gym主要为我们提供了两种元素:环境和操作。
我们首先通过gym.make来生成cartpole的运行环境,然后reset给小车和棍子一个初始化的值。
最后,通过env.step将操作传给环境去控制小车。

操作

cartpole的操作非常简单,只有两种命令,用0和1表示。0是向左推小车,1是向右推小车。小车是处在一个光滑轨道上的,根据牛顿第一定律,在无外力时处于静止或匀速直线运动的状态。

刚才我们调用env.action_space.sample(),就是在0和1之间随机生成两种状态之一做为输入。

除了刚才的随机策略外,我们也可以采取交替的策略:

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    i = 0
    env.render()
    env.step( (i+1) % 2) 
env.close()

获取环境信息

但是,有了操作之后是个开环的系统,我们需要通过从环境中读取信息来更好地决策。

其实,不管是reset还是step,环境都是会返回一系列值给我们的。

reset会返回一个状态信息给我们。而step会返回一个四元组,分别是状态信息,奖励信息,是否已经结束和附加信息。

我们进行一轮迭代,先判断下是否已经失败,如果已经倒了就结束游戏,然后统计一下我们活了几轮:

import gym
env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step( (i+1) % 2)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

下面我们再进一步,去读取一下状态信息。针对cartpole这个问题,状态信息还是一个4元组,分别是:

  • 小车位置
  • 小车速度
  • 棍的倾斜角度
  • 棍的角速度

在本游戏中,如果角度大于12度,或者小车位置超出了2.4,就意味着失败了,直接结束。

闭环控制

知道了反馈信息之后,我们就可以想办法进行闭环控制了。
比如我们只取位置参数,如果偏左了就向右推,反之亦然:

def action(status): 
    pos, v, ang, va = status
    print(status)
    if pos <= 0: 
        return 1
    else: 
        return 0 

完整代码如下:

import gym

def action(status): 
    pos, v, ang, va = status
    print(status)
    if pos <= 0: 
        return 1
    else: 
        return 0 

env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step(action(status))
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

下面是我运行一次的结果:

[-0.01635101  0.00400916 -0.02452805 -0.01815461]
[-0.01627082  0.19947413 -0.02489114 -0.31847439]
[-0.01228134  0.39494158 -0.03126063 -0.61890199]
[-0.00438251  0.59048591 -0.04363867 -0.9212643 ]
[ 0.00742721  0.78616953 -0.06206395 -1.22733599]
[ 0.0231506   0.59189892 -0.08661067 -0.95472622]
[ 0.03498858  0.3980421  -0.1057052  -0.69046268]
[ 0.04294942  0.2045334  -0.11951445 -0.43283924]
[ 0.04704009  0.0112884  -0.12817124 -0.18009313]
[ 0.04726586 -0.18178868 -0.1317731   0.0695676 ]
[ 0.04363008 -0.37479942 -0.13038175  0.31794448]
[ 0.0361341  -0.56784668 -0.12402286  0.56683387]
[ 0.02477716 -0.76103061 -0.11268618  0.81801468]
[ 0.00955655 -0.95444458 -0.09632589  1.07323592]
[-0.00953234 -1.14817057 -0.07486117  1.33420176]
[-0.03249575 -0.9521891  -0.04817713  1.01906429]
[-0.05153954 -0.7564593  -0.02779585  0.71165164]
[-0.06666872 -0.5609637  -0.01356281  0.41035059]
[-0.077888   -0.36565212 -0.0053558   0.11342282]
[-0.08520104 -0.17045384 -0.00308735 -0.180945  ]
[-0.08861011  0.02471216 -0.00670625 -0.47460027]
[-0.08811587  0.21992817 -0.01619825 -0.76938932]
[-0.08371731  0.41526928 -0.03158604 -1.06712463]
[-0.07541192  0.61079456 -0.05292853 -1.36955102]
[-0.06319603  0.80653727 -0.08031955 -1.67830763]
[-0.04706529  1.0024934  -0.1138857  -1.99488277]
[-0.02701542  1.19860803 -0.15378336 -2.32055915]
[-0.00304326  1.39475935 -0.20019454 -2.65634816]
dead in 27 steps

角策略

上一种策略我们是根据车的位置来进行控制。我们还可以考虑根据角度来进行控制:

import gym

def action_a(status): 
    pos, v, ang, va = status
    print(status)
    if ang > 0: 
        return 1
    else: 
        return 0

env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step(action_a(status))
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

从一些次尝试来看,角策略比上一个位置策略要更优一些:

[ 0.00780229 -0.02463916 -0.01033269 -0.03445555]
[ 0.00730951 -0.21961142 -0.0110218   0.25494948]
[ 0.00291728 -0.41457429 -0.00592281  0.54413566]
[-0.00537421 -0.60961251  0.0049599   0.83494657]
[-0.01756646 -0.41455866  0.02165883  0.54382761]
[-0.02585763 -0.21974767  0.03253538  0.25804686]
[-0.03025258 -0.02510495  0.03769632 -0.02419899]
[-0.03075468  0.16945669  0.03721234 -0.30475403]
[-0.02736555  0.36402912  0.03111726 -0.58547272]
[-0.02008497  0.55870171  0.01940781 -0.86819324]
[-0.00891093  0.75355429  0.00204394 -1.15471154]
[ 0.00616015  0.94864953 -0.02105029 -1.44675287]
[ 0.02513314  0.75379272 -0.04998535 -1.16072073]
[ 0.040209    0.55935628 -0.07319976 -0.88411992]
[ 0.05139612  0.36530055 -0.09088216 -0.61531734]
[ 0.05870214  0.17155806 -0.10318851 -0.35258554]
[ 0.0621333  -0.02195676 -0.11024022 -0.09414094]
[ 0.06169416 -0.21534017 -0.11212304  0.16182831]
[ 0.05738736 -0.40869329 -0.10888647  0.41714169]
[ 0.04921349 -0.60211728 -0.10054364  0.67361   ]
[ 0.03717115 -0.7957087  -0.08707144  0.93302056]
[ 0.02125697 -0.98955482 -0.06841103  1.19712154]
[ 1.46587604e-03 -1.18372790e+00 -4.44685947e-02  1.46760271e+00]
[-0.02220868 -1.37827822 -0.01511654  1.74607025]
[-0.04977425 -1.57322512  0.01980486  2.03401309]
[-0.08123875 -1.37831278  0.06048513  1.74752417]
[-0.108805   -1.18392804  0.09543561  1.47425204]
[-0.13248357 -0.99009321  0.12492065  1.21283837]
[-0.15228543 -0.796785    0.14917742  0.96176679]
[-0.16822113 -0.60394842  0.16841275  0.71942016]
[-0.1803001  -0.41150733  0.18280116  0.48412211]
[-0.18853024 -0.21937201  0.1924836   0.25416579]
[-0.19291768 -0.02744473  0.19756691  0.02783298]
[-0.19346658  0.16437637  0.19812357 -0.19659389]
[-0.19017905  0.35619437  0.1941917  -0.42082427]
[-0.18305516  0.54811122  0.18577521 -0.64655444]
[-0.17209294  0.74022551  0.17284412 -0.87546311]
[-0.15728843  0.93262987  0.15533486 -1.10920578]
[-0.13863583  1.12540784  0.13315074 -1.34940608]
[-0.11612768  1.31862936  0.10616262 -1.59764218]
[-0.08975509  1.51234492  0.07420978 -1.85542638]
[-0.05950819  1.70657739  0.03710125 -2.12417555]
[-0.02537664  1.90131142 -0.00538226 -2.40517032]
[ 0.01264959  1.7062367  -0.05348567 -2.11414485]
[ 0.04677432  1.51168791 -0.09576856 -1.83845627]
[ 0.07700808  1.31774548 -0.13253769 -1.57698862]
[ 0.10336299  1.12442853 -0.16407746 -1.32840846]
[ 0.12585156  0.9317127  -0.19064563 -1.09123975]
dead in 47 steps
目录
相关文章
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
712 10
|
弹性计算 NoSQL 网络协议
阿里云ECS使用docker部署redis并远程连接
本文主要介绍如何在阿里云ECS服务器上通过docker部署redis,并在springboot项目中添加redis依赖进行远程连接。
阿里云ECS使用docker部署redis并远程连接
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
871 0
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
|
8月前
|
存储 物联网 数据中心
拒绝玄学炼丹:大模型微调显存需求精确计算指南,全参数微调与LoRA对比全解析
本文揭秘大模型微调显存消耗的本质,系统拆解模型权重、梯度、优化器状态、激活值四大组成部分的计算逻辑,推导可复用的显存估算公式;对比全量微调、LoRA、QLoRA等方案的显存需求,提供实用工具与配置建议,助开发者告别“玄学估算”,精准规划GPU资源。
|
机器学习/深度学习 算法 搜索推荐
联邦学习的未来:深入剖析FedAvg算法与数据不均衡的解决之道
随着数据隐私和数据安全法规的不断加强,传统的集中式机器学习方法受到越来越多的限制。为了在分布式数据场景中高效训练模型,同时保护用户数据隐私,联邦学习(Federated Learning, FL)应运而生。它允许多个参与方在本地数据上训练模型,并通过共享模型参数而非原始数据,实现协同建模。
1756 0
|
机器学习/深度学习 人工智能 算法
强化学习:Gym的库的实践——小车上山(包含强化学习基础概念,环境配置国内镜像加速)——手把手教你入门强化学习(一)
本文开启“手把手教你入门强化学习”专栏,介绍强化学习基础概念及实践。强化学习通过智能体与环境交互,学习最优策略以最大化累积奖励,适用于复杂动态决策问题。文章讲解智能体、环境等核心概念,并使用Gym库进行案例实操,如CartPole和MountainCar环境的代码实现。最后预告下期将深入马尔科夫决策过程(MDP)。适合初学者系统了解强化学习并动手实践。创作不易,欢迎关注、点赞与收藏!
2098 4
|
机器学习/深度学习 自然语言处理 测试技术
Qwen3技术报告首次全公开!“混合推理模型”是这样炼成的
近日,通义千问Qwen3系列模型已开源,其技术报告也正式发布。Qwen3系列包含密集模型和混合专家(MoE)模型,参数规模从0.6B到235B不等。该模型引入了“思考模式”与“非思考模式”的动态切换机制,并采用思考预算机制优化推理性能。Qwen3支持119种语言及方言,较前代显著提升多语言能力,在多个基准测试中表现领先。此外,通过强到弱蒸馏技术,轻量级模型性能优异,且计算资源需求更低。所有Qwen3模型均采用Apache 2.0协议开源,便于社区开发与应用。
8451 30
|
机器学习/深度学习 存储 算法
强化学习实战:基于 PyTorch 的环境搭建与算法实现
【8月更文第29天】强化学习是机器学习的一个重要分支,它让智能体通过与环境交互来学习策略,以最大化长期奖励。本文将介绍如何使用PyTorch实现两种经典的强化学习算法——Deep Q-Network (DQN) 和 Actor-Critic Algorithm with Asynchronous Advantage (A3C)。我们将从环境搭建开始,逐步实现算法的核心部分,并给出完整的代码示例。
2125 1
|
Rust Ubuntu 编译器
Standard ML快餐教程(1) - 初识
如何搭建Standard ML开发环境,以及如何在sml中生存下来
3717 0
|
机器学习/深度学习 人工智能 编解码
Stable Diffusion原理详解
本文向大家介绍了图像生成领域最前沿的Stable Diffusion模型。本质上Stable Diffusion属于潜在扩散模型(Latent Diffusion Model)。潜在扩散模型在生成细节丰富的不同背景的高分辨率图像方面非常稳健,同时还保留了图像的语义结构。 因此,潜在扩散模型是图像生成即深度学习领域的一项重大进步。
10166 0
Stable Diffusion原理详解

热门文章

最新文章