Text2SQL学习整理(七)SeaD模型

2,645 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

导语

上篇博客介绍了一种从Sequence labeling角度解决Text-to-SQL任务的模IE-SQL。本篇博客是WikiSQL数据集上最后一篇博客,将介绍一种完全的Seq2seq方法:SeaD,这也是WikiSQL任务上目前的SOTA模型。

简介

SeaD是Schema-aware Denoising的缩写,作者将Text-to-SQL问题重新回归到Seq2Seq生成任务,直接自回归生成来完成这个任务,即逐个token地预测SQL序列。本文的主要方法概括如下:

  • 主任务为Seq2seq模型,直接翻译生成得到结果,不像之前的模型那样为slot filling或对decoder进行约束。使用Hybrid Pointer Networks,输出为词表中的score和输入token的unnormalized attention scores进行concatenation后再进行Softmax操作得到概率值。

  • 设立两个denoising objective来联合训练模型, 借鉴BART模型(参考:arxiv.org/abs/1910.13… )和MASS模型(参考:arxiv.org/abs/1905.02… )的思想,利用一些Erosion和Shuffle的操作,促使模型可以恢复输入或预测的输出。

  • 改进了Execution guided decoding方法为Clause-sensitive EG Decoding,以改进由输出SQL语句候选项中聚合函数可能带来的影响。

详细介绍如下。

方法

类似于masked language model和其他去噪任务,作者提出了两个schema-aware的目标:Erosion和Shuffle,训练模型要么从有噪声的输入中重建原始序列,要么预测有噪声的输出。去噪过程如图2所示。

image.png

Erosion

对于一个给定的输入序列X=Q,SX={Q,S},Q代表输入问句,S代表输入的数据库schema。Erosion对schema的破坏主要有三种操作:

  1. Permutation。即重新排列schema的列。
  2. Removal。即对于每个column,以一个概率随机丢弃。
  3. Addition。以一个概率从数据库中其他表里的schema中拿一个column放到当前schema。

image.png

在上述所有操作中,分离特殊标记的顺序保持不变,因此SQL查询中相应的匿名实体应按照schema顺序更新Erosion操作。(也就是说训练时的Target也要跟着变,如果做了删除操作导致schema中没有相应的列,那么就相应的target就改为<unk>)。

如图2(a)所示,原始的schema信息为:

<col0> week <col1> data <col3> opponent …

对其按一定概率进行Erosion操作,比如删除了一个week的column,然后进行了随机的排序。得到的schema如下:

<col0> attendance <col1> venue <col3> result …

由于其中一个column被删除,且SQL语句中出现的column在schema中的顺序也发生了改变(即attendance变成了col0),所以相应的SQL语句也要进行修改,修改后为:

SELECT ` <unk> ` from ` table ` where ` <col0> ` = ` 53,677 `

通过对schema和SQL序列进行这样的联合修改,模型需要识别与问题真正相关的schema实体,并学会在schema信息不足以构成目标SQL时抛出未知异常。

Shuffle

shuffle这边的操作是固定schema序列S,打乱用户query(即问句)Q和target SQL Y中的mentioned entities。其任务是要模型可以正确的重新排序Q和Y。

如图2(b)所示,原来的Q和Y是:

SELECT ` <col0> ` from ` table ` where ` <col4> ` = ` 53,677 `
Which week had an attendance of 53,677

经过Shuffle后,变为了:

SELECT ` 53,677 ` from ` table ` where ` <col0> ` = ` <col4> `
Which 53,677 had an week of attendance

而模型的一个训练目标就是可以将这种乱序的Q和Y恢复成正常的Q和Y。

恢复打乱的实体顺序的目标是训练模型捕捉不同实体之间的内在联系,从而提高schema linking的性能。值得注意的是,Q和Y作为自我监督目标都参与了去噪任务,并分别进行了训练。尽管需要依赖SQL语句中的value entity来分辨问句中的value entity。但只使用column entity已经足够得到一个不错的性能表现。且由于不需要并行数据,对于SQL和question问句的单语数据的额外语料库可以帮助重新排序任务,这将是这项工作的进一步方向之一。

模型架构

本文采用Seq2seq的Transformer架构,其中输出Decoder端使用Hybrid Pointer Generator Network,即一个指针网络。它的优点是可以直接从输入的Seq中直接复制token到输出,从而解决OOV问题,详情可以参考blog.csdn.net/qq_38556984… 。这样,输出为词表中的score和输入token的unnormalized attention scores进行concatenation后再进行Softmax操作得到概率值。

image.png

然后得到最终的输出结果。

Clause-sensitive EG Decoding

采用完全的Seq2seq架构后,原有的Execute-Guided Decoding(EG)技术需要进行相应的改进才能进行应用,这里作者对其进行了修改,本部分内容并不是本文的重点,这里不再详细介绍。

实验

通过使用改进的EG,SeaD最终取得了目前(可能是很长时间内)的SOTA性能,实验结果如下:

image.png

由于WikiSQL数据集本身的误差,进一步大幅度提升性能基本无望。

总结

本文介绍了目前WikiSQL数据集上的最新方法SeaD,该方法将WikiSQL上的Text-to-SQL问题建模为Seq2seq模型,借助于训练BART和MASS的思想,使用Erosion和Shuffle操作对模型进行联合训练,取得了SOTA的结果。

由于WikiSQL数据集本身比较简单,其中仅涉及SQL语句最基本的条件约束元素,因而实际应用性并不强。在2020年之后,数据集的Leaderboard已经刷到了90%以上,基本解决了该数据集上的Text-to-SQL问题。研究者更多的转向更加复杂和应用性更强的数据集--Spider。下一篇博客将为大家介绍目前Text-to-SQL领域研究最广泛的数据集Spider数据集。