2018 年 10 月

33 卷,第 10

此文章由机器翻译

人工智能-强化学习简介

通过Frank La La |2018 年 10 月

Frank La Vigne在上一文章中,我曾提到监督式的学习和非监督式的学习算法。超出这两种方法的计算机学习展示了另一种类型:强化学习 (RL)。RL 正式定义,是通过与理想的学习情况下的环境进行交互的面向目标的学习的计算方法。

许多的算法和解决方法通常会立即使用 AI 的其他方面,如跟踪它们返回到 20 世纪 80 年代的源 (bit.ly/2NZP177)。使用廉价的存储和按需计算能力的问世,强化学习技术重新出现。

可以说是迄今为止最著名使用 RL 是 AlphaGo 零程序从 DeepMind Technologies ltd.与 AlphaGo,了解从业余和专业人员的播放机记录,不同 AlphaGo 零必须不能访问基于人员的训练数据集。相反,系统学习完全从本身玩游戏。几周后 AlphaGo 零来实现母版级别状态以及 40 天后便成为世界上最佳的 Go 播放机。请记住它做这一切都采用无需人工干预。有关项目的详细信息位于bit.ly/2K9NpW8。RL 也已用于训练算法来播放经典街机游戏并实现与很少或无人参与的最高可能分数。

在本文中,我将讨论 RL 的基础知识,制作这在后续文章中。

RL 模型的核心组件

RL 重点介绍使用奖励系统以与动物和人类如何了解根据的经验非常相似的方式为模型定型,通过反复试验。RL 模拟人类认知行为系统,因为没有很多与认知心理学重叠。RL 算法还部署了博弈论数学和策略,也有不少。

任何 RL 模型中的前两个元素是在环境和代理。使用象棋游戏的示例,该环境是游戏板和代理是播放机。环境的状态为棋盘上的部分的位置。代理观察到的环境的状态,并将操作应用于要接收奖励的环境 (请参阅图 1)。Chess 游戏时,无法向前移动任何一个卒直或捕获对手的棋子此操作。在象棋游戏的任何移动会自动更改环境的状态。代理可能需要任何可用的有效移动到在象棋游戏的玩家。

强化学习系统的基本组件
图 1 基本组件,为强化学习系统

代理从基于它所执行的操作环境接收奖励。获得的回报是一个类似于视频游戏中的分数的数值。代理选择可用的选项根据预期的回报。代理进行编程,使其回报最大化。例如,移动一张向前可能会产生 1,的回报时捕获对手棋子可能会产生的 5 回报。给定这些选择,该算法将选择通过下一步只需每次捕获对手棋子。这种 reward 结构将生成积极的代理,如将始终选择捕获对手的棋子,甚至代价是丢失该游戏。很明显,这不是最佳的结果。因此,环境和奖励结构的准确性对通过 RL 训练的模型的成功至关重要。

较小的问题空间

生成模型捕获 chess 训练代理的复杂程度超出了最本专栏的范围。为简单起见,我将减少到 4 × 4 网格的环境。代理将控制此网格中的字符的移动。网格的某些单元格是移动,而其他人会导致代理进水和,因此,终止字符并将其重置模拟。代理已到达的目标单元格并将得到与分数为 1 表示查找它的安全路径。看板移动返回 reward 值为 0。对于此示例中,我将使用从 OpenAI 健身房冻结 Lake 环境 (bit.ly/2v1csWA)。

若要开始,打开在偏好的平台上的 Python 3 Jupyter notebook。我介绍了如何开始使用以前的专栏中的 Jupyter 笔记本 (msdn.com/magazine/mt829269)。创建空单元格并输入并执行以下代码以导入相应的库并设置用来训练代理的环境:

import gym
import numpy as np
env = gym.make('FrozenLake-v0')

现在,创建新的单元格,输入以下代码,并执行:

print("observation_space")
print(env.observation_space)
print("action_space")
print(env.action_space)

结果应指示观察空间,只是您所期望的内容中 4x4 网格中有 16 个离散值。它还显示了操作空间中有四个离散值,这意味着该代理可以向上移动,向下、 向左或靠右。

随机方法

现在,设置环境,就可以开始与之进行交互。将以下代码添加到新的单元格当前一个文本框下方:

env.reset()
done = False
while done == False:
  action = env.action_space.sample()
  observation, reward, done, info = env.step(action)
  print(action, observation, reward, done, info)

输出应如下所示:

2 4 0.0 False {'prob': 0.3333333333333333}
3 4 0.0 False {'prob': 0.3333333333333333}
2 8 0.0 False {'prob': 0.3333333333333333}
0 4 0.0 False {'prob': 0.3333333333333333}
1 5 0.0 True {'prob': 0.3333333333333333}

此算法随机探讨了通过从操作空间中随机选取一个方向的空间。阶跃函数接受的操作作为参数并返回观察,奖励,完成和信息。观察,在这种情况下,表示在网格上的位置。获得的回报是的 reward 步骤生成的量。完成一个布尔值,该值指示是否模拟已结束。在此示例中,这意味着我们播放机最近已经通过冰,我们需要重新启动模拟。最终的出站参数为信息,主要用于诊断目的。假设客户获得积分零 reward 意味着代理未实现此目标。

当然,它是几乎不可能出现代理只是随机会在解决方案。尝试多次,则会产生成功结果。以下代码,应输入并执行,将运行 100 次模拟:

print("starting")
for i in range(100):
    env.reset()
    done = False
    while done == False:
        action = env.action_space.sample()
      observation, reward, done, info = env.step(action)
      if(reward > 0):
        print("success")
        print(reward)
print ("done")

此操作,请过,则不会有可能产生的成功结果。更改代码,以便模拟运行 1,000 次,然后再次运行。使用 1,000 次运行应为大约 10 个成功运行,授予或带。从统计上说,这意味着问题随机方法适用于大约 1%的时间。很明显,单独的随机方法将无法满足需要。

介绍问题与解答学习

如您所见,随机"尝试并失败"方法会产生可怕的结果。或它?在更高序位动物内存播放中学习的重要角色。重试失败的方法将更为成功,如果从以前的尝试结果会捕获。前面的代码重新启动每个迭代,有效地依赖于成功的机会。

一个特别有用的方法是 Q 学习。问: 学习方法了解到的策略,指导何种情况下应采取的操作上的代理。在最简单配置中,Q 学习算法可能会作为一个名为 Q 表的表。在此冻结 Lake 环境中,有 16 可能的状态,表示 4x4 网格和四个可能的操作为每个方向上的某个位置。这会导致的问题与解答值的 16 x 4 表。表的每一行都具有四个列,在该行上的最高值表示要执行的最佳操作。因此,该表包含表示每个可能的状态,并将列,该值指示哪个方向具有成功的可能性最高的行。

输入中的代码图 2到空白单元格并执行 (花费一段时间来运行)。

图 2 实现 Q 表

Qtable = np.zeros([env.observation_space.n,env.action_space.n])
lr = .8
gamma = .95
num_episodes = 2000
rList = []
for i in range(num_episodes):
  s = env.reset()
  rAll = 0
  d = False
  j = 0
  while j < 99:
    j+=1
    a = np.argmax(Qtable[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
    s1,r,d,_ = env.step(a)
    Qtable[s,a] = Qtable[s,a] + lr*(r + gamma*np.max(Qtable[s1,:]) - Qtable[s,a])
    rAll += r
    s = s1
    if d == True:
      break
  rList.append(rAll)

若要创建一个问题与解答表,首先使用 16 行和四个列创建表。回想一下,会导致每个可能状态的一个行,并且每一列表示每个可能的操作。使用的每个单元格,轻松使用零进行的任务中的零的值初始化 Q 表方法。当代理探讨了环境并观察结果时,问题与解答表获取更新。在模拟的每个步骤,该代码与其后的代码遵循适用于各种操作获得奖励,然后相应地更新的表的给定状态 (行) 的最大值选择的操作 (列)。更多代码运行模拟,Q 表中存储更多的经验。最终,在理想聚合值,并且这会导致更精确的模型。中的代码图 2将运行模拟 2,000 倍。

虽然很多代码非常简单,且只需提供的说明匹配,您可能会发现的代码段中的以下行有点棘手:

Qtable[s,a] = Qtable[s,a] + lr*(r + gamma*np.max(Qtable[s1,:]) - Qtable[s,a])

此代码实现 Bellman 公式并将结果存储在问题与解答-表中。Bellman 公式的完整讨论超出了本专栏的范围。现在,了解 Bellman 等式表示与一系列操作相关联的回报。可能在 YouTube 上找到此公式的完整演练bit.ly/2n1eEc5

在新的单元格中输入以下代码并执行它:

print( "score: " +  str(sum(rList)/num_episodes) )

生成的分数是获得超过 2,000 次迭代的回报的平均值,大致相当于准确性。此评分应位于 0.42 英寸和 0.54,这意味着该算法将成功导航其方法与通过 42%54%的时间之间的某个位置的环境的范围内。不完美,但一定能好过生成的随机推测过去操作没有内存的 1%成功率。

更紧密地检查 Q 表

最后,它可能有助于深入了解一下在 Q 表。一个空单元格中输入"Qtable"并执行它。输出将是 16 x 4 表格 0 和 1 之间的数字。请注意,某些行完全填充了零。输入"Qtable [1,:]"为一个空单元格并执行代码。输出将如下所示:

array([0.00081276, 0.00239483, 0.00018525, 0.15080315])

此结果表示代理了解 (登上) 的第四个操作是奖励的最有可能路径,在环境处于一个状态时。填充了零行指示算法永远不会填充的值,并且它所用段中保留为默认值。当在迭代结束时,代理也陷入了一个三角形孔或达到目标,则会发生这种情况。

总结

在本文中,我探讨了 RL 和两个方法,以了解环境的关键组件。代理已了解如何进行导航与没有人工指导 ice 字段。代理未的所有内容,它介绍了其自身上。在这两种情况下,代理随机探讨了其环境。在第二个示例中,代理使用了某个问题与解答表,或查找表,在什么移动以使提供指导的基于环境的当前状态。这为提供了代理类型的内存,它可以从何处了解从过去的决策。如您所看到的则结果是将会大大提高成功率中。

RL 之间在 artificial intelligence 最吸引人的空格是稍后再试。如 AlphaGo 零具有所示,人工输入不再是机器学习的必备组件。很多这项技术的潜在应用程序时,存在着重大的挑战,若要在任何实际的项目中使用它之前解决。

特别感谢亚瑟 Juliani 和他的博客文章"使用 Tensorflow 第 0 部分的简单强化学习:问: 学习使用表和神经网络"(bit.ly/2OxySXQ),其中提供 Bellman 公式在 Python 中实现的示例。


Frank La Vigne是 Microsoft 一 AI 技术解决方案专业人员,他可帮助公司获益更多通过充分利用其数据与分析和 AI。他还共同主持 DataDriven 播客。他定期在 FranksWorld.com 和您可以看到他在他的 YouTube 频道"Frank's World TV"(FranksWorld.TV)。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Andy Leonard


在 MSDN 杂志论坛讨论这篇文章