本篇文章主要讲解本人在今年EMNLP2021发表的一篇关于应用题自动解题的论文。
论文题目为:Recall and Learn: A Memory-augmented Solver for Math Word Problems
代码已开源,欢迎star:REAL4MWP
另外,本人还搜集了近五年来所有关于应用题解题的论文,供研究该方向的学者参考:Math-Word-Problems-PaperList

1. 背景介绍

  数学应用题自动解题任务是指通过给定的应用题题目,设定特定的技术方案得到对应的答案。直接通过题目得到答案忽略了中间的推理过程,因此更通用的做法是通过题目信息得到对应的表达式,再对表达式进行逻辑运算得到答案。受限于数据集的规模,以前的方法大多使用统计机器学习以及模板匹配的方法,但因为无法遍历所有应用题模板,已有方法只在限定的题目模板下效果较好,其他题目的表达式模板若不在语料中出现,则效果较差。自从大规模应用题解题数据集math23k在2017年被公开了之后,基于深度学习的方法开始广泛出现。
  已有方法大多使用基于循环神经网络的序列到序列模型,为了统一模板,首先将题目及表达式中的数字使用统一字符进行表示,其次将题目文本进行编码得到编码向量,再通过解码层解码得到表达式。通过表达式模板进行解题的方法跟人类进行应用题解题的模式差别较大,当人类阅读题目内容时,会尽量弄清楚题目的描述以及题目数字之间的关系,并根据以前掌握的知识进行举一反三。而现有的技术只能学到一种固定模板,不能通过已有的相似题目进行类比学习。

2. 数据集介绍


  数据集格式如上图所示,我们的任务为根据题目信息,预测出对应的表达式。
  首先,我们将任务转换成生成任务,基于seq2seq框架来完成表达式的生成。

3. 动机

人类的学习方式通常依赖于类比学习方法,而不是通过单个训练示例进行学习。因此,如何将类比学习方法整合到一个统一的框架中是本文主要探索的内容。
如上图所示,我们设计了一个名为REAL的新的记忆增强模型来回忆在解决新问题时已经解决的一些熟悉问题,并学习以类比的方式生成类似的解决方案。

4. 提出的方法

  本文提出的方法包括四个部分:1)Memory Module(记忆模块); 2) Representation Module(表示模块); 3) Analogy Module(类比模块); 4) Reasoning Module(推理模块)。

4.1 Memory Module(记忆模块)

  记忆模块为框架图的左边部分,首先,使用word2vec训练语料库的词向量,并使用Mean pooling的方法构造句子向量,以此获取每个题目的题目向量。然后,使用余弦相似度/向量内积对每个题目与语料库所有题目计算相似度,取TopK个题目作为相似题,如下图所示:

  首先,将语料库中的每道题目向量化得到对应的题目向量,向量化方法可采用word2vec或glove算法训练语料库得到每个词的向量表示,然后将每道题目的词向量进行均值池化可得到题目向量;同时将待求解题目向量化得到待求解题目向量;将待求解题目向量与语料库中的每道题目向量进行余弦相似度计算,并取相似度最高的n道题目作为下一步的候选相似习题。

4.2 Representation Module(表示模块)

  表示模块目的是获取待求解题目和检索题目各自的向量表征(token级别)。熟悉生成模型的同学应该知道,Unilm使用了特殊的掩码矩阵来实现基于Bert的文本生成任务。在表示模块中,我们使用了6层的transformer encoder结构,同时借鉴Unilm模型使用掩码矩阵的方法,在此阶段我们也设计了一个相似的掩码矩阵(seq2seq部分的掩码矩阵),即对于一个包含题干和表达式的题目(不管是待求解题目还是检索题目都使用相同的掩码方法),我们让题干各token之间都可以相互看见,而表达式的第k个token只能看到题干的所有token以及表达式的前k-1个token,因此该部分可实现表达式序列的生成同时也不会造成数据的泄露。

  具体掩码矩阵为框架图的中间部分,其中Q表示题干,E表示表达式:

  掩码矩阵中,白色方块使用0进行填充,黑色方块使用负无穷进行填充(负无穷经过softmax之后为0)。最后,将掩码矩阵与Attention矩阵进行叠加,可得到经过掩码处理后的结果。

4.3 Analogy Module(类比模块)

  为了达到类比学习的效果,模型需要聚合待求解题目(题干)及检索题目(包括题干和表达式)的信息。类比模块同样使用6层的transformer encoder结构,并设计了一个聚合多方面信息的掩码矩阵。

  具体掩码矩阵为框架图的右边部分:

  其中输入为{Zq,Ze,Xq,Xe}\{Z_q, Z_e, X_q, X_e\}{Zq,Ze,Xq,Xe},分别表示检索到的题目的题干及表达式,待求解题目的题干及表达式,为了防止数据泄露,我们设计了上图的掩码矩阵(同表示模块,白色方块使用0进行填充,黑色方块使用负无穷进行填充),黑色部分就是我们掩码的部分,具体分析如下:检索题目的题干信息可以互相看到,检索题目的表达式信息可以看到检索题目的题干信息及表达式当前时刻之前的信息;待求解题目的题干可以看到检索题目的题干和表达式信息以及待求解题目的题干信息;待求解题目的表达式可以看到检索题目的题干和表达式信息以及待求解题目的题干信息和表达式当前时刻之前的信息。如此设计的动机是:待求解题目可以参考检索题目的所有信息,学习类比功能;同时确保检索题目本身具备生成能力。为了从检索题目中提取出相应知识,我们针对检索题目添加了一个inductive loss参与训练:Linductive=−∑tNlogpθa(zet∣Zq,ze1:t−1)L_{inductive}=-\sum_t^Nlogp_{\theta_a}(z_e^t|Z_q,z_e^{1:t-1})Linductive=tNlogpθa(zetZq,ze1:t1)其中t表示表达式ZeZ_eZe的第t个token,θa\theta_aθa为待学习参数。

4.4 Reasoning Module(推理模块)

  推理模块借助上一步的类比模块进行有效信息的提取,同时,考虑到在待求解题目的表达式生成过程中,操作数更多地来自于待求解题目的题干中,因此,我们在类比模块的最后一层中引入了copy机制(pointer generation network(PGN),指针网络原理请参考我的另一篇博文:文本生成系列(二)Pointer Generator Network),具体公式推理请参考paper详细内容。

  PGN指针网络基于RNN框架实现,本论文是基于transformer框架,具体实现逻辑如下图所示:

这里贴出具体的实现源码:

class CopyNet2(nn.Module):def __init__(self, config, bert_model_embedding_weights):super(CopyNet2, self).__init__()self.decoder = nn.Linear(bert_model_embedding_weights.size(1),bert_model_embedding_weights.size(0),bias=False)self.decoder.weight = bert_model_embedding_weightsself.bias = nn.Parameter(torch.zeros(bert_model_embedding_weights.size(0)))self.vocab_size = config.vocab_sizeself.p_gen_linear = nn.Linear(config.hidden_size*2, 1, bias=False)def forward(self, x_e, dec_input, attn_dist, enc_batch_extend_vocab, extra_zeros):'''x_e:  shape [batch_size, top_k, pred_len, output_dim]dec_input:  shape [batch_size, top_k, pred_len, output_dim]attn_dist:  shape [batch_size, top_k, ques_seq_len, output_dim]enc_batch_extend_vocab:  shape [batch_size, top_k, ques_seq_len]extra_zeros:  shape [batch_size, top_k, equ_seq_len, vocab_size]'''p_gen_input = torch.cat((x_e, dec_input), 3)  # B x (2*hidden_dim)p_gen = self.p_gen_linear(p_gen_input)  #  [batch_size, top_k, pred_len, 1]p_gen = torch.sigmoid(p_gen)# gen_scores = self.phi_g(x_e)  # batch_size, top_k, pred_len, vocab_sizegen_logit = self.decoder(x_e) + self.bias  # batch_size, top_k, pred_len, vocab_sizevocab_dist = torch.softmax(gen_logit, dim=3)  # Multiply vocab dists by p_gen and attention dists by (1-p_gen)vocab_dist = p_gen * vocab_distattn_dist = (1-p_gen) * attn_distif extra_zeros is not None:vocab_dist = torch.cat([vocab_dist, extra_zeros.float()], 3)final_dist = vocab_dist.scatter_add(3, enc_batch_extend_vocab, attn_dist)probs = final_dist.mean(1)  # batch_size, pred_len, vocab_sizereturn torch.log(probs+1e-8)

其中attn_dist为最后一层transformer的self attention中,Q、K构造的attention输出概率,多头注意力需要进行叠加:

# Q、K构造attention输出概率,多头注意力进行叠加(modeling_mwp.py中的第373行)
attn_dist = nn.Softmax(dim=-1)(torch.sum(attention_scores, dim=1))

4.5 损失函数

推理模块损失函数为:Lanalogical=−log(pθ(y∣Xq)),L_{analogical}=-log(p_\theta(y|X_q)),Lanalogical=log(pθ(yXq)), pθ(y∣Xq)=∏tNEZ∈top−K(p(Zq∣Xq)pθ(yt∣Xq,Z,y1:t−1)p_\theta(y|X_q)=\prod \limits_t^N \underset{{Z\in top-K(p(Z_q|X_q)}} {\mathbb{E}} p_\theta(y_t|X_q,Z,y_{1:t-1})pθ(yXq)=tNZtopK(p(ZqXq)Epθ(ytXq,Z,y1:t1) 其中Z∈top−KZ\in top-KZtopK表示取top-K个最相似的检索题目计算数学期望。
最终,模型损失函数结合inductive loss和analogical loss:L=Lanalogical+λLinductiveL=L_{analogical}+\lambda L_{inductive}L=Lanalogical+λLinductive在本论文中的所有实验中,设置λ=1\lambda =1λ=1即可得到不错的效果。

5. 实验

数据集使用的是Math23K(大约2.3w条样本) 和 Ape210K(大约21w条样本) .

5.1 模型效果对比

与其他SOTA模型的对比效果如下图:

可以看到,我们的REAL模型相对当前SOTA模型在Math23K上有3-5个点的提升,在Ape210K上有7个点的提升。

5.2 消融实验:

其中EN表示等式归一化,为其它SOTA模型常用方法,我自己实现了一个简单版本的,具体请参考源码。
PS: 这篇论文在IDEA方面比较受审稿人认可,只中了EMNLP的Findings的原因是当时实验做的不是很充分,memory module作为主要创新点提升不够明显,这个问题我们在后续的一篇NIPS workshop中做了优化和补充,使得memory module模块效果大幅提升,具体请期待我的下一篇分享。

5.3 top-K实验

以上实验结果都基于top-K=1的情况下,实际上,当top-K增加时,REAL模型的性能还可以进一步地提升。

最终,Math23K最优效果为81.6%,Ape210K最优效果为77.6%.

REAL4MWP-基于记忆增强的应用题自动解题方法相关推荐

  1. 泊位 matlab,一种基于环视相机的自动泊车方法 | 厚势汽车

    原标题:一种基于环视相机的自动泊车方法 | 厚势汽车 厚势按:针对泊车摄像头视场有限的问题,提出了一种基于环视相机的自动泊车方法.采用 4 个鱼眼摄像头,构建了一种环绕车身 360° 的实时视觉泊车辅 ...

  2. 基于领域知识的Docker镜像自动构建方法

    点击上方蓝字关注我们 基于领域知识的Docker镜像自动构建方法 陈伟1,2, 叶宏杰1,2, 周家宏1,2, 魏峻1,2 1 中国科学院大学,北京 100190 2 中国科学院软件研究所,北京 10 ...

  3. 基于EEG的癫痫自动检测: 综述与展望

    目录 摘要 1. 癫痫自动检测流程 1.1 数据采集与输入 1.2 数据预处理 1.3 特征提取与选择 1.4 分类模型学习与评估 2. 癫痫自动检测中的特征 2.1 时域特征 2.2 频域特征 2. ...

  4. 软件测试自动生成测试数据,软件测试中测试数据的自动生成方法浅析

    一.引言 软件质量是制约计算机应用领域进一步发展的关键要素之一,保证软件质量.提高软件可靠性的重要手段是软件测试.软件测试中最关键的问题是测试数据的设计,它主要涉及两个方面,一是测试 数据生成,是测试 ...

  5. 蚂蚁金服AAAI论文:基于长短期老师的样本蒸馏方法和自动车险定损系统的最新突破...

    来源 | 蚂蚁金服 出品 | AI科技大本营(ID:rgznai100) 一年一度在人工智能方向的顶级会议之一AAAI 2020于2月7日至12日在美国纽约举行,旨在汇集世界各地的人工智能理论和领域应 ...

  6. 判断图像局部过暗_CVPR 2020丨基于记忆增强的全局局部整合网络:更准确的视频物体检测方法...

    编者按:在视频物体检测任务中,由于相机失焦.物体遮挡等问题,仅基于图像的目标检测器很可能达不到令人满意的效果.针对此类问题,微软亚洲研究院提出了基于记忆增强的全局-局部整合网络(Memory Enha ...

  7. 日冕物质抛射检测matlab,日冕图像论文,关于基于实时数据的日冕物质抛射自动检测方法相关参考文献资料-免费论文范文...

    导读:本论文主要论述了日冕图像论文范文相关的参考文献,对您的论文写作有参考作用. (昆明理工大学信息与自动化学院,昆明 650504) (Faculty of Information Engineer ...

  8. 依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...

    这篇文章主要介绍了PHP基于反射机制实现自动依赖注入的方法,结合实例形式分析了php使用反射实现自动依赖注入的步骤.原理与相关操作技巧,本文实例讲述了PHP基于反射机制实现自动依赖注入的方法.分享给大 ...

  9. CVPR 2020丨更精准的视频目标检测:基于记忆增强的全局-局部整合网络的方法

    编者按:在视频物体检测任务中,由于相机失焦.物体遮挡等问题,仅基于图像的目标检测器很可能达不到令人满意的效果.针对此类问题,微软亚洲研究院提出了基于记忆增强的全局-局部整合网络(Memory Enha ...

最新文章

  1. 第13章代码《跟老男孩学习Linux运维:Shell编程实战》
  2. 集合框架—HashMap
  3. ERROR LNK2019:无法解析的外部的符号 _sscanf或者_vsprintf
  4. 台式计算机的配置清单(硬件和软件),台式电脑的配置清单和产品推荐
  5. 找到特定ip地址 修改ip_您如何找到网站的IP地址?
  6. Lync与Exchange 2013 UM集成:Lync Server配置
  7. 大二生活之致给影响我最大的大学老师,我和老师的一些事
  8. RealFlow翻译教程——海洋波浪
  9. mysql 不在另一个表中_MySQL选择查询从表中选择不在另一个表中的行?
  10. q函数表格怎么看_会计表格函数玩不会?送你会计表格函数公式大全,财务人都在用...
  11. Hyperledger Fabric教程(10)-- peer命令-链码chaincode
  12. 医院患者随访工作信息化建设可行性报告
  13. 全面设防 让广播风暴远离局域网
  14. 新员工访谈-ORID(事实、体验、理解、决定)
  15. 需要一款管理链接的软件
  16. 民办教育未来10年的发展趋势
  17. nyoj 239 月老的难题 【二分匹配之匈牙利】
  18. 计算机文化与计算思维基础课后题答案,第章 计算机文化与计算思维基础.pdf
  19. 广告dsp,ssp,adx
  20. 2-8、蒙特卡洛模拟

热门文章

  1. CAD文件怎么打开?如何编辑CAD文件?
  2. 2022,LabVIEW未来版本的技术发展路线图
  3. 见过了这位存储老兵,让我对中国的软件定义存储有了新认识
  4. 我的vim配置和solardark主题
  5. 2014年美国对学计算机专业的中国工科生办绿卡政策,美国移民-绿卡
  6. 百胜图Barsetto手动奶泡机测评意想不到的丝滑奶泡
  7. ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file
  8. 微信支付-电商收付通开发-04.支付
  9. 集中注意力的方法(转)
  10. 千岛湖水质受质疑 农夫山泉遭退货要求