当前位置: 首页 > news >正文

BERT 模型详解:结构、原理解析

四前言

在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)已经成为理解类任务的标配模型。相比 GPT 更擅长文本生成,BERT 则在语言理解任务上展现出卓越的能力。本文将从结构到应用,全方位剖析 BERT 的核心思想与关键技术。


一、BERT 的技术背景

BERT 基于 Transformer 架构中的 Encoder 部分,其出现受到了 ELMo 和 GPT-1 的启发:

  • ELMo:采用双向 LSTM(能够双向上下文),能够捕捉上下文信息,但执行上较为缓慢。

  • GPT-1:基于 Transformer 的 Decoder 结构,仅使用单向上下文。

  • BERT:综合优势,采用 Transformer 的 Encoder,并实现了真正的双向建模,BERT 模型本质上就是一个强大的语义特征向量提取模型


二、模型结构概览

1. 输入结构

BERT 的输入包括三类嵌入信息:

  • Token Embedding:词语嵌入,将输入文本的词转化为向量,通常为 768 维。

  • Segment Embedding:区分句子 A/B 的标记。

  • Position Embedding:加入位置信息,使模型有“顺序感”,比如标号为0、1、2,有别于transfomer 的positional encoding 通常使用三角函数进行位置编码。

注意:此时向量只有词面信息、位置信息、片段信息

例子:

[CLS] 我 爱 吃 饭 [SEP] 我 也 爱 吃 肉 [SEP]

  • [CLS] 表示分类任务的起始标记;

  • [SEP] 表示句子分隔符。

2. Transformer 编码层

BERT-Base 模型包含 12 层 Encoder,每层内部包括:

  • 多头自注意力机制(Multi-Head Attention)——简单来说它让模型同时从多个角度理解每个向量和上下文之间的关系

  • 前馈神经网络(Feed Forward Neural Network)——简单来说它是一个对每个经过自注意力机制的向量进行抽象提取(可理解为"概括")的过程。

每层都能提取更丰富的上下文语义,最终每个 Token 输出一个 768 维语义向量(具有上下文相关的特点)。


三、预训练任务解析

1. MLM(Masked Language Model)

训练时随机将全文 15% 的 Token 替换为 [MASK],要求模型根据上下文预测被遮蔽的词。(也被称为“完形填空”的形式)

举例:

输入:

“我 爱 [MASK] 饭”

预测:

[MASK] → “吃”

Mask 策略:

在刚才选取的全文15%的Token中进行以下操作:

  • 80% 被替换为 [MASK]

  • 10% 被随机词替换

  • 10% 不变

缺点:训练阶段有 MASK,测试阶段无,引入训练-推理分布差异。

改进方案:
  • 动态 Masking:每次训练时随机生成新 MASK;

  • Span Masking(n-gram Mask)遮蔽连续多个词,训练模型能够更好预测mask 所在位置的词,提升整体语言理解能力。

  • ERNIE / SpanBERT:利用更丰富语义信息改进 Mask 策略。


2. NSP(Next Sentence Prediction)

NSP 任务是判断两个句子之间是否为上下文顺序关系

数据构造:
  • 正样本:真实连续段落。

  • 负样本:从不同文档中随机选取

任务流程:
  • 输入以 [CLS] 开头,接句子 A 和句子 B;

  • 模型输出 [CLS] 的向量,进行二分类判断(A句和B句是否为连续句);

  • 输出 [1, 0] → 是连续句子,[0, 1] → 非连续。


四、BERT总览:


总结

  • BERT 通过双向编码和 MLM+NSP 的预训练目标,极大提升了语言理解能力。

  • MLM 训练策略虽然有效,但也引入了训练-测试不一致问题,动态 Mask 和 Span Mask 是良好补充。    

理解 BERT 是深入掌握自然语言处理的基石,合理使用和优化预训练模型,将为你的 NLP 项目带来巨大提升!如果你觉得文章对你有帮助的话,请点赞、收藏,+关注!

相关文章:

  • 视频跳帧播放器设计与实现
  • Java I/O 模型详解:BIO、NIO 和 AIO
  • [Python 基础课程]Hello World
  • 实战四:基于PyTorch实现猫狗分类的web应用【2/3】
  • 【Linux庖丁解牛】— 文件系统!
  • 什么是RAG检索生成增强?
  • 利用deepseek学术搜索
  • 「Java案例」华氏摄氏温度转换
  • XIP (eXecute In Place)
  • 双指针的用法
  • Nginx漏洞处理指南
  • [database] Closure computation | e-r diagram | SQL
  • llama.cpp学习笔记:后端加载
  • VMware设置虚拟机为固定IP
  • Java--可变参数--作用域--构造器--this
  • Qwen-VL系列全面解析:从技术突破到应用实践
  • OSPF(开放最短路径优先)
  • ROS常用的路径规划算法介绍
  • Excel之将一堆姓名拆成一列4
  • 1.认识Docker