将机器学习应用于猜谜游戏?
Posted
技术标签:
【中文标题】将机器学习应用于猜谜游戏?【英文标题】:Applying machine learning to a guessing game? 【发布时间】:2011-12-24 20:51:21 【问题描述】:我正在制作的游戏有问题。我想我知道解决方案(或应用什么解决方案),但不确定所有“部分”如何组合在一起。
游戏如何运作:
(来自How to approach number guessing game(with a twist) algorithm?)
用户将获得具有价值的物品(价值每天都在变化,并且程序会意识到价格的变化)。例如
Apple = 1
Pears = 2
Oranges = 3
然后他们将有机会选择他们喜欢的任何组合(即 100 个苹果、20 个梨和 1 个橙子)。计算机获得的唯一输出是总值(在本例中,当前为 143 美元)。计算机将尝试猜测他们拥有什么。很明显它在第一回合就无法正确获得。
Value quantity(day1) value(day1)
Apple 1 100 100
Pears 2 20 40
Orange 3 1 3
Total 121 143
下一轮用户可以修改他们的数字,但不超过总量的 5%(或我们可能选择的其他百分比。我会使用 5% 为例。)。水果的价格可以(随机)变化,因此总价值也可能会因此而变化(为简单起见,在这个例子中我没有改变水果价格)。使用上面的例子,在游戏的第 2 天,用户返回值 152 美元,在第 3 天返回 164 美元。这是一个例子。
quantity(day2) %change(day2) value(day2) quantity(day3) %change(day3) value(day3)
104 104 106 106
21 42 23 46
2 6 4 12
127 4.96% 152 133 4.72% 164
*(我希望表格显示正确,我必须手动调整它们的间距,所以希望它不仅仅是在我的屏幕上进行,如果它不起作用,请告诉我,我会尝试上传屏幕截图)。
我想看看我是否能弄清楚随着时间的推移数量是多少(假设用户有耐心继续输入数字)。我现在知道我唯一的限制是总值不能超过 5%,所以我现在不能达到 5% 的准确度,所以用户将永远输入它。
到目前为止我做了什么:
我已经把给我的水果的所有价值和水果篮的总价值都计算出来了,并创建了一个包含所有可能性的大表。一旦我列出了所有可能性,我就会使用图论并为每个可能的解决方案创建节点。然后,如果它的变化在 5% 以内,我会在每天(例如第 1 天到第 2 天)的节点之间创建边(链接)。然后我删除所有没有边的节点(链接到其他节点),并且当用户继续播放时,当路径变成死胡同时,我也会删除整个路径。 这很好,因为它缩小了选择范围,但现在我被困住了,因为我想进一步缩小这些选择范围。有人告诉我这是一个隐藏的马尔可夫问题,但是一个更棘手的版本,因为状态正在发生变化(正如您在上面看到的,每轮都在添加新节点,并且正在删除旧的/不可能的节点)。
** 如果有帮助,我在这里得到了关于 baum-welch 模型(用于训练数据)的 python 实现的惊人答案(带有示例代码):Example of implementation of Baum-Welch **
我认为需要做的事情(这可能是错误的):
现在我缩小了结果范围,我基本上是在尝试让程序根据缩小的结果库来尝试预测正确的结果。我认为这是不可能的,但有几个人建议这可以通过隐藏马尔可夫模型来解决。我认为我可以对数据进行多次迭代(使用 Baum-Welch 模型),直到概率稳定(并且应该随着用户的更多轮次而变得更好)。 隐藏马尔可夫模型能够检查拼写或笔迹并在出错时进行改进的方式(在这种情况下,错误是选择了一个在下一回合被删除的篮子,因为这是不可能的)。
两个问题:
如果所有状态起初都相等,我如何计算转换和发射矩阵?例如,由于所有状态的可能性相同,因此必须使用某些东西来确定状态变化的概率。我正在考虑使用我制作的图表来加权具有最多边数的节点作为过渡/发射状态计算的一部分?这有意义还是有更好的方法?
如何跟踪状态的所有变化?随着新篮子的添加和旧篮子的移除,跟踪篮子就成了问题。虽然我需要一个层次化狄利克雷过程隐藏马尔可夫模型(hdp-hmm),但不完全确定如何应用它。
(对不起,如果我听起来有点沮丧......知道问题是可以解决的但无法从概念上掌握需要做什么有点困难)。
与往常一样,感谢您抽出宝贵的时间和任何建议/建议,我们将不胜感激。
【问题讨论】:
如果对输入的唯一约束是总量变化不超过 5%,那么建模,HMM 或其他方面没有太多。例如第 1 天:(100,20,1) 第2 天:(20, 100,1) 第3 天:(55, 44, 22) ... 除了总量不变(0%每天都在变化)。您在问题陈述中遗漏了哪些隐藏的假设? 不同的数量会产生不同的总值,因此您可以检测数量是否发生了变化(以及变化了多少)。 @Dave 我相信隐藏的价值是篮子里水果的实际数量。在隐藏马尔可夫模型的 wiki 页面上,他们有一个示例问题/代码,他们可以从中获取一个人的行为(走到外面、购物等),并基于该模型找出外面的天气情况。我可以看到我的问题如何适应这个例子,随着时间的推移,它可以稳定到对篮子本身持有什么的预测(通过提高/改变每轮的概率)。 我对其他解决方案 100% 持开放态度,但我问过很多人,大多数人都说这可以通过隐藏马尔可夫模型解决,但我认为问题在于训练他们时,除了所有州是有限的/静态的,而不是不断变化的(对于我的问题,正在添加和删除新节点)。我拥有的示例代码(链接到上面的答案)是如何训练隐藏马尔可夫模型的一个很好的例子。但问题是它仅适用于 3 个状态(1、2 或 3 个冰淇淋锥它用来预测外面是热还是冷)。 马尔可夫模型有一组状态和一组一阶状态转移概率。 (在 Wikipedia 示例中,2 个状态和一个 2x2 转换矩阵)。在您的示例中,没有状态,只有一个用户在制作大量水果。如果您想将马尔可夫建模应用于您的示例,您需要一组庞大的状态(所有可能的数量组合)和一组更大的 (N^2) 组给定今天的明天数量的概率。而且您的模型没有隐藏 - 没有概率输出,每个状态只有一个已知输出。 【参考方案1】:正如您所说,这个问题可以用 HMM 来描述。您本质上对维护潜在或隐藏状态的分布感兴趣,这将是每个时间点的真实数量。但是,您似乎混淆了学习 HMM 参数的问题,而不是简单地在已知 HMM 中进行推理。您有后一个问题,但建议采用旨在解决前一个问题的解决方案 (Baum-Welch)。也就是说,你已经有了模型,你只需要使用它。
有趣的是,如果您为您的问题编写离散 HMM 编码,您会得到一个与您在图论解决方案中描述的非常相似的算法。最大的区别在于您的解决方案是跟踪可能,而正确的推理算法(如Virterbi algorithm)将跟踪可能。当域上的 5% 范围内存在重叠时,即当多个可能的状态可能转换到同一状态时,差异就很明显了。您的算法可能会在一个点上添加 2 条边,但我怀疑当您计算第二天会产生影响时(本质上它应该计算两次)。
无论如何,您可以使用 Viterbi 算法,如果您只对最近一天的最佳猜测感兴趣,我将简要介绍一下如何修改您的图论解决方案。不是维护状态之间的边,而是维护一个代表状态正确概率的分数(这种分布有时称为置信状态)。在每个新的一天,通过将每个桶增加其父项的概率来传播您的信念状态(而不是添加一个边,而是添加一个浮点数)。您还必须确保您的信念状态正确标准化(总和为 1),因此只需在每次更新后除以它的总和。之后,您可以通过观察对每个状态进行加权,但由于您没有嘈杂的观察,您可以将所有不可能的状态设置为零概率,然后重新归一化。您现在有了一个基于您的观察结果的基础数量分布。
我在这里跳过了很多统计细节,只是为了给你一个想法。
编辑(回复:问题): 您的问题的答案实际上取决于您想要什么,如果您只想要最近一天的分布,那么您可以使用我所描述的一次性算法。但是,如果您希望在每一天的数量上得到正确的分布,那么您也必须进行反向传递。因此,恰如其分地命名为forward-backward algorithm。我的感觉是,由于您希望后退一步并删除边缘,那么您可能希望整天都进行分发(与我最初假设的不同)。当然,您注意到可以使用“未来可以告知过去”的信息,这正是您需要进行反向传递的原因,它并不复杂,您只需拥有从链的末端开始运行完全相同的算法。要获得一个很好的概述,请查看 Christopher Bishop 在 videolectures.net 上的 6 件式教程。
因为您提到了添加/删除边缘,所以让我澄清一下我之前描述的算法,请记住,这是针对单个前向传递的。假设总共有 N 个可能的数量排列,那么您将有一个信念状态,它是一个 sparse 向量 N 个元素长(称为 v_0)。第一步您收到总和的观察结果,并通过将所有可能值设置为概率 1.0 来填充向量,然后重新归一化。下一步,您将创建一个全为 0 的新稀疏向量 (v_1),遍历 v_0 中的所有非零条目并增加(按 v_0 中的概率)v_1 中 5% 以内的所有条目。然后,将 v_1 中根据新观察不可能的所有条目归零,然后重新规范化 v_1 并丢弃 v_0。永远重复,v_1 将永远是可能性的正确分布。
顺便说一句,如果您有嘈杂的观察或非常大的状态或连续状态,事情可能会变得比这更复杂。出于这个原因,很难阅读一些关于统计推断的文献。这很一般。
【讨论】:
感谢您的出色回答。这真的让我思考。我将问题分为 3 个步骤(但在阅读您的答案后不确定它是否是一个好方法)。第 1 步,生成所有可能性..step2 在最后一回合之间交叉引用并消除不可能的..step3 在选择当天(甚至未来)的最佳猜测的可能性中......我没有意识到我也许能够结合 step2 /3。我对此真的很陌生,所以我将审查您的答案并努力理解它(通过试验代码中的逻辑) 一个问题..说..我拥有今天所有的可能性,并将信念状态添加到它,因此它总和为 1..如果明天显示路径无效并且我删除它会发生什么.我是否必须重新计算归一化的信念状态,还是因为相对权重相同(如果 5 个篮子的权重分别为 0.20.. 移除一个仍然会使其他 4 个仍然等于 0.20).. 嘿,非常感谢..我学习这个真的很慢(对我来说很新),这是一个爱好项目,所以我有点慢。感谢您惊人的更新答案,我现在得到了理论。我想给你一个赏金,但它不会让我在 23 小时内,所以明天我会分配给你。我可能会为您所说的代码示例放另一个赏金,因为代码对我来说更清晰一些。再次感谢,如果我对你的理论有更多问题,我可能会打扰你。 我真的没有时间写代码,但是如果你提交你的代码,我会帮你检查的。 感谢匿名!!我正在编写一些代码,我会将其提交给审查(如果我能完成它)。我为您提供了很好的建议,但我正在考虑为某人提供另一个尝试代码示例的赏金。再次感谢您的帮助!我现在明白了很多。以上是关于将机器学习应用于猜谜游戏?的主要内容,如果未能解决你的问题,请参考以下文章
机器学习应用——强化学习&课程总结 实例 “自主学习Flappy Bird游戏”(MDP&蒙特卡洛强化学习&Q-learning&DRL&DQN)