预训练语EBET易博真人平台言模型

  新闻资讯     |      2023-10-06 12:53

  提出一种双向语言模型,基于该预训练模型finetune后在各下游任务取得sota效果。

  随机mask掉句子15%的token,然后让模型预测mask掉的词。因为应用到下游任务finetune时,是没有mask标记的,为了弥补pretrain和finetune两个截断输入的不同,实际操作的时候是随机选择15%的词,然后其中80%替换成[mask]标记,10%保持不变,10%随机替换成其他词。这样模型并不知道该位置是mask还是原词还是随机的词,就迫使模型结合上下文去预测。此外15%*10%=1.5%的随机替换,这个量不大,并不会影响对原有句子的理解。

  跟GPT任务每次都预测全部词相比,MLM任务每次只预测15%的词,因此bert训练时间要更长一点点。

  有些下游任务(比如QA,句子蕴涵)需要判断两个句子的关系,因此作者设计了NSP任务,提高这类任务的泛化能力。

  从一个文档里面选取连续的两个句子作为正样本,从不同的文档选择两个句子作为负样本,以1:1的比例混合。用[CLS]位置的输出向量来做分类任务。

  后面有论文证明该任务提升有限,作者在ALBERT的论文中进行了原因推测:主要是负样本选择的不好导致该任务太容易了,模型没学到东西。因为负样本从两个不同的文档里面选择的,所以他们的主题也不同,而主题是很容易学习的(MLM任务也可以学到一点主题)。所以NSP任务其实更倾向于学主题而不是是否两个句子是连续的。

  针对上面的缺点,ALBERT的论文将NSP任务调整为两个连续句子的顺序,正样本保持不变,负样本为连续的两个句子调换位置后,预测两个句子是否调换了位置。

  一共33亿word的语料,包括8亿的BooksCorpus语料和25亿的英文wikipedia语料。

  句子开头是[CLS],两个句子之间是[SEP],末尾还有个[SEP],第一个[SEP]的segment_id是0,表示第一个句子,第二个[SEP]的segment_id是1,表示第二个句子。

  包括两个segment(注意不是两个句子),每个segment包括多个连续的真实句子

  两个segment来自不同的文档则是NSP任务的负样本,否则是NSP任务的正样本

  每个segment的长度都小于max_len(512),如果两个segment的长度和大于512,则每次选择两个segment中较长的那个segment,随机从头部/尾部丢弃一个字。(处理的时候每个segment的长度期望值的相同的,也就是512的一半256)

  为了提高计算效率,会尽可能长的填满segment;这就带来预训练和finetune的不一致,为缓解这种不一致,会以10%的概率选取一些short的input,即90%的概率输入总长度是max_len,10%的概率输入总长度是random.randint(2, max_len)。对于short的input,不到max_len的部分会补pad,最终输入到model的总长度都是max_len。具体可以见代码

  优化器: Adam,β1=0.9,β2=0.999,L2 weight decay:0.01

  90%的step用128的序列长度,后面10%采用512的长度,加速训练

  在attention is all you need的论文里面实验表明两者效果相差不大,用后者是因为可以推断比训练样本更长的文本

  bert用可学习参数位置编码的原因可能是语料足够大,两者效果相差小,前者实现更简单。可学习的参数在大语料情况下比公式赋值的效果可能更好一点。

  静态MASK:在预训练之前的数据预处理阶段先将语料复制n份,然后进行mask后固化到数据,在预训练阶段直接加载。比如复制10份,epoch=40,那么平均同一个样本同一种mask后的input会被模型见4次。

  [CLS]位置的输出用于预测NSP任务,因此在下游任务中必须要微调,否则没有具体意义。

  learning rate(Adam): 5e-5,3e-5,2e-5

  单层transformer的时间复杂度(假设序列长度为n,隐层大小为d)

  两者加起来就是单层transformer的复杂度,因此当n比较小的时候,复杂度主要是在FFN层,即bert base的512长度复杂度主要是在FFN层

  提出一种轻量化bert,包括两种方法:一个是降低词向量的纬度,二是transformer层的参数共享。

  在和BERT-large相同配置的前提下,参数只有之前的1/18,训练速度是之前的1.7倍。

  不改变隐藏层大小,只降低词向量的纬度。将VH的词向量用两个小矩阵VE和E*H表示,这样当HE的时候,将显著降低参数。其次这也对模型起到正则的作用。作者这样做的两个原因:

  有很多共享策略,只共享FFC层,只共享attention层或者分组共享,作者这里采用完全共享的方式,只有一层参数。作者发现这样作可以让训练更加稳定。

  有研究表明原始BERT的NSP任务(next sentence predict)收效甚微,作者进行了原因推测:主要是负样本选择的不好导致该任务太容易了,模型没学到东西。因为负样本从两个不同的文档里面选择的,所以他们的主题也不同,而主题是很容易学习的(MLM任务也可以学到一点主题)。所以NSP任务其实更倾向于学主题而不是是否两个句子是连续的。针对上面的缺点,ALBERT的论文将NSP任务调整为两个连续句子的顺序SOP任务(sentence order predict),正样本保持不变,负样本为连续的两个句子调换位置后,预测两个句子是否调换了位置。

  作者通过mask掉词组和实体的方式,让预训练模型隐式的学习到知识,属于BERT的效果改进版。

  作者采用了多源语料,代表了不同类型的知识,可以提高迁移学习的能力。具体采用中文、、百度新闻、四种语料,分别2.1kw、5.1kw、4.7kw、5.4kw个句子。

  ERNIE设计DLM(Dialogue Language Model)来强化模型在对话领域的建模能力,类似原始BERT的NSP任务。DLM任务模型的输入是一个多个句子的序列,表示多轮对话,可以是QRQ、QRR、QQR等形式(Q表示query,R表示response)。负样本(fake)是用一个随机的句子替换query或者response。模型的目标是使用[CLS]位置的向量预测该多轮对话是真实的还是fake的。该任务可以和MLM任务兼容。

  作者提出了一个BERT的蒸馏版本,减少了40%的参数,保留了97%的效果,推理耗时减少到之前的60%。之前的研究都是针对特定任务的蒸馏,即BERT在特定任务finetune后蒸馏到小模型,本论文是直接在预训练阶段将语言模型蒸馏到小bert。

  EBET易博app

  teacher模型是bert,本模型为student,在预训练的过程中,进行知识蒸馏。

  层数:减小为bert的一半。作者验证层数对性能影响大,而向量纬度对性能影响很小;减少层数也方便后续使用原bert训练好的参数初始化

  如下图所示,使用训练好的bert的参数初始化影响最大,其次是蒸馏的loss,影响最小的是MLM任务的loss。

  作者在语料、超参、训练方法上对原始BERT进行了优化,属于BERT的工程优化版。

  原BERT的mask策略是在预训练之前的数据处理阶段就做好然后固化到数据里面的,在预训练阶段直接加载。为了多样性,会先复制10份,然后mask,这样比如跑了40个epoch,那么同一条样本会有10种mask后的序列,同一条样本同一种mask后的序列会在训练阶段出现4次。

  本文采用动态mask,即在预训练过程中,在每个batch的data喂给模型之前进行mask,这样每次mask都不同。

  本文分别实现了两种mask策略,实验结果如下,动态的会略好,但是影响不大。

  实验结果如下,前两个任务对比发现单个句子会损伤模型性能,应该是模型缺乏建模长依赖的能力;第三第四个任务跟第一个任务对比可以发现去掉NSP任务效果还提升了,说明NSP任务不是必须的。

  作者还验证使用更多的数据,训练的更久,能提升效果。此外作者还对wordpiece的不同实现方式进行了对比,差别不大。

  现在预训练任务都是利用句子/词共现信息,没有用到词法(比如ner)、语法(比如句子顺序)、语义信息(比如文档中句子相似度)。作者提出一种基于持续学习和多任务学习的预训练框架ERNIE2.0来利用这些信息。

  提出了一个统一的预训练框架ERNIE 3.0,统一了自回归任务和自编码任务。

  在预训练模型中引入了大规模知识图谱,在54个中文任务上取得SOTA的结果,并在SuperGLUE排行榜取得了第一名。

  作者提出通用语义表示和任务语义表示结合的模型框架,该框架融合自编码和自回归等不同的任务语义表示网络,既可同时处理语言理解和语言生成任务,还能做无标注数据的零样本学习(Zero-shot Learning)和有标注数据的微调训练(Fine-tuning)

  第一层是通用语义表示网络,该网络学习数据中的基础和通用的知识。网络使用48层Transformer-XL,隐层大小4096,64头attention

  第二层是任务语义表示网络,该网络基于通用语义表示,学习任务相关的知识。不同任务语义表示网络可通过自编码结构或者自回归结构实现,并通过底层共享实现交互和增强。在学习过程中,任务语义表示网络只学习对应类别的预训练任务,而通用语义表示网络会学习所有的预训练任务。网络使用12层Transformer-XL,隐层大小768,12头attention。

  在ernie 2.0的基础上,新增了知识图谱的预测任务。输入包括两部分,一部分是知识图谱三元组(主体,关系,客体),第二部分是包括该条知识实体的句子。为了让模型能学习到这个知识图谱的关系,可以采用以下两种方法:

  将三元组中的某个实体或者关系去掉,然后通过B段去预测A段的masked部分。(原理是如果一句话包括两个实体,那么这句话应该也包括了这两个实体的关系)

  因为A,B段包含的信息是冗余的,那么通过A理应可以预测B的缺失部分,而通过B也应该可以预测A的缺失部分。如果缺失部分是和语义(知识)有关的,那么模型应该可以学习到一定的知识才对。因此在ERNIE 3.0中作者称之为“知识图谱加强”。