本月累计签到次数:

今天获取 积分

人机对弈

人机对弈

348 浏览

基于强化学习开发人机对弈五子棋游戏

机械自动化类 密泰传动系统 2016-12-07 11:37 发表了文章 来自相关话题

 上一期提到过,强化学习主要包括状态空间、价值函数、状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息,而强化学习却不需要,强化学习可以不需要预先给定任何知识,只需要指定一定的策略和回报,它可以通过不断地尝试和探索,从而可以进行最优的决策,而且随着尝试的次数增多,决策也会越来越最优。


今天通过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个可以人机对弈的五子棋程序。由于完整的棋盘导致状态空间太大,个人PC一时难以训练,因此这里我们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的情况就是:

同一行或者同一列的棋子相同;
 
正对角线或反对角线的棋子相同。


那么如何定义价值函数呢?首先,我们把棋盘上每一种布局看做一种状态空间,然后每一种状态空间又对应一个价值,我们把所有价值组合起来称为价值空间,价值空间中的每个状态的价值都是要通过价值函数得到。不同状态之间的价值相对大小决定着该状态赢得棋局的概率大小,例如如果状态A的价值大于状态B的价值,那么我们可以认为状态A能赢的概率大于状态B能赢的概率。


关于所有状态的价值初始化方法如下:假如我们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,如果有三个O棋子在一条直线上,也就代表X输了,于是此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,我们把所有平局的状态的价值都设置为0;然后还有一些状态是表示棋还没下完,无法判断输赢或平局,这种情况价值设置为0.5,因为我们觉得双方都有可能会赢。


那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种情况,分别是X、O、Empty,状态转移只能是转移到Empty的点。



具体玩家指定下一步是到哪一个Empty点的策略是:为了保证能在机器学习的exploration和exploitation二者之间做出一个折中,通常有两种算法,一种是贪婪算法,另外一种是随机算法。贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就好比平常我们在叫外卖时,你可以去点一个之前自己最喜欢的外卖,也可以去尝试一种新的口味,那么第一种情况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种情况对应的就是随机算法,也就是机器学习中的exploration。


有了贪婪算法和随机算法过后,就要考虑何时使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的情况应该要占大多数,因此我们这里设置一个概率阈值0.1,在每一次状态转移之前,通过随机抽样0~1之间的数来采取不同的算法。如果它小于0.1,我们采取随机算法;如果它大于0.1,我们就采取贪婪算法。


随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置即可作为下一步的位置;而贪婪算法的执行过程是遍历所有的Empty位置得到所有的状态,并且计算每个状态的价值,找出其中最大价值的那个状态。与随机算法所不同的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式如下:

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代码:













































来源: 张泽旺 深度学习每日摘要
智造家 查看全部

6.1_.jpg

 上一期提到过,强化学习主要包括状态空间、价值函数、状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息,而强化学习却不需要,强化学习可以不需要预先给定任何知识,只需要指定一定的策略和回报,它可以通过不断地尝试和探索,从而可以进行最优的决策,而且随着尝试的次数增多,决策也会越来越最优。


今天通过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个可以人机对弈的五子棋程序。由于完整的棋盘导致状态空间太大,个人PC一时难以训练,因此这里我们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的情况就是:

  • 同一行或者同一列的棋子相同;

 
  • 正对角线或反对角线的棋子相同。



那么如何定义价值函数呢?首先,我们把棋盘上每一种布局看做一种状态空间,然后每一种状态空间又对应一个价值,我们把所有价值组合起来称为价值空间,价值空间中的每个状态的价值都是要通过价值函数得到。不同状态之间的价值相对大小决定着该状态赢得棋局的概率大小,例如如果状态A的价值大于状态B的价值,那么我们可以认为状态A能赢的概率大于状态B能赢的概率。


关于所有状态的价值初始化方法如下:假如我们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,如果有三个O棋子在一条直线上,也就代表X输了,于是此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,我们把所有平局的状态的价值都设置为0;然后还有一些状态是表示棋还没下完,无法判断输赢或平局,这种情况价值设置为0.5,因为我们觉得双方都有可能会赢。


那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种情况,分别是X、O、Empty,状态转移只能是转移到Empty的点。



具体玩家指定下一步是到哪一个Empty点的策略是:为了保证能在机器学习的exploration和exploitation二者之间做出一个折中,通常有两种算法,一种是贪婪算法,另外一种是随机算法。贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就好比平常我们在叫外卖时,你可以去点一个之前自己最喜欢的外卖,也可以去尝试一种新的口味,那么第一种情况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种情况对应的就是随机算法,也就是机器学习中的exploration。


有了贪婪算法和随机算法过后,就要考虑何时使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的情况应该要占大多数,因此我们这里设置一个概率阈值0.1,在每一次状态转移之前,通过随机抽样0~1之间的数来采取不同的算法。如果它小于0.1,我们采取随机算法;如果它大于0.1,我们就采取贪婪算法。


随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置即可作为下一步的位置;而贪婪算法的执行过程是遍历所有的Empty位置得到所有的状态,并且计算每个状态的价值,找出其中最大价值的那个状态。与随机算法所不同的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式如下:

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):

6.2_.JPG


然后机器走出(1,1):

6.3_.JPG


第二步,我走(1,0),然后机器走出(2,0):

6.4_.JPG


第三步,我走出(0,2),然后机器走出(0,1):

6.5_.JPG


第四步,我走出(2,1),然后机器走出(2,2),最后只剩一个地方我走了(1,2),因此最终达成平局。

6.6_.JPG




从上可以看出,机器以及具备了基本的下棋技能。对于五子棋,演示方式也是和上面的一样。下面给出开发人机对弈的五子棋程序Python代码:

6.7_.jpg


6.8_.jpg


6.9_.jpg


6.10_.jpg


6.11_.jpg


6.12_.jpg


6.13_.jpg


6.14_.jpg






来源: 张泽旺 深度学习每日摘要
智造家
348 浏览

基于强化学习开发人机对弈五子棋游戏

机械自动化类 密泰传动系统 2016-12-07 11:37 发表了文章 来自相关话题

 上一期提到过,强化学习主要包括状态空间、价值函数、状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息,而强化学习却不需要,强化学习可以不需要预先给定任何知识,只需要指定一定的策略和回报,它可以通过不断地尝试和探索,从而可以进行最优的决策,而且随着尝试的次数增多,决策也会越来越最优。


今天通过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个可以人机对弈的五子棋程序。由于完整的棋盘导致状态空间太大,个人PC一时难以训练,因此这里我们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的情况就是:

同一行或者同一列的棋子相同;
 
正对角线或反对角线的棋子相同。


那么如何定义价值函数呢?首先,我们把棋盘上每一种布局看做一种状态空间,然后每一种状态空间又对应一个价值,我们把所有价值组合起来称为价值空间,价值空间中的每个状态的价值都是要通过价值函数得到。不同状态之间的价值相对大小决定着该状态赢得棋局的概率大小,例如如果状态A的价值大于状态B的价值,那么我们可以认为状态A能赢的概率大于状态B能赢的概率。


关于所有状态的价值初始化方法如下:假如我们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,如果有三个O棋子在一条直线上,也就代表X输了,于是此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,我们把所有平局的状态的价值都设置为0;然后还有一些状态是表示棋还没下完,无法判断输赢或平局,这种情况价值设置为0.5,因为我们觉得双方都有可能会赢。


那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种情况,分别是X、O、Empty,状态转移只能是转移到Empty的点。



具体玩家指定下一步是到哪一个Empty点的策略是:为了保证能在机器学习的exploration和exploitation二者之间做出一个折中,通常有两种算法,一种是贪婪算法,另外一种是随机算法。贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就好比平常我们在叫外卖时,你可以去点一个之前自己最喜欢的外卖,也可以去尝试一种新的口味,那么第一种情况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种情况对应的就是随机算法,也就是机器学习中的exploration。


有了贪婪算法和随机算法过后,就要考虑何时使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的情况应该要占大多数,因此我们这里设置一个概率阈值0.1,在每一次状态转移之前,通过随机抽样0~1之间的数来采取不同的算法。如果它小于0.1,我们采取随机算法;如果它大于0.1,我们就采取贪婪算法。


随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置即可作为下一步的位置;而贪婪算法的执行过程是遍历所有的Empty位置得到所有的状态,并且计算每个状态的价值,找出其中最大价值的那个状态。与随机算法所不同的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式如下:

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代码:













































来源: 张泽旺 深度学习每日摘要
智造家 查看全部

6.1_.jpg

 上一期提到过,强化学习主要包括状态空间、价值函数、状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息,而强化学习却不需要,强化学习可以不需要预先给定任何知识,只需要指定一定的策略和回报,它可以通过不断地尝试和探索,从而可以进行最优的决策,而且随着尝试的次数增多,决策也会越来越最优。


今天通过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个可以人机对弈的五子棋程序。由于完整的棋盘导致状态空间太大,个人PC一时难以训练,因此这里我们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的情况就是:

  • 同一行或者同一列的棋子相同;

 
  • 正对角线或反对角线的棋子相同。



那么如何定义价值函数呢?首先,我们把棋盘上每一种布局看做一种状态空间,然后每一种状态空间又对应一个价值,我们把所有价值组合起来称为价值空间,价值空间中的每个状态的价值都是要通过价值函数得到。不同状态之间的价值相对大小决定着该状态赢得棋局的概率大小,例如如果状态A的价值大于状态B的价值,那么我们可以认为状态A能赢的概率大于状态B能赢的概率。


关于所有状态的价值初始化方法如下:假如我们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,如果有三个O棋子在一条直线上,也就代表X输了,于是此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,我们把所有平局的状态的价值都设置为0;然后还有一些状态是表示棋还没下完,无法判断输赢或平局,这种情况价值设置为0.5,因为我们觉得双方都有可能会赢。


那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种情况,分别是X、O、Empty,状态转移只能是转移到Empty的点。



具体玩家指定下一步是到哪一个Empty点的策略是:为了保证能在机器学习的exploration和exploitation二者之间做出一个折中,通常有两种算法,一种是贪婪算法,另外一种是随机算法。贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就好比平常我们在叫外卖时,你可以去点一个之前自己最喜欢的外卖,也可以去尝试一种新的口味,那么第一种情况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种情况对应的就是随机算法,也就是机器学习中的exploration。


有了贪婪算法和随机算法过后,就要考虑何时使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的情况应该要占大多数,因此我们这里设置一个概率阈值0.1,在每一次状态转移之前,通过随机抽样0~1之间的数来采取不同的算法。如果它小于0.1,我们采取随机算法;如果它大于0.1,我们就采取贪婪算法。


随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置即可作为下一步的位置;而贪婪算法的执行过程是遍历所有的Empty位置得到所有的状态,并且计算每个状态的价值,找出其中最大价值的那个状态。与随机算法所不同的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式如下:

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):

6.2_.JPG


然后机器走出(1,1):

6.3_.JPG


第二步,我走(1,0),然后机器走出(2,0):

6.4_.JPG


第三步,我走出(0,2),然后机器走出(0,1):

6.5_.JPG


第四步,我走出(2,1),然后机器走出(2,2),最后只剩一个地方我走了(1,2),因此最终达成平局。

6.6_.JPG




从上可以看出,机器以及具备了基本的下棋技能。对于五子棋,演示方式也是和上面的一样。下面给出开发人机对弈的五子棋程序Python代码:

6.7_.jpg


6.8_.jpg


6.9_.jpg


6.10_.jpg


6.11_.jpg


6.12_.jpg


6.13_.jpg


6.14_.jpg






来源: 张泽旺 深度学习每日摘要
智造家