RoBERTa 和 ALBERT
BERT 模型是 2018 年提出的,并在很多自然语言处理任务有前所未有的提升。因此 2019 年就有很多工作是围绕着 BERT 展开的,其中出现了两个 BERT 的改进版模型,RoBERTa 和 ALBERT。RoBERTa 在更大的数据集和最优的参数中训练 BERT,使 BERT 的性能再次提升;ALBERT 主要是对 BERT 进行压缩,通过共享所有层的参数以及 Embedding 分解减少 BERT 的参数量。本文主要介绍 BERT 的两种改进模型 RoBERTa 和 ALBERT,关于 BERT 模型可以参考之前的文章《彻底理解 Google BERT 模型》 ,首先总体看一下 RoBERTa 和 ALBERT 的一些特点。RoBERTa:ALBERT:RoBERTa 主要试验了 BERT 中的一些训练设置 (例如 NSP Loss 是否有意义,batch 的大小等),并找出最好的设置,然后再更大的数据集上训练 BERT。原来的 BERT 只使用了 16G 的数据集,而 RoBERTa 在更大的数据集上训练 BERT,使用了 160G 的语料:BERT 在训练的过程中采用了 NSP Loss,原本用意是为了让模型能够更好地捕捉到文本的语义,给定两段语句 X = [x1, x2, ..., xN] 和 Y = [y1, y2, ...., yM],BERT 中的 NSP 任务需要预测 Y 是不是 出现在 X 的后面。但是 NSP Loss 受到不少文章的质疑 ,例如 XLNet,RoBERTa 采用了一个实验验证 NSP Loss 的实用性。实验中采用了四种组合:Segment-Pair + NSP:这个是原来 BERT 的训练方法,使用 NSP Loss,输入的两段文字 X 和 Y 可以包含多个句子,但是 X + Y 的长度要小于 512。Sentence-Pair + NSP:与上一个基本类似,也使用 NSP Loss,但是输入的两段文字 X 和 Y 都分别是一个句子,因此一个输入包含的 token 通常比 Segment-Pair 少,所以要增大 batch,使总的 token 数量和 Sentence-Pair 差不多。Full-Sentences:不使用 NSP,直接从一个或者多个文档中采样多个句子,直到总长度到达 512。当采样到一个文档末尾时,会在序列中添加一个文档分隔符 token,然后再从下一个文档采样。Doc-Sentences:与 Full-Sentences 类似,不使用 NSP,但是只能从一个文档中采样句子,所以输入的长度可能会少于 512。Doc-Sentences 也需要动态调整 batch 大小,使其包含的 token 数量和 Full-Sentences 差不多。上图是实验结果,最上面的两行是使用 NSP 的,可以看到使用 Segment-Pair (多个句子) 要好于 Sentence-Pair (单个句子),实验结果显示使用单个句子会使 BERT 在下游任务的性能下降,主要原因可能是使用单个句子导致模型不能很好地学习长期的依赖关系。中间两行是不使用 NSP Loss 的结果,可以看到两种方式都是比使用 NSP 效果要好的,这说明了 NSP Loss 实际上没什么作用,因此在 RoBERTa 中丢弃了 NSP Loss。原始的 BERT 在训练之前就把数据 Mask 了,然后在整个训练过程中都是保持数据不变的,称为 Static Mask。即同一个句子在整个训练过程中,Mask 掉的单词都是一样的。RoBERTa 使用了一种 Dynamic Mask 的策略,将整个数据集复制 10 次,然后在 10 个数据集上都 Mask 一次,也就是每一个句子都会有 10 种 Mask 结果。使用 10 个数据集训练 BERT。下图是实验结果,可以看到使用 Dynamic Mask 的结果会比原来的 Static Mask 稍微好一点,所以 RoBERTa 也使用了 Dynamic Mask。之前的一些关于神经网络翻译的研究显示了使用一个大的 batch 并相应地增大学习率,可以加速优化并且提升性能。RoBERTa 也对 batch 大小进行了实验,原始的 BERT 使用的 batch = 256,训练步数为 1M,这与 batch = 2K,训练步数 125K 的计算量是一样的,与 batch = 8K 和训练步数为 31K 也是一样的。下图是使用不同 batch 的实验结果,不同 batch 学习率是不同的,可以看到使用 batch = 2K 时的效果最好。BERT 的预训练模型参数量很多,训练时候的时间也比较久。ALBERT 是一个对 BERT 进行压缩后的模型,降低了 BERT 的参数量,减少了训练所需的时间。注意 ALBERT 只是减少 BERT 的参数量,而不减少其计算量。ALBERT 能减少训练时间,这是因为减少了参数之后可以降低分布式训练时候的通讯量;ALBERT 不能减少 inference 的时间,因为 inference 的时候经过的 Transformer 计算量和 BERT 还是一样的。下面介绍 ALBERT 的一些优化方法。这是对 Embedding 进行分解,从而减少参数。在 BERT 中,Embedding 的维度和 Transformer 隐藏层维度是一样的,都是 H。假设词库的大小为 V,则单词的 Embedding 矩阵参数量就有 VH,如果词库很大,则参数量会很多。因此,ALBERT 使用了一种基于 Factorized 的方法,不是直接把单词的 one-hot 矩阵映射到 H 维的向量,而是先映射到一个低维空间 (E 维),再映射到 H 维的空间,这个过程类似于做了一次矩阵分解。这个是参数共享机制,即所有 Transformer 层共享一套参数,Transformer 包括 Multi-Head Attention 的参数和 Feed-Forward 的参数。针对不同部分的参数,ALBERT 采用了四种方式实验。all-shared:共享所有的 Transformer 参数。shared-attention:只共享 Transformer 中 Multi-Head Attention 的参数。shared-FFN:只共享 Transformer 中 Feed-Forward 的参数。not-shared:不共享参数。上图显示了不同共享方式模型的参数量,可以看到共享所有参数之后的模型要远远小于不共享参数的模型。当 E = 768 时,not-shared 的参数量其实就是 BERT-base 的参数量,等于 108M,而共享所有参数后,模型的参数量变为 31M。通过共享参数可以有效地减少模型的参数量,另外共享参数还可以帮助模型稳定网络中的参数。作者对比了 ALBERT 和 BERT 每一层 Transformer 的输入和输出的 L2 距离,发现 ALBERT 的效果更加平滑,如下图所示。如 RoBERTa 结果显示的,NSP Loss 对于模型并没有什么用处,因此 ALBERT 也对 NSP 进行了一些思考。ALBERT 认为 BERT 中使用的 NSP 任务过于简单了,因为 NSP 的反例是随机采样得到的,这些反例的句子通常属于不同的主题,例如前面的句子是来自体育新闻,而后面的句子来自于娱乐新闻。因此 BERT 在进行 NSP 任务时,通常是不需要真正学习句子之间的语义以及顺序的,只需要判断它们的主题类型。ALBERT 将 NSP 替换成了 SOP (sentence order prediction),预测两个句子是否被交换了顺序。即输入的两个句子是来自同一文档的连续句子,并随机对这两个句子的顺序进行调换,让模型预测句子是否被调换过。这样可以让模型更好地学习句子语义信息和相互关系。RoBERTa 更像是一个经过仔细调参后得到的 BERT 模型,并且使用了更大的数据集进行训练。ALBERT 对 BERT 的参数量进行了压缩,并且能够减少分布式训练的开销。但是 ALBERT 并不能减少需要的计算量,因此模型在 inference 时的速度没有提升。RoBERTa: A Robustly Optimized BERT Pretraining ApproachALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS

BERT预训练模型
n-gram语言模型:根据前面n个词预测当前词,它的缺点是,一般只能取1-2,n越大计算成本越高,这就使得它关注的信息是非常局限的。 预训练语言模型:wordvecglovefasttext。wordvec是根据周围词预测当前词或当前词预测周围词,相比于n-gram,它关注了下文,但它仍然是关注局部信息。glove通过构建词频共现矩阵来训练词向量,将全局信息融入到词向量中。fasttext仍然是局部的,只是他分词是基于subword,对于oov词相对友好。三者共同的缺点是,无法解决一词多义问题。高级语言模型:elmoGPT,elmo采用1层静态向量+2层单向LSTM提取特征,并且能够解决一词多义,elmo是一个双向语言模型,但实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比 BERT 一体化融合特征方式弱。GPT采用Transformer的decoder单元提取特征,同样也可以解决一词多义问题,但GPT是单向的。所以,对上下文信息的融合,二者能力还不够。bert是双向语言模型,句子没有shift_mask操作,所以是完整的上下文环境,证实了双向语言模型对文本特征表示的重要性。bert同时证实了预训练模型能够简化很多繁重任务的网络结构,在11个nlp任务上都有显著提升。bert采用Transformer的encoder单元提取特征,encoder中包含几个重要的机制:self-attention、muti-head attention、position encoding。bert分为bert_base和bert_large大小两个模型,bert_base采用了12个encoder单元,768维隐藏层,12个attention。bert_base采用了24个encoder单元,1024维隐藏层,16个attention。input:单句或句对组合,有[cls]作为句子开头的标记,[sep]作为句子分隔和结束的标记。token embedding:对于英文采用WordPiece embeddings,也就是一个单词会被拆成词根词缀的,比如图中的playing被拆成了play和ing两个token;对于中文,就是单子拆分。segment embedding:相邻句子采用不同的标志分隔,形如111111111100000011111100000。position embedding:在transformer中,单词之间是没有先后顺序的,而语言本身是有序的,所以采用采用正余弦函数来计算每个单词的先后顺序,这种方式有点勉强,算是折中方式。前面讲到elmo也是双向语言模型,它是采用bi-LSTM来提取特征,如下:比如一句话:‘北京是中国的首都’,在LSTM中从左往右,预测‘中国’的时候只能看到‘北京’,从右往左,预测‘中国’的时候只能看到‘首都’,然后将两个lstm的输出做拼接来达到上下文信息融合的目的。其实是没有完全做到双向,只是以结构的改变来接近双向语言模型。真正的双向是预测‘中国’的时候,需要同时看到‘北京’和‘首都’。由此,mask LM产生了。mask LM的原理是将‘中国’遮盖住,同时用‘北京’和‘首都’来预测‘中国’。‘北京’和‘首都’联系起来语言模型很容易联想到就是‘中国’啦。这个思想和wordvec的CBOW模型如出一辙,就是用周围词预测当前词,只是这个思想放在厉害的transformer中,便能大显其能。BERT的mask方式:在选择mask的15%的词当中,80%情况下使用mask掉这个词,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。这样mask的优点是什么?1)被随机选择15%的词当中以10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为BERT模型赋予了一定的文本纠错能力;2)被随机选择15%的词当中以10%的概率保持不变,缓解了finetune时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有mask,而finetune时候输入是完整无缺的句子,即为输入不匹配问题)。在Mask LM任务中,模型学到了词与词之间的关系,而NSP任务是要模型学到句子与句子之间的关系,比如问答、推理等。它将训练语料分为两类,一是将50%语料构建成正常语序的句子对,比如A-B句子对,B就是A的实际下一个句子,并做标记为isnext;二是将50%语料构建成非正常语序句子对,B是来自语料库的随机句子,并做标记为notnext。然后通过对句子对的关系做分类,预测B到底是不是A句子的下一个句子,使模型具有句子级别的识别能力。微调的目的在于我们的任务与bert预训练任务是不一致的,但是bert是非常好的语言模型,他具备提取词法和句法的强大能力。将bert嵌入到我们的网络结构中,能够简化在语言模型方面的复杂结构。只需要将输入做成和bert适配的格式就行,而在bert后面接上全连接、CNN等简单模型进行训练,就能够使训练得到一个比较好的效果。GPT 和 BERT 都采用Transformer,Transformer 是encoder-decoder 结构,GPT 的单向语言模型采用 decoder 部分,decoder 的部分见到的都是不完整的句子;BERT 的双向语言模型则采用 encoder 部分,采用了完整句子。他俩最主要的区别在于BERT是双向语言模型,更适合文本分类等任务,GPT是单向语言模型,更适合生成式任务。1)低层网络捕捉了短语级别的结构信息2)表层信息特征在底层网络(3,4),句法信息特征在中间层网络(6~9),语义信息特征在高层网络。(9~12)3)主谓一致表现在中间层网络(8,9)1)ROBERTA•静态mask->动态mask:在bert中每一个epoch被mask的是相同的词,而ROBERTA在每一个epoch结束,重新随机15%的词,使不同的词被mask。•去除句对NSP任务,输入连续多个句子:在bert中最长是512个token,输入单句或者句对不容易把512个token占满,ROBERTA输入更多句子占满512个坑位。•训练使用更多数据 更大batch size 更长时间2)ALBERT•减少参数:词表 V 到隐层 H 的中间,插入一个小维度 E,即一个VxH的embedding变成两个VxE, ExH的两个fc。•共享所有层的参数:Attention 和 FFN,在bert中每一层的Attention 和 FFN的参数是不一样的。•SOP 替换 NSP:负样本换成了同一篇文章中的两个逆序的句子,bert中是A-->B和A-->随机,ALBERT中是A-->B,B-->A。•BERT对MASK 15% 的词来预测。ALBERT 预测的是 n-gram 片段,包含更完整的语义信息。•训练数据长度:90%取512,BERT90% 128 •对应BERT large:H:1024 ->4096 L:24->12 窄而深->宽而浅

预训练模型综述--Albert,xlnet,bert,word2vec
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 hairy2. Transformer —— attention is all you needTransformer模型是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<

BERT:深度双向预训练语言模型
论文标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 论文链接:https://arxiv.org/abs/1810.04805BERT(Bidirectional Encoder Representations from Transformers)通过预训练来学习无标注数据中的深度双向表示,预训练结束后通过添加一个额外的输出层进行微调,最终在多个NLP任务上实现了SOTA。预训练语言模型在实践中证明对提高很多自然语言处理任务有效,其中包括句子层级的任务,比如自然语言推断(natural language inference)和复述(paraphrasing),还有token层级的任务,比如命名实体识别(named entity recognition)和问答(question answering)。在下游任务中应用预训练语言模型表示的方法有两种:feature-based的方法和fine-tuning的方法。举例来说,ELMo这种预训练语言模型使用feature-based的方法,通过将ELMo的预训练的表示作为额外的特征输入到特定于任务的模型中去;GPT使用fine-tuning的方法,通过引入少量的特定于任务的参数,在下游任务中训练时所有的预训练参数。截止BERT之前的预训练语言模型都是单向的(unidirectional),包括GPT和ELMo,这样的方法对句子层级的任务不是最优的,而且对于token层级的任务比如问答非常有害。BERT使用masked language model(MLM)的方法来预训练,这种方法能够训练一个双向的(directional)语言模型。除了masked language model的预训练的方法,BERT还使用了next sentence prediction的预训练方法。BERT的使用分为两个阶段:预训练(pre-training)和微调(fine-tuning)。预训练阶段模型通过两种不同的预训练任务来训练无标注数据。微调阶段模型使用预训练参数初始化,然后使用下游任务(downstream task)的标注数据来微调参数。BERT的一个显著特点是它在不同的任务上有统一的架构,使用时只需要在BERT后面接上下游任务的结构即可使用。BERT的模型架构是一个多层双向的Transformer的encoder。我们标记模型的层数(每一层是一个Tranformer的block)为,模型的hidden size为,self-attention head的数量为。两个比较通用的BERT架构为和。对比GPT,BERT使用了双向self-attention架构,而GPT使用的是受限的self-attention, 即限制每个token只能attend到其左边的token。BERT的输入表示能够是一个句子或者是一个句子对,这是为了让BERT能够应对各种不同的下游任务。BERT的输入是一个序列,该序列包含一个句子的token或者两个句子结合在一起的token。具体地,我们会将输入的自然语言句子通过 WordPiece embeddings 来转化为token序列。这个token序列的开头要加上 [CLS] 这个特殊的token,最终输出的 [CLS] 这个token的embedding可以看做句子的embedding,可以使用这个embedding来做分类任务。由于句子对被pack到了一起,因此我们需要在token序列中区分它们,具体需要两种方式:①在token序列中两个句子的token之间添加 [SEP] 这样一个特殊的token;②我们为每个token添加一个用来学习的embedding来区分token属于句子A还是句子B,这个embedding叫做segment embedding。具体地,BERT的输入由三部分相加组成:token embeddings、segment embeddings和position embeddings。如下图所示:BERT使用两个无监督的任务进行预训练,分别是Masked LM和Next Sentence Prediction(NSP)。如下图所示,我们定义输入的embedding为,BERT最终输出的 [CLS] 的embedding为,最终输出的第个token的embedding为。我们有理由相信一个深度双向模型比left-to-right模型和left-to-right和right-to-left简单连接的模型的效果更加强大。不幸的是,标准的条件语言模型只能够够left-to-right或者right-to-left地训练,这是因为双向条件会使每个token能够间接地“看到自己”,并且模型能够在多层上下文中简单地预测目标词。为了能够双向地训练语言模型,BERT的做法是简单地随机mask掉一定比例的输入token(这些token被替换成 [MASK] 这个特殊token),然后预测这些被遮盖掉的token,这种方法就是Masked LM(MLM),相当于完形填空任务(cloze task)。被mask掉的词将会被输入到一个softmax分类器中,分类器输出的维度对应词典的大小。在预训练时通常为每个序列mask掉15%的token。与降噪自编码器(denoising auto-encoders)相比,我们只预测被mask掉的token,并不重建整个输入。这种方法允许我们预训练一个双向的语言模型,但是有一个缺点就是造成了预训练和微调之间的mismatch,这是因为 [MASK] 这个token不会在微调时出现。为了缓解这一点,我们采取以下做法:在生成训练数据时我们随机选择15%的token进行替换,被选中的token有80%的几率被替换成 [MASK] ,10%的几率被替换成另一个随机的token,10%的几率该token不被改变。然后将使用交叉熵损失来预测原来的token。一些重要的NLP任务如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之间的关系,而这种关系通常不会被语言模型直接捕捉到。为了使得模型能够理解句子之间的关系,我们训练了一个二值的Next Sentence Prediction任务,其训练数据可以从任何单语语料库中生成。具体的做法是:当选择句子A和句子B作为训练数据时,句子B有50%的几率的确是句子A的下一句(标签是 IsNext ),50%的几率是从语料库中随机选择的句子(标签是 NotNext )。 [CLS] 对应的最后一个隐层输出向量被用来训练NSP任务,这个embedding就相当于sentence embedding。虽然这个预训练任务很简单,但是事实上在微调时其在QA和NLI任务上表现出了很好的效果。在前人的工作中,只有sentence embedding被迁移到下游任务中,而BERT会迁移所有的参数来初始化下游任务模型。Transformer的self-attention机制允许BERT建模多种下游任务。对于包含句子对的任务,通常的做法是先独立地对句子对中的句子进行编码,然后再应用双向交叉注意(bidirectional cross attention)。而BERT使用self-attention机制统一了这两个过程,这是因为对拼接起来的句子对进行self-attention有效地包含了两个句子之间的双向交叉注意(bidirectional cross attention)。对于每个任务来说,我们只需要将任务特定的输入输出插入到BERT中然后端到端地微调即可。举例子来说,BERT的预训练输入句子A和句子B在微调时可以类比为:①paraphrasing任务中的句子对;②entailment任务中的hypothesis-premise对;③question answering任务中的question-passage对;④text classification或者sequence tagging任务中的text-∅对(也就是只输入一个text,不必一定需要两个句子)。对于BERT的输出,对于一些token-level的任务,BERT的token表示将被输入到一个输出层,比如sequence tagging或者question answering任务;对于entailment或者sentiment analysis这样的任务,可以将 [CLS] 对应的表示输入到一个输出层。我们使用 [CLS] 这个token的最后一层的隐层向量作为聚合的表示,可以认为是sentence embedding。在微调时只引入一个新的权重,这里的代表标签的数量,然后计算标准分类损失。下图展示了BERT在GLUE上的效果:在这个数据集上,我们将question和passage拼接起来作为一个输入序列(中间是 [SEP] )。在微调时引入一个start向量和一个end向量,计算和的点积然后通过函数作为word是答案的span起始位置的概率:。答案的终止位置也做上述类似处理。从到的候选区间的得分记作,我们挑选的最大得分区间作为预测的结果。下图展示了BERT在SQuAD v1.1上的效果:SQuAD v2.0有的question在提供的passage中没有答案存在。在微调时我们设置没有答案的问题的span的起始和结束位置都是 [CLS] 这个token,也就是start和end的可能性空间包含进了 [CLS] 的位置。在预测时,我们比较没有答案的span得分和最优的有答案得分。当时,我们预测这是一个有答案的问题,这里的用来在dev set上选择最优的。下图展示了BERT在SQuAD v2.0上的效果: 微调时我们为BERT构建4个输入序列,每一个是所给的句子(句子A)和一个可能的延续(句子B)。然后引入一个向量,该向量和每一个输入对应的 [CLS] 的embedding的点积再通过一个层来得到每个选择的得分。下图展示了BERT在SWAG上的效果:

局域网参考模型由哪几层组成
局域网是一个通信网,只涉及到相当于OSI/RM通信子网的功能。由于内部大多采用共享信道的技术,所以局域网通常不单独设立网络层。局域网的高层功能由具体的局域网操作系统来实现。 IEEE 802标准的局域网参考模型与OSI/RM的对应关系,该模型包括了OSI/RM最低两层(物理层和链路层)的功能,也包括网间互连的高层功能和管理功能。从图中可见,OSI/RM的数据链路层功能,在局域网参考模型中被分成媒体访问控制MAC(Medium Access Control)和逻辑链路控制LLC(Logical Link Control)两个子层。在OSI/RM中,物理层、数据链路层和网络层使计算机网络具有报文分组转接的功能。对于局域网来说,物理层是必需的,它负责体现机械、电气和过程方面的特性,以建立、维持和拆除物理链路;数据链路层也是必需的,它负责把不可靠的传输信道转换成可靠的传输信道,传送带有校验的数据帧,采用差错控制和帧确认技术。但是,局域网中的多个设备一般共享公共传输媒体,在设备之间传输数据时,首先要解决由哪些设备占有媒体的问题。所以局域网的数据链路层必须设置媒体访问控制功能。由于局域网采用的媒体有多种,对应的媒体访问控制方法也有多种,为了使数据帧的传送独立于所采用的物理媒体和媒体访问控制方法,IEEE 802 标准特意把 LLC 独立出来形成一具单独子层,使用权LLC子层与媒体无关,仅让MAC子层依赖于物理媒体和媒体访问控制方法。由于穿越局域网的链路只有一条,不需要设立路由器选择和流量控制功能,如网络层中的分级寻址、排序、流量控制、差错控制功能都可以放在数据链路层中实现。因此,局域网中可以不单独设置网络层。当局限于一个局域网时,物理层和链路层就能完成报文分组转接的功能。但当涉及网络互连时,报文分组就必须经过多条链路才能到达目的地,此时就必须专门设置一个层次来完成网络层的功能,在职IEEE 802 标准中灾一层被称为网际层。在参考模型中,每个实体和另一个系统和同等实体按协议进行通信;而一个系统中上下层之间的通信,则通过接口进行,并用服务访问点SAP(Server Access Point) 来定义接口。为了对多个高层实体提供支持,在LLC层的顶部有多个LLC服务访问点(LSAP),为图中的实体A和B提供接口端;在网际层的顶部有多个网间服务访问点(NSAP),为实体C、D和E提供接口端;媒体访问控制服务访问点(MSAP)向LLC实体提供单个接口端。LLC子层中规定了无确认无连接、有确认无连接和面向连接三种类型的链路服务。无确认城无连接服务是一促数据报服务,信息帧在LLC实体间交换时,无需在同等层实体间事先建立逻辑链路,对这种LLC帧进行确认外,其它类似于无确认无连接服务;面向连接服务提供访问点之间的虚电路服务,在任何住处帧交换前,一对LLC实体之间必须建立逻辑路,在数据传送过程中,信息帧依次发送,并提供差错恢复和流量控制功能。 MAC子层在支持LLC层完成毁灭体访问控制功能时,可以提供多个可供选择的毁灭体访问控制方式。使用MSAP支持LLC子层悍,MAC子层实现帧的寻址和识别。MAC到MAC的操作通过同等层协议来进行MAC还产生帧检验序列和完成帧检验等功能。
局域网是一个通信网,只涉及到相当于OSI/RM通信子网的功能。由于内部大多采用共享信道的技术,所以局域网通常不单独设立网络层。局域网的高层功能由具体的局域网操作系统来实现。IEEE 802标准的局域网参考模型与OSI/RM的对应关系,该模型包括了OSI/RM最低两层(物理层和链路层)的功能,也包括网间互连的高层功能和管理功能。从图中可见,OSI/RM的数据链路层功能,在局域网参考模型中被分成媒体访问控制MAC(Medium Access Control)和逻辑链路控制LLC(Logical Link Control)两个子层。在OSI/RM中,物理层、数据链路层和网络层使计算机网络具有报文分组转接的功能。对于局域网来说,物理层是必需的,它负责体现机械、电气和过程方面的特性,以建立、维持和拆除物理链路;数据链路层也是必需的,它负责把不可靠的传输信道转换成可靠的传输信道,传送带有校验的数据帧,采用差错控制和帧确认技术。但是,局域网中的多个设备一般共享公共传输媒体,在设备之间传输数据时,首先要解决由哪些设备占有媒体的问题。所以局域网的数据链路层必须设置媒体访问控制功能。由于局域网采用的媒体有多种,对应的媒体访问控制方法也有多种,为了使数据帧的传送独立于所采用的物理媒体和媒体访问控制方法,IEEE 802 标准特意把 LLC 独立出来形成一具单独子层,使用权LLC子层与媒体无关,仅让MAC子层依赖于物理媒体和媒体访问控制方法。 由于穿越局域网的链路只有一条,不需要设立路由器选择和流量控制功能,如网络层中的分级寻址、排序、流量控制、差错控制功能都可以放在数据链路层中实现。因此,局域网中可以不单独设置网络层。当局限于一个局域网时,物理层和链路层就能完成报文分组转接的功能。但当涉及网络互连时,报文分组就必须经过多条链路才能到达目的地,此时就必须专门设置一个层次来完成网络层的功能,在职IEEE 802 标准中灾一层被称为网际层。 在参考模型中,每个实体和另一个系统和同等实体按协议进行通信;而一个系统中上下层之间的通信,则通过接口进行,并用服务访问点SAP(Server Access Point) 来定义接口。为了对多个高层实体提供支持,在LLC层的顶部有多个LLC服务访问点(LSAP),为图中的实体A和B提供接口端;在网际层的顶部有多个网间服务访问点(NSAP),为实体C、D和E提供接口端;媒体访问控制服务访问点(MSAP)向LLC实体提供单个接口端。 LLC子层中规定了无确认无连接、有确认无连接和面向连接三种类型的链路服务。无确认城无连接服务是一促数据报服务,信息帧在LLC实体间交换时,无需在同等层实体间事先建立逻辑链路,对这种LLC帧进行确认外,其它类似于无确认无连接服务;面向连接服务提供访问点之间的虚电路服务,在任何住处帧交换前,一对LLC实体之间必须建立逻辑路,在数据传送过程中,信息帧依次发送,并提供差错恢复和流量控制功能。 MAC子层在支持LLC层完成毁灭体访问控制功能时,可以提供多个可供选择的毁灭体访问控制方式。使用MSAP支持LLC子层悍,MAC子层实现帧的寻址和识别。MAC到MAC的操作通过同等层协议来进行MAC还产生帧检验序列和完成帧检验等功能。

本文由 在线网速测试 整理编辑,转载请注明出处。