这篇论文目前为止还是在WikiSQL数据集的第一名,所以在这里写个读书笔记。这篇是蚂蚁研究院写的,所以code应该是没有公开。
这篇论文不像TAPAS,有预训练并且在很多数据集上进行实验,这里只针对WikiSQL数据集,在该数据集上取得了高的测试结果。还有一点是,这个模型是Supervised via logical forms,也就是完全监督的,而相反的weakly supervised如TAPAS有介绍,感兴趣点TAPAS
这篇论文针对WikiSQL数据集训练做了两部分的改进,分别叫Erosion和Shuffle,其实这两种方法在普通的深度学习中也经常被使用,字面上就是数据增强和打乱,这篇文章对table QA任务在wikisql数据集上又有了具体的Erosion和Shuffle。另外,在解码阶段,普通的基于seq2seq的table QA任务大部分是通过EG(execution guided)来实现的,这里稍微做了点改进。关于EG下面会详细介绍的。
基础模型
模型的基础架构依旧是transformer,输入是question 和 table schema ,这里的 只使用了表头信息,表里面的内容并没有使用,输出是SQL序列,也就是logical form。表头是以:
<coli> [col name] : [col type]格式输入到模型中, coli表示第几个,col name就是列名称,col type是该列所属类型。
输出的vocabulary是由 组成,其中是语料库词汇,是表格的列信息,是SQL keywords(如SELECT,MAX,MIN等)。
t step的输出由两部分组成,首先是长度为vocabulary的score预测,这是预测t step的SQL序列,另外通过同样的隐藏层计算非归一化的attention score,长度为输入长度,这是对输入的预测。
训练过程Eroson and Shuffle
Eroson
对于输入序列question 和 table schema ,对表格中的列进行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。可能还有细节我忘了说,上周看的论文,这周就忘的差不多了。
转载请注明出处