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

Bert模型

一、定义

只用做 Transformer 架构的编码器(Encoder)堆叠多层,训练出一个懂文本语言的通用特征提取器

二、BERT 机制

1.双向注意力(Bidirectional Attention)

①定义

普通 RNN/LSTM 只能从左到右看一句,BERT 可以同时看一句话的左右两边

双向= 每个位置可以关注:左边所有词 + 右边所有词(一句话内)

也就是:上下文 full context,无任何未来遮挡。

例如:

句子:“我喜欢吃苹果,因为它很甜。”

BERT 看 “苹果” 时:

  • 左边:喜欢吃
  • 右边:很甜
  • 同时理解,真正双向注意力

②标准自注意力公式(也即双向注意力公式)

  • Q:查询(当前词)
  • K:键(所有词)
  • V:值(所有词)
  • 无 mask!

2.多头注意力(Multi-Head)

BERT 注意力是多头并行

  • 每一头都是完整双向注意力
  • 每头学习不同语义关系:主谓、指代、上下文关联…
  • 最后拼接输出

三、BERT 预训练任务

任务:

模型的任务 = 看【最后一层输出 + 损失函数】怎么定义,同一个模型结构,只要改最后输出层和损失,任务完全变掉。

1.Bert模型

Bert 模型主体完全不动,只改最后一层:

① 输出:每个 token 预测原词 + 交叉熵损失

MLM 任务(掩码语言模型)

② 输出:CLS 向量二分类(IsNext/NotNext)+ 交叉熵

NSP 任务(下一句预测)

③ 输出:CLS 向量二分类(积极 / 消极)

情感分析任务

④ 输出:每个 token 分类(B/I/O)

NER 命名实体识别

⑤ 输出:每个 token 做分类(起止位置)

阅读理解问答任务

2. 再看 GPT

GPT 结构(Decoder)本身也不是生成模型只是因为它最后输出 “下一个词概率”+ 自回归损失才变成生成模型

1. MLM(Masked Language Model)掩码语言模型

随机遮住 15% 的词,让模型去猜。

例子:“我喜欢吃 [MASK],因为它很甜。”模型要猜:是苹果?香蕉?还是橘子?

目的:让模型学会双向上下文推理。

2. NSP(Next Sentence Prediction)下句预测

给模型两句话,判断是不是同一段文章的连续两句,输出:是 / 不是(二分类)。

目的:让模型学会段落级别的逻辑关系。

四、BERT 的输入

  1. Token Embedding词向量
  2. Segment Embedding句子编号向量(A 或 B)
  3. Positional Encoding位置向量

BERT 的输入向量,是由三种 Embedding 直接相加得到的:

[CLS] 和 [SEP] 作用?

[CLS]分类专用 token.

最后一层 [CLS] 代表整个句子的语义向量

[SEP]句子分隔符 + 注意力边界

句间隔离,不让两句词互相看见

五、Bert预训练流程

以下列图片为例

1.分词

将 “商将务大床房”拆成单个汉字"商 务 大 床 房"。这是 BERT 的中文分词方式:按单个字 / 词切分(也可以是词粒度,但中文 BERT 通常用字粒度)。

注意:

  • 实际 BERT 分词器还会加上特殊符号商 务 大 床 房商 务 大 床 房
  • 最终序列是:[CLS] 商 务 大 床 房 [SEP]

2.生成标准输入向量

1.input_ids:词表索引

(101, 2112, 555, 2315, 13145, 32141, 102)
  • 每个数字代表该 token 在词表中的索引
  • 101[CLS]的 ID,102[SEP]的 ID
  • 后续模型会通过这些 ID,在嵌入层查表得到词向量

2.mask:注意力掩码

(1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,......)
  • 1代表真实 token,模型需要处理
  • 0代表 padding(填充的无效 token),模型会忽略
  • 作用:让所有输入序列长度一致,不影响注意力计算

3.seq_ids(segment_ids):句子标记

(0,0,0,0,0,0,0,0 ........................)
  • 标记每个 token 属于哪个句子(0代表第一句,1代表第二句)
  • 这张图是单句输入,所以全是0
  • 如果是句子对任务(如问答),第一句标0,第二句标1

3.Embedding 嵌入

根据标准输入向量得到3种Embedding:

Token Embedding(词嵌入)———— input_ids

Segment Embedding(句子嵌入)———— seq_ids

Position Embedding(位置嵌入)————pos_ids

BERT 把这三种向量直接相加,得到每个 token 的最终输入向量:

嵌入的实际操作:

input_ids,seq_ids,pos_ids 各自通过一次全连接,输出维度为768的向量

4.多头自注意力(Multi-Head Attention)

1.输入向量 Embeedding 经过3个分别的全连接线性变换,得到Query(Q)、Key(K)、Value(V)

2.计算多头注意力:

  • 把 Q/K/V 分成多个头
  • 每个头独立计算注意力,再拼接起来

3.输出的向量维度和输入保持一致,还是768

5.Add & Norm(残差连接与层归一化,第1次)

1.Add(残差连接):把「多头注意力的输出」和「原始输入向量」直接相加

2.Norm(层归一化):对相加后的结果做层归一化,稳定分布

结果:输出的向量维度和输入保持一致,还是768,作为下一层(前馈网络)的输入

6.前馈神经网络(Feed Forward)

这是一个两层的全连接网络 Linear,BERT 里的标准结构是:

  1. 第一层:Linear(768 → 3072),然后加激活函数(GELU)
  2. 第二层:Linear(3072 → 768),恢复维度

作用:对每个位置的向量做非线性变换提取更复杂的语义特征

7.Add & Norm(残差连接与层归一化,第2次)

  1. Add:把「前馈网络的输出」和「前馈网络的输入」直接相加
  2. Norm:对相加后的结果做层归一化,稳定分布
  3. 输出的向量维度和输入保持一致,还是768,传给 BERT 的下一层(或者传给Pooler output层)

8.Pooler output

1.取最后一层[CLS]token 的 hidden state

也就是从 BERT 输出的最终向量里,只拿出每句话的第 0 个位置 = [CLS]。即每句话开头的[CLS] 768维向量【以BERT-base 的 768 为例】

为什么要拿[CLS] 768 维向量

因为[CLS] 经过了全部 12 层双向注意力它融合了整句话所有词的信息所以可以当作句子的总代表向量

2.拿到 [CLS] 768 维向量后通过一个全连接层(Linear)+ Tanh 激活

公式:pooler_output=tanh(W⋅CLS_hidden+b)

  • 输入维度:hidden_size(BERT-base 是 768)
  • 输出维度:和输入一样,也是 768
  • 作用:[CLS]的向量,映射成一个 “句子级的向量表示”

9.输出给解码器

http://www.jsqmd.com/news/588296/

相关文章:

  • 【Git】TortoiseGit无法push远程仓库
  • Vibe Coding 有哪些实用技巧?这篇文章讲透工作流、提示词和避坑方法
  • 从语言到神经网络:人类表达的三次革命与AI的终极赋能
  • C++ Move 构造函数的优化原理
  • 海康云台 ISPAI 二次开发
  • 梦行云软件全系列
  • 【演化计算与抽样方法】构造新算法流程:从 AlphaEvolve 看 LLM × EA 融合范式
  • JL杰理AC696N开发板PWM波形生成与控制(1):频率、占空比
  • C++ 与 事务多版本并发控制(MVCC):在 C++ 存储内核中利用时间戳排序实现无锁读写冲突控制
  • MT5专业交易面板
  • 基于stm32单片机的仔猪喂饲系统设计
  • Git从入门到精通:原理、实战与企业级协作全攻略
  • React生态学习路线
  • 图片调色思路分享
  • 告别手动刷新:用快马生成自动化工具,高效锁定jxx登录页最新域名
  • 高性能负载均衡
  • KART-RERANK在互联网广告场景的应用:广告创意与搜索词的相关性优化
  • 游标分页与服务器端游标的对比分析
  • 工具篇:诊断延迟的利器——SHOW SLAVE STATUS详解
  • 【skill-creator 】技术解析:Claude Code 元技能系统的设计原理与核心特点
  • 如何让老旧苹果电脑重获新生:OpenCore Legacy Patcher完全指南
  • 新手福音:在快马平台用代码复刻ps基础功能,轻松入门图像处理
  • 我的编程之旅——第一篇博客
  • [JAVA探索之路]带你手写多线程实现生产者-消费者模型
  • C++的std--ranges算法并行执行数据竞争检测
  • 第06章langchain之向量化和向量数据库
  • 实战指南:基于快马AI构建企业级域名监控与故障切换管理平台
  • 找到一种方法:用LM Studio 和 llmster 可以把qwen3.5改成nothinking版本装载来提高响应速度
  • 别再找了,这应该是目前最好用的翻译插件了。
  • TongWeb8.0支持JBoss Weld‌