近年来,通过利用大规模文本数据,语言模型预训练取得了巨大的成功。通过使用诸如掩码语言建模等预训练任务,这些模型在多个下游任务上展现出了出色的性能。然而,预训练任务(例如语言建模)和下游任务(例如表格问答)之间的巨大差距使得现有的预训练效率还不够高。在实践中,我们经常需要大量的预训练数据才能获得令人满意的改进,即使是针对域自适应预训练也是如此。我们如何设计一个预训练任务来缩小这个差距,从而加速预训练呢?
概述
在《TAPEX: 通过学习神经SQL执行器进行表格预训练》中,我们探索了在预训练期间使用合成数据作为真实数据的代理,并以TAPEX(通过执行进行表格预训练)作为示例展示其强大性能。在TAPEX中,我们展示了通过在合成语料库上学习神经SQL执行器来实现表格预训练的方法。
注意:[Table]是输入中用户提供的表格的占位符。
如上图所示,TAPEX通过系统化地采样可执行的SQL查询及其在表格上的执行结果,首先合成了一个合成且非自然的预训练语料库。然后,它继续预训练语言模型(例如BART),以输出SQL查询的执行结果,这模拟了神经SQL执行器的过程。
预训练
下图说明了预训练过程。在每一步中,我们首先从网页上获取一个表格。示例表格是关于奥运会的。然后,我们可以采样一个可执行的SQL查询SELECT City WHERE Country = France ORDER BY Year ASC LIMIT 1
。通过一个现成的SQL执行器(例如MySQL),我们可以获得查询的执行结果Paris
。类似地,通过将SQL查询和扁平化的表格的连接作为输入,输入到模型(例如BART编码器),执行结果作为模型的监督(例如BART解码器)的输出。
为什么要使用SQL查询这样的程序而不是自然语言句子作为预训练的源呢?最大的优点是相较于无法控制的自然语言句子,程序的多样性和规模可以得到系统地保证。因此,我们可以通过采样SQL查询轻松合成多样、大规模且高质量的预训练语料库。
您可以在下面使用训练好的神经SQL执行器🤗 Transformers:
from transformers import TapexTokenizer, BartForConditionalGeneration
import pandas as pd
tokenizer = TapexTokenizer.from_pretrained("microsoft/tapex-large-sql-execution")
model = BartForConditionalGeneration.from_pretrained("microsoft/tapex-large-sql-execution")
data = {
"year": [1896, 1900, 1904, 2004, 2008, 2012],
"city": ["athens", "paris", "st. louis", "athens", "beijing", "london"]
}
table = pd.DataFrame.from_dict(data)
# tapex accepts uncased input since it is pre-trained on the uncased corpus
query = "select year where city = beijing"
encoding = tokenizer(table=table, query=query, return_tensors="pt")
outputs = model.generate(**encoding)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
# ['2008']
微调
在微调过程中,我们将自然语言问题和扁平化的表格的连接作为输入,由标注员标注的答案作为模型的输出监督。想要自己对TAPEX进行微调吗?您可以查看这里的微调脚本,该脚本已经正式集成到🤗 Transformers 4.19.0
中!
到目前为止,所有可用的TAPEX模型都由Huggingface官方支持的交互式小部件支持!您可以尝试回答一些问题,如下所示。
实验
我们在四个基准数据集上评估TAPEX,包括WikiSQL(弱)、WikiTableQuestions、SQA和TabFact。前三个数据集都是关于表格问答的,而最后一个数据集是关于表格事实验证的,两者都需要对表格和自然语言进行联合推理。以下是来自最具挑战的数据集WikiTableQuestions的一些示例:
实验结果表明,TAPEX在表格预训练方法方面的表现远远超过以往的方法,并在所有这些方法中实现了⭐新的最先进结果⭐。其中包括对弱监督的WikiSQL语义准确度的改进达到89.6%(超过SOTA 2.3%,超过BART 3.8%),对TabFact准确度的改进达到84.2%(超过SOTA 3.2%,超过BART 3.0%),对SQA语义准确度的改进达到74.5%(超过SOTA 3.5%,超过BART 15.9%),以及对WikiTableQuestion语义准确度的改进达到57.5%(超过SOTA 4.8%,超过BART 19.5%)。据我们所知,这是第一个利用合成可执行程序进行预训练并在各种下游任务上取得新的最先进结果的工作。
与以往表格预训练方法的比较
Google Research的TAPAS(也可在🤗 Transformers中找到)和Meta AI的TaBERT是早期的表格预训练方法,它们揭示了收集更多的领域自适应数据可以提高下游性能。然而,这些先前的工作主要采用通用的预训练任务,例如语言建模或其变种。TAPEX通过牺牲预训练源的自然性来获得领域自适应的预训练任务(即SQL执行),开辟了一条不同的道路。下面是BERT、TAPAS/TaBERT和我们的TAPEX的图形比较。
我们认为SQL执行任务更接近下游的表格问答任务,尤其是从结构推理能力的角度来看。想象一下,你面对一个SQL查询SELECT City ORDER BY Year
和一个自然语言问题Sort all cities by year
。SQL查询和问题所需的推理路径是相似的,只是SQL比自然语言更加严格。如果一个语言模型可以被预训练为忠实地执行SQL查询并产生正确的结果,那么它应该对具有类似意图的自然语言有深入的理解。
那么效率如何?与以前的预训练方法相比,这种预训练方法有多高效?答案在上图中给出:与以前的表格预训练方法TaBERT相比,TAPEX仅使用了2%的预训练语料库就能提高2%,实现了近50倍的加速!使用更大的预训练语料库(例如500万个三元组),在下游数据集上的性能会更好。
结论
在本文中,我们介绍了TAPEX,一种通过采样SQL查询和它们的执行结果自动合成语料库的表格预训练方法。TAPEX通过在多样化、大规模和高质量的合成语料库上学习神经SQL执行器来解决表格预训练中的数据稀缺挑战。对四个下游数据集的实验结果表明,TAPEX在很大程度上优于以往的表格预训练方法,并具有更高的预训练效率。
收获
从TAPEX的成功中我们可以学到什么?我建议,特别是如果你想进行高效的持续预训练,可以尝试以下选项:
- 合成准确而小型的语料库,而不是从互联网上挖掘大型但嘈杂的语料库。
- 通过程序模拟领域自适应技能,而不是通过自然语言句子进行通用语言建模。