Google BERT 详解

文章目录

  • 1.BERT 模型
    • 1.1 模型结构
    • 1.2 Embedding
    • 1.3 Pre-training Task 1#: Masked LM
    • 1.4 Pre-training Task 2#: Next Sentence Prediction
    • 1.5 Fine-tunning
  • 2. 优缺点
    • 2.1 优点
    • 2.2 缺点
  • 3. 总结
  • 参考资料

转载来源:https://zhuanlan.zhihu.com/p/46652512
作者:李如

Google BERT 详解_第1张图片

1.BERT 模型

BERT 的全称是 Bidirectional Encoder Representation from Transformers,即双向 Transformer 的 Encoder,因为 decoder 是不能获要预测的信息的。模型的主要创新点都在 pre-train 方法上,即用了 Masked LM 和 Next Sentence Prediction 两种方法分别捕捉词语和句子级别的 representation。

1.1 模型结构

由于模型的构成元素 Transformer 已经解析过,就不多说了,BERT 模型的结构如下图最左:

Google BERT 详解_第2张图片
对比 OpenAI GPT(Generative pre-trained transformer),BERT 是双向的 Transformer block 连接;就像单向 rnn 和双向 rnn 的区别,直觉上来讲效果会好一些。

对比 ELMo,虽然都是 “双向”,但目标函数其实是不同的。ELMo 是分别以 P ( w i ∣ w 1 , … w i − 1 ) P\left(w_{i} \mid w_{1}, \dots w_{i-1}\right) P(wiw1,wi1) P ( w i ∣ w i + 1 , … w n ) P\left(w_{i} \mid w_{i+1}, \dots w_{n}\right) P(wiwi+1,wn)作为目标函数,独立训练处两个 representation 然后拼接,而 BERT 则是以 P ( w i ∣ w 1 , … , w i − 1 , w i + 1 , … , w n ) P\left(w_{i} \mid w_{1}, \dots, w_{i-1}, w_{i+1}, \dots, w_{n}\right) P(wiw1,,wi1,wi+1,,wn)作为目标函数训练 LM。

1.2 Embedding

这里的 Embedding 由三种 Embedding 求和而成:

Google BERT 详解_第3张图片
其中:

  • Token Embeddings 是词向量,第一个单词是 CLS 标志,可以用于之后的分类任务
  • Segment Embeddings 用来区别两种句子,因为预训练不光做 LM 还要做以两个句子为输入的分类任务
  • Position Embeddings 和之前文章中的 Transformer 不一样,不是三角函数而是学习出来的

1.3 Pre-training Task 1#: Masked LM

第一步预训练的目标就是做语言模型,从上文模型结构中看到了这个模型的不同,即 bidirectional。关于为什么要如此的 bidirectional,作者在 reddit 上做了解释,意思就是如果使用预训练模型处理其他任务,那人们想要的肯定不止某个词左边的信息,而是左右两边的信息。而考虑到这点的模型 ELMo 只是将 left-to-right 和 right-to-left 分别训练拼接起来。直觉上来讲我们其实想要一个 deeply bidirectional 的模型,但是普通的 LM 又无法做到,因为在训练时可能会 “穿越”(关于这点我不是很认同,之后会发文章讲一下如何做 bidirectional LM)。所以作者用了一个加 mask 的 trick。

在训练过程中作者随机 mask 15% 的 token,而不是把像 cbow 一样把每个词都预测一遍。最终的损失函数只计算被 mask 掉那个 token。

Mask 如何做也是有技巧的,如果一直用标记 [MASK] 代替(在实际预测时是碰不到这个标记的)会影响模型,所以随机 mask 的时候 10% 的单词会被替代成其他单词,10% 的单词不替换,剩下 80% 才被替换为[MASK]。具体为什么这么分配,作者没有说。。。要注意的是 Masked LM 预训练阶段模型是不知道真正被 mask 的是哪个词,所以模型每个词都要关注。

因为序列长度太大(512)会影响训练速度,所以 90% 的 steps 都用 seq_len=128 训练,余下的 10% 步数训练 512 长度的输入。

1.4 Pre-training Task 2#: Next Sentence Prediction

因为涉及到 QA 和 NLI 之类的任务,增加了第二个预训练任务,目的是让模型理解两个句子之间的联系。训练的输入是句子 A 和 B,B 有一半的几率是 A 的下一句,输入这两个句子,模型预测 B 是不是 A 的下一句。预训练的时候可以达到 97-98% 的准确度。

注意:作者特意说了语料的选取很关键,要选用 document-level 的而不是 sentence-level 的,这样可以具备抽象连续长序列特征的能力。

1.5 Fine-tunning

分类:对于 sequence-level 的分类任务,BERT 直接取第一个 [CLS]token 的 final hidden state C ∈ Re ⁡ H C \in \operatorname{Re}^{H} CReH,加一层权重 W ∈ Re ⁡ K × H W \in \operatorname{Re}^{K \times H} WReK×H后 softmax 预测 label proba:
P = softmax ⁡ ( C W T ) P=\operatorname{softmax}\left(C W^{T}\right) P=softmax(CWT)

其他预测任务需要进行一些调整,如图:

Google BERT 详解_第4张图片
可以调整的参数和取值范围有:

  • Batch size: 16, 32
  • Learning rate (Adam): 5e-5, 3e-5, 2e-5
  • Number of epochs: 3, 4

因为大部分参数都和预训练时一样,精调会快一些,所以作者推荐多试一些参数。

2. 优缺点

2.1 优点

BERT 是截至 2018 年 10 月的最新 state of the art 模型,通过预训练和精调横扫了 11 项 NLP 任务,这首先就是最大的优点了。而且它还用的是 Transformer,也就是相对 rnn 更加高效、能捕捉更长距离的依赖。对比起之前的预训练模型,它捕捉到的是真正意义上的 bidirectional context 信息。

2.2 缺点

作者在文中主要提到的就是 MLM 预训练时的 mask 问题:

  1. [MASK]标记在实际预测中不会出现,训练时用过多 [MASK] 影响模型表现
  2. 每个 batch 只有 15% 的 token 被预测,所以 BERT 收敛得比 left-to-right 模型要慢(它们会预测每个 token)

3. 总结

一遍读下来,感觉用到的都是现有的东西,可没想到效果会这么好,而别人又没想到。不过文章中没有具体解释的很多点可以看出这样出色的结果也是通过不断地实验得出的,而且训练的数据也比差不多结构的 OpenAI GPT 多,所以数据、模型结构,都是不可或缺的东西。

以上。

参考资料

  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  2. 全面超越人类!Google 称霸 SQuAD,BERT 横扫 11 大 NLP 测试
  3. 如何评价 BERT 模型?

你可能感兴趣的:(Google BERT 详解)