设为首页 | 加入收藏

欢迎访问幸运彩票app下载ios-幸运彩票app3132-幸运彩票app手机下载

幸运彩票app3132 >> 那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码

【CSDN 编者按】本文将为咱们展示怎么经过 Numpy 库和 50行 Python 代码,运用规范的 OpenAI Gym渠道创立智能体 (Agent),就教会机器处理推车杆问题 (Cart Pole Problem) ,坚持平衡。

作者 | Mike Shi

译者 | linstancy

责编 | Jane

出品 | AI科技大本营(id:rgznai100)

推车杆问题 (cart pole problem) ,咱们可以类比方同在手指尖上笔直平衡铅笔相同,需求经过左右推进来平衡车顶部的杆,这是个十分具有挑战性的问题!

今日,咱们不过多的评论强化学习的根底理论,期望咱们鄙人面的编译器里,不断测验,领会这个项目。一开端,咱们只需求点击“Start”,开端装备需求的环境即可。

 

快速入门强化学习 (RL)


假如你是机器学习或强化学习范畴的新人,先了解一下下面的一些根底知识和术语,为后边做衬托。假如你现已把握了根底知识,那可以越过这部分内容。

  • 强化学习

强化学习旨在教会咱们的智能体 (算法或机器) 履行特定的使命或动作,而无需显式地告知它该怎么做。幻想一个婴儿在随机抬动自己的腿,当站立起来时就给予他一个奖赏。相同地,智能体的方针是在其生命周内最大化奖赏值,而奖赏取决于特定的使命。比方宝宝站立这个比如,站立时给予奖赏记为1,不然记为0。

AlphaGo 便是一个典型的强化学习智能体比如,教会智能体怎么玩游戏并最大化其奖赏 (即赢得游戏)。而在本文中就将创立一个智能体,教它怎么经过左右推进推车来处理推车上的杆平衡问题。 

  • 状况

状况即当时游戏的姿态,通常用数字来表明。在乒乓球竞赛中,它或许是每个球拍与x、y坐标轴的笔直方位或许是乒乓球的速度。在推车杆的状况下,这儿的状况由4个数字组成:即推车的方位,推车的速度,杆的方位 (作为视点) 和杆的角速度。这4个数字作为向量 (或数组) 供给给智能体,这十分重要:将状况作为一组数字意味着智能体可以对它进行一些数学运算,以便决议怎么依据状况来采纳什么举动。

  • 战略

战略是一种可以处理游戏状况的函数 (例如棋盘的方位或许推车和杆的方位), 并输出智能体在该方位应该采纳的动作 (例如移动或将推车推到左面)。在智能体采纳相应的操作后,游戏将以下一个状况更新,此刻将再次依据其输入战略做出决议计划,这个进程一向持续到游戏到达某个停止条件时完毕。战略相同是个十分要害的要素,由于它反映了是智能体背面的决议计划才能,这也是咱们所需求仔细考虑的。

  • 点积 (Dot Product)

两个数组 (向量) 之间的点积可以简略理解为,将第一个数组的每个元素乘以第二个数组的对应元素,并将它们悉数加在一起。假定想要核算数组 A 和 B 的点积,形如 A[0]*B[0]+A[1]*B[1] ......随后将运用此运算成果再乘以一个状况 (相同是一个向量) 和一个战略值 (相同也是一个向量)。这部分内容将鄙人一节详细介绍。


拟定战略


为了处理推车游戏,咱们期望所规划的机器学习战略可以赢得游戏或最大化游戏奖赏。关于智能体而言,这儿将接纳4维数组所表明战略,每一维代表每个组成的重要性 (推车的方位,杆位等四个组成)。随后,再将点积的成果与战略、状况向量进行处理并输出终究的成果。依据成果的正负值决议是向左仍是向右推进推车。这听起来或许有点笼统,下面就经过一个详细的比如,来看看整个进程将发作什么。

假定推车在游戏中静止地处在中心方位,当杆向右歪斜时车也将向右歪斜,如下图这样:

所对应的的状况如下图所示:

此刻的状况向量为 [0, 0, 0.2, 0.05]。直观地说,现在咱们想要将推车面向右侧,并将杆拉直。这儿经过练习中得到了一个很好的战略,即 [-0.116, 0.332, 0.207,  0.352]。将上面的状况向量与战略向量进行点积处理,假如得到的成果为正,则将推车向右推进;反之则向左推进。

明显,这儿的输出是个正数,这意味着在这种战略下智能体将推车向右推进,这也正是咱们想要的成果。那么,该怎么得到这个战略向量呢,以便智能体可以朝着咱们期望的方向推进?或许说假如随机挑选一个战略,那么智能体又该怎么举动呢?

 

开端修改

 

在该项目主页 repl.it 上弹出一个 Python 实例。repl.it答使用户快速发动很多不同编程环境的云实例环境并在强壮云编译器 (IDE) 中修改代码,这个强壮的 IDE 能在任何地方拜访,如下图所示。

 

装置所需的包

 

装置这个项目所需的两个软件包:numpy 用于协助数值核算,而 OpenAI Gym 则作为智能体的模拟器。如下图所示,只需在修改器左边的包查找东西中输入 gym 和 numpy,然后单击加号按钮即可装置这两个包。

 

创立根底环境

 

这儿首要将刚装置的两个依靠包导入到 main.py 脚本中并设置一个新的 gym环境。随后界说一个名为 play 的函数,该函数将被赋予一个环境和一个战略向量,在环境中履行战略向量并回来分数以及每个时刻步的游戏观测值。最终,将经过分数凹凸来反映战略的作用好坏,以及在单次游戏中战略的体现。如此,就可以测验不同的战略,检查他们在游戏中的体现!

import gym
import numpy as np
env = gym.make('CartPole-v1')

下面从函数界说开端,将游戏重置为开端状况,如下所示。

def play(env, policy):
  observation = env.reset()

接着初始化一些变量,用来盯梢游戏是否到达停止条件,战略得分以及游戏中每个进程的观测值,如下所示。 

 done = False
  score = 0
  observations = []

现在,只需求一些时刻步来开端游戏,直到 gym 提示游戏完毕停止。

for _ in range(5000):
    observations += [observation.tolist()] # Record the observations for normalization and replay

    if done# If the simulation was over last iteration, exit loop
 &nb那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码sp;    break

    # Pick an action according to the policy matrix
    outcome = np.dot(policy, observation)
    action = 1 if outcome > 0 else 0

    # Make the action,&那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码nbsp;record reward
    observation, reward, done, info = env.step(action)
    score += reward

  return score, observations

 如下,这部分的代码主要是用于开端游戏并记载成果,而与战略相关的代码便是这两行:

 outcome = np.dot(policy, observation)
    action = 1 if outcome > 0 else 0

 在这儿所做的仅仅对战略向量和状况 (观测) 数组之间进行点积运算,就像在之前详细比如中所展示的那样。随后依据成果的正负,挑选1或0 (向左或右) 的动作。到这儿停止,main.py 脚本如下所示:

import gym
import numpy as np

env = gym.make('CartPole-v1'那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码)

def play(env, policy):
  observation = env.reset()

  done = False
  score = 0
  observations = []

  for _ in range(5000):
    observations += [observation.tolist()] # Record the observations for normalization and replay

    if done: # If the simulation was over last iteration, exit loop
      break

    # Pick an action according to the policy matrix
    outcome = np.dot(policy, observation)
    action = 1 if outcome > 0 else 0

    # Make the action, record reward
    observation, reward, done, info = env.step(action)
    score += reward

  return score, observations 

下面开端寻觅该游戏的最优战略!

 

第一次游戏


现在现已有了一个函数,用来反映战略的好坏。因而,接下来要做的事开端拟定一些战略,并检查他们的体现怎么。假如一开端你想测验一些随机的战略,那么这些战略的成果将会怎样呢?这儿运用 numpy 来随机生成一些的战略,这些战略都是4维数组或1x4矩阵,即挑选4个0到1之间的数字作为游戏的战略,如下所示。

policy = np.random.rand(1,4)

有了这些战略以及上面所创立的环境,下面就可以开端游戏并取得战略分数:

score, observations = play(env, policy)
print('Policy Score', score)

 只需点击运转即可开端游戏,它将输出每个战略所对应的得分,如下所示。

最终,一切的战略取得的最高得分为500,在这儿随机生成的战略或许并不能得到太好的成果,并且经过随机生成的方法,很难解说智能体是怎么进行游戏的。下一步将过户费怎么算介绍怎么挑选并设置游戏的战略,来检查智能体的游戏体现。

 

调查咱们的智能体

 

这儿运用 Flask 来设置轻量级服务器,以便可以在浏览器中检查智能体的体现。 Flask 是一个轻量级的 Python HTTP 服务器结构,可以为 HTML UI 和数据供给服务。由于烘托和 HTTP 服务器背面的细节对智能体的练习并不重要,在这儿仅仅简略介绍下。首要需求将 Flask 装置为 Python 包,就像上面装置 gym 和 numpy 包相同,如下所示。

接下来,在脚本的底部创立一个 flask 服务器,它将在 /data 端点上揭露游戏的每个帧的记载,并在 / 上保管 UI,如下所示。

from flask import Flask
import json
app = Flask(__name__, static_folder='.')
@app.route("/data")
def data():
    return json.dumps(observations)
@app.route('/')
def root():
    return app.send_static_file('./index.html')
app.run(host='0.0.0.0', port='3000')

此外,还需求增加两个文件:一个是项目的空白 Python 文件,这是 repl.it 用于检测 repl 是处于评价形式仍是项目形式的要害。这儿只需运用新文件按钮增加空白的 Python 脚本即可。随后,还需求创立一个将承载烘托 UI 的 index.html 文件。在此不需求深化了解这部分的内容,只需将此 index.html 上传到 repl.it 项目即可。

好了,现在的项目目录应该像这样,如下所示:

有了这两个新文件,当运转 repl 时它将回放所挑选的游戏战略,便于咱们寻觅一个最优的战略。

 

战略查找


在第一次游戏中仅仅经过 numpy 为智能体随机生成一些战略并开端游戏。那么,怎么挑选一些游戏战略,并在游戏完毕时只保存那个成果最好的战略呢?在这儿,拟定游戏时并不仅仅生成一个战略,而是经过编写一个循环来生成一些战略,盯梢每个战略的履行状况并在最终保存最佳的战略。

首要创立一那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码个名为 max 的元组,它将存储游戏进程所呈现的最佳战略得分、观测和战略数组,如下所示。

max = (0, [], []) 

接下来将生成并评价10个战略,并将得分最大值的战略保存。此外,这儿还需求在 /data 端点回来最佳战略的重放,如下所示。

for _ in range(10):
  policy = np.random.rand(1,4)
  score, observations =&nbs那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码p;play(env, policy)

  if score > max[0]:
    max = (score, observations, policy)

print('Max Score'max[0])

 此外,这个端点:

@app.route("/data")
def data():
    return json.dumps(observations) 

应改为:

@app.route("/data")
def data():
    return json.dumps(max[1])

最终 main.py 脚本应像这样,如下图所示:

import gym
import numpy as np
env = gym.make('CartPole-v1')
def play(env, policy):
  observation = env.reset()
  done = False
  score = 0
  observations = []
  for _ in range(5000):
    observations += [observation.tolist()] # Record the observations for normalization and replay
    if done: # If the simulation was over last iteration, exit loop
      break
    # Pick an action according to the policy matrix
    outcome = np.dot(policy, observation)
    action = 1 if outcome > 0 else 0
    # Make the action, record reward
   那些你很冒险的梦-50 行代码教 AI 完成动作平衡 | 附完好代码; observation, reward, done, info = env.step(action)
    score += reward
  return score, observations
max = (0, [], [])
for _ in range(10):
  policy = np.random.rand(1,4)
  score, observations = play(env, policy)
  if score > max[0]:
    max = (score, observations, policy)
print('Max Score', max[0])
from flask import Flask
import json
app = Flask(__name__, static_folder='.')
@app.route("/data")
def data():
    return json.dumps(max[1])
@app.route('/')
def root():
    return app.send_static_file('./index.html')
app.run(host='0.0.0.0', port='3000')

假如现在运转 repl,正常状况所得到的最大分数应为500。假如没有的话,请再次测验运转 repl! 经过这种方法,可以完美地调查游戏战略是怎么让杆到达平衡的!

 

怎么加快?


(1)这儿智能体到达平衡的速度并不行块。回想前面拟定战略时,首要仅仅在0到1范围内随机创立了战略数组,这刚好是有用的。但假如这儿智能体翻转大于运算符所设定的那样,那么或许将看到灾难性的失利成果。可以测验将 action> 0 if outcome>0 else 0 改为 action=1 if outcome<0 else 0。

作用好像并没有很明显,这或许是由于假如刚好挑选少于而不是大于,那么或许永久也找不到处理游戏的战略。为了缓解这种状况,在实际操作时也应该生成一些带负数的战略。尽管这将使得查找一个好战略的进程变得愈加困难 (由于包括许多负的战略并不好),但所带来的优点是不再需求经过特定算法来匹配特定游戏。假如测验在 OpenAI gym 的其他环境中这样做,那么算法肯定会失利。

要做到这一点,不能运用 policy = np.random.rand(1,4),需求将改为 policy = np.random.rand(1,4) -0.5。如此,所生成的战略中每个数字都在-0.5到0.5之间,而不是0到1。可是由于这样做会使得最优战略的查找进程变得困难,因而在上面的 for 循环中,不要迭代10个战略,更改这部分的代码测验查找100个战略 (for _ in range (100):)。当然,你也可以先测验迭代10次,看看用负的战略取得最优战略的困难性。

好了,现在的 main.py 脚本可参阅 

https://gist.github.com/MikeShi42/e1c5551bbf2cb2064da962ad8b198c1b

假如现在运转 repl,不管运用的是否大于或小于,依然可以找到一个好的游戏战略。

(2)不仅如此,即便所生成的战略或许可以在一次游戏中得到最高分500的成果,那它可以在每次游戏中都有这样的体现呢?当生成100个战略并挑选在单次运转中体现最佳的战略时,该战略或许仅仅单次最佳战略,或许它或许是一个十分糟糕的战略,仅仅刚好在一次游戏中有十分好的功能。由于游戏自身具有随机性 (如开始方位每次都不同),因而战略可以仅仅在一个开始方位体现杰出,而不是在其他方位。

因而,为了处理这个问题,需求评价一个战略在屡次试验中的体现。现在就采纳之前试验得到的最佳方针,检查它在100次游戏试验中的体现。在这儿对最优战略进行100次游戏 (最大索引值为2) 并记载每次的游戏得分。随后运用 numpy 核算该战略的均匀分数并将其打印到终端。你或许会注意到,最佳的游戏战略实际上并不一定是最优异的。

 

总结


好了,以上现已成功创立了一个可以十分有用地处理推车杆问题的 AI 智能体。当然它还有很大的改善空间,这将是后续系列文章的一部分。此外,后续的作业还可以对一些问题打开研讨:

  • 寻觅“真实的”最优战略 (即在100次独立游戏中体现杰出)

  • 优化最佳战略查找所需的次数 (即样本功率问题)

  • 挑选正确查找战略,而不是测验随机地挑选。

  • 在其他的环境中创立。

原文地址:

https://towardsdatascience.com/from-scratch-ai-balancing-act-in-50-lines-of-python-7ea67ef717

【END】

「2019以太坊技能及使用大会」门票惊喜大促!

V神携手很多海内外闻名区块链专家来北京啦!自6月14日起,大会隆重推出618特惠票,低至399元,感恩新老用户,惊喜不断,虚左以待!扫码了解概况。

 热 文 推 荐 

☞为什么说 5G 是物联网的年代?

互联网公司没有中年人

教你用OpenCV完成机器学习最简略的k-NN算法

☞Docker 存储选型,这些年咱们遇到的坑

☞荔枝自在?朋友,你完成了吗?

☞开源要自立?华为怎么“仿制”Google形式

☞从制造业转型物联网,看博世怎么破界

☞回报率850%? 这个用Python优化的比特币买卖机器人几乎太烧脑了...

☞老码农冒死揭开编程内幕:这些Bug让我认输,谁踩谁服!

点击阅览原文,精彩持续。

你点的每个“在看”,我都仔细当成了喜爱



上一条      下一条
返回顶部