向AlphaGo进化,应用增强式学习技术打造超越人类的围棋机器人

AlphaGo在与李世石或柯洁对弈过程中有个休息流程。此时人类选手利用这段时间充分放松思维,让自己从上一盘比赛的剧烈思维活动中抽身而出,让身体和思维获得恢复以便再战。但此时AlphaGo并没有休息,而是抓住这段时间自己跟自己对弈,在对方休息时,它可能又让自己下了好几万盘棋,于是自己的下棋能力又有了新的提升。当下一盘棋开始时,李世石和柯洁唯一的变化是由体力的下降而变弱了,而AlphaGo通过自我对弈增强了,如此此消彼长,最终结局自然不难预料。

从本节开始,我们将深入研究AlphaGo自我对弈的技术。这种人工智能自我增强的能力较增强式学习。业余与专业的最大区别不在于智商上的差异,而在于练习量上的显著差异。专业人士的练习量是业余人士的十倍,乃至百倍以上,能力的差异其实是实践量级上的差异而导致。

知识分为显性知识和隐形知识。显性知识可以通过文字进行传播,而隐性知识无法通过任何媒介传播,只能个人进行大量练习后才能捕捉和感受到隐性知识。所以一个人无论背诵多少棋谱,你都不能成为高手,高手能够在错综复杂的棋局中,通过过往的经验和直觉找到最佳落子点,这种能力可不是通过书本能够传达。

因此高手的能力都是通过反复艰辛的刻意练习后才能掌握。既然练习能让人的能力增强,我们是否刻意把这个模式应用到神经网络的训练中?答案是肯定的。在增强式学习中,我们让网络反复进行一个任务,一开始网络会随机在所有可能的决策中选择一种,如果它选中了对的决策,我们就给予网络正向激励,让网络下次继续挑选具有类似性质的决策。如果它选中了错误的决策,我们给它惩罚,让它下次避开类似性质的决策。

增强式学习技术非常强大,它可以让网络实现自我进化。但天下没有免费的午餐。首先这种技术计算量非常大,其次要设计合适的激励与惩罚机制很困难,因此增强式学习是比我们以前简单将数据输入网络然后撒手不管的方法还要高级的设计思路,我们看看增强式学习的基本流程:

首先我们让网络自我对弈。它要把对弈中的每个步骤,以及最终结果记录下来。接着我们要设计一种机制,让网络懂得如何从记录的数据中进行学习,由于棋盘中无论黑子还是白子都是网络自己下的棋,如果黑棋赢了,那么它就知道黑棋落子方式比白棋落子方式更好,于是下次下棋时,它就要从黑棋中”总结“经验,从白棋中”吸取“教训。问题是如何”总结“和”吸取“,这里面对应着一系列数学模型和算法。

在增强式学习中,一次任务流程叫”episode”,在期间网络需要进行各种决策,所谓决策就是,网络面临给定几种选择,网络根据当前具体情况,从给定选择中选一种,当网络做出选择后,环境会根据网络的选择做出回应。对应到围棋,环境就是棋盘和对手,当前棋盘状况所允许的落子方式就是网络当前拥有的选择,网络在选定一种落子方式后,对手会根据网络的落子方式进行相应落子,当棋局结束后,一个”episode”结束,如果网络赢了,那么它获得激励,如果输了,他就获得惩罚。

这里我们还得量化一个说法叫“根据当前情况作出选择”。我们会制定一个“政策”函数,函数的输入就是当前棋盘,输出是落子方式,函数的计算依赖于里面的一系列参数,对于相同棋盘,内部参数变了,输出的结果也不一样,我们的目的就是要调整这些参数,让政策函数在给定的输入棋盘中,计算出赢率最大的落子方式。

增强式学习跟以前我们使用的神经网络不同还在于,以前网络会根据当前棋盘状况计算每一步落子的胜率,然后选出概率最大的那一步。增强式学习不同在于,它也会根据棋盘状况计算每一步落子的胜率,但它不是选择概率最大那步,而是通过特定算法选择概率小一些的落子方式,于是对于相同棋盘,输入给神经网络时,它总会做出相同的预测,但是在增强式学习中,对于两次输入相同的棋盘,它可能会做出不同的决策。

这里我们还需要说明一个问题叫概率采样。概率采样是指根据事情发生的概率模拟发生时的情景。假设你模拟石头剪刀布游戏,你设计的角色以50%的概率出石头,30%概率出布,20%出剪刀,于是用以下代码模拟整个过程:

#取0,1间随机数
randval = random.random()
if 0.0 <= randval < 0.5:
  #如果随机数处于[0,0.5]之间就出石头
  return 'rock'
if  0.5 <= randval < 0.8:
  #如果随机数处于[0.5, 0.8]之间就出布
  return  'paper'
if  0.8 <= randval < 1:
  #如果随机数处于[0.8, 1]之间就出剪刀
  return  'sciessor'

我们看上面的代码每次运行时,返回的内容都不一样,但内容的返回肯定追随一定规律,特别是在上面代码运行次数足够多时,规律的显示就越明显。如果执行次数不够多,我们就看不出石头,剪刀,布其实有特定的出现概率,例如你只运行上面代码10次,那么很可能剪刀会出现5次。

在python中给我们提供了方便的方式实现上面功能而不必要写那么多代码,使用python库完成上面功能的方法如下:

return  np.random.choice(['rock', 'paper' , 'scissor'], size = 3,
replace = False,
 p= [0.5, 0.3, 0.2])

其中size = 3表示连续模拟运行三次,replace=False表示非替代性模拟,如果它的值是True,那么第一次如果出现剪刀,代码就会把剪刀去除,下次模拟就不能再出剪刀,而False是让代码每次模拟时,三种情况都能出现。这种方法在后面我们会反复使用在增强式学习中。

我们还需了解的一点叫极端概率剔除。在增强式学习的前期,网络运行很不稳定。它会对某些落子方式赋予高概率,即使这种落子方式并不好。由于增强式学习的特点是不断训练网络更多的采取高概率标明的落子方式,于是由于前期网络不稳定而产生的高概率落子方式会对网络后期训练产生严重误导,于是在训练时,我们就得把一些不同寻常的高概率落子方式剔除掉,也就是把那些非常接近概率1或者概率0的落子方式剔除掉,我们使用下面代码完成这个功能:

min_p = 1e-5
max_p = 1 - min_p
'''
original_probs是网络产生的每一步落子概率,下面代码把所有概率小于min_p,
大于max_p的落子步骤给删除掉
'''
clipped_probs = np.clip(original_probs, min_p, max_p)
'''
由于我们删除掉一些步骤会使得original_probs中所有步骤对应的概率加总不等于1,下面的计算使得删除后所有步骤概率加总变成1
'''
clipped_probs = clipped_probs / np.sum(clipped_probs)

以上就是我们对增强式学习的入门介绍。对于技术而言,任何言语的描述都是苍白,掌握技术的最好方法永远是做中学,本节我们只让大家了解基本概念,从下一节开始,我们进入到增强式学习的开发和研究中去。

原文发布于微信公众号 - Coding迪斯尼(gh_c9f933e7765d)

原文发表时间:2019-05-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券