NLP预训练模型

内容纲要

背景

  1. 训练数据规模往往比较小: 领域数据自身少, 标注成本高
  2. 互联网上有大量标注和未标注的数据

能够利用在大规模数据集上学习到的有用的,强壮的特征来帮助提升模型的泛化性能,让我们在很小的数据集上就可以完成具体任务模型的训练, 而且有更快的训练和更好的泛化性能.

1. Word Embedding

  1. Word2Vec: Efficient Estimation of Word Representations in Vector Space
  2. Glove: GloVe: Global Vectors for Word Representation
  3. Fasttext: Enriching Word Vectors with Subword Information

Word2Vec是这个领域的开创性工作,在无标注的文本上训练出词的特征向量. 构建词典和向量之间的映射; 训练简单,效果很好.

Glove理解了Word2Vec的本质是词语之间的共现关系, 经常共同出现的词语之间会有更靠近的向量; 所以Glove从共现矩阵除法, 做到更快的训练收敛, 而且因为训练方法有一些不同, 和Word2Vec在不同的任务上互有胜负.

Fasttext在学术上的创新不大, 但是他在模型上微调以及使用subword还是有提升性能(特别是英语), 不过对于使用来说,他们提供了一个非常方便的fastText库, 可以通过命令行就可以快速的进行训练和预测, 对于验证可行性和提供一个baseline模型非常方便.

2. BERT

历史

  1. ELMo: Deep contextualized word representations
  2. Tranformer: Attention Is All You Need
  3. GPT: Improving Language Understanding by Generative Pre-Training
  4. BERT : BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

CV领域很早就基于VGG和ResNet进行模型的预训练(Pre-training)和微调(Fine-tuning), 利用大规模标注数据集预训练的模型, 在具体的小规模的具体任务的数据集上进行微调(只训练最后一两层), 就可以获得超高的性能和非常快速的训练.

NLP领域在这方面一直落后, 尽管Word2Vec以及后续工作可以基于大规模的无标注的语料训练向量, 但是相对比CV和NLP后来的预训练模型,有一些比较重要的不足

  1. 只能作为最开始的词的基本特征,不能学习到更多文本的特征表示, 所以也不能通过微调就适应具体任务.
  2. 作为词向量的不足: 是静态固定的, 不能够表示相同词在不同句子中不同的含义或者多义词

ELMo是这个NLP领域的开创性作品, 发表后的一段时间是非常热门的模型. 不过由于发表时间的时候在Transformer之前, 使用的是RNN架构, 而且微调时候只能作为新模型的旁路模型, 使用也不方便. 不过后来的GPT和BERT基本就是Transformer版的ELMo.

GPT的发布要比BERT稍微早一点, Transformer Decoder版本的ELMo. 没有像BERT那么有名的地方就是因为选择了Decoder, 在大量任务的性能上比BERT差很多. 不过也是因为选择了Decoder, 后来的GPT-2, GPT-3在生成领域一直是走在最前面.

BERT的发布是预训练模型的里程碑, 真正让NLP的预训练和微调走到了CV前面

  1. 大规模无标注的文本数据上训练,互联网上有海量的无标注文本. CV领域主流的都是需要标注数据, 但是标注数据只是一个很小的子集.
  2. Transformer架构非常稳健强大, 现在CV领域很多研究都是结合Transformer来做.

更快

深度模型的缺点是预测的时候需要很大的计算量(相比于传统的机器学习模型), 特别是在CPU上运行时会更加困难, 不过深度学习领域有一些比较成熟的方法来压缩模型,提升预测速度:

  1. 量化(Quantization): 计算过程中并不总是需要使用FP32. 使用量化在Pytorch中只要一行代码, 就可以20%以上的性能提升, 而且几乎不损失精度. 限制是一般在CPU上(GPU默认是FP32), 而且不是所有层都能够使用低精度进行计算.
    • QUANTIZATION (Pytorch)

      Quantization refers to techniques for performing computations and storing tensors at lower bitwidths than floating point precision. A quantized model executes some or all of the operations on tensors with reduced precision rather than full precision (floating point) values. This allows for a more compact model representation and the use of high performance vectorized operations on many hardware platforms. PyTorch supports INT8 quantization compared to typical FP32 models allowing for a 4x reduction in the model size and a 4x reduction in memory bandwidth requirements. Hardware support for INT8 computations is typically 2 to 4 times faster compared to FP32 compute. Quantization is primarily a technique to speed up inference and only the forward pass is supported for quantized operators.

  2. 剪枝(Pruning): 模型总是稀疏连接, 大量神经元之间连接是对结果没什么影响的. 通过剪枝减少这部分的运算量.
  3. 蒸馏(Knowledge Distillation): 深度学习的参数实际上是稀疏的(参数多过实际需要), 用一个小的多的模型(学生), 直接去学习一个大模型(比如BERT)的输出分布(老师).
    • TinyBERT蒸馏BERT: BERT-base 96.8%的性能, 模型大小和推理速度提升10倍. 这种更小的BERT架构来蒸馏大的BERT性能保持更好.
    • textCNN蒸馏BERT: 在没有GPU的情况下, BERT的Self-Attention和FFN的计算都很贵, 可以考虑使用textCNN来蒸馏BERT, CNN模型运算很快而且并行度要远高于RNN系列架构. 这样可以获得远比直接训练textCNN更高的性能.

3. 结论

Word Embedding使用场景

  1. Embedding Layer: 机器学习或者浅层的深度学习模型, 特别是配合MLP/RNN/textCNN, 用预训练的Embedding替换从初始化进行训练的Embedding层, 就可以获得性能和泛化性的显著提升.
  2. fastText: 工具可以使用命令行快速的进行训练和测试, 用来当做baseline的模型.

BERT使用场景

我们使用深度学习相对较大的模型时候, 优先考虑基于BERT的预训练模型, 如果没有GPU或者性能比较吃紧的时候, 考虑使用蒸馏的云训练BERT. 主要有两种使用方式

  1. 抽取特征: 对样本中的某些文本内容抽取特征, 作为动态的文本特征.
  2. 微调: 基于预训练的微调, 可以获得更快的收敛和更好的泛化性能.

工具

  1. 中文预训练RoBERTa模型
  2. TextBrewer: TextBrewer is a PyTorch-based model distillation toolkit for natural language processing.

资料

  1. 自然语言处理-基于预训练模型的方法; 车万翔,郭江, 崔一鸣
  2. fastText原理及实践

发表评论