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

BERT(Bidirectional Encoder Representations from Transformers)模型详解

一、BERT 简介

BERT(Bidirectional Encoder Representations from Transformers)是由 Google 在 2018 年提出的一种预训练语言表示模型。它基于 Transformer 编码器结构,首次提出了 双向上下文建模 的方法,大幅度提升了自然语言处理(NLP)任务的表现。

传统的语言模型(如 RNN、LSTM)多是 单向建模,只能从左到右或从右到左学习语义。而 BERT 通过 Mask Language Model (MLM) 技术,使得模型能够同时利用 前文和后文信息,达到深度双向表示的效果。

二、BERT 的模型结构

BERT 的核心是 多层 Transformer Encoder,每一层由以下部分组成:

  • 输入嵌入层(Input Embedding)

    • Token Embedding:词的向量表示。

    • Segment Embedding:表示句子对中的句子 A 或 B。

    • Position Embedding:位置编码,用于保留词序信息。

    输入向量表示为:E = E_{\text{token}} + E_{\text{segment}} + E_{\text{position}}

  • 多头自注意力层(Multi-Head Self-Attention)
    与 Transformer Encoder 一致,计算公式为:

    \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V
  • 前馈神经网络(Feed Forward Network, FFN)

    \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2
  • 残差连接 + 层归一化(Residual Connection + LayerNorm)

三、BERT 的预训练任务

BERT 通过 大规模语料预训练 + 下游任务微调 的方式工作。其预训练包含两大任务:

1. Masked Language Model (MLM)

在输入句子中,随机遮盖 15% 的词,然后让模型预测这些被遮盖的词。
例如:

  • 输入:"I love [MASK] learning"

  • 预测:"I love machine learning"

其损失函数为交叉熵:

\mathcal{L}_{\text{MLM}} = - \sum_{i \in M} \log P(w_i | w_{\setminus M})

其中 M 表示被 Mask 的位置,w_{\setminus M}​ 表示上下文。

2. Next Sentence Prediction (NSP)

给定两句话,预测第二句是否是第一句的真实后续。

  • 正样本:句子 B 紧跟句子 A。

  • 负样本:句子 B 来自语料中的随机句子。

其损失函数为二分类交叉熵:

\mathcal{L}_{\text{NSP}} = - \big[ y \log P(\text{IsNext}) + (1-y) \log (1 - P(\text{IsNext})) \big]

四、BERT 的训练与微调

  1. 预训练阶段

    • 使用大规模语料(BooksCorpus, Wikipedia)进行训练。

    • 学习通用的语言表示。

  2. 微调阶段

    • 将预训练好的 BERT 模型参数作为初始化。

    • 根据具体任务(文本分类、问答、命名实体识别等)在最后接入不同的输出层,并在小规模任务数据上训练。

五、BERT 的应用场景

  • 文本分类(情感分析、新闻分类)

  • 问答系统(SQuAD 竞赛表现优异)

  • 命名实体识别(NER)

  • 自然语言推理(NLI)

  • 机器翻译、对话系统

六、总结

  • BERT 基于 Transformer Encoder 架构,采用 双向上下文建模

  • 通过 MLM + NSP 的预训练任务,使模型学到深层语义表示。

  • 在多个 NLP 下游任务上达到 SOTA(state-of-the-art)表现。

BERT 的提出是 NLP 领域的里程碑,为后续的 RoBERTa、ALBERT、DistilBERT 等改进模型奠定了基础。

http://www.xdnf.cn/news/18636.html

相关文章:

  • 【RAGFlow代码详解-1】概述
  • 【Android】从一个AndroidRuntime看类的加载
  • 结构化智能编程:用树形向量存储重构AI代码理解范式
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2025年4月真题
  • More Effective C++ 条款05: 谨慎定义类型转换函数
  • 【Flex SerialPort】一个基于Qt6的支持自定义按键指令的串口工具
  • Kubernetes保姆级教学
  • centos搭建gitlab服务器
  • 【贪心算法】day2
  • 邮箱创建时间打标与自动删除功能设计思路
  • 13种常见机器学习算法面试总结(含问题与优质回答)
  • MySQL视图有什么用?一文读懂虚拟表的六大核心价值
  • String的最大长度剖析
  • 港口集装箱编号识别误识率↓79%!陌讯多模态融合算法落地优化
  • docker 镜像问题(解决了)
  • 第二重境:视角切换——用心灵的望远镜,看见问题的全局
  • 基于 Redis + JWT 的跨系统身份共享方案
  • Vue2+Vue3前端开发笔记合集
  • 【运维进阶】case、for、while、until语句大合集
  • VSCode+Qt+CMake详细地讲解
  • 嵌入式系统bringup通用流程
  • halcon(一)一维码解码
  • 目标检测数据集 第007期-基于yolo标注格式的茶叶病害检测数据集(含免费分享)
  • MATLAB 入门:从变量定义到基础绘图的完整上手指南
  • 05-ArkUI界面开发
  • 前端漏洞(上)- CSRF漏洞
  • C++ Core Guidelines: 最佳实践与深入解析
  • .net9 解析 jwt 详解
  • Go语言 Hello World 实例
  • RabbitMQ--消费端异常处理与 Spring Retry