深度双向Transformer预训练【BERT第一作者分享】

目录

  • NLP中的预训练
  • 语境表示
    • 语境表示相关研究
    • 存在的问题
    • BERT的解决方案
      • 任务一:Masked LM
      • 任务二:预测下一句
  • BERT
    • 输入表示
    • 模型结构——Transformer编码器
      • Transformer vs. LSTM
    • 模型细节
    • 在不同任务上进行微调
      • GLUE
      • SQuAD 1.1
      • SQuAD 2.0
      • SWAG
  • 分析
    • 预训练的影响
    • 方向与训练时间的影响
    • 模型规模的影响
    • 遮罩策略的影响
  • 多语言BERT(机器翻译)
  • 生成训练数据(机器阅读理解)
  • 常见问题
  • 结论

翻译自Jacob Devlin分享的slides

NLP中的预训练

  • 词嵌入是利用深度学习解决自然语言处理问题的基础。

  • 词嵌入(例如word2vec,GloVe)通常是在一个较大的语料库上利用词共现统计预训练得到的。例如下面两个句子中,由于kingqueen附近的上下文时常相同或相似,那么在向量空间中,这两个词的距离较为接近。

语境表示

  • 问题:通常的词嵌入算法无法表现一个词在不同语境(上下文)中不同的语义。例如bank一词在下列两个句子中有着不同的语义,但是却只能使用相同的向量来表示。

  • 解决方案:在大语料上训练语境表示,从而得到不同上下文情况下的不同向量表示。

语境表示相关研究

存在的问题

  • 问题:语言模型的训练,要么仅适用上文,要么仅适用下文;而人类理解语言则是同时考虑上下文的。
  • 为什么说语言模型是单向的
    • 理由1:为了生成适合模型计算的概率分布
    • 理由2:如果使用双向的编码器,因为这会产生一些循环,在这些循环中,单词会间接地“看到它们自己”

BERT的解决方案

任务一:Masked LM

把输入序列中的k%(一般为15%)的词掩盖住,然后通过上下文预测这些被掩盖住的词。

  • k%的设置

    • k太小:计算代价过大
    • k太大:剩下的上下文不足以准确预测
  • 遇到的问题:在下游任务中微调的阶段,没有出现被遮住的那些词
  • 由于15%的词被遮住,那么就有15%的词要被语言模型预测,但是BERT并不是一词就将所有这些词都用[MASK]替换掉,而是

任务二:预测下一句

学习句子间的关系,预测句子B是否句子A的下一句话(译者注:二元分类任务)。

BERT

输入表示

  • 使用30,000 WordPiece 词表(BERT 用 WordPiece工具来进行分词,并插入特殊的分离符([CLS],用来分隔样本)和分隔符([SEP],用来分隔样本内的不同句子))
  • 每一个token由三种向量加和而成
  • 单一序列更高效

模型结构——Transformer编码器

  • 多头注意力机制

    • 上下文建模
  • 前向层
    • 计算非线性层次特征
  • 正则化与残差
    • 让深层网络更有效
  • 位置向量
    • 让模型学习相对位置的特征

Transformer vs. LSTM

  • 自注意力机制不管词间距离长短而直接计算其依赖关系
  • 每一层进行乘法运算在TPU上更高效
    • 有效的batch_size是词数而不是序列数

模型细节

  • 语料: Wikipedia (2.5B words) + BookCorpus (800M words)
  • Batch Size: 131,072 个词 (1024 个序列* 每个序列128个词或者256个序列 *每个序列512个词)
  • 训练时间: 1M steps (~40 epochs)
  • Optimizer: AdamW, 1e-4 learning rate, linear decay
  • BERT-Base: 12-layer, 768-hidden, 12-head
  • BERT-Large: 24-layer, 1024-hidden, 16-head
  • 在4x4 或 8x8 的TPU slice上训练了4天

在不同任务上进行微调

GLUE

SQuAD 1.1

*注:榜单已经被很多基于BERT的模型刷新了

SQuAD 2.0

SWAG

分析

预训练的影响

  • 相较于从前到后(从左到右)语言模型,在一些任务中,Masked LM更重要,还有一些任务中,预测下一句这一策略很重要。
  • 从前到后的模型在词级别的任务(如SQuAD)上表现平平,加上BiLSTM后效果也一般。

方向与训练时间的影响

  • 由于仅仅预测15%的词,因此Masked LM收敛速度仅仅慢了一点点
  • Masked LM的绝对结果显然更好

模型规模的影响

  • 大模型更有效
  • 即使在仅有3,600个标注样本的数据集上,把参数从110M调整到340M也带来了性能提升
  • 性能提升并不是渐进的

遮罩策略的影响

  • 一次遮住100%的词让基于特征的方法在性能上有所下降
  • 而100%使用随机替换的方式让基于特征的方法在性能上下降幅度较小

多语言BERT(机器翻译)

  • 在104种语言的维基百科数据上训练不同的语言模型,共享110k的WordPiece 词表
  • XNLI是由MultiNLI翻译为多种语言得到的
  • 在人工翻译测试集上进行性能评估
  • 机器翻译-训练:将英文翻译为其他语言,然后进行微调
  • 机器翻译-测试:将其他语言翻译为英文,使用英文模型
  • 零样本:在英文模型上使用其他语言进行测试

生成训练数据(机器阅读理解)

  1. 使用seq2seq模型从context+answer中生成正例问题
  2. 启发式地将正例问题转换为负例(如“no answer”/impossible )

  1. 在维基百科数据上预训练seq2seq模型

    • 用BERT作为编码器,训练解码器解码下一个句子
  2. 在SQuAD 进行微调——Context+Answer →Question
    • Ceratosaurus was a theropod dinosaur in the Late Jurassic, around 150 million years ago. -> When did the Ceratosaurus live ?
  3. 训练模型,预测答案,不使用问题描述
    • Ceratosaurus was a theropod dinosaur in the Late Jurassic, around 150 million years ago. -> {150 million years ago, 150 million, theropod dinsoaur, Late Jurassic, in the Late Jurassic}
  4. 使用第三步的模型从大量维基百科数据中生成答案
  5. 使用第四步的输出作为seq2seq模型的输入,生成问题描述
    • Roxy Ann Peak is a 3,576-foot-tall mountain in the Western Cascade Range in the U.S. state of Oregon. → What state is Roxy Ann Peak in?
  6. 利用基线SQuAD2.0 系统过滤不好的问题
    • ○ Roxy Ann Peak is a 3,576-foot-tall mountain in the Western Cascade Range in the U.S. state of Oregon. → What state is Roxy Ann Peak in? ( 好问题)

      ○ Roxy Ann Peak is a 3,576-foot-tall mountain in the Western Cascade Range in the U.S. state of Oregon. → Where is Oregon? (坏问题)

  7. 启发式地生成强负例
    • 从同一文档的其他段落中获得正例问题

      • What state is Roxy Ann Peak in? → When was Roxy Ann Peak first summited?
    • 将一些词替换为段落内相同 POS标识类型的词
      • What state is Roxy Ann Peak in? → What state is Oregon in?
      • What state is Roxy Ann Peak in? → What mountain is Roxy Ann Peak in?
  8. 可选步骤: Two-pass训练,

常见问题

  1. 深度双向性是必要的吗?在更大的模型上像ELMo这种类型的浅层双向性怎么样?

    • 深度双向性的优点:训练耗时稍短
    • ELMo这种类型的浅层双向模型的缺点:
      • 需要在上面增加非预训练的双向模型
      • 从后到前的SQuAD模型看不到问题描述
      • 需要训练两个模型
      • 错位:从前到后(LTR)预测下一个词,从后到前(RTL)预测前一个词
      • 增加预训练任务并不是没有用
  2. 为什么之前没有人想到这一点?或者说,为什么在ELMo之前语境预训练没有流行起来?
    • 比起有监督训练,计算开销更大
    • 在2013年,从零训练2层的512维的LSTM情感分析模型,需要花费约8小时进行训练,正确率达到80%;而预训练的语言模型在同样的结构上需要消耗一周的时间,而正确率也就能达到80.5%。(谁会为了这么一点点提升却消耗这么大的计算代价?)
  3. 靠这一个模型能解决NLP中的所有问题吗?
    • 就目前而言,在大部分任务上是可以由这一模型解决的

结论

  • 使用预训练,更大的模型意味着更好的性能,目前没有证明其界限
  • 研究者或企业在BERT上建立模型,会带来更好的模型性能

原文地址:https://www.cnblogs.com/d0main/p/10368965.html

时间: 2024-07-30 07:55:05

深度双向Transformer预训练【BERT第一作者分享】的相关文章

BERT论文翻译:用于语言理解的深度双向Transformer的预训练

Jacob Devlin Ming-Wei Chang Kenton Lee kristina Toutanova Google AI Language {jacobdevlin, mingweichang, kentonl, kristout}@google.com 摘要 本文介绍了一种新的语言表示模型BERT,意为“来自transformer的双向编码器表示”(Bidirectional Encoder Representations from Transformers).与最近的语言表示模

预训练中Word2vec,ELMO,GPT与BERT对比

预训练 先在某个任务(训练集A或者B)进行预先训练,即先在这个任务(训练集A或者B)学习网络参数,然后存起来以备后用.当我们在面临第三个任务时,网络可以采取相同的结构,在较浅的几层,网络参数可以直接加载训练集A或者B训练好的参数,其他高层仍然随机初始化.底层参数有两种方式:frozen,即预训练的参数固定不变,fine-tuning,即根据现在的任务调整预训练的参数. 优势: 1.当前任务数据量少,难以训练更多的网络参数,可以加载预训练的模型,然后根据当前的任务对参数进行fine-tuning,

使用深度双向LSTM模型构造社区问答系统

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 关于社区问答系统的问题背景,我们在之前的"利用卷积神经网络构造社区问答系统"一文里已经说明得很清楚,本文就不再赘述,不清楚背景的读者可自行参照上文,我们这些相关的研发工作主要是为了开发畅捷通"会计家园"交流社区的相关功能.为了保持行文完整,简明叙述形式化描述的问题如下: 假设我们已知问答库如下: 其中,Qi是问答社区中的历史问题,Ai是Qi问题的精华答案: 现有社区用户

文本分类实战(一)—— word2vec预训练词向量

1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 textCNN 模型 charCNN 模型 Bi-LSTM 模型 Bi-LSTM + Attention 模型 RCNN 模型 Adversarial LSTM 模型 Transformer 模型 ELMo 预训练模型 BERT 预训练模型 所有代码均在textClassifier仓库中, 觉得有帮助,

DeepFaceLab 模型预训练参数Pretrain的使用!

Pretrain参数是20190501版本才加入的参数,作者加入这个参数的目的应该是提升模型的训练速度和增强适应性.具体有哪些提升,需要大家去摸索,我这里分享一下自己的使用过程. ? 这个参数仅针对SAE模型,并且只有在第一次启动的时候可以配置,配置完之后,一旦中断训练之后,这个预训练环节就结束了. ? 上图为预训练的效果图,这个界面红红绿绿配上灰色,看起来还挺好看. ? 除了颜色上的差别之外,看起来和平时的训练并没有什么差别.但是根据作者的描述,以及我们自己的验证,有些模型文件在预训练阶段并不

CNN基础二:使用预训练网络提取图像特征

上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始训练(training from scratch),因为训练代价高,且很难避免过拟合问题.相对的,通常会采用一种更高效的方法--使用预训练网络. 预训练网络的使用通常有两种方式,一种是利用预训练网络简单提取图像的特征,之后可能会利用这些特征进行其他操作(比如和文本信息结合以用于image capti

[转] 轻松使用多种预训练卷积网络抽取图像特征

选自GitHub,机器之心整理. 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征.对于每一个模型,它们都会输出最后的全连接层,即 AlexNet 的第七个全连接层.VGG_19 的第 8 个全连接层等.这些层级将最终抽取出图像的特征,并能进一步用于图像分类和聚类等.机器之心简要地介绍了该项目,并测试了使用Inception_V1预训练模型抽取图像特征. 项目地址:https://github.com/cameronfabbri/Compu

在 C/C++ 中使用 TensorFlow 预训练好的模型—— 直接调用 C++ 接口实现

现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过直接调用 TensorFlow 的 C/C++ 接口来导入 TensorFlow 预训练好的模型. 1.环境配置 点此查看 C/C++ 接口的编译 2. 导入预定义的图和训练好的参数值 // set up your input paths const string pathToGraph = "/ho

如何使用“预训练的词向量”,做文本分类

不多比比了,看代码!!! def train_W2V(w2vCorpus, size=100): w2vModel = Word2Vec(sentences=w2vCorpus, hs=0, negative=5, min_count=5, window=8, iter=1, size=size) w2vModel.save(inPath+'w2vModel.model') return w2vModel def load_W2V(W2V_path, loader_mySelf=1): if l