Skip to main content
QUICK REVIEW

[论文解读] Learning to Blame: Localizing Novice Type Errors with Data-Driven Diagnosis

Eric L. Seidel, Huma Sibghat|arXiv (Cornell University)|Aug 25, 2017
Software Engineering Research参考文献 20被引用 3
一句话总结

本文提出Nate,一种基于数据驱动的方法,通过在5,000个初学者OCaml程序的语料库上应用监督式机器学习,来定位类型错误,预测最可能引发类型错误的子表达式。通过利用语法、类型和结构特征——包括父表达式和子表达式上下文——Nate在最高等级的责备分配中实现了72%的精确率,分别比OCaml和SHErrLoc高出28和16个百分点。

ABSTRACT

Localizing type errors is challenging in languages with global type inference, as the type checker must make assumptions about what the programmer intended to do. We introduce Nate, a data-driven approach to error localization based on supervised learning. Nate analyzes a large corpus of training data -- pairs of ill-typed programs and their "fixed" versions -- to automatically learn a model of where the error is most likely to be found. Given a new ill-typed program, Nate executes the model to generate a list of potential blame assignments ranked by likelihood. We evaluate Nate by comparing its precision to the state of the art on a set of over 5,000 ill-typed OCaml programs drawn from two instances of an introductory programming course. We show that when the top-ranked blame assignment is considered, Nate's data-driven model is able to correctly predict the exact sub-expression that should be changed 72% of the time, 28 points higher than OCaml and 16 points higher than the state-of-the-art SHErrLoc tool. Furthermore, Nate's accuracy surpasses 85% when we consider the top two locations and reaches 91% if we consider the top three.

研究动机与目标

  • 解决在具有全局类型推断的语言中定位类型错误的挑战,其中错误信息往往远离错误的真正源头。
  • 克服基于约束的错误定位方法的局限性,这些方法无法扩展或适应现实世界初学者的编程错误。
  • 开发一种可扩展的数据驱动方法,用于错误定位,该方法从实际初学者编程行为中学习,而非依赖专家假设。
  • 构建一个大规模、真实的类型错误程序及其修复的语料库,用于训练和评估机器学习模型以实现错误定位。
  • 证明学习到的模型能够泛化到不同批次的初学者程序员,并优于纯粹基于符号或启发式的方法。

提出的方法

  • 通过在OCaml编译器中加入监控机制,在两个学期中记录学生程序提交日志,收集5,000个类型错误的OCaml程序及其后续修复。
  • 通过计算错误程序与修正后程序之间的树形差异(tree-diffs),识别出被修改的确切子表达式,从而提取带标签的训练数据。
  • 为每个程序表达式设计丰富的特征集,包括语法结构、类型信息以及来自父表达式和子表达式上下文的特征。
  • 训练一个监督式机器学习模型(例如梯度提升树)以预测每个表达式作为类型错误源头的可能性。
  • 根据模型置信度对潜在的责备分配进行排序,并评估在top-1、top-2和top-3排名下的精确率。
  • 通过在一年的数据上进行训练并在另一年的数据上进行测试,评估泛化能力,证明对数据分布偏移具有鲁棒性。

实验结果

研究问题

  • RQ1在真实初学者编程行为上训练的数据驱动模型,是否能优于基于约束的错误定位技术,更准确地识别出类型错误的真正源头?
  • RQ2与孤立表达式特征相比,包含上下文特征(父表达式和子表达式)在多大程度上能提升错误定位的精确率?
  • RQ3在某一届学生群体上训练的模型,能在多大程度上泛化到另一学期不同批次的初学者程序员?
  • RQ4一种从实际修复中学习的数据驱动方法,是否能减少专家设计的启发式方法中固有的偏差?
  • RQ5在单一课程数据上训练的模型,是否能在无需大量手动标注数据集的情况下实现高精确率?

主要发现

  • 当仅考虑最高等级的责备分配时,Nate在正确识别应被修改的确切子表达式方面实现了72%的精确率,分别比OCaml高出28个百分点,比SHErrLoc高出16个百分点。
  • 当考虑前两名责备位置时,Nate的精确率达到85%;当考虑前三名时,精确率提升至91%,表明在多个候选位置中具有强大的召回能力。
  • 在一年数据上训练的模型能很好地泛化到另一年程序,表明对数据分布偏移具有鲁棒性,且在不同学生群体中具有实际可用性。
  • 添加上下文特征——特别是来自表达式父节点和子节点的特征——相比最先进方法SHErrLoc提升了16个百分点,凸显了结构上下文的重要性。
  • 尽管仅基于孤立表达式特征的模型性能低于符号方法,但引入类型错误切片特征后,性能达到最先进水平;进一步整合上下文特征则超越了最先进水平。
  • 该方法表明,基于真实初学者错误模式训练的数据驱动模型,能够比专家硬编码的启发式方法更有效地适应实际编程错误,从而减少错误定位中的偏差。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。