最佳/最简单的AI学习模块是什么?
我看了这个帖子。
我想知道怎么让一个人工智能从零开始学会玩游戏。举个例子,比如说这个AI要去玩二十一点(黑杰克),它不考虑分牌、牌堆里的牌等等。这个AI可以选择要牌或者停牌,但它一开始并不知道自己在做什么,直到它开始输掉游戏。它应该学会,过多要牌会导致输,而太早停牌也会输。我听说这叫做强化学习,但我不知道怎么实现,也不知道该用什么模块等等……
我该从哪里开始呢?
我的最终目标是创建一个游戏,用户和AI一起玩,不是互相对抗,而是都在和游戏机制较量(不是合作),而且双方都能学习怎么玩。这个游戏会不时变化,新的机制会出现,让玩家和AI都觉得更难。AI会通过玩游戏和观察玩家的输赢来学习。不过,我不想让电脑学得太快,我希望两者在同一个“起跑线”上……也许最终的目标是玩家可以和AI对抗。我这样做对吗,还是应该尝试其他方法?
补充:我觉得这个问题可能太宽泛了。所以我查了一下关于机器学习和人工智能的资料,发现了一些可能有用的模块,比如scikit-learn、PyBrain、neurolab,还有RLToolkit。前两个我不太明白怎么入手,文档对我这样的新手来说很不清楚,neurolab我还没试过,因为我不太明白什么是人工神经网络(ANN),它能帮我什么,而最后一个专门针对强化学习的模块没有任何文档。
1 个回答
虽然这不是一个完整的答案,但基本原则是这样的:
在结果不可预测的情况下,当前状态 + 可能的动作 = 结果。也就是说,在游戏的某个特定状态下(比如手里有一定数量或组合的牌,可能还有其他人手里有一些未知的牌,或者自上次洗牌以来已经看到的某些牌),你可以进行一些可能的操作(比如要牌或停牌)。你会尝试其中一个动作,然后记录这个动作是给你带来了好的结果、坏的结果,还是介于两者之间的结果。下次再遇到相同的当前状态时,你就可以查看哪个可能的动作到目前为止给你带来了最好的统计结果(带有一定的随机性百分比)。
如果你有多个动作,而直到最后才得到实际结果,你就需要记录所有的(状态+尝试的动作);一旦你得到了结果,就把这个结果应用到之前的每一步。
完成这些后,你就让它玩大量的游戏,随着时间的推移,它应该会变得更好。
通常的关键是弄清楚什么构成一个“状态”。状态越多,AI变得优秀所需的游戏数量就越多,你的数据库也会越大。在二十一点游戏中,状态可能只是手中牌的总和(这会给你20种状态),或者可能还包括其中有多少张是A(这可能会有大约40种状态);它可能还会包括其他玩家手中有多少张牌;可能还会包括你手中具体有哪些牌的点数,但不考虑花色(如果你有4张A,你就知道其他人没有A),或者可能包括(对于二十一点来说没有意义的)牌的花色顺序。
在某些情况下,“状态”可能更抽象。例如,在国际象棋中,有很多可能的“状态”,需要学习所有这些状态,我们必须进行抽象。我不太清楚通常用什么来表示这些状态;也许是哪些棋子在攻击哪些,哪些棋子在防守哪些,有多少个方格被多少个棋子覆盖,哪些棋子被什么保护,等等;或者
你可能还需要考虑什么是“好”的结果和“坏”的结果。你可能会认为,在二十一点中,赢是好的,输是坏的,仅此而已。然而,有一种情况是比输更需要避免的:做出无效的动作。在二十一点的例子中,假设你的AI不知道规则,如果你有的手牌不是一对却选择分牌,那比(可能)输掉还要糟糕。如果你把这个算作“失败”,它最终会明白并停止这样做。