파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

[REVIEW] NumPy와 라이브러리와 OpenAI 체육관 에이전트 (에이전트)를 생성하기 위해 표준 플랫폼을 사용하여 파이썬 코드 50 개 라인, 교회 문제로드 기계 가공 카트 (장바구니 극 문제가) 균형을 유지하는 방법을 보여줍니다이 문서.

 

트롤리 극 문제 (카트 극 문제는) 우리가 수직으로 손가락의 비유처럼 연필 균형을 수 있습니다, 당신은 왼쪽과 오른쪽에 의해 구동 차량의 상단에 막대를 균형 필요, 이것은 매우 어려운 문제입니다!

 

오늘, 우리가 논의하지만 많은 학습의 기본 이론을 강화, 나는 계속이 프로젝트를 실현하려고하면 다음과 같은 컴파일러에서 당신을 바랍니다. 처음에, 우리는 "시작", 당신이 필요한 환경을 구성 시작할 수 있습니다 클릭해야합니다.

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

학습 시작 강화 얻기 (RL)

 

당신은 기계 학습 또는 나중을위한 기반을 마련, 연구의 새로운 분야, 다음과 같은 기본 지식과 용어의 일부 처음 모습을 강화합니다. 당신이 기초를 마스터 한 경우에, 당신은이 부분을 건너 뛸 수 있습니다.

 

  • 강화 학습

 

강화 학습은 명시 적으로 무엇을 말 할 필요없이, 특정 작업 또는 우리의 정보 기관 (알고리즘 또는 기계)의 작업을 수행하기 위해 교회에 목적이있다. 그에게 보상을주고 서있는 동안 그들의 다리를 이동 임의의 아기를 들고 상상해보십시오. 마찬가지로, 대상 에이전트는 특정 작업에 따라 삶의 보상 주간의 값 및 보상을 극대화하는 것입니다. 예를 들어,이 예에 서있는 아기, 그렇지 않으면 1, 0로 표시 기립 보상을 제공합니다.

 

AlphaGo이 강화 학습 에이전트의 전형적인 예입니다 방법, 에이전트 교회는 게임을 플레이하고 자신의 보상을 (즉, 게임을 승리) 극대화. 이 문서에서 우리는, 지능형 몸을 만드는 방법 트롤리 폴 균형 왼쪽과 오른쪽의 문제를 해결하기 위해 카트를 밀어하는 방법을 가르 칠 것입니다.

 

  • 상태

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

즉, 게임의 현재 상태는 보통 숫자로 표현하는 방법입니다. 탁구 라켓의 각 X는, 수직 위치 또는 탁구 Y 축의 속도 일 수있다. 트롤리 바의 경우, 상태 여기서 네 자리 (각도)를 트롤리의 위치, 속도, 트롤리, 상기로드 및로드의 각속도. 매우 중요 에이전트에 벡터 (또는 배열)로 제공이 네 숫자 : 숫자의 집합으로 상태는 에이전트가 어떤 상태에 따라 작업을 수행하는 방법을 결정하기 위해 몇 가지 수학을 할 수 있다는 것을 의미한다.

 

  • 전술

 

策略是一种可以处理游戏状态的函数 (例如棋盘的位置或者推车和杆的位置), 并输出智能体在该位置应该采取的动作 (例如移动或将推车推到左边)。在智能体采取相应的操作后,游戏将以下一个状态更新,此时将再次根据其输入策略做出决策,这个过程一直持续到游戏达到某个终止条件时结束。策略同样是个非常关键的因素,因为它反映了是智能体背后的决策能力,这也是我们所需要认真考虑的。

 

  • 点积 (dot product)

 

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

 

制定策略

 

为了解决推车游戏,我们希望所设计的机器学习策略能够赢得游戏或最大化游戏奖励。对于智能体而言,这里将接收4维数组所表示策略,每一维代表每个组成的重要性 (推车的位置,杆位等四个组成)。随后,再将点积的结果与策略、状态向量进行处理并输出最终的结果。根据结果的正负值决定是向左还是向右推动推车。这听起来可能有点抽象,下面就通过一个具体的例子,来看看整个过程将发生什么。

 

假设推车在游戏中静止地处在中间位置,当杆向右倾斜时车也将向右倾斜,如下图这样:

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

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

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

此时的状态向量为 [0, 0, 0.2, 0.05]。直观地说,现在我们想要将推车推向右侧,并将杆拉直。这里通过训练中得到了一个很好的策略,即 [-0.116, 0.332, 0.207, 0.352]。将上面的状态向量与策略向量进行点积处理,如果得到的结果为正,则将推车向右推动;反之则向左推动。

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

显然,这里的输出是个正数,这意味着在这种策略下智能体将推车向右推动,这也正是我们想要的结果。那么,该如何得到这个策略向量呢,以便智能体能够朝着我们希望的方向推动?或者说如果随机选择一个策略,那么智能体又该如何行动呢?

 

开始编辑

 

在该项目主页 repl.it 上弹出一个 Python 实例。repl.it允许用户快速启动大量不同编程环境的云实例环境并在强大云编译器 (IDE) 中编辑代码,这个强大的 IDE 能在任何地方访问,如下图所示。

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

安装所需的包

 

安装这个项目所需的两个软件包:numpy 用于帮助数值计算,而 OpenAI Gym 则作为智能体的模拟器。如下图所示,只需在编辑器左侧的包搜索工具中输入 gym 和 numpy,然后单击加号按钮即可安装这两个包。

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

创建基础环境

 

这里首先将刚安装的两个依赖包导入到 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
 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

如下,这部分的代码主要是用于开始游戏并记录结果,而与策略相关的代码就是这两行:

  •  
 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')

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)

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

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

最后,所有的策略获得的最高得分为500,在这里随机生成的策略可能并不能得到太好的结果,而且通过随机生成的方式,很难解释智能体是如何进行游戏的。下一步将介绍如何选择并设置游戏的策略,来查看智能体的游戏表现。

 

观察我们的智能体

 

这里使用 Flask 来设置轻量级服务器,以便可以在浏览器中查看智能体的表现。 Flask 是一个轻量级的 Python HTTP 服务器框架,可以为 HTML UI 和数据提供服务。由于渲染和 HTTP 服务器背后的细节对智能体的训练并不重要,在这里只是简单介绍下。首先需要将 Flask 安装为 Python 包,就像上面安装 gym 和 numpy 包一样,如下所示。

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

接下来,在脚本的底部创建一个 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 项目即可。

 

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

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

有了这两个新文件,当运行 repl 时它将回放所选择的游戏策略,便于我们寻找一个最优的策略。

 

 

파이썬 코드 50 개 라인의 균형을 달성하기 위해 AI 동작을 가르쳐

 

 

 

策略搜索

 

在第一次游戏中只是通过 numpy 为智能体随机生成一些策略并开始游戏。那么,如何选择一些游戏策略,并在游戏结束时只保留那个结果最好的策略呢?在这里,制定游戏时并不只是生成一个策略,而是通过编写一个循环来生成一些策略,跟踪每个策略的执行情况并在最后保存最佳的策略。

 

首先创建一个名为 max 的元组,它将存储游戏过程所出现的最佳策略得分、观测和策略数组,如下所示。

  •  
max = (0, [], [])

 

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

  •  
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])

此外,这个端点:

  •  
@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
 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 에이전트는 카트 극 문제에 매우 효과적인 솔루션이 될 수 있습니다. 물론, 그것은 또한 후속 시리즈의 일부가 될 것입니다 개선의 여지를 많이 가지고있다. 또한, 후속 작업은 문제의 숫자에 대한 연구를 확장 할 수 있습니다 :

추천

출처blog.csdn.net/java276582434/article/details/92685029