Solving Math Word Problems Using AI Generated Expression Trees
用AI自动生成的表达式树解答数学应用题
https://middlebury.figshare.com/articles/thesis/Solving_Math_Word_Problems_Using_AI_Generated_Expression_Trees/28409369
![]()
![]()
![]()
![]()
摘要
数学应用题(MWPs)因其融合了语言与数值上下文,为自然语言处理和人工智能提出了一个独特挑战。大语言模型(LLMs)为此问题提供了一种解决思路,但随着LLM复杂度的增加,其内部运作的可观测性与可解释性却在下降,从而削弱了我们对模型输出选择原因的理解,也降低了对模型的信任度。因此,我研究了一种结构化的深度学习方法,其中词元生成受到输出目标的约束,且模型决策过程是可观察的。当前数学应用题领域的一项前沿(SOTA)解决方案尝试生成用于方程构建的子目标,类似于人类解决数学应用题的方式。在本论文中,我扩展了该子目标算法,并尝试将其应用于求解那些需要解集(solution sets)而非单一方程的数学应用题。实验发现,我的模型在Math23K数据集上达到了55.0%的解准确率,比所扩展的原模型低10%;在DRAW-1K数据集上,我的模型解准确率为26.5%,显著低于当前69.6%的非LLM前沿方法。然而,这一差距可合理归因于数据集规模的限制。
第一章 引言
1.1 背景
数学应用题(Math Word Problems, MWPs)对传统的机器学习(Machine Learning, ML)、人工智能(Artificial Intelligence, AI)和自然语言处理(Natural Language Processing, NLP)技术提出了独特的挑战。要解决数学应用题,模型必须具备逻辑推理能力,并能同时捕捉数学和语言的上下文信息 [14]。
考虑以下例子:“两架飞机同时从一个机场起飞,一架向东飞行,另一架向西飞行。向东飞行的飞机速度慢110英里每小时。3小时后,它们相距2250英里。求每架飞机的速度”[58]。要解决这个问题,首先必须识别出有两个未知量需要求解——向东飞行的飞机速度(x)和向西飞行的飞机速度(y)。然后,识别出3小时后它们相距2250英里(即 3x + 3y = 2250),以及向东飞行的飞机速度比向西的慢110英里每小时(即 y − 110 = x)。根据这些方程,可以解出 x = 320,y = 430。
在这一求解过程中,许多环节都可能出现错误:我们可能错误地识别出所要求解的未知量(例如,误以为只需解一个变量);在构建方程时可能选错数值或运算符;也可能将方程的顺序弄错。因此,解决数学应用题需要多个环节都准确无误,而微小的错误就可能导致完全不同的答案。
需要注意的是,本论文仅探讨如何构建方程,而不涉及对方程进行求解。对于已构建的方程,我将使用 SymPy Python 软件包进行求解。
数学应用题涵盖广泛的领域,包括线性代数、微积分、几何等,如表1.1所示。在本论文中,我专注于面向小学至初中阶段的数学应用题。这类问题涉及基础代数,其解法仅需使用基本算术运算符(+、−、×、÷)和实数(R 中的数字)。我之所以仅关注小学至初中水平的数学应用题,是因为其输入语言仅包含数字和文字(而非数学符号,如 √),输出语言也仅包含数字和运算符(而非数学符号,如 ∫)。在未来的研究中,我希望将本论文提出的方法扩展到更高级的数学领域,以检验该方法是否具有可扩展性。
![]()
1.2 研究动机
近期的研究致力于提升人工智能模型的逻辑推理能力。大语言模型(LLMs)一直是研究的重点,大多数基准测试的结果均由大语言模型取得,而非采用专用型人工智能方法(即专为特定任务构建的AI模型)。然而,与专用型AI方法相比,大语言模型存在一些特有的局限性,例如生成与问题无关的回答(即“幻觉”现象)以及缺乏逻辑稳定性(即对词元/token、符号或概念之间关系缺乏明确、一致的理解)[37],这降低了模型输出结果的一致性,也削弱了人们对模型能否正确输出信息的信任。
当前有一条研究主线试图减少幻觉现象 [38, 10, 16] 并提升逻辑推理能力 [20],以增强AI的能力和可信度。作为这项工作的一部分,研究者们创建了用于评估大语言模型逻辑推理能力的数据集。例如,Nezhurina 等人 [45] 提出了 AIW 数据集,其中包含诸如“爱丽丝有 N 个兄弟,还有 M 个姐妹。爱丽丝的兄弟有多少个姐妹?”这类问题。另一个例子是 Liu 等人 [39] 提出的 LogiQA 数据集,其中包含类似于标准化考试中的阅读理解类逻辑推理问题。
在上述 AIW 问题和前文所述的数学应用题(MWPs)中,问题均描述了一个包含数字的情境,而答案都是一个单一的数值。因此,数学应用题领域的进展可能可以推广到更广泛的逻辑推理问题,而对数学应用题的评估也可用于验证模型的逻辑推理能力 [65]。
我旨在研究一种能够提升人工智能系统逻辑推理能力的方法。我在此基础上采用了一种能生成结构化输出的方法,从而消除了大语言模型常见的离题回答(即幻觉)问题。通过使用专用型AI模型,我力求减少所需的训练数据量,并增强模型输出与问题相关性的可信度。然而,这种更强的约束也带来了模型灵活性的不足——该模型无法处理那些需要不同类型输出(或任何不同于方程组形式的输出)的问题。
此类建模方法也可应用于教育场景,因为在教育中,可信度至关重要。Opesemowo [47] 指出,AI在教育中的两大主要风险是:缺乏问题解决能力,以及模型无法解释其推理过程。尽管目前大多数学生已在教育中使用AI [4],但针对初中生的相关研究仍较为有限。然而,AI在教育中的普及已是大势所趋 [9],因此,通过高性能且可观察的方法构建可信的模型至关重要。大语言模型由于存在上述幻觉和逻辑推理能力不足的问题,会带来更高的风险;而专用型AI模型则能缓解这些风险。此外,由于所选专用型AI模型具有结构化输出,其决策过程是可见的,因此模型的可解释性也得以提升。本论文所探索的结构化数学应用题求解器将在每一步展示所选择的词元(token),向学生提示何时应选择一个数字、何时应选择一个运算符,并如何利用子目标。通过更深入地理解方程生成过程,学生可以学习如何复现这一过程。虽然本研究探索的方法并未明确解释为何选择某个词元而非另一个,但未来可将此研究扩展为:为各个子目标生成自然语言解释。
本论文的动机源于一种愿望:通过结构化方法提升AI的逻辑推理能力和模型可解释性,从而增强人们对AI模型的信任。
第二章 相关工作
2.1 相邻工作
第一个能够解决简单数学应用题(MWPs)的系统是 Bobrow [7] 提出的 STUDENT 模型,该模型依赖预设规则,先将输入的数学应用题转化为仅包含单一信息点的句子,再通过预定义规则将其转换为输出方程。这种方法仅能处理简单的数学应用题,例如:“汤姆的鱼的数量是玛丽的孔雀数量的两倍。如果玛丽有3只孔雀,那么汤姆有多少条鱼?” 这种基于规则的方法(如将“孔雀”映射到“鱼”)主导了早期数学应用题研究文献,大多数方法都依赖预定义模板或规则来解析问题、识别预定义结构并生成有限的方程 [7, 6, 36]。另一个例子是 Bakman [6],他使用由规则集组成的模型,其中介词和动词被识别并用于构建方程。Liguda 和 Pfeiffer [36] 也尝试捕捉结构,他们依靠增强语义网络来捕捉带标签对象之间的关系,从而构建完整方程。当预定义的规则集无法适应自然语言的多样性时,这些模型泛化能力较差。
接下来出现了统计学习方法,旨在捕捉更多变化并提升泛化能力。这些方法依赖人工设计的特征,其中有关输出格式的信息被用于生成过程。例如,Hosseini 等人 [22] 使用 l₁ 正则化线性模型将重要动词与实体及数字配对;Zhou、Dai 和 Chen [69] 则使用对数线性模型选择用于求解数学应用题的模板。这些方法在输出模板重复的数据集上取得了高准确率,但手工设计特征成本高昂,且在脱离上下文的问题上泛化能力仍受限制 [31, 27]。
随后出现了深度学习方法,其通过组合多个处理层试图捕捉更高层次的特征 [32]。这些方法将在第2.2节中探讨,它们是本论文的相关贡献。
大型语言模型(LLMs)的兴起——如 OpenAI 的 GPT-4 [46]、GPT-4 或 Google 的 Gemini [56]——推动了这一领域的新型研究方法,多数研究涉及在冻结模型上使用提示方法以增强其输出,或对大语言模型进行微调 [42, 3]。
由于模型规模庞大且训练数据量巨大,大语言模型具备卓越的泛化能力、高级推理技能以及灵活的生成能力。因此,它们在数学应用题领域具有独特优势,成为主要求解器,研究发现它们在常见的数学应用题数据集上持续优于非大语言模型方法 [55, 57]。由于生成灵活性强,大语言模型能够应对更难的数学相关数据集。一个数据集的例子是 DeepMind Mathematics,其中包含诸如“将1136975704除以-14121932”和“排序:2, 4, 0, 6”[50] 的问题。这些问题需要不同类型的回答:第一个例子要求单个数字,第二个则要求一系列数字。然而,这种灵活性也可能带来风险——模型不仅可能给出错误答案(例如,模型预测“3”而非“4”),甚至可能连答案类型都完全错误(例如,输出“三明治”而非“4”)。因此,我专注于一种目标明确的模型类型,该模型旨在模仿人类如何解决数学应用题,确保答案必定是一个方程(而不是像“三明治”这样的错误答案)。
正如第1.2节所讨论的,我们目前尚不了解大语言模型的内部机制,这导致了随机模型预测(幻觉)和模型信任度方面的问题 [34]。因此,我选择专注于那些模仿人类解决此问题方式的受限深度学习方法。相关的深度学习方法将在下一节中探讨。
2.2 相关工作
神经网络和深度学习的兴起催生了一种解决数学应用题的新途径:利用嵌入表示(无论是从头训练还是使用现有嵌入如 word2vec [44]),以数值形式表达输入方程中词元的含义。借助这种语义的数值表示,不同的学习方法可以结合并对这些表示进行变换,从而生成更精确的输出。这类方法大约在2017年出现在数学应用题领域,并且表现优于统计学习方法 [63, 62]。首次尝试将深度学习方法应用于数学应用题的是 Wang、Liu 和 Shi [63],他们使用 seq2seq 模型 [54] 将输入文本转换为方程。该模型将输入文本通过一系列门控循环单元(GRUs [12])传递,取最终 GRU 的嵌入作为输入,然后通过一系列长短期记忆(LSTM [21])单元生成输出词元。尽管该方法在该领域最常用的算术数据集(Math23K,见第3节)上达到了50%以上的准确率,但它经常生成语法无效的方程和虚假数字。
这促使 Huang 等人 [25] 创建了一种从输入文本到输出方程的复制机制,旨在减少虚假数字的生成。作者使用强化学习,采用基于注意力的复制方法,使模型既能从输入问题中复制数字,也能生成目标词汇表中存在的、但在输入问题中未明确说明的已知词元(例如 π, 0, 1)。
Wang 等人 [62] 接着观察到,模型可能会预测一个与目标方程等价但形式不同的方程(例如 x=3+2 对比 x=2+3)。作者引入了一个后处理步骤——方程去重,从而提升了模型性能 [62]。
Wang 等人 [61] 随后采用了 Huang 等人 [25] 的复制机制,结合 Wang 等人 [62] 提出的表达式树,创建了一个模型:首先使用 seq2seq [54] 模块预测除特定运算符外的所有内容以生成表达式树,然后使用双向 LSTM(Bi-LSTMs [26])预测运算符词元 [61]。
Liu 等人 [40] 接着指出,纯 seq2seq 模型在捕捉方程真实含义方面存在困难,并尝试使用多层级 seq2seq 模型构建表达式树,以生成多层次表达式树的不同深度。
Xie 和 Sun [64] 进一步扩展了树生成过程,提出 seq2seq 模型在生成方面遇到困难的原因在于它们并未像人类那样解决数学应用题。当人类解决数学应用题时,我们会将问题分解为子目标,解决这些子目标,然后合并结果。根据第1.2节中的例子,当试图为“他们年龄之和的一半是24”建立方程时,你可能会产生子目标“他们的年龄之和是多少?”,从而引导你构建 x + y。Xie 和 Sun [64] 构建了一种新颖的树生成方法,用于生成子目标,这些子目标随后被用来实现方程中的词元。这就是本文将要扩展的目标驱动树结构(GTS)模型。GTS 模型还被 Zhang 等人 [67] 和 Li 等人 [35] 扩展,他们都使用图编码器生成更好的目标向量;以及被 [52] 扩展,后者结合了不同的编码和解码方法。
进一步探索解决数学应用题的方法集中在 seq2seq 与图编码器、以及 seq2seq 与树解码器的不同组合上。请参见表2.1,了解相关工作的总结。
![]()
2.3 可观察性相关研究
在众多领域中,对人工智能系统的可观察性(observability)正成为一个重要的研究方向。Gunning 和 Aha [18] 认为,提升人工智能系统可解释性主要有三种方法:深度解释(deep explanation)、模型归纳(model induction)和可解释模型(interpretable models)。
- 深度解释
指的是设计更具可解释性的 AI 模型架构,例如采用更直观的损失函数、网络层结构和数据集选择。
- 模型归纳
包括在不改变数据或模型本身的前提下,对 AI 系统的输入-输出行为进行分类和分析。
- 可解释模型
(本论文所聚焦的方法)是指具有更结构化输出的模型,这类模型能更清晰地揭示信息流动过程以及模型内部所做出的决策 [18]。
在上述相关工作中,采用纯 seq2seq 解码器的模型属于可解释性较低的模型,因为其输出未被约束为某种预定义的结构。在本论文中,我通过扩展一种要求输出必须符合语法有效性的模型来提升可解释性;同时,通过“深度解释”进一步增强模型的可解释性——因为该模型的解码过程反映了人类在解决问题时所采用的直观子目标(sub-goal)方法。
第三章 数据
本论文考虑两类数学应用题(MWPs)。按照文献中的标准,那些要求求解单一变量且以显式形式(即“x =”)给出答案的数学应用题被视为算术题 [49, 8]。代数问题则更为复杂,需要识别变量并建立能够求解这些变量的方程。代数方程可以是单变量的(仅含一个未知数,属于隐式形式),也可以是多变量的(含多个未知数)[8]。表3.1展示了来自相关数据集的这两类问题的示例。
![]()
需要注意的是,算术题与代数题之间存在一定重叠。一个单方程的算术应用题(形式为“x =”的单一方程)如果被改写为隐式形式(即将 x 移到等号另一边,并存在另一个符号 c,使得 c 等于一个包含 x 的表达式),也可被视为代数题。出于本论文的目的,我将沿用文献中通用的算术/代数分类方式,尽管某些算术题可以用代数方法求解,反之亦然。
本论文采用的一个常用算术数据集是由 Wang、Liu 和 Shi [63] 提出的 Math23K 数据集,其中包含 23,162 道中文数学应用题。该数据集在本研究领域被广泛采用 [63, 62, 61, 64, 67],且 GTS 模型的代码正是围绕该数据集构建的,因此我将在本论文中使用它。
对于代数问题,我将使用 Upadhyay 和 Chang [58] 创建的 DRAW-1K 数据集。该数据集包含 1,000 道代数应用题,已被 Cao 等人 [8]、Kim 等人 [28]、Upadhyay 等人 [59] 以及 Ki 等人 [27] 所采用。表3.3列出了在第4.2.1节所述预处理步骤之后的方程和解的数量统计。需要注意的是,总数少于1000,因为我使用的是 Kim 等人 [28] 预处理后的 DRAW-1K 版本,该版本将诸如 “student+general=7” 这样的方程转换为 “x + y = 7”。在他们的转换过程中,由于数据集中存在重复样本,或某些样本并非代数应用题,共剔除了13个 DRAW-1K 样本。DRAW-1K 数据集的训练集、开发集和测试集分别包含600、200和200个样本,我将分别用于训练、开发和测试我的 mGTS 模型。
![]()
表3.2 列出了该任务的其他相关数据集。本论文未采用的数据集包括:Koncel-Kedziorski 等人 [30] 的单变量代数数据集 MAWPS(包含3,000道应用题)、Kushman 等人 [31] 的代数数据集 ALG514(仅含514个样本,因规模过小而受限),以及 Huang 等人 [23] 的 DOLPHIN18K 代数数据集(包含18,000个样本)。我曾考虑使用 DOLPHIN18K,但该数据集基于现已关闭的 Yahoo Answers 服务构建,因此我无法重新构建该数据集,且尝试寻找预构建版本也未成功。因此,我将主要聚焦于 Math23K 和 DRAW-1K,但会对 ALG514 和 MAWPS 进行鲁棒性检验。
第四章 方法
本论文基于 Xie 和 Sun [64] 提出的目标驱动树结构(Goal-driven Tree Structure, GTS)算法。该算法构建了一个深度学习模型,用于从数学应用题(MWP)生成表达式树(expression tree)。表达式树是一种表示方程的树形结构,图4.1中给出了两个示例。通过中序遍历(in-order traversal)该表达式树,即可还原出对应的方程。
![]()
请注意不同类型的表达式树。显式表达式(explicit expression)不包含等号,可默认其仅用于求解变量 x。Math23K 数据集中的方程即采用这种形式。隐式方程(implicit equation)则包含等号,由左侧的一个词元(token)和右侧的一个表达式组成。
本节所述方法如下:第4.1节详细讨论现有的 GTS 方法;第4.2节介绍我提出的 mGTS 模型,包括预处理步骤(第4.2.1节)、模型架构(第4.2.2节)以及我对 GTS 所做的模块级改进(第4.2.3节)。
4.1 现有的 GTS 方法
Xie 和 Sun [64] 使用一个编码器来捕获一个目标向量 q,该向量“代表问题的最终目标”。这是一个嵌入向量,旨在捕捉最终输出方程中应使用的词元相关信息。该论文的核心直觉是:该目标向量可被分解为若干子目标(sub-goals),这类似于人类解决数学应用题的方式——我们将一个复杂的方程分解为若干子问题,然后将子问题的解组合起来。
图4.2展示了带有子目标的树分解示例。通过这种方式,GTS 算法可被看作是递归的:每个节点都可视为其子树的根节点。模型试图通过使用词汇表中的词元构建方程,来求解该根节点对应的目标。
![]()
GTS 算法的一般流程如下:
对于给定节点,如果该节点是左子节点或根节点,则利用当前子目标和输入文本的嵌入来预测一个词元。如果该节点是右子节点,则词元生成过程还会使用左子节点的嵌入。
如果生成的词元是一个运算符(operator),则创建左子节点和右子节点。算法随后进入左子节点,完成该左子节点目标向量的生成,并预测一个词元以重复该过程。
如果模型在某个节点预测出一个非运算符词元,则模型转向右子节点以完成该子树的构建。右子节点的目标向量由父节点的嵌入和左子节点的嵌入共同生成。
当不再需要计算更多右子节点时,该过程终止。
例如,假设 GTS 模型生成了方程 700350−280。图4.3展示了 GTS 生成的对应表达式树。以下是对该分解过程的逐步说明:算法首先使用目标向量 q0预测一个词元;如果该词元是数字,则算法终止。否则,树的构建过程开始:
![]()
![]()
这种树分解方法相比纯 seq2seq 模型已展现出良好的效果 [63, 62, 61],并在后续研究中被 Zhang 等人 [67]、Li 等人 [35] 以及 Shen 等人 [51] 进一步扩展。我选择对核心的树分解方法进行扩展,因为当前许多最先进的(SOTA)深度学习方法都基于基础的 GTS 算法 [35, 67, 52],因此,我对核心 GTS 算法所做的任何改进都可以轻松地应用于这些最先进的方法中。
4.2 构建多目标 GTS:mGTS
4.2.1 预处理
mGTS 的大部分预处理步骤沿用了原始 GTS 方法及其代码。任何对预处理所做的修改均会明确注明。
输入处理
输入序列中的数字通过正则表达式(regex)识别,并统一替换为相同的 NUM 词元(token)。在输出文本中,这些被替换的数字按照其在输入文本中出现的顺序进行映射,如表 4.1 所示。
![]()
我对预处理步骤进行了扩展:将输入方程中以文字形式出现的数字(例如 “twenty”)转换为其对应的数字形式(例如 “20”),以便正则表达式能够正确识别这些数字。我使用 Python 的 Inflect 软件包来完成这一映射。
输出处理
遵循 Kushman 等人 [31] 的方法,我将方程转换为“相减形式”:将方程一侧减去另一侧,使最终方程等于零。因此,我不需要分别预测方程的左侧和右侧,而只需生成一个表达式树,然后将其设为等于零即可。
接着,输出方程中的数字会被替换为它们在输入文本中对应的数字映射。如果方程中的某个数字未出现在输入文本中,则将其替换为 UNK 词元(token),除非该符号在整个训练数据中出现的次数超过一个可调超参数 k。在测试阶段,不会预测 UNK 词元,因为我在测试所用的语言中不包含该词元。输出方程中常见但未在输入文本中出现的符号包括 0.1、1 和 10。
随后,使用调度场算法(Shunting Yard algorithm)将方程从传统的中缀表达式(infix form)转换为前缀表达式(prefix form)。
整个输出预处理流程如表 4.2 所示。
![]()
4.2.2 模型架构
正如 Cao 等人 [8] 所指出的,仅生成一个方程是有限制的。考虑第1.2章中探讨的问题:正确解法需使用两个方程 3x + 3y = 2250 和 y − 110 = x,然后求解 x 和 y。然而,当使用 GTS 时,只能实现一个未知数。该方法在使用 GTS 时存在若干限制。
首先,GTS 无法生成“等于”符号对应的词元(例如,在 x = 3 + 4 中的 x)。在 GTS 代码中,所有方程均为显式形式,这导致可生成的方程类型具有刚性。由于要求输出方程必须为 “x =” 形式,同时又无法将 x 替换为其他变量,因此永远只能实现一个变量。此外,任何隐式形式的数学应用题都无法被生成(例如 3 = x + 1)。因此,多变量或隐式单变量解法均无法由 GTS 生成。
如果我们用 GTS 仅求解多变量数学应用题中的一个变量,仍可能因需要生成多个方程而面临生成能力受限的问题。以上述例子为例,如果我们试图直接构建 x 的显式形式方程,仅使用输入文本中的数字,我们可能会得到方程 x = (2250 − (110×3)) / (2×3)。这个表达式树需要三层深度,从而增加生成新子目标的次数,进而提高 qᵢ 向量不够准确的风险。
显然,我们需要一种能够求解方程组的方法。我的方法通过生成方程组来扩展 GTS 算法。mGTS 模型的概览见图 4.4 和图 4.5。请注意,Vocab Builder 并非独立模型,而是如图 4.5 所示的一组辅助词汇构建步骤的模块集合。
![]()
![]()
算法本身有几处改动,但核心 GTS 算法基本保持不变。为了让 GTS 算法在其分解过程中能预测变量词元(而非运算符、生成数字或复制数字),我需要确定应预测多少个变量,以及每个词元对应的可能性得分值。对于运算符,GTS 使用一个简单的单层前馈网络来预测 n 个运算符的概率。对于复制和生成数字,概率是通过对词元嵌入与目标向量拼接后使用注意力评分系统计算得出的。在本论文中,由于我将变量视为类似于数字而非运算符,我会像处理复制和生成数字那样处理变量,并将变量嵌入添加到输出词汇表的嵌入列表中。这使得注意力机制能够将变量视为潜在词元,并生成其被返回的概率。
我做的另一项修改是移除了原始 GTS 代码中使用的束搜索(beam search)实现。移除束搜索后,我实现了以下两点改进:1)更容易对模型进行修改,因为我不必分别调整训练和评估函数(我改用了一个带 “isTraining” 布尔参数的单一函数);2)评估速度更快。
4.2.3 模块
本节描述 mGTS 模型中使用的主要模块。由于我基本保留了核心 GTS 算法未作改动,因此不在此详述 GTS 模块的具体实现细节。如需了解这些模块的详细信息以及 GTS 过程背后的直觉设计,请参见 Xie 和 Sun [64]。
新增模块
以下描述了将 GTS 模块扩展至代数类数学应用题(algebraic MWPs)所需的新模块。由于 GTS 过程为每个方程都需要一个目标向量(goal vector)和一个词汇表(vocab),我需要确定应计算多少个目标向量、为每个方程构建对应的目标向量,并创建要附加到词汇表中的变量词元(variable tokens),以便在每个方程的 GTS 生成过程中使用。
![]()
GenerateQs 根据 Xie 和 Sun [64] 的方法,目标向量的生成分为两个步骤。我遵循 GTS 流程,即如何为每个节点生成目标向量,并将其扩展至方程级的目标向量。每个目标向量的隐藏状态首先被创建,而对于所有目标向量,前一个方程的递归树嵌入会修改该隐藏目标向量,从而生成该方程的最终目标向量。第一阶段——隐藏状态生成步骤——在此模块中完成。
利用整体问题目标向量 q 和需生成的 n 个目标向量,第 i 个目标向量的隐藏状态计算如下:
![]()
FinalizeQ 该模块完成由 GenerateQs 模块启动的目标向量生成过程。如果当前正在创建第一个目标向量,则不存在先前方程的嵌入。因此,第 i 个方程的目标向量仅由其隐藏状态 计算得出
![]()
![]()
![]()
修改的模块
本节描述的是原始 GTS 代码中仅需进行轻微修改的模块。
预测(Prediction)预测模块返回下一个输出词元为“生成数字”、“复制数字”、“变量”或“运算符”的概率。它同时还生成当前上下文向量。我将变量嵌入添加到“生成数字”和“复制数字”的列表中,以便该模块能够预测变量词元。
未修改的模块
以下模块保持不变:
编码器(Encoder):编码器将输入问题转换为一系列有意义的嵌入表示,并生成一个整体的问题目标向量。我使用相同的编码器架构来处理问题编码和变量编码。
生成(Generate):创建用于左节点和右节点生成过程中的左、右隐藏向量。
合并(Merge):将已完全生成的左节点和右节点与一个根运算符结合,以创建代表整棵树的嵌入向量。
第五章 结果
本论文的主要实验在 Math23K 数据集上进行,以确定所提模型在算术类数学应用题(MWPs)上的表现;并在 DRAW-1K 数据集上进行,以确定其在代数类数学应用题上的表现。此外,我还对 ALG514 和 MAWPS 数据集进行了鲁棒性检验。
在 Math23K 上训练 mGTS 时,我使用批大小为 64、训练 80 轮,并采用 1e⁻³ 的学习率——与 Xie 和 Sun [64] 所用参数一致。对于 DRAW-1K,我使用批大小为 20,以及“生成数字截断值”为 20(即:一个未出现在输入数学应用题中的数字,必须在解中出现至少 20 次才会被纳入输出语言)——相比原始 Xie 和 Sun [64] 代码中的 5 有所提高。详见表 5.1,了解DRAW-1K 开发集上的超参数准确率细分情况。
![]()
5.1 准确率
5.1.1 Math23K
由于我的修改基本保留了核心 GTS 算法不变,我原以为引入变量并把解改为相减形式(见第 4.2.1 节)不会影响模型在 Math23K 上的表现。然而,这些修改导致 Math23K 准确率下降了 10%,如表 5.3 所示。尽管在 Math23K 上性能有所下降,mGTS 仍能达到超过 50% 的解级准确率。
5.1.2 DRAW-1K
本论文的主要目标是使 GTS 能够求解代数类数学应用题,例如 DRAW-1K 中的问题。我发现,我的 mGTS 模型在 DRAW-1K 上最高可达到 26.5% 的准确率,显著低于当前最先进的模型。参见表 5.3,查看 mGTS 与神经网络 SOTA 方法的对比结果。
虽然标准评估指标是解级准确率(solution level accuracy,即解集的准确率),我也考察了词元级准确率(token level accuracy),即方程中位于正确位置的正确词元数量与总词元数量之比,以便更深入理解解级准确率的构成。例如,词元级准确率有助于通过观察每条方程的准确率分解来定位错误发生的位置。在我的实验中,mGTS 模型整体词元级准确率达到 75.0%,其中第一方程为 74.2%,第二方程为 78.2%。这表明 mGTS 模型在第一方程上的表现较差,提示需要进一步关注第一方程。然而,对于方程组而言,可能存在词元级准确率很高但解级准确率为零的情况,因此我的实验主要聚焦于解级准确率。
此外,PredictNumX 模块(第 4.2.3 节)实现了 72% 的准确率。当该模块出错时,会导致准确率大幅下降,因为可能生成不必要的方程(且该方程本身也可能错误),或根本未生成所需方程。然而,当我移除 PredictNumX 模块并改用观测数据的实际方程数量时,准确率并未提升。这是一个有趣的结果,因为我原本预测移除该模块会提高准确率。由于没有提升,这表明 72% 的准确率并非进一步提升准确率的主要限制因素,相反,提高词元级准确率应成为更高优先级的目标。
![]()
关于 GTS 模型的一个有趣现象是其所需的训练数据量。图 5.1 是一张图表,展示了观测样本数量如何影响 GTS 在 Math23K 上的解级准确率。我预计这一结果同样适用于代数类数据集,因此或许随着更多训练数据的加入,mGTS 的准确率会进一步提升。
5.2 鲁棒性
为了验证模型的鲁棒性,我在 ALG514 和 MAWPS 数据集上测试了我的模型。如第 3 章所述,ALG514 仅有 514 个样本,这对 GTS 可达到的准确率构成限制;而 MAWPS 仅包含单变量数学应用题。尽管如此,我希望观察 mGTS 相较于其他深度学习方法在这些数据集上的表现。
由于 ALG514 仅有 514 个样本,而 MAWPS 有 3,320 个样本,我先在 DRAW 数据集上训练 mGTS 模型,再在 ALG514 或 MAWPS 上微调 80 轮。参见表 5.3,查看 ALG514 和 MAWPS 上神经网络 SOTA 方法与 mGTS 的结果对比。
![]()
即使经过预训练,我发现我的模型在 ALG514 和 MAWPS 上的表现仍显著低于其他深度学习方法,但模型仍能在这两个数据集上解决约 50% 的问题。
5.3 扩展实验
我对 mGTS 模型进行了若干微小修改,以观察其对解级准确率的影响。结果见表 5.4。
![]()
首先,我按照 Cao 等人 [8] 的做法,引入了 BERT 模型 [15]。该 BERT 模型除最后两层外均被冻结,并用于问题编码和变量编码两个步骤中,以生成输入词元的嵌入表示。实验结果显示,这一改动导致准确率显著下降。
接着,我尝试引入语义对齐(semantic alignment)模块 [48],该模块通过一个正则化步骤试图对子树进行对齐。我发现应用此扩展后,准确率略有下降。
5.4 运行时间
一个值得关注的问题是我所提出修改的运行时间开销。详见表 5.5 和表 5.6。所有结果均在 Middlebury 学院的 Ada GPU 计算集群上获得。
![]()
在 Math23K 数据集上,我的模型在训练和推理时间上略长于原始 GTS。我认为训练时间的增加主要源于新增模块的引入。
对于 DRAW-1K 数据集,训练和评估时间的增加则归因于该数据集中每个解包含多个方程(见表 3.3)。这导致模型需为每个样本预测 x个词元,共 y个方程,其中 x是最长方程的词元数,y是当前批次中方程数量的最大值。而在 Math23K 中,y=1,因此唯一变量是 x(即每个方程的词元数),从而产生的冗余预测词元数量较少。
第六章 讨论
本研究旨在使用一个最初为算术类数学应用题(arithmetic MWPs)设计的 AI 模型来求解代数类数学应用题(algebraic MWPs)。由于数学应用题常被用于评估模型的推理能力,我通过扩展该模型所能处理的数学应用题类型,从而拓展了其推理能力。与当前基于大语言模型(LLM)的最先进(SOTA)方法相比,我采用了一种专用型(narrow)AI 模型,这提高了模型输出语法有效方程的可信度,并减少了模型所需的训练数据量,尽管其准确率存在显著局限。此外,通过采用专用型 AI 模型,我也向模型使用者明确传达:该模型是专为数学应用题而构建的,因此在设计时充分考虑了数学应用题的特性(例如,答案必须是语法有效的方程,且仅使用有限词汇表中的词元),并在相关任务上进行了评估(而非一个为通用任务设计、仅在当前数学应用题任务上表现优异的模型)。
本研究的动机源于希望将 GTS 算法扩展至代数应用题,从而使专用型 AI 模型具备更广泛的能力。我选择 GTS 算法而非 seq2seq 模型,是因为 GTS 只能生成语法有效的方程,而无需额外学习“什么是语法有效的方程”。通过消除这一负担,我期望模型能更专注于学习变量之间的关系,而非学习方程的结构本身。
在算术类 Math23K 数据集上,实验结果比原始 GTS 模型低了 10%,表明所增加的复杂性对核心 GTS 性能产生了负面影响。可能的原因之一是:在输出语言中新增了一个词元(变量),使得模型在预测时多了一个错误选项,从而降低了词元级和解级的准确率。
另一个可能原因是 mGTS 在处理 Math23K 时生成的方程长度比原始 GTS 更长。由于 mGTS 采用相减形式(见第 4.2.1 节),方程中多了两个词元,这两个额外词元若预测错误,会进一步降低准确率。
最后,Math23K 性能下降的另一个潜在原因可能来自 FinalizeQ 模块——该模块会根据先前的方程对目标向量进行修改。对于第一个方程,由于没有先前方程可供参考,目标向量仅通过线性层进行调整。而原始 GTS 算法在生成目标向量后不再对其进行修改,因为它只需实现单一目标。我在单方程情况下对目标向量的修改,可能导致目标上下文信息丢失,从而基于不完整的信息生成方程。
在代数类 DRAW-1K 数据集上,我对 GTS 算法的扩展效果有限,准确率比当前最先进方法低了 43%。如表 6.1 所示,一个常见的错误来源是模型预测了运算符词元,而非应预测的变量词元。表 6.2 进一步支持了这一点:当应预测变量但未预测变量时,模型最可能预测的词元是运算符。这也解释了为何运算符的准确率高于变量、复制数字和生成数字——模型更倾向于预测运算符。
![]()
另一个有趣的发现是:词元在训练数据中的出现频率会影响模型对该词元的预测准确率。尽管图 6.1 并未显示严格的线性关系,但整体上词元出现次数越多,准确率呈上升趋势。在该数据集中,“生成数字”(generate numbers)仅占 4.12%,而变量占 28.02%,复制数字占 24.87%,运算符占 42.98%。因此,“生成数字”出现频率低而运算符高频,很可能解释了表 6.2 中“生成数字”词元级准确率较低、而运算符准确率较高的现象。
![]()
如表 6.2 中词元数量与词元准确率之间的正相关关系,以及图 5.1 中随着训练集规模增大而提升的解级准确率所示,我认为 mGTS 在 DRAW-1K 上表现不佳的主要原因在于数据集规模过小。由于我的模型并未对 GTS 算法进行实质性改动,我相信 GTS 模型的局限性同样适用于我的 mGTS 模型,即:增加训练数据量会带来更高的准确率。DRAW-1K 的训练集仅包含 600 个样本,因此,若拥有更大规模的数据集,模型的准确率可能会显著提升。
![]()
6.1 局限性
本论文的一个核心局限在于代数类训练数据的匮乏。如果 mGTS 模型在代数数据集上的训练行为与 GTS 在算术数据集上的行为相似(见图 5.1),那么增加代数训练样本的数量可能会提高准确率。然而,目前唯一规模相近的代数数据集(DOLPHIN18K)无法获取,因此我无法确定 mGTS 准确率低下的主要原因究竟是模型架构存在缺陷,还是训练数据不足所致。由于我对模型的修改基本保留了核心 GTS 算法不变,我预期在达到更高解级准确率方面,mGTS 对训练数据量的需求趋势应与 GTS 相似。因此,我相信,只要有足够多的训练样本,我的模型有望达到当前最先进(SOTA)的性能水平。
另一个局限是,如第5.2节所示,我的mGTS模型在ALG514和MAWPS数据集上表现不佳。然而,这支持了我的结论:性能不佳的主要原因通常是数据集规模不足,因为当模型在额外数据上训练后,其准确率会提升(相比之下,mGTS在未经过ALG514或MAWPS训练时,在DRAW-1K上的准确率为26.5%)。
最后,我所提出方法的一个根本性局限是GTS或mGTS模型在教育应用中可能带来的风险。正如第1.2节所述,AI在教育中的一个风险是缺乏问题解决能力。在我看来,更大的风险在于模型虽然缺乏解题能力,却无法向使用者传达这一点。对于大语言模型(LLMs),模型可能会产生“幻觉”,给出荒谬的回答——例如“3 + 4 = 三明治”,学生通常能识别出这是错误的。然而,LLM也可能自信地给出错误答案——例如“3 + 4 = 9”。在第一种情况下,LLM相比我的mGTS方法具有一定优势,因为学生更容易识别出明显错误的答案。但在第二种情况下,mGTS模型可能更具优势。因为在生成词元时,mGTS模型会预测每个词元的概率,并选择概率最高的词元。为了增强对模型的信任并确保生成结果正确,一个有趣的扩展方向是引入置信度阈值机制:当最高概率词元的概率低于设定阈值时,模型终止生成。这一扩展或许可以降低错误生成的风险,从而有望减轻AI在课堂环境中可能引发的问题。
6.2 未来工作
尽管本论文仅聚焦于解码步骤,但构建目标向量(goal vectors)的方法其实有多种。这一问题本身或许就值得一篇独立的学位论文,因为已有大量研究专注于数学应用题(MWPs)的编码步骤(参见表2.1)。例如,若采用 GTS 编码器的扩展方法——如 Zhang 等人 [67] 或 Zhang 等人 [68] 所提出的方法——或许能够生成更优的多方程目标向量。
同样地,在生成变量向量 xi方面也存在多种不同策略:可以使用嵌入表(embedding table),将变量词元通过编码器进行处理,或在编码器输出上应用注意力机制。本论文的一个潜在扩展方向,便是系统性地分析不同变量嵌入生成方法及其对应的模型性能。
另一项有趣的扩展是将树分解过程应用于实际的逻辑单元,以构建命题逻辑语言(Propositional Logic, PL)语句。例如,参见表6.3中 Smith [53] 提供的例子,以及图6.2中可能的树分解结构。
![]()
![]()
这种对 mGTS 算法的扩展可用于从给定前提中生成逻辑表达式,从而让 AI 自动生成结论。尽管当前已有研究将深度学习方法应用于形式化逻辑推理 [17, 19, 13],但据我所知,子目标(sub-goal)方法尚未被用于此类任务。若 mGTS 能采用形式化逻辑推理语言,用户便可清晰看到模型得出特定结论所依据的完整逻辑推导过程,从而显著提升对系统的信任度和依赖度。
6.3 结论
在本论文中,我将一个原本用于求解算术类数学应用题(arithmetic MWPs)的 AI 模型进行了扩展,使其能够求解代数类数学应用题(algebraic MWPs)。通过在目标词汇表中引入变量,并将树分解过程扩展为可生成多个方程,我发现:该模型在算术类数学应用题上的性能略有下降,而在代数类数学应用题上的表现则显著低于当前可比的最先进(SOTA)方法。我认为,这种在代数问题上的性能不足主要源于核心 GTS 模型对大量训练数据的依赖,以及 DRAW-1K 数据集本身规模过小。
原文链接:https://middlebury.figshare.com/articles/thesis/Solving_Math_Word_Problems_Using_AI_Generated_Expression_Trees/28409369
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.