SeaD: End-to-end Text-to-SQL Generation with Schema-aware Denoising 论文解读

 这篇论文目前为止还是在WikiSQL数据集的第一名,所以在这里写个读书笔记。这篇是蚂蚁研究院写的,所以code应该是没有公开。

这篇论文不像TAPAS,有预训练并且在很多数据集上进行实验,这里只针对WikiSQL数据集,在该数据集上取得了高的测试结果。还有一点是,这个模型是Supervised via logical forms,也就是完全监督的,而相反的weakly supervised如TAPAS有介绍,感兴趣点TAPAS

这篇论文针对WikiSQL数据集训练做了两部分的改进,分别叫ErosionShuffle,其实这两种方法在普通的深度学习中也经常被使用,字面上就是数据增强和打乱,这篇文章对table QA任务在wikisql数据集上又有了具体的Erosion和Shuffle。另外,在解码阶段,普通的基于seq2seq的table QA任务大部分是通过EG(execution guided)来实现的,这里稍微做了点改进。关于EG下面会详细介绍的。

基础模型

模型的基础架构依旧是transformer,输入是question Q 和 table schema S,这里的 S只使用了表头信息,表里面的内容并没有使用,输出是SQL序列,也就是logical form。表头是以:

<coli> [col name] : [col type]格式输入到模型中, coli表示第几个,col name就是列名称,col type是该列所属类型。

输出的vocabulary是由 V=\left \{ Q_{v} , S_{v}, V_{sql}\right \}组成,其中Q_{v}是语料库词汇,S_{v}是表格的列信息,V_{sql}是SQL keywords(如SELECT,MAX,MIN等)。

t step的输出由两部分组成,首先是长度为vocabulary的score预测,这是预测t step的SQL序列,另外通过同样的隐藏层h_{t}计算非归一化的attention score,长度为输入长度,这是对输入的预测。

训练过程Eroson and Shuffle

Eroson

对于输入序列question Q 和 table schema S,对表格中的列进行eroson操作,主要是重排列信息、以一定的概率删除列以及按一定的概率新增列(这些列是其他表中的列),进行这些操作时,<coli>是保持不变的,但如果列被删除了,那么SQL中存在该列的被标记为<unk>,如果被打乱了,那么SQL中存在的该列也会发生变化。可能这里有点不好理解,举个文中的例子:

1. 表格列信息输入如图:<col0> week <col1> data <col3> opponent <col4>attendance

[只能说作者太不认真了呀,col2飞了,col_type这里也没加上,为了方便我把col4也给写上了]

2. 经过Erosion后,就当col2被删了吧,col0被删了,col4变成了col0,col1被别的表格插入了。现在的表格列信息就变了:

<col0> attendance <col1> venue <col3> result <col4> xxx

3. question是:Which week had an attendance of 53,677?

那么原先label SQL是:SELECT `<col0>` from `table-xxx` where `<col4>` = `53677`

由于表格进行了eroson,所以SQL也得相应的发生变化,变成:

SELECT `<unk>` from `table-xxx` where `<col0>` = `53677`

 Shuffle

这里表头信息不变,对问题和SQL进行改变,如图所示:

 这里仅是打乱实体间的顺序,输入是表的column信息、打乱的question以及打乱的SQL,而目标是为了得到正确的SQL和问句,这也就解释了为什么之前模型架构的输出是两部分。

Decoder

正常情况下decoder都是用的EG Decoder,通过Beam Search生成的SQL不一定是能正确执行的SQL,所以大部分model的decoder都是执行所有可能的情况,丢弃执行失败或者空结果的SQL,留下有输出的SQL,文章指出这样做也只是得到微乎其微的提升,因为一般得到错误的SQL的根本原因在于select或者表格schema的列名的变体比较冗余,所以在这里索性之间将beam-search的beam设为1。

并且,错误的select col和一些agg操作结合在一起,会返回一些乱七八糟的结果比如0,这样其实抑制了EG过程,所以EG 期间在 SELECT 中删除agg聚合运算符,以最大限度地提高它的有效性。 请注意,使用这种策略时,应将 WHERE 子句中不等式的条件一起删除,以确保真实 SQL 结果的有效性。

所以总结来说,就是在EG Decoder时,beam=1,另外删除agg操作,这么做其实只是加快了EG Decoder啦,其他也没啥。那你在EG是删除agg,一旦有结果了,还是得把agg操作加回来(这是我的理解哈,你不可能一直不要agg吧,那结果肯定有问题啊,只是在EG的时候去掉,加快操作而已)

实验结果

实验结果其实没啥好说的了,test结果达到93的准确率了,这比之前的TAPAS高了不少(93-88),但是没有公开code,有点遗憾,里面倒是说了很多超参设置,不知道有没有人尝试过复原code。可能还有细节我忘了说,上周看的论文,这周就忘的差不多了。

转载请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值