上篇博客:Text2SQL学习整理(三):SQLNet与TypeSQL模型简要介绍了WikiSQL数据集提出后两个早期的baseline,那时候像BERT之类的预训练语言模型还未在各种NLP任务中广泛应用,因而作者基本都是使用Bi-LSTM作为基本组件搭建模型。
本篇博客将介绍两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法:SQLOVA和X-SQL模型。其中,SQLOVA这篇工作更是发表在了2019年的NIPS上,可以看出这个任务被越来越多人所关注。
SQLOVA工作的创新点有两个:
整个框架包含两个部分:
上图为一个WikiSQL数据集中的问题-SQL示例。表格的schema(即图中的表名、列名等)是一种结构性信息,而在利用BERT之类的预训练模型时,需要将所有输入全部转为一个序列。SQLOVA的转换方式如下:
可以看到,序列的开始部分是query(也即用户的自然语言问句Question),之后是数据库的各个列的名字。因为WIkiSQL是单表的数据库,所以不需要编码表名。在序列化过程中,SQLOVA利用了BERT中的[CLS]、[SEP]等特殊token作为分隔符。
如上图所示,输入Table-aware Encoding Layer将自然语言查询与整个表的所有header放在一起进行编码,用来表示问题与表两者信息之间存在交互。
与之前的SQLNet类似,SQLOVA在生成SQL语句时采用slot filling的思想,还是分别用6个子模块来生成SQL语句的各个部分。
NL2SQL层的6个子模块不共享参数、代替使用pointer network推断Where_val,这里训练一个模块来推断start和end、where_val不仅依赖于where_col还依赖于where_op(比如text的类型不存在>或<)、当要结合question和header时,采用的是拼接操作而不是求和操作。
SQLOVA使用了Execution-guided decoding技术,以减少不可执行的query语句。
所谓Execution-guided decoding就是在输出返回结果时对检查生成的SQL序列是否是一条语法正确的SQL语句,使模型最终输出的SQL语句一定是可以无语法错误执行的。它是通过将候选列表中的SQL查询按顺序提供给执行器来执行的,并丢弃那些执行失败或返回空结果的查询。该技术可以参考论文Robust Text-to-SQL Generation with Execution-Guided Decoding.
文章还给出了human的performance,从结果来看,SQLova已超过了人类表现。
同时,文章还进行了充分的消融实验以检验各个模块的有效性。可以看出,预训练模型BERT的引入对结果有很大提升。即使用词语的上下文对logical form的acc有很大贡献。
X-SQL也是利用预训练语言模型的方法。它使用BERT风格预训练模型的上下文输出来增强结构化schema表示,并在下游任务中与类型信息一起学习一个新的schema表示。同时,这里不再使用BERT,而是使用MT-DNN(Multi-Task Deep Neural Networks for Natural Language Understanding一种多任务学习出来的语言模型,详见https://fyubang.com/2019/05/23/mt-dnn/)预训练模型。
模型的整体架构如上图所示。
模型包括三个部分:
序列编码器部分类似BERT,但主要改动如下:
该模块根据表格每列的tokens的编码来得到相应列的表示hCi,利用attention。将每个列名对应的多个token输出的向量聚合并且在混入[CTX] token中的信息。
采用与之前同样的做法,最终输出时将任务分解为6个子任务,每个均采用更简单的结构,采用LayerNorm,输入为schema的表示hCi和上下文表示hCTX。
通过这些改进,X-SQL将性能表现提升至90%以上,超过了SQLOVA。
本文介绍了两个借助预训练语言模型BERT(MT-DNN)来表示schem和Question之间上下文关系表示的方法,通过预训练语言模型强大的表示能力,模型第一次在数据集上的表现超越了人类。足以见证当今NLP技术发展之迅速。