转自我本人的其他平台的博客。
本文是今年(2022年)EMNLP上发表的一个工作,该工作延续了上一篇DELTA模型的思路,将多轮问题重构为两阶段pipeline模式:问题重写和单轮Text-to-SQL。让我们一起来看看本文又是如何在DELTA上继续改进的吧。
对于多轮的Text-to-SQL任务,现有的方法通常专注于充分利用历史上下文或以前预测的SQL来进行当前的SQL解析,而忽略了显式地理解模式和会话依赖关系,如共同引用、省略和用户焦点变化。而这些则是多轮Text-to-SQL中最复杂的挑战,下图1展示了关于这些语言现象的示例:
之前的工作大都是简单的将多轮中的各个句子进行拼接(下图2a),就得到了不错的效果,但这些端到端的方法缺乏对这些上下文依赖现象的关注。过去多轮Text-to-SQL领域,只有DELTA模型关注过这个问题,其将整个任务流程分解为两个pipeline的子任务(下图2b):
然而,在实践中,两阶段pipeline方法的限制体现在两个方面:
同时,由于因为text-to-SQL数据集中的多轮题严格围绕底层数据库,现有的text-to-SQL数据集中没有CQR注释。这些需要研究者自己通过一些无监督或半监督的方法来生成CQR标注。
基于以上的发现,本文设计了一个新的两阶段的模型CQR-SQL,它是一个两阶段模型,其中第一阶段是一个schema增强的递归式CQR模型,相比于之前的两阶段方法中的第一阶段模型,该模型有两点更新:
在第二阶段,作者设计了两个一致性任务,即schema grounding consistency task 和 tree-structured SQL parsing consistency task来将self-contained questions和多轮question上下文映射到同一个潜在空间,尽量保证模型在输入self-cotanied question和多轮question上下文时得到相同的输出。这样,在推断阶段,模型将无需重新生成self-contained语句,解决了错误传播问题。
多轮Text-to-SQL任务的目标是在输入当前轮次τ的问句和历史上下文问句q≤τ的前提下,生成对应于该轮次的SQL语句sτ。
CQR-SQL使用Encoder-decoder结构,其中Encoder采用relation-aware Transformer (RAT)结构,Decoder则采用tree-structured LSTM(Yin and Neubig (2017)),都是很经典的Text-to-SQL任务中用到的结构。
由于上下文相关的text-to-SQL缺乏域内CQR标注,我们采用schema enhanced递归CQR方法来收集可靠的self-contained问题。
为了产生与schema更相关的问题,这里把问题的最后拼接了schema信息。
同时,受Edit-SQL和IST-SQL的启发,在多轮编码中加入last predicted SQL query有助于捕获长期依赖。所以,最终的优化目标为:
通用的CQR模型在SParC和CoSQL这类in-domain数据上表现不好,因而本文也采用和DELTA的类似方式来进行半监督的生成标注数据。
具体来说,采用的方法为self-training,该方法就是通过一系列的步骤,用已有的有标签的数据(labelled data),去对剩下的还未标记的数据打标签。从而使得训练数据(training data)更多。
具体步骤如下:
重复:
使用算法描述即如下图所示:
在解决了阶段1的self-contained数据标注问题之后,我们再来看看CQR-SQL模型。图3展示了CQR-SQL的训练示意图,首先这里明确一下,作者使用了两个任务来训练模型:
这里,我们会注意到,这些任务后面都加了Consistency,即这里作者还设计了一致性的Loss确保模型在接收self-contained问题和多轮上下文question时模型的预测尽可能一致。接下来将详细介绍。
这个任务用来预测当前轮次下,哪些database schema会被使用到;由于这是一个不需要顺序的任务(相当于从一堆集合元素中挑出一部分元素的子集),所以为了避免位置信息干扰,这里使用BoW loss(参考:https://zhuanlan.zhihu.com/p/26898768)。
其损失函数定义如下:
BoW loss的ground truth就是第τ轮次中出现的schema item。
同时,为了保持模型在接收self-contained question和多轮question上下文时的一致性,还涉及了一致性loss,如下:
S G K L SG_{KL} SGKL loss就是两次预测之间的KL散度(交换顺序后也要考虑,因为KL散度不对称)
该任务的loss设计与上一个任务相仿,也是由两部分组成,其中第一部分是预测SQL语句的loss,这个需要位置信息,就是正常的cross-entropy loss,另一个则也是一致性loss,形式如下:
最终的loss形态,包含BoW loss、SQL预测loss、和两个阶段中各自的一直连续性loss加和
在Evaluation时需不要额外的self-contaied问题标注了,因为CQR模型已经训练好了可以接收多轮输入或Self-contained问题而产生连续一致的结果。
首先,由于self-contained question缺乏标注,作者标注了一部分self-contained问题作为初始化的标注数据。之后,通过3轮self-training的迭代,最终获得了4441个SParC和1973个CoSQL上的有标签数据来训练CQR模型。
主要实验结果如下表所示:
可以看到。CQR-SQL在绝大多数指标上都取得了SOTA的表现。同时,作者还进行了不同轮次和不同难度的正确性分析,如下图所示:
作者还进行了一些消融实验来验证各个组件的有效性,结果如下表:
同时,作者也提供了两个case study来详细分析:
略
相比于DELTA,CQR-SQL通过一种潜在空间的一致性loss去掉了在推断时需要的两阶段转换,从而避免了错误累积现象,同时使用self-training的方式总结了一些标注数据,实验结果也有了很大提升。