当前位置: 首页 > 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 项目带来巨大提升!如果你觉得文章对你有帮助的话,请点赞、收藏,+关注!

http://www.lryc.cn/news/577284.html

相关文章:

  • RWKV-8 系列之 DeepEmbedAttention:精简 KV 缓存,尤其适合混合模型(RWKV-7s)
  • MySQL 慢查询日志详解
  • 小白excel中使用VBA
  • [国家电网备考]操作系统
  • 飞算JavaAI 2.0.0深度测评:自然语言编程如何重构开发生产力?
  • 《微信生态裂变增长利器:推客小程序架构设计与商业落地》
  • 【Python使用】嘿马云课堂web完整实战项目第2篇:CMS页面管理需求,后端工程搭建【附代码文档】
  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • 鸿蒙5:组件状态共享
  • STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器
  • 七天学会SpringCloud分布式微服务——05——OpenFeign
  • Hadoop WordCount 程序实现与执行指南
  • 大数据(3)-Hive
  • 【时时三省】vectorcast使用教程
  • 烘焙工业4.0:自动化升级与制造执行MES系统的深度赋能
  • 【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • 国产车哪款有远程代驾功能?远程代驾+自动驾驶
  • 【Wireshark】高级过滤技巧精讲
  • APP 内存测试--Android Profiler实操(入门版)
  • Unity编辑器扩展之扫描项目中所有图片资源,并找出引用这些图片的预制体及其引用路径,最终导出为CSV报告
  • Monorepo+Pnpm+Turborepo
  • Windows 安装 nodejs npm
  • 网络拓扑图绘制全流程:从架构解析到工具实战
  • Jenkins Pipeline 实战指南
  • Java基础(六):数组全面解析
  • python+uniapp基于微信小程序的生鲜订购系统nodejs+java
  • Java 图书管理系统
  • 在拉卡拉分账功能中实现实时更新,需结合异步回调通知和数据库事务来确保数据一致性。以下是具体实现方案
  • 【Linux系统部分】在Linux命令行中写一个简单的shell外壳