为什么我的神经网络玩井字游戏的适应度一直在波动?

人工智能 训练 进化算法 前馈神经网络 适应功能 健身设计
2021-10-19 04:06:47

我写了一个简单的前馈神经网络来玩井字游戏:

  • 输入层中有 9 个神经元:1 - 我的符号,-1 - 对手的符号,0 - 空;
  • 隐藏层 9 个神经元:使用 ReLU 计算的值;
  • 输出层 9 个神经元:使用 softmax 计算的值;

我正在使用一种进化方法:100 个人互相对抗(all-play-all)。前 10 名最好的被挑选出来变异并繁殖到下一代。计算出的适应度得分:正确移动+1(可以将您的标志放在已经占用的瓷砖上),+9 胜利,-9 失败。

我注意到的是,网络的适应度不断攀升并再次下降。似乎我目前的方法只是在板上放置标志时演变出某些模式,一旦随机突变中断了当前模式,新的模式就会出现。我的网络在没有发展实际战略的情况下转圈。我怀疑解决方案是让网络与井字游戏人工智能相抗衡,但有没有办法仅仅通过与自己对战来发展实际策略?

2个回答

我注意到的是,网络的适应度不断攀升并再次下降。似乎我目前的方法只是在板上放置标志时演变某些模式,一旦随机突变中断当前模式,新的模式就会出现。我的网络在没有发展实际战略的情况下转圈。我怀疑对此的解决方案是将网络与井字游戏人工智能相提并论,但是有没有办法仅仅通过与自己对战来发展实际策略?

这种现象的可能原因是您的适应度函数涉及通过让智能体扮演许多其他智能体(整个人口)来评估智能体的适应度,其中许多可能是非常差的智能体。

因为井字游戏是如此简单的游戏,我们知道双方的最佳游戏会导致平局。假设我们有以下三种策略的人口:

  • π1: 最佳球员
  • π2: 次优玩家
  • π3: 一个不同的次优玩家

很容易出现最佳玩家的情况π1与两个次优的玩家打成平手(如果他们不是非常糟糕的话),因为从一开始,一个最优的玩家就会玩得足够“安全”,这样它仍然可以保证与一个最优的对手打平,这可能不是战胜次优玩家的最快方式。

在同样的情况下,次优玩家π2例如,可能能够持续战胜稍差的次优玩家π3. 在此示例情况下,您的适应度函数对代理进行排名f(π2)>f(π1)>f(π3),这是错误的。


正如您已经建议自己的那样,解决此问题的最直接方法是简单地评估策略的适用性,让它们与最优的 minimax-agent 对抗,而不是许多策略(包括糟糕的策略)。

如果你真的想只使用进化而不是树搜索,你将不得不找到一种方法来修复适应度函数,这样上述问题就不会再发生了您可以尝试这样做的一种方法(不是 100% 确定它会起作用,但想象一下它可能会起作用)是设置一些更大的锦标赛分组,如果代理人能够击败与他们配对的其他人,他们会在分组中晋级跟上。在比赛中走得更远会增加代理人的适应度。非常糟糕的次优球员如果被其他(次)最佳代理人击败,他们应该无法在锦标赛中取得很大进展,但设法晋级的次优代理人仍然应该无法获得超过平局的成绩对抗最优代理。这个想法需要记住一些事情:

  • 您可能希望在括号中使用不同的随机初始配对多次重复整个锦标赛,并根据锦标赛所有重复的平均(或者可能是中值或最大值)排名计算适应度。这将过滤掉那些在括号中遇到的对手特别幸运或不幸的人群。
  • 你必须考虑代理人在这样的锦标赛中选择了哪些动作。他们是否确定地执行由argmaxsoftmax 输出(在这种情况下,您也可以只使用线性输出而不是 softmax 输出,因为 softmax 函数不会改变输出的排名)。或者他们是否根据 softmax 分布不确定地对动作进行采样?根据 softmax 分布对动作进行采样似乎很有吸引力,因为它会导致遇到的游戏状态情况出现更多变化,并且具有鲁棒性并能够处理许多不同的游戏状态非常重要。另一方面,它确实会引入噪音,并可能使最佳代理意外丢失。我想我会走向确定性游戏argmax在 softmax 输出上。在大型锦标赛中,由于遇到许多不同的对手,仍然会有足够的多样性。
  • 您必须考虑处理两个代理可能无限地相互吸引的情况。哪个经纪人晋级?如果发生这种情况,我想我会逐渐从确定性玩argmax根据 softmax 分布进行播放的动作。这保证了有人最终会失败。像这样对多个不同比赛的结果进行平均,加上对整个锦标赛的多次不同重复进行平均,应该会产生准确的结果。
  • 您将要考虑如何处理非法行为您描述了在适应度函数中包括对非法行为的惩罚。这会在适应度函数中引入额外的噪声/方差,这已经很难开始,所以我不会这样做。我建议有一个手动后处理步骤,您可以在其中手动设置正在播放的非法操作的概率0, 并规范化以确保剩余动作的概率加起来1再次。例如,这也是 DeepMind 在其最先进的 Go/Chess/Shogi 代理中所做的(在更大范围内)。如果你真的不想这样做,如果你真的想要进化策略自动学习永远不要为非法行为产生高输出,我建议如果他们确实提出非法行为,立即让他们输掉游戏。这样,您仍然拥有仅基于赢/平/输的“干净”适应度函数。

游戏的特点就是这些。

  • 移动是二维的
  • 由于对称性(角、边缘、中间),只有三个可能的第一步移动
  • 在那之后永远不会超过七种可能的动作
  • 没有随机的游戏元素(例如掷骰子)
  • 没有秘密(例如一手牌)
  • 完美的比赛不会输
  • 只有一个由两部分组成的规则:(1)必须在未标记的单元格中做出标记(2)
  • 只有一个获胜条件:三连胜

目标策略是获得两个标记,这样第三个将需要在一个对手移动中两个块。三层网络将能够学习该策略。因为游戏的复杂性很低,突变总是会对游戏玩法产生根本性的影响。这意味着由于突变引起的变化必须是渐进的,并且必须在找到策略时停止。这意味着有状态学习是最好的。

这个问题与人与自我游戏无关。

由于每转只有一个标记,因此 soft max 对输出层没有多大意义。你想要二进制输出——最后一层的阈值激活函数。使用两对二进制输出单元,每个维度一对。