强化学习主要包括状态空间、价值函数、状态转移三个部分,经过状态之间的转移来获得每一个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不一样的是,监督学习一般须要大量的样原本得到有价值的信息,而强化学习却不须要,强化学习能够不须要预先给定任何知识,只须要指定必定的策略和回报,它能够经过不断地尝试和探索,从而能够进行最优的决策,并且随着尝试的次数增多,决策也会愈来愈最优。(原文在我的微信公众号:deeplearningdigest)算法
今天经过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个能够人机对弈的五子棋程序。因为完整的棋盘致使状态空间太大,我的PC一时难以训练,所以这里咱们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的状况就是:微信
同一行或者同一列的棋子相同;机器学习
正对角线或反对角线的棋子相同。函数
那么如何定义价值函数呢?首先,咱们把棋盘上每一种布局看作一种状态空间,而后每一种状态空间又对应一个价值,咱们把全部价值组合起来称为价值空间,价值空间中的每一个状态的价值都是要经过价值函数获得。不一样状态之间的价值相对大小决定着该状态赢得棋局的几率大小,例如若是状态A的价值大于状态B的价值,那么咱们能够认为状态A能赢的几率大于状态B能赢的几率。布局
关于全部状态的价值初始化方法以下:假如咱们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,若是有三个O棋子在一条直线上,也就表明X输了,因而此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,咱们把全部平局的状态的价值都设置为0;而后还有一些状态是表示棋还没下完,没法判断输赢或平局,这种状况价值设置为0.5,由于咱们以为双方都有可能会赢。学习
那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种状况,分别是X、O、Empty,状态转移只能是转移到Empty的点。spa
具体玩家指定下一步是到哪个Empty点的策略是:为了保证能在机器学习的exploration和exploitation两者之间作出一个折中,一般有两种算法,一种是贪婪算法,另一种是随机算法。贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就比如日常咱们在叫外卖时,你能够去点一个以前本身最喜欢的外卖,也能够去尝试一种新的口味,那么第一种状况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种状况对应的就是随机算法,也就是机器学习中的exploration。设计
有了贪婪算法和随机算法事后,就要考虑什么时候使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的状况应该要占大多数,所以咱们这里设置一个几率阈值0.1,在每一次状态转移以前,经过随机抽样0~1之间的数来采起不一样的算法。若是它小于0.1,咱们采起随机算法;若是它大于0.1,咱们就采起贪婪算法。开发
随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置便可做为下一步的位置;而贪婪算法的执行过程是遍历全部的Empty位置获得全部的状态,而且计算每一个状态的价值,找出其中最大价值的那个状态。与随机算法所不一样的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式以下:it
V(s)=V(s)+alpha*[V(s')-V(s)]
其中V表示价值空间,s表示上一个状态,s'表示下一个状态,alpha表示一个相似学习率同样的参数,本文中设置为0.99,这里能够类比梯度降低算法,只不过这里使用的是时间上的差分。
按照以上的描述,咱们就能够设计一个会下五子棋的Agent了,这个Agent先让它本身与本身对弈必定次数,次数越多,技术越强。它具有了基本的技术之后,就能够进行人机对弈了,而且,随着人机对弈次数愈来愈多,它也会变得愈来愈强大了。
因为五子棋状态空间较多,计算量较大,而若是设置机器人自身对弈次数较小的话,演示效果不佳;所以这里给出9宫格的演示结果(三个连成一条线就表明赢了),首先让Agent本身与本身下了30000局,而后我来和它下,结果以下图所示,X表明我,O表明Agent:
第一步,我走(0,0):
而后机器走出(1,1):
第二步,我走(1,0),而后机器走出(2,0):
第三步,我走出(0,2),而后机器走出(0,1):
第四步,我走出(2,1),而后机器走出(2,2),最后只剩一个地方我走了(1,2),所以最终达成平局。
从上能够看出,机器以及具有了基本的下棋技能。对于五子棋,演示方式也是和上面的同样。下面给出开发人机对弈的五子棋程序Python代码: