zoukankan      html  css  js  c++  java
  • 预训练语言模型整理(ELMo/GPT/BERT...)

    简介

    2018年ELMo/GPT/BERT的相继提出,不断刷新了各大NLP任务排行榜,自此,NLP终于找到了一种方法,可以像计算机视觉那样进行迁移学习,被誉为NLP新时代的开端。
    与计算机视觉领域预训练模型不同的是,其通过采用自监督学习的方法,将大量的无监督文本送入到模型中进行学习,即可得到通用的预训练模型,而NLP领域中无监督文本数据要多少有多少,2019年发布的后续研究工作(GPT2、Roberta、T5等)表明,采用更大的数据、更强大的炼丹炉可以不断提高模型性能表现,至少目前看来还没有达到上限。同时,如何缩减模型参数也成为了另一个研究热点,并有相应的论文在今年发表(ALBERT、ELECTRA)。这一类工作为NLP研发者趟通并指明了一条光明大道:就是通过自监督学习,把大量非监督的文本充分利用起来,并将其中的语言知识编码,对各种下游NLP任务产生巨大的积极作用。
    为何预训练语言模型能够达到如此好的效果?主要有如下几点:

    • word2vec等词向量模型训练出来的都是静态的词向量,即同一个词,在任何的上下文当中,其向量表征是相同的,显然,这样的一种词向量是无法体现一个词在不同语境中的不同含义的。
    • 我们采用预训练模型来代替词向量的关键在于,其能够更具上下文的不同,对上下文中的词提取符合其语境的词表征,该词表征向量为一个动态向量,即不同上下文输入预训练模型后,同一个词的词表征向量在两个上下文中的词表征是不同的。
      本文将对一下几个模型进行简单的总结,主要关注点在于各大模型的主要结构,预训练任务,以及创新点:
    • ELMo
    • GPT
    • BERT
    • BERT-wwm
    • ERNIE_1.0
    • XLNET
    • ERNIE_2.0
    • RoBERTa
    • ALBERT
    • ELECTRA

    预训练任务简介

    总的来说,预训练模型包括两大类:自回归语言模型与自编码语言模型

    自回归语言模型

    通过给定文本的上文,对当前字进行预测,训练过程要求对数似然函数最大化,即:

    [max_{ heta} logp_{ heta}(x) = sum_{t=1}^{T}log p_{ heta}(x_t|x_{<t}) ]

    代表模型:ELMo/GPT1.0/GPT2.0/XLNet
    优点:该模型对文本序列联合概率的密度估计进行建模,使得该模型更适用于一些生成类的NLP任务,因为这些任务在生成内容的时候就是从左到右的,这和自回归的模式天然匹配。
    缺点:联合概率是按照文本序列从左至右进行计算的,因此无法得到包含上下文信息的双向特征表征;

    自编码语言模型

    BERT系列的模型为自编码语言模型,其通过随机mask掉一些单词,在训练过程中根据上下文对这些单词进行预测,使预测概率最大化,即

    [max_{ heta} logp_{ heta}(ar{x}|hat{x}) approx sum_{t=1}^{T}log m_tp_{ heta}(x_t|hat{x}) = sum_{t=1}^{T}log m_tlogfrac{exp(H_{ heta}(hat{x})_t^Te(x_t))}{sum_{x'}exp(H_{ heta}(hat{x})_t^Te(x'))} ]

    其本质为去噪自编码模型,加入的 [MASK] 即为噪声,模型对 [MASK] 进行预测即为去噪。
    优点:能够利用上下文信息得到双向特征表示
    缺点:其引入了独立性假设,即每个 [MASK] 之间是相互独立的,这使得该模型是对语言模型的联合概率的有偏估计;另外,由于预训练中 [MASK] 的存在,使得模型预训练阶段的数据与微调阶段的不匹配,使其难以直接用于生成任务。

    预训练模型的简介与对比

    ELMo

    原文链接:Deep contextualized word representations

    ELMo为一个典型的自回归预训练模型,其包括两个独立的单向LSTM实现的单向语言模型进行自回归预训练,不使用双向的LSTM进行编码的原因正是因为在预训练任务中,双向模型将提前看到上下文表征而对预测结果造成影响。因此,ELMo在本质上还是属于一个单向的语言模型,因为其只在一个方向上进行编码表征,只是将其拼接了而已

    细节

    • 引入双向语言模型,其实是2个单向语言模型(前向和后向)的集成,这样做的原因在上一节已经解释过了,用共享词向量来进行预训练;
    • 通过保存预训练好的2层biLSTM,提取每层的词表征用于下游任务;

    ELMo的下游使用

    • 对于每一个字符,其每一层的ELMo表征均为输入词向量与该层的双向编码表征拼接而成,即:

    [R_k = {x^{LM}_k, overrightarrow{h}^{LM}_{k,j}, overleftarrow{h}^{LM}_{k,j} | j = 1, ..., L} = {h^{LM}_{k,j}|j = 0, ..., L} ]

    • 对于下游任务而言,我们需要把所有层的ELMo表征整合为一个单独的向量,最简单的方式是只用最上层的表征,而更一般的,我们采用对所有层的ELMo表征采取加权和的方式进行处理,即:

    [ELMo^{task}_k = E(R_k; heta ^{task}) = gamma ^{task}sum_{j=0}^L s^{task}h^{LM}_{k,j} ]

    其中(s^{task})可以作为学习参数,为一个归一化的权重因子,用于表示每一层的词向量在整体的重要性。(gamma ^{task})为缩放参数,允许具体的task模型去放缩 ELMo 的大小,因为ELMo的表征分布与具体任务的表征分布不一定是一样的,可以将其作为一个辅助特征参数。

    • 得到ELMo表征之后,则需要将其用于下游任务中去,注意,ELMo的微调过程中,并不是严格意义上的微调,预训练模型部分通常是固定的,不参与到后续训练当中。具体的,有以下几种操作方法:
      • 方法一:直接将ELMo表征与词向量拼接,输入到下游任务当中去;
      • 方法二:直接将ELMo表征与下游模型的输出层拼接
      • 另外,还可以在ELMo模型中加入dropout, 以及采用 L2 loss的方法来提升模型。

    GPT/GPT2

    GPT:Improving Language Understanding by Generative Pre-Training
    GPT2:Language Models are Unsupervised Multitask Learners

    GPT

    GPT是“Generative Pre-Training”的简称,从名字上就可以看出其是一个生成式的预训练模型,即与ELMo类似,是一个自回归语言模型。与ELMo不同的是,其采用多层Transformer Decoder作为特征抽取器,多项研究也表明,Transformer的特征抽取能力是强于LSTM的。

    细节

    • 由于GPT仍然是一个生成式的语言模型,因此需要采用Mask Multi-Head Attention的方式来避免预测当前词的时候会看见之后的词,因此将其称为单向Transformer,这也是首次将Transformer应用于预训练模型,预测的方式就是将position-wise的前向反馈网络的输出直接送入分类器进行预测
    • 此外整个GPT的训练包括预训练和微调两个部分,或者说,对于具体的下游任务,其模型结构也必须采用与预训练相同的结构,区别仅在于数据需要进行不同的处理

    微调

    对于带有标签(y)的监督数据([x_1, ..., x_m]),我们直接将其输入到已经完成预训练的模型中,然后利用最后一个位置的输出对标签进行预测,即

    [P(y|x^1, ..., x^m) = softmax(h_l^mW_y) ]

    其中,(W_y)为分类器的参数,(h_l^m)为最后一层最后一个位置的输出。则最大化优化目标即为:

    [L_2(C) = sum_{(x, y)}^{T}log P(y|x^1, ..., x^m) ]

    具体的,对于不同的微调任务,我们需要对数据进行如下处理:

    GPT2

    GPT2 与 GPT 的大致模型框架和预训练目标是一致的,而区别主要在于以下几个方面:

    • 其使用了更大的模型
    • 使用了数量更大、质量更高、涵盖范围更广的预训练数据
    • 采用了无监督多任务联合训练的方式,即对于输入样本,给予一个该样本所属的类别作为引导字符串,这使得该模型能够同时对多项任务进行联合训练,并增强模型的泛化能力

    其他的就不深究了

    优缺点

    BERT

    原文链接:BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding

    BERT 的特征抽取结构为双向的 Transformer,简单来说,就直接套用了 Attention is all you need 中的 Transformer Encoder Block 结构,虽然相比于GPT,仅仅是从单向的变为双向的,但这也意味着 BERT 无法适用于自回归语言模型的预训练方式,因此,BERT提出了两种预训练任务来对其模型进行预训练。

    BERT的预训练

    Task 1: MLM

    由于BERT需要通过上下文信息,来预测中心词的信息,同时又不希望模型提前看见中心词的信息,因此提出了一种 Masked Language Model 的预训练方式,即随机从输入预料上 mask 掉一些单词,然后通过的上下文预测该单词,类似于一个完形填空任务。

    在预训练任务中,15%的 Word Piece 会被mask,这15%的 Word Piece 中,80%的时候会直接替换为 [Mask] ,10%的时候将其替换为其它任意单词,10%的时候会保留原始Token

    • 没有100%mask的原因
      • 如果句子中的某个Token100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词
    • 加入10%随机token的原因
      • Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token ’hairy‘
      • 另外编码器不知道哪些词需要预测的,哪些词是错误的,因此被迫需要学习每一个token的表示向量
    • 另外,每个batchsize只有15%的单词被mask的原因,是因为性能开销的问题,双向编码器比单项编码器训练要更慢

    Task 2: NSP

    仅仅一个MLM任务是不足以让 BERT 解决阅读理解等句子关系判断任务的,因此添加了额外的一个预训练任务,即 Next Sequence Prediction。

    具体任务即为一个句子关系判断任务,即判断句子B是否是句子A的下文,如果是的话输出’IsNext‘,否则输出’NotNext‘。

    训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]符号中

    输入表征

    BERT的输入表征由三种Embedding求和而成:

    • Token Embeddings:即传统的词向量层,每个输入样本的首字符需要设置为[CLS],可以用于之后的分类任务,若有两个不同的句子,需要用[SEP]分隔,且最后一个字符需要用[SEP]表示终止
    • Segment Embeddings:为([0, 1])序列,用来在NSP任务中区别两个句子,便于做句子关系判断任务
    • Position Embeddings:与Transformer中的位置向量不同,BERT中的位置向量是直接训练出来的

    Fine-tunninng

    对于不同的下游任务,我们仅需要对BERT不同位置的输出进行处理即可,或者直接将BERT不同位置的输出直接输入到下游模型当中。具体的如下所示:

    • 对于情感分析等单句分类任务,可以直接输入单个句子(不需要[SEP]分隔双句),将[CLS]的输出直接输入到分类器进行分类
    • 对于句子对任务(句子关系判断任务),需要用[SEP]分隔两个句子输入到模型中,然后同样仅须将[CLS]的输出送到分类器进行分类
    • 对于问答任务,将问题与答案拼接输入到BERT模型中,然后将答案位置的输出向量进行二分类并在句子方向上进行softmax(只需预测开始和结束位置即可)
    • 对于命名实体识别任务,对每个位置的输出进行分类即可,如果将每个位置的输出作为特征输入到CRF将取得更好的效果。

    缺点

    • BERT的预训练任务MLM使得能够借助上下文对序列进行编码,但同时也使得其预训练过程与中的数据与微调的数据不匹配,难以适应生成式任务
    • 另外,BERT没有考虑预测[MASK]之间的相关性,是对语言模型联合概率的有偏估计
    • 由于最大输入长度的限制,适合句子和段落级别的任务,不适用于文档级别的任务(如长文本分类);
    • 适合处理自然语义理解类任务(NLU),而不适合自然语言生成类任务(NLG)

    ELMo/GPT/BERT对比,其优缺点

    ELMo/GPT/BERT 均为在2018年提出的三个模型,且性能是依次提高的,这里将其放在一起对比,来看看这三者之间的主要区别有哪些

    • ELMo 的特征提取器为LSTM,特征抽取能力明显较Transformer更弱,且并行能力较差
    • ELMo/GPT 均为单向语言模型,即自回归语言模型,天生适合用于处理生成式任务,但这种特性也决定了无法提取上下文信息用于序列编码
    • BERT采用双向Transformer作为特征抽取结构,能够有效提取上下文信息用于序列编码

    BERT-wwm

    原文链接:Pre-Training with Whole Word Masking for Chinese BERT
    Github链接:Pre-Training with Whole Word Masking for Chinese BERT(中文BERT-wwm系列模型)

    Whole Word Masking (wwm),暂翻译为全词Mask或整词Mask,是哈工大讯飞联合实验室提出的BERT中文预训练模型的升级版本,主要更改了原预训练阶段的训练样本生成策略。 简单来说,原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask。

    在全词Mask中,如果一个完整的词的部分WordPiece子词被mask,则同属该词的其他部分也会被mask,即全词Mask。这样的做法强制模型预测整个的词,而不是词的一部分,即对同一个词不同字符的预测将使得其具有相同的上下文,这将加强同一个词不同字符之间的相关性,或者说引入了先验知识,使得BERT的独立性假设在同一个词的预测上被打破,但又保证了不同的词之间的独立性。

    作者将全词Mask的方法应用在了中文中,使用了中文维基百科(包括简体和繁体)进行训练,并且使用了哈工大LTP作为分词工具,即对组成同一个词的汉字全部进行Mask。这样一个简单的改进,使得同样规模的模型,在中文数据上的表现获得了全方位的提升

    RoBERTa

    从模型结构上看,RoBERTa基本没有什么太大创新,最主要的区别有如下几点:

    • 移除了NSP这个预训练任务,效果变得更好

    • 动态改变mask策略,把数据复制10份,然后统一进行随机mask;

    • 其他的区别就在于学习率/数据量/batch_size 等

    ERNIE(艾尼) 1.0

    作者认为BERT在中文文本中的MLM预训练模型很容易使得模型提取到字搭配这种低层次的语义信息,而对于短语以及实体层次的语义信息抽取能力是较弱的。因此将外部知识引入大规模预训练语言模型中,提高在知识驱动任务上的性能。具体有如下三个层次的预训练任务:

    • Basic-Level Masking: 跟bert一样对单字进行mask,很难学习到高层次的语义信息;
    • Phrase-Level Masking: 输入仍然是单字级别的,mask连续短语;
    • Entity-Level Masking: 首先进行实体识别,然后将识别出的实体进行mask。

    ERNIE 2.0

    ERNIE 2.0相比于 1.0 来说,主要的改进在于采取 Multi-task learning(多任务同时学习,同时学习的任务数量逐渐增多)以及 Continue-Learning(不同任务组合轮番学习)的机制。其训练任务包括了三个级别的任务:

    • 词级别:
      • Knowledge Masking(短语Masking)
      • Capitalization Prediction(大写预测)
      • Token-Document Relation Prediction(词是否会出现在文档其他地方)
    • 结构级别
      • Sentence Reordering(句子排序分类)
      • Sentence Distance(句子距离分类)
    • 语义级别:
      • Discourse Relation(句子语义关系)
      • IR Relevance(句子检索相关性)

    XLNet

    XLNet针对自回归语言模型单向编码以及BERT类自编码语言模型的有偏估计的缺点,提出了一种广义自回归语言预训练方法。

    提出背景

    • 传统的语言模型(自回归语言模型AR天然适合处理生成任务,但是无法对双向上下文进行表征;

    • 而自编码语言模型(AE)虽然可以实现双向上下文进行表征,但是:

      • BERT系列模型引入独立性假设,没有考虑预测[MASK]之间的相关性;
      • MLM预训练目标的设置造成预训练过程和生成过程不一致;
      • 预训练时的[MASK]噪声在finetune阶段不会出现,造成两阶段不匹配问题;
    • XLNet提出了一种排列语言模型(PLM),它综合了自回归模型和自编码模型的优点,同时避免他们的缺点

    排列语言模型(Permutation Language Model,PLM)

    排列语言模型的思想就是在自回归和自编码的方式中间额外添加一个步骤,即可将两者完美统一起来,具体的就是希望语言模型从左往右预测下一个字符的时候,不仅要包含上文信息,同时也要能够提取到对应字符的下文信息,且不需要引入Mask符号。即在保证位置编码不变的情况下,将输入序列的顺序打乱,然后预测的顺序还是按照原始的位置编码顺序来预测的,但是相应的上下文就是按照打乱顺序的上下文来看了,这样以来,预测对象词的时候,可以随机的看到上文信息和下文信息。另外,假设序列长度为(T),则我们如果遍历(T!)种分解方法,并且模型参数是共享的,PLM就一定可以学习到预测词的所有上下文信息。但显然,遍历(T!)种上下文计算量是十分大的,XLNet采用的是一个部分预测的方法(Partial Prediction),为了减少计算量,作者只对随机排列后的末尾几个词进行预测,并使得如下期望最大化:

    [max_{ heta} E_{Z sim Z_T}[sum_{t = 1}^{T}logp_{ heta}(x_{z_t}|x_{z < t})] ]

    Two-Stream Self-Attention

    直接用标准的Transformer来建模PLM,会出现没有目标(target)位置信息的问题。即在打乱顺序之后,我们并不知道下一个要预测的词是一个什么词,这将导致用相同上文预测不同目标的概率是相同的。

    XLNet引入了双流自注意力机制(Two-Stream Self-Attention)来解决这个问题。Two-Stream Self-Attention表明了其有两个分离的Self-Attention信息流:

    • Query Stream 就为了找到需要预测的当前词,这个信息流的Self-Attention的Query输入是仅包含预测词的位置信息,而Key和Value为上下文中包含内容信息和位置信息的输入,表明我们无法看见预测词的内容信息,该信息是需要我们去预测的;
    • Content Stream 主要为 Query Stream 提供其它词的内容向量,其Query输入为包含预测词的内容信息和位置信息,Value和Key的输入为选中上下文的位置信息和内容信息;

    两个信息流的输出同样又作为对应的下一层的双信息流的输入。而随机排列机制实际上是在内部用Mask Attention的机制实现的。

    Transformer-XL

    Transformer-XL是 XLNet 的特征抽取结构,其相比于传统的Transformer能捕获更长距离的单词依赖关系。

    原始的Transformer的主要缺点在于,其在语言建模中会受到固定长度上下文的限制,从而无法捕捉到更长远的信息。

    Transformer-XL采用片段级递归机制(segment-level recurrence mechanism)和相对位置编码机制(relative positional encoding scheme)来对Transformer进行改进。

    • 片段级递归机制:指的是当前时刻的隐藏信息在计算过程中,将通过循环递归的方式利用上一时刻较浅层的隐藏状态,这使得每次的计算将利用更大长度的上下文信息,大大增加了捕获长距离信息的能力。

    • 相对位置编码:Transformer本身引入了三角函数向量作为位置编码向量。而Transformer-XL复用了上文的信息,这就导致位置编码出现重叠,因此采用了训练的方式得到相对位置编码向量。

    ALBERT

    论文原文:ALBERT: A Lite BERT for Self-supervised Learning of Language Representations

    首先,论文作者提出,当我们让一个模型的参数变多的时候,一开始模型效果是提高的趋势,但一旦复杂到了一定的程度,接着再去增加参数反而会让效果降低,这个现象叫作模型退化(model degratation)。

    因此ALBERT的主要创新点就在于,其提出了两种模型参数缩减的技术,使得在减小模型重量的同时,模型性能不会受到太大的影响。

    对Embedding因式分解(Factorized embedding parameterization)

    在BERT中,Embedding层和隐藏层的维度大小是一致的,即(E = H)。作者认为,词级别的Embedding是没有上下文依赖的表述,而隐藏层的需要对上下文的信息进行处理,因此相对来说隐藏层的维度应该相对来说更高一点,因此采用了一个因式分解的方式对Embedding层的矩阵进行压缩。简单来说,就是先将one-hot映射到一个低维空间(E),然后再将其从低维空间映射到高维空间(H),即参数量的变化为(O(V imes H) => O(V imes E + E imes H)),且论文也用实验证明,Embedding的参数缩减对整个模型的性能并没有太大的影响

    跨层参数共享(Cross-layer parameter sharing)

    ALBERT借鉴了Universal Transformer中的参数共享机制来提高参数利用率,即多层使用同一个模块,从而可以使得参数量得到有效的减少。参数共享的对象为Transformer中的 feed-forward layer 参数和 self-attention 参数,默认方式是两者均共享。

    由实验结果中可知,参数共享的操作可以大幅减少参数量,且模型性能的下降仍然是在可接受的范围。

    句间连贯性损失(Inter-sentence coherence loss)

    之前的XLNet以及RoBERTa模型已经表明,NSP任务对模型的预训练并没有太大的帮助,主要原因是在于该任务的负例是从不想关的平行语料中提取的,这仅仅需要判断两个句子是否具有相同的主题就行了,并不是一个难度适当的任务。

    ALBERT提出了一种新的预训练任务,即句间连贯性判断。正例样本是正常顺序的两段文本,而负例样本是将两段文本的顺序进行颠倒。这样的预训练任务就逼迫模型去学习这两个句子的语义,从而去进行相关的推断。相比于NSP任务更加巧妙。

    ELECTRA

    未完待续...

    参考链接
    https://zhuanlan.zhihu.com/p/76912493
    https://zhuanlan.zhihu.com/p/89894807
    https://zhuanlan.zhihu.com/p/37684922
    https://zhuanlan.zhihu.com/p/56865533
    https://zhpmatrix.github.io/2019/02/16/transformer-multi-task/
    https://zhuanlan.zhihu.com/p/57251615
    https://zhuanlan.zhihu.com/p/68295881
    https://www.zhihu.com/question/316140575

  • 相关阅读:
    5.深入TiDB:Insert 语句
    4.深入TiDB:执行计划执行过程详解
    3.深入TiDB:执行优化讲解
    2.深入TiDB:入口代码分析及调试 TiDB
    1.深入TiDB:初见TiDB
    开发必备之单元测试
    如何用好MySQL索引
    SpringBoot运行源码剖析(一)
    深入理解Java虚拟机读后感
    Java并发编程艺术读后感
  • 原文地址:https://www.cnblogs.com/sandwichnlp/p/11947627.html
Copyright © 2011-2022 走看看