阅读大概需7分钟
跟随小博主,每天进步一丢丢
将句子嵌入到向量空间,在许多NLP任务上都需要用到。相较于词向量,使用句子编码的好处是这些编码后的表示可以在句子层级重用,因而能大大提升推理速度。譬如对于QA任务,对于候选段落可以将其预先缓存,然后就只需要和query的embedding进行匹配即可。
目前有一系列预训练句子编码器的方法,例如:
Skip-thought使用句子表示来生成下个句子,如上图(a);
Inverse Cloze Task要求给定句子,预测其上下文的句子(类似NSP任务),如上图(b);如之前工作证明的那样,该预训练任务较弱,往往难以学到非常细粒度的、带有充分语义信息的句子表示。
目前主流的语言模型预训练任务,如language model、masked language model、sequence generation,都难以直接应用于句子表示预训练。因为它们都采用序列的第一个特殊符号(如:[CLS])作为句子的表示,但是上述预训练任务的目标都没有损失直接作用在这个特殊符号上,这样就导致在这个特殊符号上学出来的句子表示很难包含充分的信息。
另一个限制在于,主流的masked language model都作用在非常长的序列上(比如512),使得模型在恢复被mask的token时,可以直接获取到周边句子的信息(因为在512的跨度上,多个句子都被分割到同一个样本上了,导致不同句子的token之间具有直接的信息交互)。作者认为,这对于学习有效的上下文token表示很有用,但对于学习句子表示则效率较低,因为信息不会主动聚集到[CLS]符号上。
本文提出了Cross-Thought,如上图(c)所示。它将输入文本切分成许多短句,使得恢复某个短句中被mask掉token的信息较难出现在同一个短句中,而不得不依赖于其上下文其它短句的信息:
如上图所示,最后一个短句中被mask掉的“United States”和“George Washington”必须从第一个短句中获得信息才能恢复。本文提出的方法不再是对于所有句子的所有token做attention,而是要求模型从上下文的句子表示中,选取最相关的句子表示用于恢复被mask的token。
由于本文提出的预训练目标是让模型利用上下文的句子信息用来恢复该句子中被mask的token,因此预训练数据的构建方式和传统的预训练模型有所区别。
在传统的预训练模型训练中,语料通常按照最大长度(512)切分,然后将所有切分后的样本随机shuffle。但本文的做法是:
将语料切分成更短的短句
不进行shuffle
这样做使得:
切分后的短句有较大可能不具有恢复mask token的必要信息,而需要从上下文信息中去获取该信息;
不进行shuffle使得预训练短句之间具有上下文依赖关系,而不是像传统预训练任务那样,每个序列被视为是单独的一条样本。
MNLI:textual entailment(句子对分类任务)
SNLI:textual entailment
QQP:语义匹配任务
Quasar-T:阅读理解(选择候选段落)
HotpotQA(选择候选段落)
主实验:
“-5-64”表示,按照64个词切分,同时追加5个特殊token。
HotpotQA实验对比:
本文提出了Cross-Thought,一种创新的训练句子表示的自监督任务,使得模型利用上下文句子的表示用来恢复当前句子中被mask的token。实验结果显示Cross-Thought在短序列上预训练的有效性,进一步在下游任务上finetune的结果显示超出了许多baseline。
下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套! 后台回复【五件套】
下载二:南大模式识别PPT 后台回复【南大模式识别】
整理不易,还望给个在看!