文本匹配一直是自然语言处理(NLP)领域一个基础且重要的方向,一般研究两段文本之间的关系。文本相似度计算、自然语言推理、问答系统、信息检索等,都可以看作针对不同数据和场景的文本匹配应用。
最近,我和小伙伴们参与了阿里天池““新冠疫情相似句对判定大赛”,比赛任务:根据真实场景下疫情相关的肺炎、支原体肺炎等患者提问句对,识别相似的患者问题,就是典型的文本相似匹配应用。 截止3月18日,我们团队在942支参赛队伍中排名第四。
借助比赛的机会,我重新系统梳理、总结了文本匹配的经验方法。本文将着重介绍文本匹配任务中的经典网络Siamse Network,它和近期预训练语言模型的组合使用,一些论文提及的调优技巧以及在此次比赛数据集上的效果检验等。
在正式开始介绍之前,我们先来看一个有趣的故事: 孪生网络的由来!
“Siamse”中的“Siam”是古时泰国的称呼,中文译作暹罗,所以“Siamese”就是指“暹罗”人或“泰国”人。而“Siamese”在英语中是“孪生”的意思,这又是为什么呢?请看下图
十九世纪,泰国出生了一对连体婴儿“恩”和“昌”,当时的医学技术无法使两人分离出来,于是两人顽强地生活了一生。1829年他们被英国商人发现,进入马戏团,在全世界各地演出,1839年他们访问美国北卡罗莱那州成为“玲玲马戏团” 的台柱,最后成为美国公民。1843年4月13日跟英国一对姐妹结婚,恩生了10个小孩,昌生了12个。1874年,两人因病均于63岁离开了人间。他们的肝至今仍保存在费城的马特博物馆内。从此之后“暹罗双胞胎”(Siamese twins)就成了连体人的代名词,也因为这对双胞胎全世界开始重视这项特殊疾病。
由于结构具有鲜明的对称性,就像两个孪生兄弟,所以下图这种神经网络结构被研究人员称作“Siamese Network”,即孪生网络。
其中最能体现“孪生”的地方,在于网络具有相同的编码器(sentence encoder),即将文本转换为高维向量的部分(词嵌入)。网络随后对两段文本的特征进行交互,最后完成分类/相似预测。“孪生网络”结构简单,训练稳定,是很多文本任务不错的baseline模型。
孪生网络的具体用途是衡量两个输入文本的相似程度。例如,现在我们有两个文本 text1 和 text2,首先将文本分别输入 sentence encoder 进行特征提取和编码,将输入映射到新的空间得到特征向量 u和v;最终通过u、v的拼接组合,经过下游网络(比如全连接网络mlp)和激活函数来计算文本1和2的相似性。
整个过程有2个值得关注的点:
(1)在训练和测试过程中, 模型的编码器(sentence encoder)部分是权重共享的 ,这也是“孪生”一词的体现之处。编码器的选择非常广泛,传统的CNN、RNN和Attention、Transformer都可以。
(2)得到特征u、v后,可以直接使用距离公式,如cosine距离、欧式距离等得到两个文本的相似度。不过更通用的做法是,基于u和v构建用于建模两者匹配关系的特征向量,然后用额外的模型(mlp等)来学习通用的文本关系函数映射;毕竟我们的场景不一定只是衡量相似性,可能还有问答、蕴含等复杂任务。
基于孪生网络,还有人提出了 Triplet network 三连体网络。顾名思义,输入由三部分组成,文本1,和1相似的文本2,和1不相似的文本3。训练的目标非常朴素,期望让相同类别间的距离尽可能的小,让不同类别间的距离尽可能的大,即减小类内距,增大类间距。
自从2018年底Bert等预训练语言模型横空出世,NLP届的游戏规则某种程度上已经被大大更改了。在计算资源允许的条件下,Bert成为很多问题的优先选择;甚至有的时候,拿Bert跑一跑baseline,发现问题已经被解决了十之八九。
但是Bert的缺点也很明显,11亿参数量(base版本)使得预测、推理速度明显比CNN等传统网络慢了不止一个量级,对资源要求更高,也不适合处理某些任务。例如,从10000条句子中找到最相似的一对句子,由于可能的组合众多,需要完成49,995,000次推理计算;在一块现代V00GPU上使用Bert计算,将消耗65小时。
考虑到孪生网络的简洁有效,有没有可能将它和Bert强强联合取其精华呢?
当然可以,这正是论文 《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》 的工作,首次提出了 Sentence-Bert模型(以下简称SBert) 。SBert在众多文本匹配工作中(包括语义相似性、推理等)都取得了最优结果。更让人惊讶的是,前文所述的从10000条句子找最相似pair的任务,SBert仅需5秒就能完成!
让我们简短回顾此前Bert是怎么处理文本匹配任务的。
常规做法是将匹配任务转换成二分类任务(相似/不相似)。输入的两个文本拼接成一个序列(中间用一个特殊的符号“SEP”分割),经过12层(base-model)或24层(large-model)的multi-head Transformer模块编码后,将输出层的字向量取平均或者取第一个token位置“CLS”的特征作为句向量,经softmax完成最终分类。
但是论文作者 Nils Reimers 在实验中指出,这样的做法产生的结果并不理想(至少在处理语义检索和聚类问题时是如此),甚至往往比Glove词向量取平均的效果还差。
为了让Bert更好地利用文本信息,作者们在论文中提出了如下的SBert模型结构。是不是非常眼熟?对,这不就是之前见过的孪生网络嘛!
SBert沿用了孪生网络的结构,文本的encoder部分用同一个Bert来处理。之后,作者分别实验了CLS-token和2种池化策略(Avg-Pooling、Mean-Pooling),对Bert输出的字向量进行进一步特征提取、压缩,得到u、v。最后的u、v整合,作者提供了3种策略:
(1)针对分类任务,对u、v拼接组合,最后接入一个mlp网络,使用softmax进行分类输出,损失函数使用交叉熵;
(2)直接计算、输出余弦相似度;训练损失函数采取了均方根误差;
(3)如果输入的是三元组,论文种也给出了相应的损失函数。
总的来说,SBert直接使用Bert的原始权重进行初始化,在具体数据集上微调,训练过程和传统Siamse Network差异不大。但是这种训练方式能让Bert更好的捕捉句子之间的关系,生成更优质的句向量。在评估测试阶段,SBert直接使用余弦相似度来比较两个句向量之间的相似度,极大提升了推理速度。
有实验为证!作者在7个文本匹配相关的任务上做了对比实验,结果在其中的5个任务上,SBert都有更优表现。
此外,作者还做了一些有趣的消融实验。使用NLI和STS为代表的匹配数据集,在进行分类目标函数训练时,作者们测试了不同的整合策略,结果显示“(u, v, |u-v|)”的组合效果最好,这里面最重要的组成部分是元素差: (|u - v|) 。句向量之间的差异度量了两个句子嵌入的维度间的距离,确保相似的对更近,而不同的对更远。
此外,在Pool方法中,平均池化的效果要比另两种方法更好。
完善的实验过程帮助我们避免了不少坑。文章最后,作者对SBert和传统的一些句嵌入方法做了对比,SBert的计算效率要更高一些。其中的smart-batching是论文中的一个小trick,先将输入的文本按长度排序,这样同一个mini-batch的文本长度更加统一,padding填充处理时能显著减少填充的token。
我们将SBert模型在本次比赛的数据集上做了测试。使用数据增强后,线下的训练集和验证集数量分别是13,500和1000条句子组合。预训练模型权重选择的是roberta_wwm_large,训练过程中加入了对抗训练,通过在embedding层额外增加一些噪声点提升模型的泛化能力。
最终SBert单模型在线下验证集上的准确率是957%。直接使用Bert微调的方式,准确率为953%。
总的来说,我们做这次比赛的目的是为了积累更多的经验,尽可能将学术界的前沿算法和工业界结合,从而更好的将相关技术在实际项目中落地。
本文总体介绍了文本匹配任务中常用的网络结构Siamse Network,以及在此基础上改进而来的Sentence-BERT模型。
Siamse Network 简洁的设计和平稳高效训练非常适合作为文本匹配任务的baseline模型,包括不限于问答对话、文本蕴含、文本相似等任务;如果孪生网络不能有效解决,可以再尝试其他更复杂的模型。SBert则充分利用了孪生网络的优点和预训练语言模型强大的特征抽取优势,在众多匹配任务上取得了最优实验结果。
抛开具体任务不谈,SBert 可以帮助我们生成更好的句向量,在一些任务上可能产生更优结果。在推理阶段,SBert直接计算余弦相似度的方式,大大缩短了预测时间;在语义检索、信息搜索等任务中预计会有不错表现。同时, 得益于生成的高质量句嵌入特征,SBert也非常适合做文本聚类、新FAQ发现等工作。
Albert,xlnet,bert,word2vec
通过预训练模型实现迁移学习,迁移学习本质上是在一个数据集上训练模型,然后对该模型进行调整,以在不同的数据集上执行不同的自然语言处理功能。
1 word2vec
线性模型 :
很神奇的地方,从而也说明高维空间映射的词向量可以很好体现真实世界中token之间的关系。如:king-man = queen-woman
负采样 :
由于训练词向量模型的目标不是为了得到一个多么精准的语言模型,而是为了获得它的副产物——词向量。所以要做到的不是在几万几十万个token中艰难计算softmax获得最优的那个词(就是预测的对于给定词的下一词),而只需能做到在几个词中找到对的那个词就行,这几个词包括一个正例(即直接给定的下一词),和随机产生的噪声词(采样抽取的几个负例),就是说训练一个sigmoid二分类器,只要模型能够从中找出正确的词就认为完成任务。
这种负采样思想也应用到之后的BERT里,只不过从word-level变成sentence-level,这样能获取句子间关联关系。
缺点是上下文无关(static):
因而为了让句子有一个整体含义(context),大家会在下游具体的NLP任务中基与词向量的序列做encoding操作。
下面是一个比较表格,模型不细讲了,预测目标这里的next word下一个词,是所有传统语言模型都做的事——寻找下一个词填什么。
BERT模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。
真正的双向encoding:
Masked LM,类似完形填空,尽管仍旧看到所有位置信息,但需要预测的词已被特殊符号代替,可以放心双向encoding。
Transformer做encoder实现上下文相关(context):
使用transformer而不是bi-LSTM做encoder,可以有更深的层数、具有更好并行性。并且线性的Transformer比lstm更易免受mask标记影响,只需要通过self-attention减小mask标记权重即可,而lstm类似黑盒模型,很难确定其内部对于mask标记的处理方式。
提升至句子级别:
学习句子/句对关系表示,句子级负采样。首先给定的一个句子,下一句子正例(正确词),随机采样一句负例(随机采样词),句子级上来做二分类(即判断句子是当前句子的下一句还是噪声),类似word2vec的单词级负采样。
二、BERT细则
这里主要介绍BERT的三个亮点Masked LM、transformer、sentence-level。
1 Masked Language Model
原本叫cloze test,是完形填空的意思。
随机mask语料中15%的token,然后将masked token 位置输出的最终隐层向量送入softmax,来预测masked token。
这样输入一个句子,每次只预测句子中大概15%的词,所以BERT训练很慢。。。(但是google设备NB。。)
而对于盖住词的特殊标记,在下游NLP任务中不存在。因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。如:my dog is hairy
2 Transformer —— attention is all you need
Transformer模型是2018年5月提出的,可以替代传统RNN和CNN的一种新的架构,用来实现机器翻译,论文名称是attention is all you need。无论是RNN还是CNN,在处理NLP任务时都有缺陷。CNN是其先天的卷积操作不很适合序列化的文本,RNN是其没有并行化,很容易超出内存限制(比如50tokens长度的句子就会占据很大的内存)。
下面左图是transformer模型一个结构,分成左边Nx框框的encoder和右边Nx框框的decoder,相较于RNN+attention常见的encoder-decoder之间的attention(上边的一个橙色框),还多出encoder和decoder内部的self-attention(下边的两个橙色框)。每个attention都有multi-head特征。最后,通过position encoding加入没考虑过的位置信息。
下面从multi-head attention,self-attention, position encoding几个角度介绍。
multi-head attention:
将一个词的vector切分成h个维度,求attention相似度时每个h维度计算。由于单词映射在高维空间作为向量形式,每一维空间都可以学到不同的特征,相邻空间所学结果更相似,相较于全体空间放到一起对应更加合理。比如对于vector-size=512的词向量,取h=8,每64个空间做一个attention,学到结果更细化。
self-attention:
每个词位的词都可以无视方向和距离,有机会直接和句子中的每个词encoding。比如上面右图这个句子,每个单词和同句其他单词之间都有一条边作为联系,边的颜色越深表明联系越强,而一般意义模糊的词语所连的边都比较深。比如:law,application,missing,opinion。。。
position encoding:
因为transformer既没有RNN的recurrence也没有CNN的convolution,但序列顺序信息很重要,比如你欠我100万明天要还和我欠你100万明天要还的含义截然不同。。。
transformer计算token的位置信息这里使用正弦波↓,类似模拟信号传播周期性变化。这样的循环函数可以一定程度上增加模型的泛化能力。
但BERT直接训练一个position embedding来保留位置信息,每个位置随机初始化一个向量,加入模型训练,最后就得到一个包含位置信息的embedding(简单粗暴。。),最后这个position embedding和word embedding的结合方式上,BERT选择直接相加。
3 sentence-level representation
在很多任务中,仅仅靠encoding是不足以完成任务的(这个只是学到了一堆token级的特征),还需要捕捉一些句子级的模式,来完成SLI、QA、dialogue等需要句子表示、句间交互与匹配的任务。对此,BERT又引入了另一个极其重要却又极其轻量级的任务,来试图把这种模式也学习到。
句子级负采样
句子级别的连续性预测任务,即预测输入BERT的两端文本是否为连续的文本。训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。 即首先给定的一个句子(相当于word2vec中给定context),它下一个句子即为正例(相当于word2vec中的正确词),随机采样一个句子作为负例(相当于word2vec中随机采样的词),然后在该sentence-level上来做二分类(即判断句子是当前句子的下一句还是噪声)。
句子级表示
BERT是一个句子级别的语言模型,不像ELMo模型在与下游具体NLP任务拼接时需要每层加上权重做全局池化,BERT可以直接获得一整个句子的唯一向量表示。它在每个input前面加一个特殊的记号[CLS],然后让Transformer对[CLS]进行深度encoding,由于Transformer是可以无视空间和距离的把全局信息encoding进每个位置的,而[CLS]的最高隐层作为句子/句对的表示直接跟softmax的输出层连接,因此其作为梯度反向传播路径上的“关卡”,可以学到整个input的上层特征。
segment embedding
对于句对来说,EA和EB分别代表左句子和右句子;对于句子来说,只有EA。这个EA和EB也是随模型训练出来的。
如下图所示,最终输入结果会变成下面3个embedding拼接的表示。
首先,XLNet 是一个类似 BERT 的模型,而不是完全不同的模型。但这是一个非常有前途和潜力的。总之,XLNet是一种通用的自回归预训练方法。
那么什么是自回归(AR)语言模型?
AR语言模型是一种使用上下文词来预测下一个词的模型。但是在这里,上下文单词被限制在两个方向,前向或后向。
AR 语言模型的优势是擅长生成式自然语言处理任务。 因为在生成上下文时,通常是前向的。AR 语言模型很自然地适用于此类 NLP 任务。
但AR语言模型有一些缺点,它只能使用前向上下文或后向上下文,这意味着它不能同时使用前向和后向上下文。
自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似ELMO这种双向都做,然后拼接看上去能够解决这个问题,因为融合模式过于简单,所以效果其实并不是太好。它的优点,其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。而Bert这种DAE模式,在生成类NLP任务中,就面临训练过程和应用过程不一致的问题,导致生成类的NLP任务到目前为止都做不太好。
与 AR 语言模型不同,BERT 被归类为自动编码器(AE)语言模型。
AE 语言模型旨在从损坏的输入重建原始数据。
损坏的输入意味着我们在预训练阶段用 [MASK] 替换原始词 into 。目标是预测 into 得到原始句子。
AE 语言模型的优势是,它可以从向前和向后的方向看到上下文。
但 AE 语言模型也有其缺点。它在预训练中使用 [MASK] ,但这种人为的符号在调优时在真实数据中并不存在,会导致预训练-调优的差异。[MASK] 的另一个缺点是它假设预测(掩蔽的)词 在给定未屏蔽的 词 的情况下彼此独立。例如,我们有一句话“它表明住房危机已经变成银行危机”。我们掩蔽“银行业”和“危机”。在这里注意,我们知道掩蔽的“银行业”和“危机”包含彼此的隐含关系。但 AE 模型试图预测“银行业”给予未掩蔽的 词,并预测“危机”分别给出未掩蔽的 词。它忽略了“银行业”与“危机”之间的关系。换句话说,它假设预测(掩蔽)的标记彼此独立。但是我们知道模型应该学习预测(掩蔽)词之间的这种相关性来预测其中一个词。
作者想要强调的是,XLNet 提出了一种让 AR 语言模型从双向上下文中学习的新方法,以避免 MASK 方法在 AE 语言模型中带来的缺点。
XLNet的出发点就是:能否融合自回归LM和DAE LM两者的优点。就是说如果站在自回归LM的角度,如何引入和双向语言模型等价的效果;如果站在DAE LM的角度看,它本身是融入双向语言模型的,如何抛掉表面的那个[Mask]标记,让预训练和Fine-tuning保持一致。当然,XLNet还讲到了一个Bert被Mask单词之间相互独立的问题,我相信这个不太重要,原因后面会说。当然,我认为这点不重要的事情,纯粹是个人观点,出错难免,看看就完了,不用较真。
AR 语言模型只能向前或向后使用上下文,那么如何让它从双向上下文中学习呢?
语言模型包括两个阶段,即预训练阶段和调优阶段。XLNet 专注于预训练阶段。在预训练阶段,它提出了一个名为排列语言建模的新目标。我们可以从这个名称知道基本思想,它使用排列。
这里我们举一个例子来解释。序列的次序是 [x1, x2, x3, x4] 。这种序列的所有排列如下。
因此对于这 4 个词的([上传失败(image-c7a4e0-1570519576567)]
)句子,有 24([上传失败(image-d738b7-1570519576567)]
)个排列。
情景是我们想要预测 x3 。因此在 24 个排列中有 4 种模式,分别 x3 位于第 1 位,第 2 位,第 3 位,第 4 位。
当然,上面讲的仍然是基本思想。难点其实在于具体怎么做才能实现上述思想。首先,需要强调一点,尽管上面讲的是把句子X的单词排列组合后,再随机抽取例子作为输入,但是,实际上你是不能这么做的,因为Fine-tuning阶段你不可能也去排列组合原始输入。所以,就必须让预训练阶段的输入部分,看上去仍然是x1,x2,x3,x4这个输入顺序,但是可以在Transformer部分做些工作,来达成我们希望的目标。具体而言,XLNet采取了Attention掩码的机制,你可以理解为,当前的输入句子是X,要预测的单词Ti是第i个单词,前面1到i-1个单词,在输入部分观察,并没发生变化,该是谁还是谁。但是在Transformer内部,通过Attention掩码,从X的输入单词里面,也就是Ti的上文和下文单词中,随机选择i-1个,放到Ti的上文位置中,把其它单词的输入通过Attention掩码隐藏掉,于是就能够达成我们期望的目标(当然这个所谓放到Ti的上文位置,只是一种形象的说法,其实在内部,就是通过Attention Mask,把其它没有被选到的单词Mask掉,不让它们在预测单词Ti的时候发生作用,如此而已。看着就类似于把这些被选中的单词放到了上文Context_before的位置了)。具体实现的时候,XLNet是用“双流自注意力模型”实现的,细节可以参考论文,但是基本思想就如上所述,双流自注意力机制只是实现这个思想的具体方式,理论上,你可以想出其它具体实现方式来实现这个基本思想,也能达成让Ti看到下文单词的目标。
上面说的Attention掩码,我估计你还是没了解它的意思,我再用例子解释一下。Attention Mask的机制,核心就是说,尽管当前输入看上去仍然是x1->x2->x3->x4,但是我们已经改成随机排列组合的另外一个顺序x3->x2->x4->x1了,如果用这个例子用来从左到右训练LM,意味着当预测x2的时候,它只能看到上文x3;当预测x4的时候,只能看到上文x3和x2,以此类推……这样,比如对于x2来说,就看到了下文x3了。这种在输入侧维持表面的X句子单词顺序,但是其实在Transformer内部,看到的已经是被重新排列组合后的顺序,是通过Attention掩码来实现的。如上图所示,输入看上去仍然是x1,x2,x3,x4,可以通过不同的掩码矩阵,让当前单词Xi只能看到被排列组合后的顺序x3->x2->x4->x1中自己前面的单词。这样就在内部改成了被预测单词同时看到上下文单词,但是输入侧看上去仍然维持原先的单词顺序了。关键要看明白上图右侧那个掩码矩阵,我相信很多人刚开始没看明白,因为我刚开始也没看明白,因为没有标出掩码矩阵的单词坐标,它的坐标是1-2-3-4,就是表面那个X的单词顺序,通过掩码矩阵,就能改成你想要的排列组合,并让当前单词看到它该看到的所谓上文,其实是掺杂了上文和下文的内容。这是attention mask来实现排列组合的背后的意思。
ALBERT相比于BERT的改进
ALBERT也是采用和BERT一样的Transformer的encoder结果,激活函数使用的也是GELU,在讲解下面的内容前,我们规定几个参数,词的embedding我们设置为E,encoder的层数我们设置为L,hidden size即encoder的输出值的维度我们设置为H,前馈神经网络的节点数设置为4H,attention的head个数设置为H/64。
在ALBERT中主要有三个改进方向。
1、对Embedding因式分解(Factorized embedding parameterization)
在BERT中,词embedding与encoder输出的embedding维度是一样的都是768。但是ALBERT认为,词级别的embedding是没有上下文依赖的表述,而隐藏层的输出值不仅包括了词本生的意思还包括一些上下文信息,理论上来说隐藏层的表述包含的信息应该更多一些,因此应该让H>>E,所以ALBERT的词向量的维度是小于encoder输出值维度的。
在NLP任务中,通常词典都会很大,embedding matrix的大小是E×V,如果和BERT一样让H=E,那么embedding matrix的参数量会很大,并且反向传播的过程中,更新的内容也比较稀疏。
结合上述说的两个点,ALBERT采用了一种因式分解的方法来降低参数量。首先把one-hot向量映射到一个低维度的空间,大小为E,然后再映射到一个高维度的空间,说白了就是先经过一个维度很低的embedding matrix,然后再经过一个高维度matrix把维度变到隐藏层的空间内,从而把参数量从O(V×H) O(V×H)O(V×H)降低到了O(V×E+E×H) O(V×E+E×H)O(V×E+E×H),当E<<H时参数量减少的很明显。
下图是E选择不同值的一个实验结果,尴尬的是,在不采用参数共享优化方案时E设置为768效果反而好一些,在采用了参数共享优化方案时E取128效果更好一些。
2、跨层的参数共享(Cross-layer parameter sharing)
在ALBERT还提出了一种参数共享的方法,Transformer中共享参数有多种方案,只共享全连接层,只共享attention层,ALBERT结合了上述两种方案,全连接层与attention层都进行参数共享,也就是说共享encoder内的所有参数,同样量级下的Transformer采用该方案后实际上效果是有下降的,但是参数量减少了很多,训练速度也提升了很多。
下图是BERT与ALBERT的一个对比,以base为例,BERT的参数是108M,而ALBERT仅有12M,但是效果的确相比BERT降低了两个点。由于其速度快的原因,我们再以BERT xlarge为参照标准其参数是1280M,假设其训练速度是1,ALBERT的xxlarge版本的训练速度是其12倍,并且参数也才223M,评判标准的平均值也达到了最高的887
除了上述说了训练速度快之外,ALBERT每一层的输出的embedding相比于BERT来说震荡幅度更小一些。下图是不同的层的输出值的L2距离与cosine相似度,可见参数共享其实是有稳定网络参数的作用的。
3、句间连贯(Inter-sentence coherence loss)
BERT的NSP任务实际上是一个二分类,训练数据的正样本是通过采样同一个文档中的两个连续的句子,而负样本是通过采用两个不同的文档的句子。该任务主要是希望能提高下游任务的效果,例如NLI自然语言推理任务。但是后续的研究发现该任务效果并不好,主要原因是因为其任务过于简单。NSP其实包含了两个子任务,主题预测与关系一致性预测,但是主题预测相比于关系一致性预测简单太多了,并且在MLM任务中其实也有类型的效果。
这里提一下为啥包含了主题预测,因为正样本是在同一个文档中选取的,负样本是在不同的文档选取的,假如我们有2个文档,一个是娱乐相关的,一个是新中国成立70周年相关的,那么负样本选择的内容就是不同的主题,而正样都在娱乐文档中选择的话预测出来的主题就是娱乐,在新中国成立70周年的文档中选择的话就是后者这个主题了。
在ALBERT中,为了只保留一致性任务去除主题识别的影响,提出了一个新的任务 sentence-order prediction(SOP),SOP的正样本和NSP的获取方式是一样的,负样本把正样本的顺序反转即可。SOP因为实在同一个文档中选的,其只关注句子的顺序并没有主题方面的影响。并且SOP能解决NSP的任务,但是NSP并不能解决SOP的任务,该任务的添加给最终的结果提升了一个点。
4、移除dropout
除了上面提到的三个主要优化点,ALBERT的作者还发现一个很有意思的点,ALBERT在训练了100w步之后,模型依旧没有过拟合,于是乎作者果断移除了dropout,没想到对下游任务的效果竟然有一定的提升。这也是业界第一次发现dropout对大规模的预训练模型会造成负面影响。
参考链接:
彻底搞懂BERT
什么是 XLNet,为何它会超越 BERT?
XLNet:运行机制及和Bert的异同比较
一文揭开ALBERT的神秘面纱
不懂word2vec,还敢说自己是做NLP?
BERT不可以做翻译任务,因为翻译任务是NLP生成式任务,BERT目前是不可以做的。
BERT主要可以做的任务有下面几种:
1 文本分类任务,比如情感分类
2 序列标注任务,比如分词 实体识别 词性标注
3 句子关系判断,比如QA,自然语言推理
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)