Bert的结构主要就是引用了transformer的encoder,是encoder的堆叠。使用encoder作为特征提取器,使用双向编码(类似于完形填空),让Bert有更强的语义提取能力。可以用来进行各种文本处理任务,比如文本分类、问答、翻译等。
Bert和普通的transformer Encoder结构的区别:
1、普通的transformer结构是端到端训练的,没有预训练。Bert采用了预训练,主要有两种方式:MLM和NSP。
2、双向注意力机制,普通的transformer encoder结构,训练的时候是单向的,从左到右生成文本,而Bert依赖双向transformer,通过MLM机制在训练的时候同时关注前面的单词和后面的单词,不像传统方法只能从左往右预测。
3、输入的表示不同,Bert的输入向量比普通的transformer更复杂,它使用Token Embeddings(词嵌入),Segment Embeddings(片段嵌入), Position Embeddings(位置嵌入)。比普通的多加了片段嵌入,这个功能主要是用来区分第一句话和第二句话的,是NSP任务所需要的。
总结:
语言掩码模型MLM
Bert的作者认为,使用从左向右的和从右向左的单向编码器,拼接成的双向编码器,性能,参数规模还有效率都不如直接用深度双向编码器强大。所以Bert使用Transformer的encoder作为特征提取器,而不是用两个Decoder做特征提取器。
MLM方法就是随机去掉句子的部分单词,然后用模型来预测被去掉的单词是什么。类似于完形填空。随机去掉的单词(token)叫做掩码词。
下面是例子
-
80% 的时间:用
[MASK]代替,例如:- 原句子:
The cat sat on the mat - 变换后:
The cat sat on [MASK] mat - 这样,模型必须通过上下文来预测
[MASK]代表哪个单词。
- 原句子:
-
10% 的时间:用一个随机词替换,例如:
- 原句子:
The cat sat on the mat - 变换后:
The cat sat on apple mat - 这样训练可以让模型更鲁棒,避免只会死记
[MASK]的模式。
- 原句子:
-
10% 的时间:保持原样不变,例如:
- 原句子:
The cat sat on the mat - 变换后:
The cat sat on the mat - 这样做的目的是让模型在没有
[MASK]的情况下也能学习语义表示。
- 原句子:
"我喜欢吃苹果,因为它很甜。"
在训练时,BERT 可能会做这样的变换:
-
80% 变为
[MASK]:"我喜欢吃
[MASK],因为它很甜。"(模型需要预测[MASK]是“苹果”) -
10% 变为随机词:
"我喜欢吃 香蕉 ,因为它很甜。"(模型要理解这个词是不合理的)
-
10% 保持不变:
"我喜欢吃苹果,因为它很甜。"(让模型也学习正常的语言分布)
这样的好处就是编码器不知道哪些词是需要预测的,哪些词是错误的,因此被迫学习每一个token的表示向量,所以训练效率会低一些,但是模型的语义理解能力会增强。
下句预测NSP
NSP主要的思想就是输入两个句子,然后判断第二个句子是不是第一个句子的自然续句。训练的时候各占百分之五十的情况。为了给Bert识别两个句子,并区分两个句子的关系,每个输入会进行处理:[CLS]分类标记,放在句子A的最前面,表示整个句子的输入开始。[SEP]分隔符分别放在句子A和句子B的末尾,用来分隔句子。
举个例子:
[CLS] 我 今天 去 了 公园 。 [SEP] 我 在 湖边 喂 了 几只 鸽子 。 [SEP]
NSP主要增强了Bert的句子级别的理解能力,这对阅读理解,文本推理,句子生成等工作有用。