项目笔记 / COMP3888
Grammar Inference
Platform.
我们在 COMP3888 中实现并比较多种语法推断算法。平台将训练与评估分开,因为向目标语言询问是否合法,不等于验证学到的语法能否正确识别输入。
把推断与评估分开。
- 01
训练并保存语法
正例与目标语言 oracle 查询用于推断,结果保存为语法产物
- 02
独立识别
BRNGLR 读取保存的语法,判定留出输入是否属于该语法
- 03
评估反馈
将识别结果与预先记录的测试标签比较,生成评估指标
01 / 项目背景
不止于生成一份语法。
我们小组开发了用于实现和比较 Arvada、TreeVada、Kedavra、Crucio 与 XVada 的语法推断平台,基准流程支持 Arithmetic 和 Lisp。算法从正例训练字符串和目标语言 oracle 的查询反馈中学习语法;得到一份语法只是起点,还需要检查它在未参与训练的输入上如何表现。
训练 oracle 是目标语言原有的解析器,回答“这个字符串属于目标语言吗?”。它提供学习时的成员查询反馈,却不代表推断出的语法。若只继续询问它,就无法知道学到的语法是否接受了不该接受的输入,或漏掉了合法输入。因此,评估需要独立读取推断结果,再与留出测试集的既有标签比较。
02 / 我的贡献
关注系统之间的连接。
参与系统架构设计
我参与了平台的系统架构设计,关注训练、语法产物和评估之间的职责边界:推断算法负责学习并导出语法,评估模块负责读取这份语法并检验它,而不是再次运行推断。
重构评估流程
我重构了评估流程,将训练与评估拆成互不调用的两个环节。训练保存语法与训练元信息;评估只使用保存的语法和留出测试输入,输出逐条预测、指标与评估元信息。这样可以对已有语法单独运行评估,不必重新训练。
接入 BRNGLR 识别器
我接入了原生 BRNGLR 识别器来评估推断出的语法。它回答的是“这个字符串属于保存的语法吗?”,而不是替代训练 oracle 判断目标语言。评估将它对留出正例与负例的识别结果,与预先记录的目标语言标签比较,计算 precision、recall、F1 等指标。
03 / 技术决策
用保存的语法划清边界。
重构中的一个关键决策,是让保存的语法产物成为训练与评估的交界,而不是把评估绑在某个算法的内部状态上。训练导出经过校验、符合 BRNGLR 契约的 JSON 语法产物;评估读取它时,不需要选择推断算法,也不会调用目标语言 oracle。
这使“学到了什么”与“如何检验它”可以分别检查,但也要求导出的语法符合识别器支持的契约。当前独立评估使用字面终结符、字符级 CFG;识别超时或执行错误必须作为评估失败报告,不能伪装成“该输入不属于语法”的负例预测。独立识别提供的是可分析的测试证据,而不是语法与目标语言完全等价的证明。