外观
BERT 模型
BERT 模型介绍
学习目标
- 了解什么是BERT
- 掌握BERT的架构
- 掌握BERT的预训练任务
1 BERT简介
BERT是2018年10月由Google AI研究院提出的一种预训练模型。
- BERT的全称是Bidirectional Encoder Representation from Transformers
- BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且在11种不同NLP测试中创出SOTA表现。包括将GLUE基准推高至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7%(绝对改进5.6%),成为NLP发展史上的里程碑式的模型成就
2 BERT的架构
总体架构:BERT采用Transformer Encoder block进行连接,是一个典型的双向编码模型
从架构图中可以看到,宏观上BERT分三个主要模块:
- 最底层的Embedding模块
- 中间层的Transformer模块
- 最上层的预微调模块
2.1 Embedding模块
BERT中的该模块是由三种Embedding共同组成而成:
- Token Embeddings:词嵌入张量,第一个单词是CLS标志,可以用于之后的分类任务
- Segment Embeddings:句子分段嵌入张量,是为了服务后续的两个句子为输入的预训练任务
- Position Embeddings:位置编码张量,此处注意和传统的Transformer不同,不是三角函数计算的固定位置编码,而是通过学习得出来的
- 整个Embedding模块的输出张量就是这3个张量的直接加和结果
2.2 双向Transformer模块
BERT中只使用了经典Transformer架构中的Encoder部分,完全舍弃了Decoder部分。而两大预训练任务也集中体现在训练Transformer模块中
2.3 预微调模块
- 经过中间层Transformer的处理后,BERT的最后一层根据任务的不同需求而做不同的调整即可
- 比如对于sequence-level的分类任务,BERT直接取第一个[CLS] token的final hidden state,再加一层全连接层后进行softmax来预测最终的标签
对于不同的任务,微调都集中在预微调层,几种重要的NLP微调任务包括:
- 句子对关系判断
- 单文本主题分类
- 问答任务(QA)
- 单句贴标签(NER)
若干可选的超参数建议:
Batch size: 16, 32
Learning rate (Adam): 5e-5, 3e-5, 2e-5
Epochs: 3, 43 BERT的预训练任务
BERT包含两个预训练任务:
- 任务一:Masked LM(带mask的语言模型训练)
- 任务二:Next Sentence Prediction(下一句话预测任务)
3.1 任务一:Masked LM
带mask的语言模型训练
- 关于传统的语言模型训练,都是采用left-to-right,或者left-to-right + right-to-left结合的方式,但这种单向方式或者拼接的方式提取特征的能力有限。为此BERT提出一个深度双向表达模型(deep bidirectional representation),即采用MASK任务来训练模型
- 在原始训练文本中,随机的抽取15%的token作为参与MASK任务的对象
- 在这些被选中的token中,数据生成器并不是把它们全部变成[MASK],而是有下列3种情况:
- 80%的概率:用[MASK]标记替换该token,比如
my dog is hairy -> my dog is [MASK] - 10%的概率:用一个随机的单词替换token,比如
my dog is hairy -> my dog is apple - 10%的概率:保持该token不变,比如
my dog is hairy -> my dog is hairy
- 80%的概率:用[MASK]标记替换该token,比如
- 模型在训练的过程中,并不知道它将要预测哪些单词?哪些单词是原始的样子?哪些单词被遮掩成了[MASK]?哪些单词被替换成了其他单词?正是在这样一种高度不确定的情况下,反倒逼着模型快速学习该token的分布式上下文的语义,尽最大努力学习原始语言说话的样子。同时因为原始文本中只有15%的token参与了MASK操作,并不会破坏原语言的表达能力和语言规则
3.2 任务二:Next Sentence Prediction
下一句话预测任务
- 在NLP中有一类重要的问题比如QA(Question-Answer),NLI(Natural Language Inference),需要模型能够很好的理解两个句子之间的关系,从而需要在模型的训练中引入对应的任务。在BERT中引入的就是Next Sentence Prediction任务。采用的方式是输入句子对(A, B),模型来预测句子B是不是句子A的真实的下一句话
- 所有参与任务训练的语句都被选中作为句子A:
- 其中50%的B是原始文本中真实跟随A的下一句话(标记为IsNext,代表正样本)
- 其中50%的B是原始文本中随机抽取的一句话(标记为NotNext,代表负样本)
- 在任务二中,BERT模型可以在测试集上取得97%-98%的准确率
4 小结
- 学习了什么是BERT:
- BERT是一个基于Transformer Encoder的预训练语言模型
- BERT在11种NLP测试任务中创出SOAT表现
- 学习了BERT的结构:
- 最底层的Embedding模块,包括Token Embeddings、Segment Embeddings、Position Embeddings
- 中间层的Transformer模块,只使用了经典Transformer架构中的Encoder部分
- 最上层的预微调模块,具体根据不同的任务类型来做相应的处理
- 学习了BERT的两大预训练任务:
- MLM任务(Masked Language Model):在原始文本中随机抽取15%的token参与任务
- 在80%概率下,用[MASK]替换该token
- 在10%概率下,用一个随机的单词替换该token
- 在10%概率下,保持该token不变
- NSP任务(Next Sentence Prediction):采用的方式是输入句子对(A, B),模型预测句子B是不是句子A的真实的下一句话
- 其中50%的B是原始文本中真实跟随A的下一句话(标记为IsNext,代表正样本)
- 其中50%的B是原始文本中随机抽取的一句话(标记为NotNext,代表负样本)
- MLM任务(Masked Language Model):在原始文本中随机抽取15%的token参与任务
常见问答
- 说一说BERT模型的架构以及每一部分的作用?
- 说一说BERT模型两大预训练任务,并谈一谈你的理解?
BERT 模型特点
学习目标
- 理解BERT模型的优点和原因
- 理解BERT模型的缺点和原因
- 理解在MLM任务中采用80%、10%、10%策略的原因
- 掌握利用BERT处理长文本的任务如何构造训练样本
1 BERT模型优缺点
1.1 BERT的优点
- 通过预训练,加上Fine-tunning,在11项NLP任务上取得最优结果
- BERT的根基源于Transformer,相比传统RNN更加高效,可以并行化处理同时能捕捉长距离的语义和结构依赖
- BERT采用了Transformer架构中的Encoder模块,不仅仅获得了真正意义上的bidirectional context,而且为后续微调任务留出了足够的调整空间
1.2 BERT的缺点
- BERT模型过于庞大,参数太多,不利于资源紧张的应用场景,也不利于上线的实时处理
- BERT目前给出的中文模型中,是以字为基本token单位的,很多需要词向量的应用无法直接使用。同时该模型无法识别很多生僻词,只能以UNK代替
- BERT中第一个预训练任务MLM中,[MASK]标记只在训练阶段出现,而在预测阶段不会出现,这就造成了一定的信息偏差,因此训练时不能过多的使用[MASK],否则会影响模型的表现
- 按照BERT的MLM任务中的约定,每个batch数据中只有15%的token参与了训练,被模型学习和预测,所以BERT收敛的速度比left-to-right模型要慢很多(left-to-right模型中每一个token都会参与训练)
2 BERT的MLM任务
2.1 BERT的MLM任务中为什么采用了80%、10%、10%的策略?
- 首先,如果所有参与训练的token被100%的[MASK],那么在fine-tunning的时候所有单词都是已知的,不存在[MASK],那么模型就只能根据其他token的信息和语序结构来预测当前词,而无法利用到这个词本身的信息,因为它们从未出现在训练过程中,等于模型从未接触到它们的信息,等于整个语义空间损失了部分信息。采用80%的概率下应用[MASK],既可以让模型去学着预测这些单词,又以20%的概率保留了语义信息展示给模型
- 保留下来的信息如果全部使用原始token,那么模型在预训练的时候可能会偷懒,直接照抄当前token信息。采用10%概率下random token来随机替换当前token,会让模型不能去死记硬背当前的token,而去尽力学习单词周边的语义表达和远距离的信息依赖,尝试建模完整的语言信息
- 最后再以10%的概率保留原始的token,意义就是保留语言本来的面貌,让信息不至于完全被遮掩,使得模型可以"看清"真实的语言面貌
3 BERT处理长文本的方法
首选要明确一点,BERT预训练模型所接收的最大sequence长度是512。
那么对于长文本(文本长度超过512的句子),就需要特殊的方式来构造训练样本。核心就是如何进行截断:
- head-only方式:这是只保留长文本头部信息的截断方式,具体为保存前510个token(要留两个位置给[CLS]和[SEP])
- tail-only方式:这是只保留长文本尾部信息的截断方式,具体为保存最后510个token(要留两个位置给[CLS]和[SEP])
- head+tail方式:选择前128个token和最后382个token(文本总长度在800以内),或者前256个token和最后254个token(文本总长度大于800)
4 小结
- 学习了BERT模型的3个优点:
- 在11个NLP任务上取得SOAT成绩
- 利用了Transformer的并行化能力以及长语句捕捉语义依赖和结构依赖
- BERT实现了双向Transformer并为后续的微调任务留出足够的空间
- 学习了BERT模型的4个缺点:
- BERT模型太大,太慢
- BERT模型中的中文模型是以字为基本token单位的,无法利用词向量,无法识别生僻词
- BERT模型中的MLM任务,[MASK]标记在训练阶段出现,预测阶段不出现,这种偏差会对模型有一定影响
- BERT模型的MLM任务,每个batch只有15%的token参与了训练,造成大量文本数据的"无用",收敛速度慢,需要的算力和算时都大大提高
- 学习了长文本处理如果要利用BERT的话,需要进行截断处理:
- 第一种方式就是只保留前面510个token
- 第二种方式就是只保留后面510个token
- 第三种方式就是前后分别保留一部分token,总数是510
常见问答
- BERT模型的优点和缺点?
- BERT的MLM任务中为什么采用了80%、10%、10%的策略?
- 长文本预测任务如果想用BERT来实现,要如何构造训练样本?
BERT 系列模型介绍
学习目标
- 了解不同类型的BERT系列模型
- 掌握BERT系列模型之间的区别和联系
1 ALBERT 模型
学习目标
- 了解ALBERT模型的架构
- 掌握ALBERT模型的优化点
1.1.1 ALBERT模型的架构
ALBERT(A Lite BERT)是BERT的轻量级版本,通过参数共享和分解嵌入技术大大减少了模型的参数量
1.1.2 ALBERT模型的优化点
- 跨层参数共享:所有Transformer层使用相同的参数,大大减少了模型参数量
- 嵌入参数分解:将大的嵌入矩阵分解为两个小的矩阵,降低参数量
- 句子顺序预测:用句子顺序预测任务替代NSP任务
2 RoBERTa 模型
学习目标
- 了解RoBERTa模型的架构
- 掌握RoBERTa模型的优化点
1.2.1 RoBERTa模型的架构
RoBERTa(Robustly optimized BERT approach)是BERT的优化版本,通过调整训练策略获得了更好的性能
1.2.2 RoBERTa模型的优化点
- 动态掩码:每次向模型输入数据时动态生成掩码模式
- 去除NSP任务:发现NSP任务对某些任务没有帮助,因此去除
- 更大的批次和更长训练时间:使用更大的批次和更长的训练时间
- 更长的训练序列:使用更长的序列进行训练
3 MacBERT 模型
学习目标
- 了解MacBERT模型的架构
- 掌握MacBERT模型的优化点
1.3.1 MacBERT模型的架构
MacBERT(Modified BERT with an improved mask strategy)是BERT的改进版本,通过改进掩码策略提升性能
1.3.2 MacBERT模型的优化点
- 改进的掩码策略:使用更合理的单词替换策略
- 多任务学习:同时训练多个相关任务
1.3.3 MacBERT模型的优化点
- 语法感知预训练:引入语法相关的预训练任务
- 自适应掩码:根据上下文自适应选择掩码位置
4 SpanBERT 模型
学习目标
- 了解SpanBERT模型的架构
- 掌握Span Masking和SBO任务
- 理解NSP任务反思
1.4.1 SpanBERT模型的架构
SpanBERT是BERT的改进版本,专注于span级别的预测任务
1.4.2 Span Masking
- Span Masking随机mask连续的span(片段),而不是单个token
- 这使得模型能够学习到更长的上下文依赖关系
1.4.3 Span Boundary Objective(SBO)
- SBO任务是让模型预测span边界处的token表示
- 这有助于模型更好地学习span级别的表示
1.4.4 NSP任务反思
- SpanBERT发现NSP任务对某些任务没有帮助,因此去除该任务
- 这与RoBERTa的发现一致