BERT
定义
BERT (Bidirectional Encoder Representations from Transformers) 利用基于 Transformer 的神经网络来理解和生成类似人类的语言。
目的:根据训练时挖掘的词向量特征或句向量特征,基于输入获得词向量或句向量
特性
- BERT旨在生成语言模型,采用仅编码器的架构。
- BERT使用双向方法(Bidirectional)。
- BERT参与各种无监督的预训练任务。
BERT模型经历了两个步骤
- 对大量未标记文本进行预训练,学习上下文嵌入;
- 对标记数据进行微调,执行特定的NLP任务(包括情绪分析、问答、命名实体识别等)。
BERT工作原理
1、MLM
掩码语言模型(Masked Language Model)
BERT预测输入序列中被随机遮盖的Token,输出是每个被遮盖Token的概率分布,通过Softmax层得到。
目的
学习更深层次的语义表示。
实现方式
动态遮盖:在预训练阶段,BERT随机选择文本中15%的Token进行遮盖。其中80%用[MASK]标记替换、10%用随机词汇替换,剩下10%保持不变。(每次输入时都会随机改变遮盖的位置和词汇)
why 80%/10%/10%
训练阶段为了获取词句特征需要mask,测试阶段的目的是获取一个词向量或句向量,不需要mask。于是产生两个阶段不对等的弊端,进而导致由训练和测试数据不对等产生的性能损失。
用这种方式可以(测试时也是关注所有的词):
- 如果100%是用[mask]标记,模型就会认为只有[mask]标记的地方需要学习,损失语义空间的信息。因此,留出20%的空间不用[mask]遮盖,就是告诉模型,没标记的一样需要学习,都有可能是mask词,但80%的情况下还是通过完形填空去学习,效率更高。
- 10%是用随机的token替换,是怕模型偷懒,认为没标记的都是正确的。
- 最后再以10%的概率保留原始的token, 意义就是保留语言本来的面貌, 让信息不至于完全被遮掩, 使得模型可以"看清"真实的语言面貌。这10%是参与到梯度更新的,因此和未掩盖的85%不一样。
2、NSP
预测下一句(Next Sentance Prediction)
预测两个句子是否是连续的,输出的是一个二分类问题的概率分布。
目的
是模型能够理解句子间的逻辑关系,如连贯性、因果关系等,从而提高其在处理长文档或复杂文本时的能力。
实现方式
在预训练阶段,BERT构造了一个二分类任务,其中50%的样本:B是A的真正后续句子(标签为IsNext);另外50%的样本:B是从语料库中随机选择的句子(标签为NotNext)。模型通过最后一层Transformer输出的[CLS]标记的嵌入来进行预测。
BERT架构
1、Input
BERT输入的事一个原始的文本序列,可以是单个句子,也可以是两个句子。在输入到模型之前,需要经过预处理。
BERT处理长文本的方法
首先要明确一点, BERT预训练模型所接收的最大sequence长度是512。
那么对于长文本(文本长度超过512的句子), 就需要特殊的方式来构造训练样本. 核心就是如何进行截断。
- head-only方式: 这是只保留长文本头部信息的截断方式, 具体为保存前510个token (要留两个位置给[CLS]和[SEP]).
- tail-only方式: 这是只保留长文本尾部信息的截断方式, 具体为保存最后510个token (要留两个位置给[CLS]和[SEP]).
- head+only方式: 选择前128个token和最后382个token (文本总长度在800以内), 或者前256个token和最后254个token (文本总长度大于800).
2、Tokenization&Embeddings
-
Token Embeddings
BERT使用WordPiece分词方法。通过查找一个预训练的嵌入矩阵(通过大规模语料库上进行无监督预训练得到的)来为每个Token获得一个固定大小的向量(768维或1024维),帮助模型理解和处理各种复杂的语言现象和语义关系。
-
Segment Embeddings
为每个Token添加一个额外的嵌入,用来区分属于哪个句子(通常是“A”或者“B”),帮助模型理解句子间的关系和边界。
-
Position Embeddings
确保模型能够区分不同位置的相同Token。
将三者想加,得到每个Token的最终输入嵌入。
3、BERT的网络结构
由多个Transformer的Encoder堆叠而成,每个Encoder都包含自注意力机制、前馈神经网络、残差连接和层归一化。
- BERT-BASE的Encoder有12层,BERT-LARGE有24层;(Transformer是6层)
- 前馈网络分别为768个和1024个隐藏单元;注意力头分别为12个和16个;(Transformer包含512个隐藏单元和8个注意力头)
- BERT-BASE包含110M个参数,BERT-LARGE包含340M个参数;
4、Output
-
MLM
-
NSP
基于BERT的Fine Tuning完成任务
任务类型
-
句子对分类任务(Sentence Pair Classification)
这种任务需要判断两个句子之间的关系,如文本蕴含、问答匹配等。在fine-tuning时,将两个句子一起输入模型,并取第一个token([CLS])的输出表示作为整个句子对的表示,然后将其输入到一个额外的softmax层进行分类。
-
单句分类任务(Single Sentence Classification)
如情感分析、文本分类等。将单个句子输入模型,并取第一个token([CLS])的输出表示进行分类。
-
问答任务(Question Answering)
将问题和答案一起输入模型,并取答案部分在模型输出中的起始和结束位置作为答案的预测。
-
序列标注任务(Sequence Tagging)
如命名实体识别NER,对输入序列中的每个token进行分类。
模型修改
输入处理
根据任务类型不同,对输入数据进行相应处理,如拼接句子、添加特殊标记等。
输出处理
在模型输出部分添加一层或多层神经网络,将输出转换成任务所需的格式。如加一层softmax、逐token进行分类等。
损失函数
如交叉熵损失函数用户分类任务、平方差损失函数用于回归任务等。
具体应用举例
聊天机器人
-
用户意图分类(单轮对话)
输入:将用户的话语作为BERT模型的输入。
模型结构:在BERT模型的基础上添加分类层,用于将用户意图分类到不同的服务类型中。
训练:使用带有意图标签的用户话语数据集进行fine-tuning,使模型能够准确识别用户意图。
任务描述:从用户的话语中解析出用户的意图,如订餐、点歌等。
-
槽位填充(单轮对话)
输入:将用户的话语以及预定义的槽位作为BERT模型的输入。
模型结构:采用序列标注的方式,对每个输入token进行槽位标签的预测。
训练:使用带有槽位标签的用户话语数据集进行fine-tuning,使模型能够准确填充槽位信息。
任务描述:根据用户意图抽取关键元素,如订机票时的出发地、目的地等。
-
上下文信息利用(多轮对话)
输入:将当前用户话语以及历史对话内容作为BERT模型的输入。
模型结构:可以采用多种策略来融入历史信息,如将历史对话与当前用户话语拼接、使用历史对话的嵌入表示等。
训练:使用多轮对话数据集进行fine-tuning,使模型能够正确理解和利用上下文信息来生成应答。
任务描述:在多轮对话中,利用历史交互信息来改进模型的应答。
BERT的优点
- 通过预训练, 加上Fine-tunning, 在11项NLP任务上取得最优结果。
- BERT的根基源于Transformer, 相比传统RNN更加高效, 可以并行化处理同时能捕捉长距离的语义和结构依赖。
- BERT采用了Transformer架构中的Encoder模块, 不仅仅获得了真正意义上的bidirectional context, 而且为后续微调任务留出了足够的调整空间。
BERT的缺点
- BERT模型过于庞大, 参数太多, 不利于资源紧张的应用场景, 也不利于上线的实时处理。
- BERT目前给出的中文模型中, 是以字为基本token单位的, 很多需要词向量的应用无法直接使用. 同时该模型无法识别很多生僻词, 只能以UNK代替。
- BERT中第一个预训练任务MLM中, [MASK]标记只在训练阶段出现, 而在预测阶段不会出现, 这就造成了一定的信息偏差, 因此训练时不能过多的使用[MASK], 否则会影响模型的表现。
- 按照BERT的MLM任务中的约定, 每个batch数据中只有15%的token参与了训练, 被模型学习和预测, 所以BERT收敛的速度比left-to-right模型要慢很多(left-to-right模型中每一个token都会参与训练).