BERT是如何利用Transformer的Encoder进行预训练的?
BERT(Bidirectional Encoder Representations from Transformers)的核心创新在于它完全抛弃了Transformer的Decoder部分,仅仅使用了Encoder部分,并在海量的无标签文本上通过两个巧妙的预训练任务(MLM 和 NSP)来学习语言的深层双向表示。
要理解BERT是如何利用Transformer Encoder进行预训练的,我们可以按照“输入构建 -> Encoder处理 -> 预训练任务 -> 参数更新”的逻辑链路来拆解:
第一步:构建输入表示(Input Representation)
Transformer Encoder本身没有顺序概念,也不能直接处理文本,所以BERT首先将文本转化为丰富的向量表示。BERT的输入是三个Embedding的求和:
- Token Embeddings(词嵌入): 使用WordPiece分词算法(例如将"playing"分成"play"和"##ing"),并将每个词元转化为向量。
- Segment Embeddings(段嵌入): 用于区分当前的词属于第一个句子(句子A)还是第二个句子(句子B)。这对于句子关系任务至关重要。
- Position Embeddings(位置嵌入): 为每个词元赋予一个绝对位置信息,弥补自注意力机制丢失的顺序感。
特殊Token:
[CLS]:强制添加在输入的开头。它的最终输出向量会被用来代表整个句子的语义(用于分类任务)。[SEP]:用于分隔两个句子。
第二步:Transformer Encoder 的双向信息编码
输入向量构建好后,会被送入由多层 Transformer Encoder 堆叠而成的网络中(BERT-Base是12层,BERT-Large是24层)。
在Encoder内部,最核心的机制是多头自注意力(Multi-Head Self-Attention):
- 双向性(Bidirectional): 与通常带有掩码(Masked)的Decoder不同,Encoder中的每一个词在计算注意力时,都能够同时看到它左边和右边的所有词。
- 上下文融合: 比如句子中的“苹果”一词,Encoder会根据它周围的“吃”或者“手机”等词汇,动态地调整“苹果”的输出向量。
- 输出: 经过多层Encoder的计算,输入序列的每一个Token,都会输出一个含有全局上下文信息的密集向量(Hidden State)。
第三步:设计预训练任务(Pre-training Tasks)
有了Encoder输出的含有上下文信息的向量,BERT如何进行无监督(自监督)训练呢?它设计了两个任务同时进行:
任务 1:掩码语言模型(Masked Language Modeling, MLM)
这是BERT实现“深度双向”的关键任务,类似于我们做英语卷子时的“完形填空”。
- 做法: 随机挑选输入序列中 15% 的词汇作为目标进行预测。
- 特殊处理(80-10-10法则): 为了缓解预训练(有
[MASK])和微调(没有[MASK])之间的数据分布不匹配问题,这15%被选中的词并不全都被替换成[MASK]:- 80% 的概率:被替换为特殊的
[MASK]标签(例如:my dog is hairy -> my dog is [MASK])。 - 10% 的概率:被替换为一个随机的其他词(例如:my dog is hairy -> my dog is apple)。强迫模型利用上下文去纠错。
- 10% 的概率:保持原词不变(例如:my dog is hairy -> my dog is hairy)。让模型学会相信自己提取的特征。
- 80% 的概率:被替换为特殊的
- 如何利用Encoder: 取出被选中词在Encoder最后一层对应的输出向量,接一个全连接层和Softmax,预测词汇表里原本正确的词。
任务 2:下一句预测(Next Sentence Prediction, NSP)
为了让模型理解句子与句子之间的逻辑关系(这对问答系统、自然语言推理很有用),BERT设计了NSP任务。
- 做法: 每次给模型输入两个句子 A 和 B。
- 50% 的情况下,B 确实是在原文中紧挨着 A 的下一句话(标签为 IsNext)。
- 50% 的情况下,B 是从语料库中随机抽取的无关句子(标签为 NotNext)。
- 如何利用Encoder: 取出序列开头那个特殊的
[CLS]标签在Encoder最后一层的输出向量,将其视为整个输入对的句子级表示,送入一个二分类器(全连接层)中预测 True 或 False。
第四步:联合优化(Joint Optimization)
- 损失函数: BERT将 MLM 的交叉熵损失和 NSP 的二分类交叉熵损失相加,作为总的Loss。
- 大规模训练: 使用海量的无标注文本数据(如 Wikipedia 和 BooksCorpus,约33亿个单词),通过反向传播算法(Backpropagation)不断更新 Transformer Encoder 内部的权重矩阵以及底层的 Embedding 矩阵。
总结
BERT 利用 Transformer Encoder 的方式可以概括为:将文本加上特殊标记和位置/段落信息后送入Encoder,利用Encoder无阻碍的全局自注意力机制提取每个词的“上下文融合特征”,然后在其顶部架设 MLM(猜词)和 NSP(判断句子关系)两个预测头,通过海量语料的自监督学习,把语言的语法、句法和世界知识“压缩”到Encoder的参数之中。
这样预训练出来的Encoder,就成了一个极其强大的文本特征提取器,后续只需要在它的顶层加上简单的线性层,就能在各种下游任务(分类、问答、序列标注)中进行微调(Fine-tuning)并取得SOTA效果。