什么!?你对Bert的力量一无所知?

975 阅读7分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

作为 2018 年自然语言处理领域的新秀,BERT 是过去几年自然语言处理(NLP)领域的集大成者,一经出场就技惊四座,碾压所有算法,刷新了 11 项 NLP 测试的最高纪录,甚至有「超越人类」的表现,它被认为是未来 NLP 研究和工业应用最为主流的语言模型之一。

看我2000字👇

Bert原理

预训练模型

什么是预训练模型?----训练出具有泛化能力的模型!

举个例子,假设我们有大量的维基百科数据,那么我们可以用这部分巨大的数据来训练一个泛化能力很强的模型,当我们需要在特定场景使用时,例如做文本相似度计算,那么,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对权重进行一个轻微的调整。

预训练的好处在于在特定场景使用时不需要用大量的语料来进行训练,节约时间效率高效,Bert就是这样的一个泛化能力较强的预训练模型

Bert全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。

其中“双向”表示模型在处理某一个词时,它能同时利用前面的词和后面的词两部分信息。这种“双向”的来源在于BERT与传统语言模型不同,它不是在给你所有前面词的条件下预测最可能的当前词,而是随机遮掩一些词,并利用所有没有被遮掩的词进行预测。

对着图看👀

ELMo:使用双向信息,将上下文当作特征,但是无监督的语料和我们真实的语料还是有区别的,不一定的符合我们特定的任务。

OpenAI GPT:使用单向信息,decoder只能看到前面的信息,用transformer代替ELMo的LSTM。虽然可以进行fine-tuning,但是有些特殊任务与预训练输入有出入,单个句子与两个句子不一致的情况很难解决

Bert:使用双向信息,具备较强的泛化能力,对于特定的任务只需要添加一个输出层来进行fine-tuning即可。

Bert模型的主要创新点都在预训练(Pre-training)阶段方法上,即用了Masked Language ModelNext Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

Masked Language Model

简单来说,Masked Language Model可以理解为完形填空,作者会随机mask每一个句子中15%的词,用其上下文来做预测。

正经说👉Masked Language Model的预训练方法就是:随机mask句子中的部分token,然后训练模型来预测被去掉的token,用其上下文来做预测。

具体操作是:

随机mask语料中15%的token,然后将masked token 位置输出的final hidden vectors送入softmax,来预测masked token。

例如:

my dog is hairy → my dog is [MASK]

此处将hairy进行了mask处理,然后采用非监督学习的方法预测mask位置的词是什么,但是该方法有一个问题,因为是mask15%的词,其数量已经很高了,这样就会导致某些词在fine-tuning阶段从未见过,为了解决这个问题,作者做了如下的处理:

  • 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%的概率,其影响是可以忽略不计的。Transformer全局的可视,又增加了信息的获取,但是不让模型获取全量信息

Next Sentence Prediction

给出两个句子A和B,B有一半的可能性是A的下一句话,训练模型来预测B是不是A的下一句话,训练模型使模型具备理解长序列上下文的联系的能力。

目前很多NLP的任务比如QA(问答系统)和NLI(自然语言推理)都需要理解两个句子之间的关系,从而能让预训练的模型更好的适应这样的任务。 个人理解:

  • Bert先是用Mask来提高视野范围的信息获取量,增加duplicate再随机Mask,这样跟RNN类方法依次训练预测没什么区别,除了mask不同位置外;
  • 全局视野极大地降低了学习的难度,然后再用A+B/C来作为样本,这样每条样本都有50%的概率看到一半左右的噪声
  • 直接学习Mask A+B/C是没法学习的,因为不知道哪些是噪声,所以又加上next_sentence预测任务,与Masked Language Model同时进行训练,这样用next来辅助模型对噪声/非噪声的辨识,用Masked Language Model来完成语义的大部分的学习

输入

Bert的输入部分是个线性序列,两个句子通过分隔符分割,最前面是[CLS],最后面是[SEP]。

Bert模型的实际输入为Token Embeddings、Segment Embeddings以及Position Embeddings之和。

  • Token Embeddings:词向量。

  • Segment Embeddings:用来区别两种句子,表明这个词属于哪个句子。

  • Position Embeddings(位置编码):对字符的位置信息进行编码。

词表:{0:我,1:爱,2:北,3:京,4:上,5:海,6:,}

输入BERT的原句:''我爱北京,我爱上海''

token embedding:[0,1,2,3,6,0,1,4,5]

position embedding:[012345678]

segment embedding:[000001111]

输出

Bert预训练模型的输出结果,无非就是一个或多个向量。

下游任务可以通过精调(改变预训练模型参数)或者特征抽取(不改变预训练模型参数,只是把预训练模型的输出作为特征输入到下游任务)两种方式进行使用。

Bert原论文使用了精调方式,但也尝试了特征抽取方式的效果,比如在NER任务上,最好的特征抽取方式只比精调差一点点。但特征抽取方式的好处可以预先计算好所需的向量,存下来就可重复使用,极大提升下游任务模型训练的速度。

后面的话

Bert主要贡献

  • 引入了Masked Language Model,使用双向Language Model做模型预训练
  • 为预训练引入了新的句子级自监督目标,它可以学习句子与句子间的关系
  • 进一步验证了更大的模型效果更好: 12 --> 24 层。
  • 为下游任务引入了很通用的求解框架,不再为任务做模型定制。
  • 刷新了多项NLP任务的记录,引爆了NLP无监督预训练技术。

Bert优点

  • Transformer Encoder因为有Self-attention机制,因此Bert自带双向功能

  • 因为双向功能以及多层Self-attention机制的影响,使得Bert必须使用Cloze版的语言模型Masked Language Model来完成token级别的预训练

  • 为了获取比词更高级别的句子级别的语义表征,Bert加入了Next Sentence Prediction来和Masked Language Model一起做联合训练

  • 为了适配多任务下的迁移学习,Bert设计了更通用的输入层和输出层

  • 微调成本小

Bert缺点

  • [MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;

  • 每个batch只有15%的token被预测,所以Bert收敛得比left-to-right模型要慢(它们会预测每个token)

  • Bert对硬件资源的消耗巨大(大模型需要16个tpu,历时四天;更大的模型需要64个tpu,历时四天。

欢迎巨佬指导~

参考资料

一文读懂Bert(原理篇)--废柴当自强

BERT的理解--小汤算法屋