zoukankan      html  css  js  c++  java
  • NLP预训练发展小结二(Bert之后)

    本篇博文简要记录基于Transformer的各类自然语言处理预训练模型(自Bert开始)的特点及使用。

    1. Bert

    BERT(Bidirectional Encoder Representations from Transformers)做的是一个上下文双向的信息编码器;

    Bert与之前的ELMo、GPT相比较:

    • ELMo只是拼接LSTM 的正向向量和反向向量,并没有发生交互,所以并不是真正的双向,并且其用的是能力有限的LSTM结构;
    • GPT编码器部分采用的是Transformer的Decoder来训练语言模型,但是训练方式为单向。

    Bert预训练任务:

    • 任务一:Masked LM(MLM)

    把输入的句子对进行 WordPiece 处理后,随机选 15% 的 token【MASK】掉,然后对【MASK】掉的 token 进行预测。
    MLM 任务会引起一个问题:预训练和下游任务输入不一致,因为下游任务的时候,输入是不带【MASK】的,这种不一致会损害 BERT 的性能,这也是后面研究的改善方向之一。BERT 自身也做出了一点缓解,就是对这 15% 要预测的 token 的输入进行一些调整:
    80% 用【MASK】代替;
    10% 用随机的词 token 替;
    10% 保持原来的 token 不变。

    • 任务二:Next Sentence Prediction(NSP)

    判断句子对是否是真正连续的句子对。
    具体来说,当采样预训练样本时,句子对 A 和 B,B 有 50% 的概率是 A 的真实的后一句;有 50% 的概率是语料库中的随机一句,在预训练时,让模型去学习。

    预训练模型应用的两种范式:feature-based & fine-tuning

    • feature-based:代表如EMLo,用于下游任务时,用训练好的词向量作为embedding,去初始化RNN/LSTM/CNN 等网络结构,即预训练模型只提供feature-based的embedding;
    • fine-tunning:代表如 GPT,用于下游任务时,不仅保留了输入embedding,模型里面的参数(如 attention 层、全连接层)也同样保留,在fine-tuning的时候只需在原来的模型上加一些简单的层,就可以应用于具体的下游任务。
    把BERT某些层的向量拿出来,作为token的embedding,这些embedding在后面的任务中不更新,即以feature-based方式使用BERT;另一方式即类似于GPT,将BERT整个结构应用到下游任务上。实验证明,BERT 无论是作为 feature-based 范式还是 fine-tuning 范式,效果俱佳。

    2. RoBERTa

    RoBERTa(Robustly optimized BERT approach)在BERT基础上做了以下改动:

    • 采用更多训练语料
      在 BERT 采用的数据 BOOKCORPUS + English WIKIPEDIA(共 16G)基础上,增加 CC-NEWS(76GB),OPENWEBTEXT(38GB),STORIES(31GB);

    • 采用动态【MASK】
      对于同一个样本,BERT在不同的epoch中【MASK】掉的token不变,而RoBERTa在预训练阶段的每一个step,重新挑选15%的token进行【MASK】;

    • 去掉NSP任务
      RoBERTa是采用去掉NSP任务,而且一个样本是从同一个文档里面进行采样;

    • 增大batch_size
      BERT的batch_size是256,一共训练了1M步;实验证明采用更大的batch_size以及训练更多步可以提高性能,RoBERTa采用的batch_size是8K;

    • 文本编码方式
      BERT 采用的是基于 character level 的 Byte-Pair Encoding(BPE)编码,词表大小是 30K;RoBERTa 采用的是基于 bytes-level 的 BPE 编码,该方法用 bytes(字节)作为基础的子词单元,词表的大小是 50K,好处是可以在不需要引入任何未知字符前提下对任意文本进行编码。

    3. ALBERT

    ALBERT(A Lite BERT)旨在减少模型参数量,并提出SOP任务:

    • 矩阵分解
      BERT 采用的是 WordPiece,大概有 30K 个 token,采用的 embedding 维度为 768,所以参数量约为 3000 * 768 = 2304000;通过一个矩阵分解去代替本来的 embedding 矩阵,embedding 取为 128,则参数量变为 3000 * 128+128 * 768=482304,参数量变为原来的 20%;

    • 参数共享
      BERT 的 Transformer 共用了 12 层的 encoder,让这 12 层的 attention 层和全连接层层共享参数;

    • SOP任务
      sentence order prediction(SOP)即预测句对的顺序, 正例的构建和NSP是一样的,负例则是将正例的两句话反过来。

    • 模型版本
      albert-base、albert-large、albert-xlarge、albert-xxlarge

    4. ERNIE

    截至本文发出时,百度共推出ERNIE-1.0、ERNIE-2.0、ERNIE-3.0三个版本的ERNIE预训练模型:

    ERNIE1.0从两方面做修改:1.Knowledge Integration型【MASK】 ;2.增加对话数据的任务;
    ERNIE2.0 的结构与 ERNIE1.0 、BERT 一样,ERNIE2.0 主要是从修改预训练任务来提升效果;
    ERNIE3.0增加了知识图谱等外部信息。

    5. ELECTRA

    模型架构

    • 生成器
      首先对一句话里面的 token 进行随机的【MASK】,然后训练一个生成器,对【MASK】掉的 token 进行预测(就是原生 BERT 的 MLM 任务);生成器对【MASK】掉的 token 预测完后,得到一句新的话;
    • 判别器
      将生成器的输出,输入到判别器,判别器判断每个 token,是否是原样本的,还是被替换过的。假如生成器预测出的 token 为原来的 token,那这个 token 在判别器的输出标签里还是算原样本,而不是被替换过的(如上图的 "the",生成器预测为 "the",则 "the" 在判别器中的真实标签就为 original,而不是 replaced)。

    作者: python之家

    出处: http://www.cnblogs.com/pythonfl/

    本文版权归作者和博客园共有,转载时请标明本文出处;如对本文有疑问,欢迎邮件15256636585@qq.com联系;如发现文中内容侵犯到您的权利,请联系作者予以处理。

  • 相关阅读:
    nohub
    swoole聊天室
    swoole httpserver学习
    swore tcp服务学习
    ps查看命令
    nginx和php-fpm调用方式
    Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建
    Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建
    C语言入门(4)——常量、变量与赋值
    C语言入门(3)——对Hello World程序的解释
  • 原文地址:https://www.cnblogs.com/pythonfl/p/15362048.html
Copyright © 2011-2022 走看看