李沐论文精读:BERT 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》


https://github.com/google-research/bert

论文地址:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

官方代码地址:https://github.com/google-research/bert

课程推荐:李宏毅机器学习--self-supervised:BERT

参考:BERT 论文逐段精读【论文精读】 - 哔哩哔哩

目录

1.前言

2.摘要

3 导论

4 结论

5 相关工作

5.1 基于特征的无监督方法

5.2 无监督的微调方法

5.3 监督数据中的迁移学习  

6 BERT模型结构和输入输出

6.1BERT框架两个步骤:预训练和微调

6.2模型结构

6.3可学习参数的大小

6.4模型输入输出

input sequence

WordPiece

特殊记号

3种embedding

7 BERT预训练(MLM+NSP)

7.1 Task 1:Masked LM

7.2 Task 2:Next Sentence Prediction(NSP)

7.3 预训练数据和参数

8 BERT微调

微调参数

9 实验

9.1 GLUE数据集(分类)

9.2 SQuAD v1.1(问答)

9.3 SQuAD v2.0(问答)

9.4 SWAG(句子对任务)

10消融试验

10.1 模型各部分的影响

10.2 模型配置的影响

10.3 将BERT作为特征提取器   

11 总结


1.前言

     在计算机视觉里面很早就能够在一个大的数据集(比如说ImageNet)上训练出一个CNN模型,用这个模型可以用来处理一大片的机器视觉任务,来提升他们的性能;但是在自然语言处理里面,在BERT出来之前,在NLP领域没有一个这样的深度神经网络模型,还是对每个任务构造自己的神经网络,自己训练。BERT的出现使得我们能够在一个大的数据集上面训练好一个比较深的神经网络,然后应用在很多的NLP任务上面,这样既简化了NLP任务的训练,又提升了它的性能,所以BERT和它之后的一系列工作使得自然语言处理在过去三年中有了质的飞跃。

        BERT的主要贡献,是将预训练模式推广到深层双向体系结构,而具体的实现,是通过MLM任务来完成。通过完形填空的自监督训练机制,不需要使用监督语料,而是预测句子中被masked的词是什么,从而抽取文本特征。

        由此BERT极大的拓展了Transformers的应用,使其可以在更大的无标签的数据集上训练,其效果比有标签、更小数据集上训练的模型效果还要好。

2.摘要

  我们介绍一种新的语言表示模型叫BERT,它是Bidirectional Encoder Representations fromTransformers的缩写(双向Transformer编码器)。

BERT和ELMo、GPT的区别:

  • GPT使用新的 Transformers结构,用左侧信息取预测未来信息,单向模型的主要缺点在于不能获得足够好的词表示;
  • ELMo通过从左向右(LTR)和从右向左(RTL)两个模型的输出拼接获得词的表示,双向信息融合的很浅,且由于基于RNN的架构,在应用到下游任务时,需要对架构做一些调整;
  • BERT是基于Transformer,用了左右侧信息,使用的是没有标号的数据,用到一些下游任务的时候,和GPT一样只需要微调输出层就可以了。

从创新的角度来看,bert其实并没有过多的结构方面的创新点。本文将ELMo双向的想法和GPT的transformer架构结合起来就成为了BERT。BERT的主要特征是,对于不同的任务都有一个统一的模型结构,是一个泛化能力较强的预训练模型。

3 导论

        语言模型预训练可以改善许多NLP任务,这些任务包括:

  • 句子级别的任务,主要是用来建模句子之间的关系,比如说对句子的情绪识别或者两个句子之间的关系
  • 词元层面的任务(token-level):包括实体命名的识别(对每个词识别是不是实体命名,比如说人名、街道名),这些任务需要输出一些细腻度的词元层面上的输出  

        在使用预训练模型做特征表示的时候,一般有两类策略

  • 一个策略是基于特征feature-based的,代表作是ELMo,对每一个下游的任务构造一个跟这个任务相关的神经网络,然后将预训练好的这些表示(比如说词嵌入)作为一个附加特征,希望这些特征已经有了比较好的表示,把它们和原始输入一起放进模型中。因为附加特征已经有了好的表示,所以模型训练起来相对来说比较容易,这也是NLP中使用预训练模型最常用的做法
  • 另一个策略是基于微调fine-tuning的,这里举的是GPT的例子,就是把预训练好的模型放在下游任务的时候不需要改变太多,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对预训练好的参数会在下游的数据上再进行微调        

  

        这两种方法在预训练的过程中使用的是同一个目标函数,即单向的语言模型(给定一些词去预测下一个词是什么东西,说一句话然后预测这句话下面的词是什么东西),限制了预训练表示的能力。比如,在GPT中使用的是一个从左到右的架构(在看句子的时候只能从左看到右),这样的坏处在于如果要做句子层面的分析的话,比如说要判断一个句子层面的情绪是不是对的话,从左看到右和从右看到左都是合法的,另外,就算是词元层面上的一些任务,比如QA的时候也是看完整个句子再去选答案,而不是一个一个往下走。如果将两个方向的信息都放进去的话,应该是能够提升这些任务的性能的。

   针对上面提出的问题,作者提出了BERT,使用的是带掩码的语言模型(MLM,masked language model)预训练目标,减轻了先前提到的单向语言模型限制 。

  • 遮蔽语言模型在输入中每次随机屏遮蔽某些token,目的是根据其上下文来预测被遮蔽的单词(原始词表对应的id),等价于将一个句子挖一些空完后进行完形填空。
  • 跟标准的语言模型从左看到右的不同之处在于:带掩码的语言模型是允许看到左右的信息的,这样的话它允许训练深的双向的transformer模型。
  • 此外,还训练了一个任务,给定两个句子,然后判断这两个句子在原文里面是相邻的,还是随机采样得来的,这样就让模型学习了句子层面的信息。   

        本文的贡献如下:

  • 我们证明了双向预训练对于语言表示的重要性。
    • GPT使用单向语言模型进行预训练,BERT使用遮蔽语言模型来实现预训练的深度双向表示。
    • ELMo只是很简单地把一个从左看到右的语言模型和一个从右看到左的语言模型简单地合并到一起,类似于双向的RNN模型。BERT在双向信息的应用上更好
  • 假设有一个比较好的预训练模型,就不需要再针对特定任务精心设计模型结构。BERT是第一个基于fine-tuning的表示模型,可在一系列sentence-level和token-level任务上实现最先进的性能,其性能优于许多任务特定的体系结构。
  • BERT推动了11项NLP任务的发展。 可以在BERT上找到代码和经过预先训练的模型。代码和模型全部放在:https://github.com/google-research/bert

4 结论

  最近的实验表明,丰富的、无监督的预训练使得即使是资源少(样本少)的任务也可以享受深度神经网络。我们的主要贡献是把前人的工作扩展到深层双向体系结构,使得同样的预训练模型能够成功解决各种NLP任务。

5 相关工作

5.1 基于特征的无监督方法

主要是讲词嵌入、ELMo和之后的一些工作,跳过

5.2 无监督的微调方法

代表作是GPT

5.3 监督数据中的迁移学习  

      计算机视觉研究证明了从大型预训练模型进行迁移学习的重要性,方法是对通过ImageNet预训练的模型进行微调。在NLP中,已经有标号而且比较大的数据(包括自然语言的推理和机器翻译这两块中都有比较大的数据集),在这些有标号的数据集上训练好了模型,然后在别的任务上使用,效果是非常好的。但是在NLP领域,迁移学习的应用不是特别理想,一方面可能是因为这两个任务跟别的任务差别还是挺大的,另一方面可能是因为数据量还是远远不够的。BERT和他后面的一系列工作证明了在NLP上面使用没有标号的大量数据集训练成的模型效果比在有标号的相对来说小一点的数据集上训练的模型效果更好,同样的想法现在也在慢慢地被计算机视觉采用,即在大量无标签的图片上训练的模型,可能比在ImageNet上训练的模型效果更好。

6 BERT模型结构和输入输出

6.1BERT框架两个步骤:预训练和微调

  • 预训练是在无标签数据集上训练的
  • 微调使用的也是BERT模型,其权重初始化为预训练权重。所有权重在微调时都会参与训练,微调时使用有标签的数据
  • 每个下游任务都会创建一个新的BERT模型,根据自己的有标注的数据来训练自己的任务。

6.2模型结构

  BERT的模型架构是多层TransformerEncoder。仅使用了Transformer的EncoderLayer,然后堆叠多层,就是BERT,Transformer基于原始的论文和原始的代码,没有做改动。可以参考诸如The Annotated Transformer之类优秀的指南。

        三个参数

  • L:transformer块的个数
  • H:隐藏层的大小
  • A:多头自注意力机制的头的个数

        两个模型

  • BERT base:跟GPT模型的参数差不多,来做一个比较公平的比较。BERTBASE​(L=12,H=768,A=12,Total Parameters=110M)
  • BERT large:用来刷榜。ERTLARGE​(L=24,H=1024,A=16,Total Parameters=340M)

BERT中的模型复杂度和层数是一个线性关系,和宽度是一个平方的关系

6.3可学习参数的大小

BERT模型可学习参数来自词嵌入层和Transformer块

  • 嵌入层:就是一个矩阵,输入是字典的大小(假设是30k),输出等于隐藏单元的个数(假设是H)
  • transformer块有两部分:
    • 自注意力机制。它本身是没有可学习参数的,但是多头注意力会把所有进入的K、V、Q分别做一次投影,每一次投影的维度是等于64。因为有多个头,投影前后维度不变,头的个数A乘以64得到H。参数矩阵 (WQ,WK,WV)在每个头之间合并起来其实就是H*H的矩阵了。输出的多头注意力还会经过一个矩阵 WO将其映射回H维,也是一个H*H的矩阵,所以对于一个transformer块,他的自注意力可学习的参数是4H2
    • MLP。MLP里面需要两个全连接层,第一个层的输入是H,但是它的输出是4*H,另外一个全连接层的输入是4*H,输出是H,所以每一个矩阵的大小是H*4H,两个矩阵就是8H2

        这两部分加起来就是一个transformer块中的参数,还要乘以L(transformer块的个数),所以总参数的个数就是30K⋅H+L⋅12H2,带入base的参数大概就是1.1亿。

6.4模型输入输出

input sequence

BERT预训练的输入统一称为 input sequence。下游任务有些是处理一个句子,有些任务是处理两个句子,所以为了使BERT模型能够处理所有的任务,input sequence既可以是一个句子,也可以是一个句子对(这里的“句子”指一段连续的文字,不一定是真正的语义上的一段句子)。这和之前文章里的transformer是不一样的:transformer在训练的时候,他的输入是一个序列对,因为它的编码器和解码器分别会输入一个序列,但是BERT只有一个编码器,输入是一个序列,所以为了使它能够处理两个句子,就需要把两个句子变成一个序列

WordPiece

使用的切词的方法是WordPiece,核心思想是:

  • BERT如果使用空格切词,一个词是一个token。BERT的训练数据量是非常大的,那么词表大小也会特别大,比如百万级别。那么根据上面的算法,模型的可学习参数基本都在词嵌入层上。
  • WordPiece原理就是,一个词在数据集中出现的概率不大,那么就把它切开成子序列。如果子序列(很可能是词根)出现的概率很大的话,那么只保留这个子序列就行。这样就可以把比较长的词切成一些经常出现的片段。这样词表的大小相对来说比较小(3万)。

特殊记号

        序列的第一个词永远是一个特殊的记号[CLS](表示classification),CLS对应的最终输出可以代表整个序列的信息,如果是单句子分类,表示输入句子的类别;如果是句子对分类,表示两个句子是相关的/不相关的、相似意思/相反意思。因为自注意力层中每一个词都会去看输出入中所有词,就算是词放在第一的位置,它也是有办法能够看到之后的所有词,所以CLS放在句首是没问题的,不一定非要在句尾。

        句子对是合在一起输入的,但是为了做句子级别的任务,所以需要区分这两个句子,综合使用两个办法:

  • 句尾加上特殊词[SEP]来分隔(表示separate)
  • 在词嵌入层用一个可学习的向量来表示每个token是属于句子A还是句子B。

        下图中粉色方框表示输入的序列,每一个token进入BERT得到这个token的embedding表示,最后transformer块的输出就表示这个词元的BERT表示,最后再添加额外的输出层来得到想要的结果。

3种embedding

缩写含义如下:

  • [CLS] : class的缩写,其是一个特殊符号,每个输入样本的最前面都会增添一个这玩意。
  • Tok X:Token的缩写,Tok 1表示当前句子中的第一个词,以此类推
  • [SEP] : separator的缩写,表示分隔符。用来分割两个句子。
  • E : embedding的缩写,表示该token被embedding后的向量
  • C :表示[CLS]这个特殊的token经过BERT后的向量,H维
  • T :表示对应Token经过BERT后的向量,H维
  • NSP: Next Sentence Prediction任务
  • Mask LM: masked laguage model, MLM任务
  • 灰色箭头⇧:Tok到E之间的箭头,表示输入,即Tok为输入
  • 红色箭头:表示下游任务
  • MNLI, NER, SQuAD : 三种特定的任务

        对于给定的token,它的输入表征是由token,segment,和 position embeddings相加构成的。得到的向量序列会进入transformer块。嵌入层结构的可视化效果如图所示。

  • token embedding:将各词元转换成固定维度的向量
  • segment embedding:针对句子对任务设置的,只有0和1两个值,用于区分两个句子,句子A编码为0,句子B编码为1,如果是单句子任务,所有编码都为0
  • position embedding:输入的大小是这个序列的最大长度,它的输入就是每个词元这个序列中的位置信息(从零开始),由此得到对应的位置的向量。

        BERT采用了双向并行输入的方式,即将句子整个输入到模型中,而不是将单词一个接着一个地输入,这样可以充分利用GPU的性能,大大提升模型的运行效率。与此同时由于并行输入会带来单词在文本中的位置信息的丢失,因此BERT模型额外需要增加了一个位置编码输入,确保位置信息不被丢失。Transformer中位置信息是通过位置编码(cos函数)来得到的,而这里的位置信息position embedding和句子信息segment embedding都是通过embedding学出来的。3个embedding的size都是(batch_size, seq_length, hidden_size),最后将3个embeddings按元素值相加,即表示BERT编码层的输入

7 BERT预训练(MLM+NSP)

BERT采用两个无监督任务进行参数预训练。

7.1 Task 1:Masked LM

  随机屏蔽每个token序列的15%,将其替换为[MASK](CLS和SEP不做替换),让模型去预测这些空原先的单词。 将mask部分的相应输出向量通过一个Linear transform(矩阵相乘),并做Softmax得到一个分布,使其和MASK字符one-hot vector之间的交叉熵损失最小。本质上是在解决一个分类问题,BERT要做的是预测什么被盖住。

        这带来的一个问题是,微调时数据中是没有[MASK]的,于是预训练和微调时看到的数据有点不一样。为了缓解这种情况,我们并不总是用实际的[mask]标记替换“masked”词。

Although this allows us to obtain a bidirectional pre-trained model, a downside is that we are creating a mismatch between pre-training and fine-tuning, since the [MASK] token does not appear during fine-tuning.

        解决方法:如果某个token被选中masked,那么有80%的概率是真的将它替换成[MASK],还有10%的概率将它替换成一个随机的词元(噪音),最后有10%的概率维持原单词不变(仍然要做预测)。这个概率是实验跑出来的,效果不错。附录中有例子。

  • 80%的时间是采用[mask],my dog is hairy → my dog is [MASK]
  • 10%的时间是随机取一个词来代替mask的词,my dog is hairy -> my dog is apple
  • 10%的时间保持不变,my dog is hairy -> my dog is hairy

        那么为啥要以一定的概率使用随机词呢?这是因为transformer要保持对每个输入token分布式的表征,否则Transformer很可能会记住这个[MASK]就是"hairy"。至于使用随机词带来的负面影响,文章中说了,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影响是可以忽略不计的。

7.2 Task 2:Next Sentence Prediction(NSP)

  选择的句子对A和B,B有50%的概率是A的下一个句子(标记为is next),50%的概率是语料库中随机挑选句子(标记为not next),这就意味着有50%的样本是正例,50%的样本是负例。目的是让模型理解到两个句子之间的关系,从而能够应用于问答QA和自然语言推理NLI等下游任务中。

       只看CLS的输出,CLS的输出经过和masking input一样的操作,目的是预测第二句是否是第一句的后续句。这是一个二分类问题,有两个可能的输出:是或不是。

  尽管NSP很简单,但我们后面可以看到,加入这个目标函数能够极大地提升在QA和自然语言推理的效果(附录中有例子)

# 示例

Input = [CLS] the man went to [MASK] store [SEP]

he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP]

penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

        在原文中 flightless 是一个词,但是由于这个词出现的概率不高,所以在WordPiece中把它砍成了两个词 flight 和 less ,他们都是比较常见的词,##表示在原文中后面的词跟在前面那个词后面

        李宏毅认为:这个方法对于预训练的效果并不是很大,没有学到什么太有用的东西,原因之一可能是,Next Sentence Prediction 太简单了,通常,当我们随机选择一个句子时,它看起来与前一个句子有很大不同,因此对于BERT来说,预测两个句子是否相连并不是太难。有另外一招叫做Sentence order prediction,SOP,预测两个句子谁在前谁在后。也许因为这个任务更难,它似乎更有效

7.3 预训练数据和参数

   预训练过程很大程度上遵循现存文献的语言模型预训练,我们使用BooksCorpus(800M个单词)和English Wikipedia(25亿个单词)。应该使用文本层面的数据集,即数据集里面是一篇一篇的文章而不是一些随机打乱的句子,因为transformer确实能够处理比较长的序列,所以对于整个文本序列作为数据集效果会更好一些

所有数据和调试参数:

  1. 数据集:BooksCorpus (单词量 800M),English Wikipedia (单词量 2,500M)
  2. 主要参数:batch_size=256, epochs=40, max_tokens=512, dropout=0.1
  3. 优化参数:优化器Adam, lr=1e-4, β1=0.9, β2=0.999, L2 weight decay=0.01, lr_warmup=10,000
  4. 激活函数:gelu
  5. 训练损失:mean MLM likelihood + mean NSP likelihood
  6. 机器配置:BERT(base)使用4个云TPUs,BERT(large)使用16个云TPUs
  7. 训练时长:4天
  8. 加速方式:90%的步数按照128的文本长度训练,剩余10%的步数按照512的文本长度训练

8 BERT微调

  由于Transformer采用的是自注意力机制,使得BERT模型可以应用于各种各样的下游任务。对于句子对任务,常规的做法是在计算交叉注意力之前,先单独对句子对进行编码。而BERT是将这两步合二为一,即使用自注意力机制来对句子进行编码。

       微调的过程中,对于下游任务的训练,仍然需要少量的标记数据。对于每个下游任务,只需将特定于任务的输入和输出连接到BERT中,然后端到端微调所有参数。

        对于输入是两个句子(A和B)的任务,A和B可以是意思相同的两种表述,可以是假设-前提对,可以是问答系统中的问题-回答对,也可以是文本分类或序列标注的文本对。而在输出侧,token的输出向量用于分词级的分类任务,例如序列标注或问答系统;而[CLS]的输出向量用于分类任务,如蕴涵分析或情感分析等。 不管怎么样都是在最后加一个输出层,然后用一个softnax得到想要的标号。

语句分类

词性标注

        跟预训练比微调相对来说比较便宜,所有的结果都可以使用一个TPU跑一个小时就可以了,使用GPU的话多跑几个小时也行

微调参数

在fine-tune阶段,大部分模型参数与预训练阶段是一样的,只有batch_size, lr, epochs需要调整,推荐参数如下:

  1. batch size = 16, 32
  2. lr = 5e-5, 3e-5, 2e-5
  3. epochs = 2, 3, 4

9 实验

  在这部分,我们将介绍BERT在前面提到的11项NLP任务中的结果。

9.1 GLUE数据集(分类)

  GLUE基准是一个有着各种NLU任务的集合,是一个句子层面的任务。BERT把特殊词元[CLS]的输出向量C拿出来,放进学习到的输出层w,之后用softmax就能得到标号,这就变成了一个很正常的多分类问题了。即使用CLS最终输出向量来分类

        average表示在所有数据集上的平均值,它表示精度,越高越好。可以发现BERT就算是在base跟GPT可学习参数差不多的情况下,也还是能够有比较大的提升

9.2 SQuAD v1.1(问答)

        The Stanford Question Answering Dataset(SQuAD v1.1) 是斯坦福一个包含10w crowd-sourced句子对的数据集。给定一段话,然后问一个问题,答案在给定的那段话中,预测答案在段落中所在的位置(这个片段的开头和结尾),类似于阅读理解。就是对每个词元进行判断,看是不是答案的开头或者答案的结尾

  具体来说就是学习开始向量S和结尾向量E,分别对应这个词元是答案开始的概率和答案最后的概率。对第二句话中每个词元,计算Ti和Si的点积,然后对段落中所有词的点积都进行softmax之后,得到这个段中每一个词元是答案开头的概率。结尾概率的计算同理。

     微调使用的epoch值是3,学习率是5e-5,batch size是32。这句话对后面误导很大,因为BERT微调时很不稳定,同样的参数训练,方差非常大。所以需要多训练几个epoch。另外作者使用的优化器是不完全版的Adam,训练长的时候是没问题,训练短的话有问题,要改回正常版。

9.3 SQuAD v2.0(问答)

不再细讲

9.4 SWAG(句子对任务)

  SWAG数据集包括了113K个句子对,给定一个句子,任务是从备选的四个选项中选择最合理的下一句。在SWAG数据集上微调的时候,我们构造四个输入,每一个序列都是由给定的句子(sentenceA)和可能的下一句(sentence B)组成。唯一要引入的特定任务参数是一个向量,这个向量与[CLS] 的输出C进行点积表示为每一个选择的分数,然后用softmax得到概率(和上面差不多)。微调的参数为epoch=3,learning rate=2e-5,batch size=16。试验结果就不贴了。

        对这些不同的数据集,BERT基本上只要把这些数据集表示成所要的句子对的形式,最后拿到一个对应的输出然后再加一个输出层就可以了,所以BERT对整个NLP领域的贡献还是非常大的,大量的任务可以用一个相对来说比较简单的架构,不需要改太多的东西就能够完成了

10消融试验

  在这一部分,我们对 BERT 的许多方面进行了消融实验,以便更好地理解介绍了BERT中每一块最后对结果的贡献。

10.1 模型各部分的影响

  • No NSP:假设去掉对下一个句子的预测
  • LTR & No NSP:不使用MLM模型,模型只是从左看到右,且没有NSP
  • + BiLSTM:在LTR & No NSP上面加一个双向的LSTM

从结果来看,去掉任何一部分,结果都会打折扣

  • 只采用MLM,不采用NSP,会大大影响QNLI, MNLI, SQuAD 1.1任务的表现;
  • MLM在所有任务上都比LTR的表现好;
  • 将LTR和RTL模型拼接起来,效果仍比深度双向模型效果差,同时训练成本高

10.2 模型配置的影响

  探讨模型大小对微调任务准确度的影响。使用不同的层数,隐藏单元,注意力头数训练了一些BERT模型,而其他超参数和训练过程与之前描述的一样。

        BERT base中有1亿的可学习参数。BERT large中有3亿可学习的参数。相对于之前的transformer,可学习参数数量的提升还是比较大的。能够看出在所有的数据集上,越大的模型准确率越高。人们都知道,增加模型的大小将带来如机器翻译和语言模型上的持续提升,然而,这是第一个展示将模型变得特别大的时候对语言模型有较大提升的工作(只需要进行微调少量参数)。

        BERT由此引发了模型大战,看谁的模型更大。GPT-3都有一千个亿的参数,现在的模型都有往万亿的路上走。

10.3 将BERT作为特征提取器   

        Feature-based方法是从预训练模型中提取一些特定的特征,在一定程度上对模型训练是有性能提升的。首先并不是所有下游任务都可以用Transformer编码器结构来表示的,往往需要根据特定任务增加额外的结构。其次,从计算量的角度,先进行预计算,从训练数据上得到复杂庞大的表示,在此基础上再运行多次小模型试验,其花费是更廉价的。

        为了比较feature-based和fine-tune两种方法的效果,从模型的一层或多层中提取出特征,如Embeddings, Last Hidden, Weighted Sum Last Four Hidden等,并输入到一个随机初始化的两层768维度的BiLSTM模型中,最后通过一个分类层输出。结果显示,如果BERT(base)只提取最后4个隐含层的输出并进行拼接,其表现只比BERT(base)进行fine-tune方法低了0.3 F1。由此可以看出,采用feature-based和fine-tune对BERT模型的训练都是有效的。

        李沐:将BERT作为特征提取器,而不是进行微调,效果相比之下会差一些。所以使用BERT应该微调。

11 总结

        这篇文章认为本文的最大贡献就是双向性。BERT使用Transformer的编码器而不是解码器,好处是可以训练双向语言模型,在语言理解类的任务上表现比GPT更好,但是也有坏处,做生成类的任务不方便,比如机器翻译、摘要生成等等。只不过NLP领域,分类之类的语言理解任务多一些,所以大家更喜欢用BERT。 

        BERT所提供的是一个完整的解决问题的思路,符合了大家对于深度学习模型的期望:训练一个3亿参数的模型,在几百GB的数据集上预训练好,通过微调可以提升一大批NLP的下游任务,即使这些任务的数据集都很小

        GPT和BERT是同期提出的模型,两者都是预训练模型微调,很多思路是一样的,即使后者效果好一点,但是早晚也会被后来者超越,那为啥BERT更出圈?因为BERT的利用率是GPT的10倍,影响力自然就大了10倍不止。

猜你喜欢

转载自blog.csdn.net/iwill323/article/details/128374758