搜索
大数据中国 首页 热点综合 人工智能 查看内容
手把手教你训练一个神经网络,打爆21点!
2019-10-19 19:25 | 查看: 2467| 评论: 0

21点又名黑杰克(Blackjack),起源于法国,已流传到世界各地,有着悠久的历史。


现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代。该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。


Medium上一位程序员小哥就尝试用代码模拟玩21点,在用朴素策略试验后,小哥又将目光转向了深度学习,一起来看看吧。


上次我们开发了代码来模拟玩21点游戏,并发现了在这类赌局中获胜的关键因素。让我们先来快速回顾一下:


1、赌场的优势在于可以要求21点的玩家(根据不完整的信息)先于庄家拿牌,这使得玩家面临爆牌(bust,玩家的牌总点数超过21)的风险,有些玩家们甚至可能在庄家还未拿牌前就已经自爆了。


2、当玩家的手中牌总点数在12到16之间,并且比庄家点数小时尤为危险(玩家有可能在拿到下一张牌时自爆)。在这种情况下,如果庄家最终的总点数为大,则玩家要么继续拿牌要么放弃拿牌(停牌)。从下图可以清晰看到,总点数在12到16这一区间时玩家赢的几率最低(我们称之为“绝望之谷”)。


赢得赌局或打平的几率随玩家手牌总点数的变化(总点数为21时是必赢,概率为1)


3、最后,我们发现“仅在完全不会自爆时才要牌”的朴素策略就可极大地提高击败赌场的几率,因为这种策略将自爆的风险完全转移给了赌场。


如果你不熟悉21点游戏,那可以看我的上一篇文章,里面介绍了怎么玩以及相应的游戏规则。


文章链接:

https://towardsdatascience.com/lets-play-blackjack-with-python-913ec66c732f \t _blank


深度学习能做得更好吗?


这篇文章的主旨在于弄清楚是否可以通过深度学习找到比上面提到的朴素策略更好的策略。我们将:


1、用我们上次开发的21点模拟器生成数据(进行少量修正使其更适合用作训练算法)


2、编码并训练神经网络玩21点(最优情况下)
 

图解简单神经网络


在进入训练过程前,让我们先来快速讨论一下使用神经网络的利弊。神经网络是一种高度灵活的算法——就像软粘土一样,神经网络可以自我调整或进行少量转换就能适用于不同的数据集。通过神经网络可以轻松处理像线性回归这样比较刻板的问题。此外,网络层和神经元还能学习深藏于数据中的非线性关系。


但是,神经网络的这种多功能性需要一定的代价,因为它是一个黑匣子。与回归不同,在回归中我们可以通过查看回归系数来了解模型如何做出决策,而神经网络则缺乏这种透明度。同时,神经网络也存在过拟合的风险,就是对数据过度拟合以至于无法对样本数据进行很好的泛化。这些缺点虽不足以使我们放弃使用神经网络,但却值得我们牢记并设计防范措施。


生成训练数据


在训练神经网络前,我们首先需要弄清楚如何构造训练数据,这样训练出的模型才有意义。


我们想要预测什么?在我看来,我们的目标变量有两个候选参数:


1. 输掉赌局的概率。在这种情况下,我们可能希望模型告诉我们失败的可能性是多少。再说一次,这只有在我们可以增加或减少赌注的情况下才有用,而这在21点中不适用。


2. 实际上,我们更希望我们的神经网络能够给出正确的行为,拿牌还是停牌。因此,我们的目标变量应为“究竟是拿牌还是停牌”。


我花了一段时间才找出分析目标变量的最佳方法。下文阐述了我找到的方法。


我们需要一种让神经网络知道给定行为是否正确的方法。这种方法不需要确保万无一失,只需要大体正确即可。因此,我判断给定行为是否正确的方法是模拟一场21点游戏:将牌分发给玩家和庄家,检查是否有人拿到了21点,决定一个拿牌的行为(拿牌或停牌),如此模拟游戏直到结束并记录结果。由于模拟玩家每次只做出一个决定,因此我们可以通过他的输赢来评估该决定的质量:


  • 如果玩家要牌并获胜,那拿牌(Y=1)是正确的决定。

  • 如果玩家要牌但输了赌局,那停牌(Y=0)是正确的决定。

  • 如果玩家不要牌并获胜,那停牌(Y=0)是正确的决定。

  • 如果玩家不要牌但输了赌局,那拿牌(Y=1)是正确的决定。


我们基于此规则训练模型,其输出是对于拿牌还是停牌的预测。这次的代码与上次相似,因此在这里我不做详细介绍


GitHub链接:

https://github.com/yiuhyuk/blackjack


代码的主要功能:
1. 庄家的明牌(另一张暗牌,牌面朝下)
2. 玩家手里牌点数总和
3. 玩家手里有没有A
4. 玩家的决定(拿牌还是停牌)


目标变量为由上述逻辑定义的正确决策。


训练神经网络


我们的神经网络将使用Keras(开源神经网络库)。先看模块导入:


from keras.models import Sequential
from keras.layers import Dense, LSTM, Flatten, Dropout
免责声明: 除非特别声明,文章均为投稿或网络转载,仅代表作者观点,与大数据中国网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。如果本文内容有侵犯你的权益,请发送信息至ab12-120@163.com,我们会及时删除

最新评论

关闭

站长推荐上一条 /1 下一条

 
 
大数据行业交流
大数据行业交流
大数据求职招聘
大数据求职招聘
站长电话:
15010106923
微信联系:
hb-0310
站长邮箱:
ab12-120@163.com
大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-4-23 21:33 , Processed in 0.107042 second(s), 23 queries .