1. 引言

“猜猜我是谁”(Guess Who?)是朋友聚会中最简单也最受欢迎的互动游戏之一。每位玩家在额头上贴一张名人卡片,但自己看不到,只能通过提问来猜测自己的身份。

这些问题只能用“是”或“否”来回答。有些变种规则还会包括物品或引入计分系统。

现在我们也可以通过手机 App 或网站来玩这个游戏。

在本教程中,我们将重点讲解“20个问题”(20 Questions)这个游戏的 AI 实现原理。它通过算法和学习策略来猜测玩家心中的对象(人物或物品)。

2. 历史背景

像许多传统游戏一样,很难确定这个游戏的确切起源时间。但我们知道它在19世纪的美国新英格兰地区开始流行,是一种口头游戏。

最初,游戏的开场问题是:“它是动物、植物还是矿物?”这个游戏之所以流行,是因为它规则简单、无需练习,任何人都可以参与,且不同水平的人都能玩得开心。

2.1. 竞猜节目

“20个问题”曾在加拿大、匈牙利、挪威等国家的电视和广播节目中广受欢迎。

在广播中,听众会提交一些名字,由主持人来猜。

值得一提的是,随着主持人的经验积累,他们能在更少的问题内缩小可能的答案范围。这种人类行为后来被程序员尝试用算法来模拟。

2.2. 人工智能方法

1988年,Robin Burgener 开始尝试用计算机实现“20个问题”游戏。

在这个版本中,计算机通过最多20个“是/否”问题来猜测玩家心中所想的对象。如果第一次猜测错误,它还可以再提出最多5个问题。

作者为其策略申请了专利,其核心是一个对象-问题矩阵,通过权重连接输入(问题答案)和输出(目标对象)。虽然还有第二种模式,但为了简化说明,我们只讨论第一种方法:

Questions Matrix

在后续步骤中,对象会根据每个答案的权重进行排序。

答案还可以包括“通常”、“有时”、“可能”等选项,每种回答都可以赋予相应的权重。

我们可以在这里玩这个游戏的在线版本。它每次游戏后都会学习,因此即使玩家答错了一个问题,也能正确猜出答案。

3. 理论基础

在深入理解软件如何正确猜测答案之前,我们需要了解一个常用于解决此类问题的策略:决策树(Decision Trees)。

根据学习参数的方式,方法可以分为参数方法和非参数方法。

  • 参数方法:模型在整个输入空间中学习参数,基于全部训练数据构建模型。
  • 非参数方法:将输入空间划分为多个区域,每个区域内使用局部模型,仅基于该区域内的训练数据。

3.1. 决策树

决策树是一种非参数的分层模型,采用“分而治之”(divide-and-conquer)的策略。它可以用于回归和分类任务。

在监督学习中,我们通过递归划分区域来构建决策树。模型中包含两种元素:决策节点(decision nodes)和叶节点(terminal leaves)。

每个决策节点包含一个函数 f_{m}(x),其输出决定了分支方向。我们从根节点开始,依次在决策节点计算 f_{m},决定走向哪个分支。

我们递归地执行这个过程,直到到达叶节点。一旦到达叶节点,该节点的值就是最终输出。

假设我们有一个包含圆形和方形的虚拟数据集,其对应的决策树如下图所示,椭圆表示决策节点,矩形表示叶节点:

Tree Theoretical

另一个支持我们将决策树归为非参数模型的理由是:我们不预先设定树的结构或类别分布,这些内容是在训练阶段根据问题复杂度动态决定的。

3.2. 分类树

如果我们的决策树有多个类别标签,我们称之为分类树。

我们可以计算划分的不纯度(impurity)。如果某个划分的所有分支都只包含一个类别,那么我们认为这个划分是纯净的。

假设我们有一个节点 m,那么 N_{m} 表示到达该节点的样本数量,N_{m}^{i} 是属于类别 C_{i} 的样本数。我们可以计算该节点中 C_{i} 的概率:

(1)   \begin{equation*} \hat{P}(C_{i}|x,m) = p_{m}^{i} = \frac{N_{m}^{i}}{N_{m}} \end{equation*}

如果在节点 m 中,所有 ip_{m}^{i} 都为 0 或 1,则我们认为该节点是纯净的。也就是说,所有样本都属于 C_{i} 类别,或者都不属于。

此时我们应停止划分,因为已经到达叶节点。所有 i 类别中 p_{m}^{i} 为 1 的样本应标记为 C_{i}

但如果节点不是纯净的,我们如何衡量其不纯度呢?这就需要引入信息论中的“熵”(Entropy)概念。

3.3. 熵

如 Quinlan 在 1986 年定义的,熵是衡量编码一个实例类别所需的比特数。

我们可以用以下公式计算熵:

(2)   \begin{equation*} H = -\sum_{i=1}^{K} p_{m}^{i}\:log_{2}\: p_{m}^{i} \end{equation*}

举个例子,假设我们只有两个类别:

  • 如果 p^{1} = 1p^{2} = 0,那么熵为 0,因为所有样本都属于类别 1。
  • 如果 p^{1} = p^{2} = 0.5,那么熵为 1,因为两个类别出现的可能性相同,需要 1 bit 来编码。

我们也可以推广到多个类别的情况,当所有类别出现概率相等时,即 p^{i}=\frac{1}{K},熵为:

(3)   \begin{equation*} H = log_{2}K \end{equation*}

这个公式可以用来计算编码所有类别所需的比特数。

4. 示例

虽然上述方法可以实现高准确率,但也可以尝试其他策略来解决“20个问题”挑战。

我们还可以结合多种策略来提升模型表现。

4.1. 决策树在 20 个问题游戏中的应用

在这个场景中,我们使用的是分类树,因为我们要从多个选项中找出正确的标签。

叶节点代表我们要猜测的对象,分支代表问题的答案。

为了说明决策树的原理,我们考虑一个简化版的游戏:只有四个可能的答案:狗(dog)、猫(cat)、胡萝卜(carrot)、叉子(fork)。

如果我们精心选择问题,只需两个问题就能准确猜出答案:

Decision Tree

数学上,我们可以用以下公式来定义问题数量:

(4)   \begin{equation*} Q = log_{2}N \end{equation*}

反过来,如果我们知道问题数量,也可以计算能猜出的类别数:

(5)   \begin{equation*} N = 2^{Q} \end{equation*}

因此,在 20 个问题游戏中,我们能识别的类别数为:

(6)   \begin{equation*} N = 2^{Q} = 2^{20} = 1,048,576 \end{equation*}

仅需 20 个问题,我们就能识别超过一百万个对象,这充分说明了决策树在这个任务中的高效性。

需要注意的是,这些计算的前提是我们要有一组最优问题,能逐步缩小范围。这种最优问题集合可以通过学习策略来实现。

理想情况下,每个问题都能将可能答案分成两半,找到最能区分对象的特征。

这样,我们的学习树就能像二分查找一样工作,每次游戏后都记录结果,学习哪些问题最有效。

4.2. 随机样本一致性(RANSAC)

除了使用决策树,我们还可以结合 RANSAC(Random Sample Consensus)策略来提高准确性。

RANSAC 的做法是:随机选取 20 个问题中的一部分,而不是全部,然后验证输出是否一致。

我们重复这个过程多次,使用不同的子集进行验证。

优点:这种方法可以减少玩家答错问题对最终结果的影响,因为 RANSAC 是一种异常值检测方法。

缺点:需要多次运行,增加了计算成本。

⚠️ 注意:适合用于对抗玩家故意答错或误答的情况。

5. 总结

在本文中,我们探讨了如何使用一种非参数模型——决策树,来实现“20个问题”游戏。

我们不仅介绍了决策树的基本原理,还通过数学公式证明了问题数量与可识别类别之间的关系,并讨论了如何结合其他策略(如 RANSAC)来提升模型准确性。

关键点

  • 决策树是分类和回归任务的有力工具
  • 每个问题理论上可以将可能答案减半
  • 结合 RANSAC 可以提高抗干扰能力

掌握这些原理后,我们就可以构建一个智能的“20个问题”AI系统,甚至将其扩展到其他更复杂的分类任务中。


原始标题:How Do “20 Questions” AI Algorithms Work?

« 上一篇: 生成重复排列
» 下一篇: Akra-Bazzi 方法详解