【人工智能99问】BERT的原理什么?(23/99)
文章目录
- BERT详解
- 一、概述
- 二、BERT的结构
- 2.1 整体架构
- 2.2 输入表示层
- (1)Token Embedding
- (2)Segment Embedding
- (3)Position Embedding
- (4)特殊符号
- 2.3 Transformer Encoder层
- 三、BERT的核心原理
- 3.1 预训练阶段:学习通用语言表示
- (1)Masked Language Model(MLM)
- (2)Next Sentence Prediction(NSP)
- 3.2 微调阶段:适配下游任务
- 四、BERT的使用场景
- 五、BERT的优缺点
- 5.1 优点
- 5.2 缺点
- 六、BERT的训练技巧
- 七、BERT的关键改进与变体
- 八、实例说明:BERT处理句子对分类任务
- 步骤1:输入处理
- 步骤2:Transformer Encoder编码
- 步骤3:预训练任务的作用
- 步骤4:微调输出
- 九、总结
BERT详解
一、概述
BERT(Bidirectional Encoder Representations from Transformers) 是由Google在2018年提出的预训练语言模型,其核心思想是通过双向Transformer编码器学习通用语言表示,并通过“预训练+微调”模式适配下游自然语言处理(NLP)任务。BERT的出现彻底改变了NLP领域的范式,推动了“预训练模型主导下游任务”的趋势,大幅提升了文本分类、问答、命名实体识别等任务的性能。
二、BERT的结构
BERT的结构基于Transformer的Encoder部分,整体可分为输入表示层和多层Transformer编码器两部分。
2.1 整体架构
BERT的基础结构是堆叠的Transformer Encoder层,具体层数和隐藏层维度因版本而异:
- BERT-Base:12层Transformer Encoder,隐藏层维度768,12个注意力头,总参数约110M。
- BERT-Large:24层Transformer Encoder,隐藏层维度1024,16个注意力头,总参数约340M。
所有Transformer层共享输入表示的维度,且每层包含相同的核心组件。
2.2 输入表示层
BERT的输入需转换为三维向量(Token Embedding + Segment Embedding + Position Embedding),以同时编码词汇、句子边界和位置信息。
(1)Token Embedding
- 输入文本首先通过分词工具(如WordPiece)拆分为子词(Subword)Token,例如“embeddings”可能拆分为“em”+“#bed”+“dings”。
- 每个Token映射到一个固定维度的向量(如768维),构成Token Embedding。
(2)Segment Embedding
- 用于区分输入中的不同句子(如句子对任务),用两个标记(0和1)分别表示第一句和第二句的Token,对应不同的嵌入向量。
- 若输入为单句,所有Token的Segment Embedding均为0。
(3)Position Embedding
- 由于Transformer是无顺序的,需通过位置嵌入编码Token的顺序信息。BERT采用可学习的位置嵌入(而非Transformer原论文的正弦余弦函数),支持最长512个Token的位置编码。
(4)特殊符号
[CLS]
:位于输入开头的特殊Token,用于聚合整个序列的语义(如分类任务的输出)。[SEP]
:用于分隔句子对的特殊Token(如“句子A [SEP] 句子B”)。
2.3 Transformer Encoder层
每层Transformer Encoder包含两个核心模块,均采用残差连接和层归一化:
- 多头自注意力(Multi-Head Self-Attention):
- 将输入向量分为多个子空间(“头”),并行计算注意力,捕捉不同维度的语义关联(如语法、语义依赖)。
- 注意力公式:Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})VAttention(Q,K,V)=softmax(dkQKT)V,其中Q,K,VQ,K,VQ,K,V分别为查询、键、值矩阵。
- 前馈神经网络(Feed-Forward Network):
- 对每个Token的向量进行非线性变换,公式:FFN(x)=max(0,xW1+b1)W2+b2FFN(x) = max(0, xW_1 + b_1)W_2 + b_2FFN(x)=max(0,xW1+b1)W2+b2(含ReLU激活)。
三、BERT的核心原理
BERT的成功依赖于“预训练+微调”的两阶段模式,通过预训练学习通用语言知识,再通过微调适配具体任务。
3.1 预训练阶段:学习通用语言表示
预训练通过两个无监督任务让模型学习双向上下文信息,训练数据为BooksCorpus(约8亿词)和Wikipedia(约25亿词)。
(1)Masked Language Model(MLM)
- 随机掩盖输入中15%的Token,让模型预测被掩盖的Token:
- 80%概率用
[MASK]
替换(如“我爱[MASK]”→预测“中国”)。 - 10%概率用随机Token替换(如“我爱[MASK]”→改为“我爱苹果”,模型需识别“苹果”是错误的)。
- 10%概率不替换(保持原Token,避免模型依赖
[MASK]
符号)。
- 80%概率用
- 作用:迫使模型学习双向上下文(需结合前后文预测Token),区别于单向模型(如GPT仅从左到右建模)。
(2)Next Sentence Prediction(NSP)
- 输入句子对(A, B),50%概率B是A的真实下一句,50%概率B是随机句子,模型需判断B是否为A的下一句。
- 作用:让模型学习句子间的逻辑关系(如因果、递进),支持问答、自然语言推理等任务。
3.2 微调阶段:适配下游任务
预训练完成后,冻结大部分参数,仅调整输出层以适配具体任务,无需重新训练整个模型:
- 分类任务(如情感分析):用
[CLS]
的输出向量接全连接层预测类别。 - 序列标注任务(如NER):用每个Token的输出向量接分类层预测标签(如“人名”“地名”)。
- 句子对任务(如问答):用
[SEP]
分隔问题和段落,通过Token级输出定位答案区间。
四、BERT的使用场景
BERT凭借强大的双向语义理解能力,广泛应用于各类NLP任务:
任务类型 | 具体场景举例 | BERT的作用 |
---|---|---|
文本分类 | 情感分析、垃圾邮件检测、新闻分类 | 通过[CLS] 向量捕捉整体语义,输出分类概率 |
序列标注 | 命名实体识别(NER)、词性标注(POS) | 为每个Token输出标签,捕捉局部上下文依赖 |
问答系统 | SQuAD数据集、智能客服问答 | 定位段落中与问题匹配的答案区间(start/end) |
自然语言推理 | 判断句子间关系(蕴含/矛盾/中立) | 学习句子对的逻辑关联,输出推理结果 |
文本生成辅助 | 摘要生成、机器翻译 | 提供上下文语义表示,提升生成内容的准确性 |
语义相似度计算 | 句子查重、推荐系统中的文本匹配 | 编码句子向量,通过余弦相似度计算相似性 |
五、BERT的优缺点
5.1 优点
- 双向上下文理解:MLM任务让模型同时关注左右上下文,优于单向模型(如GPT)或半双向模型(如ELMo)。
- 强迁移能力:预训练+微调模式大幅降低下游任务的标注数据需求,小样本场景下性能显著提升。
- 统一架构适配多任务:无需为不同任务设计专用结构,仅调整输出层即可,简化工程落地。
- 特征表示鲁棒性:通过多层Transformer和残差连接,能捕捉从局部到全局的多层次语义。
5.2 缺点
- 训练成本高:预训练需海量计算资源(BERT-Large训练需数千GPU小时),对中小团队不友好。
- 输入长度限制:最大输入长度为512 Token,长文本(如文档级任务)需截断或分段处理,可能丢失上下文。
- NSP任务争议:后续研究(如RoBERTa)发现NSP任务对性能提升有限,甚至可能引入噪声。
- 推理速度较慢:多层Transformer的自注意力计算复杂度为O(n2)O(n^2)O(n2)(n为Token数),实时性要求高的场景需优化。
六、BERT的训练技巧
为提升BERT的训练效率和性能,实践中常用以下技巧:
- 学习率调度:采用“线性预热+线性衰减”策略(如预热10%步数,之后线性下降),避免训练初期参数震荡。
- 批次与硬件优化:
- 大批次训练(如BERT-Base用256序列/批次)需配合梯度累积(Gradient Accumulation)。
- 使用混合精度训练(FP16/FP32)降低显存占用,加速训练。
- 正则化:
- 对注意力权重和前馈网络加入Dropout(概率0.1),防止过拟合。
- 权重初始化采用Xavier初始化,稳定训练过程。
- 数据增强:预训练阶段通过同义词替换、随机插入/删除Token等方式扩充数据多样性。
- 长文本处理:对超512 Token的文本采用滑动窗口截断,或保留首尾关键片段。
七、BERT的关键改进与变体
BERT的成功催生了大量变体,针对其效率、性能或适用场景进行优化:
变体模型 | 核心改进 | 优势 |
---|---|---|
RoBERTa | 取消NSP任务,增大训练数据量和步数,动态Mask | 性能优于BERT,验证了NSP的非必要性 |
ALBERT | 跨层参数共享,因式分解词嵌入,简化NSP为SOP | 参数减少75%,训练速度提升,适合资源受限场景 |
SpanBERT | 预测连续片段(Span)而非单个Token | 增强对短语和实体的理解,提升NER、问答性能 |
ELECTRA | 用“替换检测”任务(RTD)替代MLM,生成对抗训练 | 训练效率提升4倍,小模型性能接近BERT-Large |
BERT-wwm | 全词Mask(对完整词的所有子词同时Mask) | 增强对完整词汇的语义捕捉,中文任务性能提升 |
DistilBERT | 知识蒸馏压缩BERT,保留60%参数 | 推理速度提升2倍,性能损失仅1-2% |
八、实例说明:BERT处理句子对分类任务
以“情感分析(判断句子对是否表达相同情感)”为例,说明BERT的结构和原理:
步骤1:输入处理
- 输入句子对:“我喜欢这部电影 [SEP] 这部电影很精彩”(标签:相同情感)。
- 分词后序列:
[CLS] 我 喜 欢 这 部 电 影 [SEP] 这 部 电 影 很 精 彩 [SEP]
。 - 生成嵌入向量:
- Token Embedding:每个子词的预训练向量。
- Segment Embedding:第一句(含
[CLS]
和第一个[SEP]
)为0,第二句为1。 - Position Embedding:按Token位置(0到n-1)添加可学习位置向量。
- 最终输入向量 = Token Embedding + Segment Embedding + Position Embedding。
步骤2:Transformer Encoder编码
输入向量经过12层Transformer Encoder(BERT-Base):
- 每层通过多头自注意力捕捉Token间关联(如“喜欢”与“精彩”的语义呼应)。
- 前馈网络对每个Token的向量进行非线性变换,增强特征表达。
- 残差连接和层归一化确保训练稳定,避免梯度消失。
步骤3:预训练任务的作用
- MLM预训练:若训练时“精彩”被Mask,模型需结合“喜欢”“电影”等上下文预测“精彩”,学习正向情感关联。
- NSP预训练:模型学习到“这部电影很精彩”是“我喜欢这部电影”的合理后续,强化句子对的逻辑一致性。
步骤4:微调输出
- 取
[CLS]
的最终输出向量(聚合了整个句子对的语义)。 - 接全连接层和Softmax,输出“相同情感”或“不同情感”的概率。
- 通过标注数据微调全连接层参数,保留预训练的Transformer参数,快速适配任务。
九、总结
BERT通过双向Transformer和创新的预训练任务,奠定了现代预训练语言模型的基础。尽管存在训练成本高、长文本处理受限等问题,但其“预训练+微调”模式已成为NLP的标准范式。后续变体(如RoBERTa、ELECTRA)进一步优化了效率和性能,推动NLP技术在实际场景中广泛落地(如智能客服、内容审核、机器翻译等)。理解BERT的结构和原理,对掌握后续预训练模型的演进至关重要。