一、背景信息:
Bert是2018年10月由Google AI研究院提出的一种预训练模型。
主要用于自然语言处理(NLP)任务,特别是机器阅读理、文本分类、序列标注等任务。
BERT的网络架构使用的是多层Transformer结构,有效的解决了长期依赖问题。
二、整体结构:
BERT由多个Transformer Encoder一层一层地堆叠起来。
BERT全名叫做Bidirectional Encoder Representation from Transformers,下图中用Trm表示Transformer中的Encoder模块。Encoder中在编码一个token的时候会同时利用了其上下文的token,即为Bidirectional双向的体现。
三、Bert 的输入
Bert 的输入向量,由x的三种向量求和而成,三种向量分别为x的词向量、句子分类向量、位置向量。
其中
词向量Token Embeddings ,第一个词是[CLS]标志,通常会用在分类任务中
;[SEP]标志分句符号,用于断开输入语料中的两个句子或者表示句子的结束。
句子分类向量Segment Embeddings ,用来区别两种句子,有两种情况;问答等任务全部所有token全为0,其余任务第一句句所有token为0第二句所有为1。
位置向量Position Embeddings ,这里的位置向量为可学习的绝对位置编码,优点是可以学习到不同位置的不同编码,而不是固定的编码。因为位置编码的维度是固定的,需要设定最大长度
,不能预测超过长度的句子。
四、Bert训练
BERT的训练包含预训练
和fine-tune
两个阶段。
Bert预训练:
Bert预训练(Pre-training)任务是由MLM和NSP两个自监督任务组成。
MLM:
MLM随机在输入语料上Mask掉一些词,并通过上下文预测该词。其中15%的WordPiece Token会被随机Mask掉。
- 80%的时候会直接替换为[Mask]
- 10%的时候将其替换为其它任意单词
- 10%的时候会保留原始Token。
bash
1、若句子中的某个Token 100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词。
2、加入随机Token的原因是因为Transformer要保持对每个输入token的分布式表征。
3、因为一个单词被随机替换掉的概率只有15%*10% =1.5%,单词带来的负面影响可以忽略不计。
4、每次只预测15%的单词,因此模型收敛的比较慢。
# 优点:
# 10%的概率用任意词替换赋予Bert一定文本纠错能力;
# 10%的概率保留原始Token,缓解了finetune时与预训练时的输入不匹配。
# 缺点:
# Mask汉字割裂了连续汉字之间的相关性
NSP:
Next Sentence Prediction(NSP)任务判断句子B是否是句子A的下文。如果是的话输出'IsNext',否则输出'NotNext'。
Bert的微调
基于Bert模型的微调应用近些年来,已经越来越丰富了,下面介绍三种具有代表性的简单版本的微调应用。当然如今的bert微调应用是不仅仅只有下面这零星的几个例子。
1、单文本分类
在需要进行分类的文本的开头和结尾分别加上CLS和SEP标记
bash
[CLS] 文本 [SEP]
Bert模型输出的[CLS]标记的向量,表示整个文本序列的语义信息。
文本分类微调需要新增一个全连接层
,将[CLS]标记的向量输入到全连接层,输出各类别的概率分布。
2、问答任务
从给定的上下文中找到问题的答案。输入包含上下文和问题两部分
bash
[CLS] 上下文 [SEP] 问题 [SEP]
Bert模型的顶部添加两个分类层,分别用于预测答案的起始位置和终止位置。
3、信息抽取
对句子中语义连贯的词汇或短语逐个字的标注。
Bert模型的最后一层输出每个token的表示向量。通常在Bert模型顶部添加一个分类器,用于预测每个token是否是命名实体的token。例如:TPLinker
Reference
2.BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding