带你从入门到精通——自然语言处理(十. BERT)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下:
带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客
带你从入门到精通——自然语言处理(二. 文本数据分析、特征处理和数据增强)-CSDN博客
带你从入门到精通——自然语言处理(三. RNN的分类和LSTM)-CSDN博客
带你从入门到精通——自然语言处理(四. GRU和seq2seq模型)-CSDN博客
带你从入门到精通——自然语言处理(五. 自注意力机制和transformer的输入部分)-CSDN博客
带你从入门到精通——自然语言处理(六. Transformer的编码器部分)-CSDN博客
带你从入门到精通——自然语言处理(七. Transformer的解码器部分、输出部分和整体搭建)-CSDN博客
带你从入门到精通——自然语言处理(八. FastText)-CSDN博客
带你从入门到精通——自然语言处理(九. 迁移学习和transformers库)-CSDN博客
目录
十. BERT
10.1 BERT概述
10.2 Embedding模块
10.2.1 Wordpiece分词
10.2.2 Segment embeddings
10.2.3 Position embeddings
10.3 Transformer模块
10.4 微调模块
10.5 BERT的预训练任务
10.5.1 MLM任务
10.5.2 NSP任务
10.5.3 长文本的处理
十. BERT
10.1 BERT概述
BERT(Bidirectional Encoder Representations from Transformers)是Google于2018年提出的一种基于transformer的预训练模型
BERT的总体架构如下图所示:

从上述的架构图中可以看到,BERT分三个主要模块:最底层黄色标记的embedding模块、中间层蓝色标记的transformer模块以及最上层绿色标记的微调模块。
10.2 Embedding模块
10.2.1 Wordpiece分词
在BERT中使用wordpiece进行分词,wordpiece分词是子词级别(例如:worked会被拆分为work、##ed)的分词算法,具体步骤如下:
1. 将训练文本进行字符级别的分词,并为每个单词的所有非首字符添加##前缀,作为初始词表,例如单词"word",拆分为:w ##o ##r ##d。
2. 计算合并分数,也称作互信息,具体公式如下:

其中分子为子词A、B在训练文本中共同出现并相邻的总次数,分母为子词A、B在训练文本中单独出现的总次数的乘积。
3. 合并合并分数最高的子词对,并将其作为一个新的子词加入词表,注意:w与##o会合并为wo,而##o和##r会合并为##or。
4. 重复步骤2、3直到到达预定的词表大小或合并次数。
5. 使用最终得到的词汇表对文本进行分词,使用贪婪最长匹配原则,即从词首开始,优先匹配词表中存在的最长子词。
使用wordpiece完成分词后在训练文本开头添加添加[CLS]标记,训练文本中不同的句子结尾添加[SEP]标记,并通过可学习的词嵌入矩阵将训练文本映射为token embeddings(长度为hidden_size)。
10.2.2 Segment embeddings
Segment embeddings为分段嵌入张量,是一个可学习的嵌入张量,用于区分同一文本中的不同句子,通常使用全0和全1交替编码不同的句子,并且0和1分别对应了不同的长度为hidden_size的嵌入向量,因此BERT中的segment embeddings可以用一个2 * hidden_size的嵌入矩阵来表示,注意:[CLS]标记属于第一个句子,[SEP]标记属于位于它之前的第一个句子。
10.2.3 Position embeddings
BERT中的position embeddings也是一个可学习的嵌入张量,属于绝对位置编码,BERT能处理的最长序列长度为512,因此BERT中的position embeddings可以用一个512 * hidden_size的嵌入矩阵来表示。
BERT的整个embedding模块的输出张量就是这token embeddings、segment embeddings以及position embeddings的逐元素相加结果。
10.3 Transformer模块
BERT只使用了transformer架构中的encoder部分,而完全舍弃了decoder部分,因此BERT的transformer模块架构与transformer的encoder架构完全一致,只是参数略有不同,BERT - base版本的模型参数为12层encoder layer,12个注意力头,hidden_size为768,总参数量为110M。
10.4 微调模块
经过中间层transformer模块的处理后,会得到一个shape为[batch_size,seq_len,hidden_size]的文本表示张量,对于不同的下游任务可以使用不同的微调策略进行调整,在transformers库中BERT模型最终的输出分为两个部分,一个为last_hidden_state,即为前文提到的文本表示张量,另一个为pooler_output,为last_hidden_state中[CLS]标记的隐藏状态再经过一个输出神经元个数为hidden_size的全连接层后得到的输出张量,形状为[batch_size,hidden_size]。
BERT的几种常见的微调任务如下:
句子对分类任务:输入为:[CLS] + 句子1 + [SEP] + 句子2 + [SEP];输出为:取pooler_output再经过一个输出神经元个数为分类数的全连接层,输出分类结果(通常是判断两个句子是否相似)。
句子分类任务:输入为:[CLS] + 句子 + [SEP];输出为:取pooler_output再经过一个输出神经元个数为分类数的全连接层,输出分类结果。
问答(QA)任务:输入为:[CLS] + 问题 + [SEP] + 上下文 + [SEP];输出为:start_logits以及end_logits,表示模型预测的答案在上下文中的起始和结束位置,两个输出的shape都为[batch_size,上下文的seq_len]。
命名实体识别(NER)任务:输入为:[CLS] + 句子 + [SEP];输出为:last_hidden_state再经过一个全连接层,输出命名实体的标签(如人名、地名)
10.5 BERT的预训练任务
10.5.1 MLM任务
MLM(Masked Language Model)任务会在原始训练文本中随机抽取15%的token作为参与MLM任务的对象,在这些被选中的token中,以80%的概率用[MASK]标记替换该token,以10%的概率用一个随机的单词替换该token,以10%的概率保持该token不变,而模型需要基于上下文预测被遮盖的token。
10.5.2 NSP任务
NSP(Next Sentence Prediction)任务中输入为一个句子对(A,B),模型需要预测句子B是不是句子A的下一句话,所有原始训练文本的语句都被选中作为句子A,而句子B以50%的概率选取为句子A的下一句话,以50%的概率选取为原始文本中(句子A的下一句话除外)随机抽取的一句话。
但是后续研究对NSP任务的有效性表示存疑,认为NSP甚至可能对某些任务产生负面影响,这是因为NSP任务中负样本中的句子B来自原始文本中随机抽取的一句话,这使得模型能够直接通过主题差异(主题差异的判断较为简单)而非句间的逻辑连贯性(句间的逻辑连贯性的判断较为复杂)来判断正负样本,导致NSP任务并未真正学习到句间的逻辑关系,所以许多改进的BERT版本已经移除了NSP任务。
10.5.3 长文本的处理
BERT能接收的最长序列长度为512,对于超长文本BERT的常用截断策略如下:
1. head-only:只保留长文本的前512个token。
2. tail-only:只保留长文本的后512个token。
3. head-tail:保留长文本前后的256个token,这也是BERT的默认截断方式。
相关文章:
带你从入门到精通——自然语言处理(十. BERT)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下: 带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客 带你从入门到精通——自然语言处理(二…...
vue3 数据监听(watch、watchEffect)
1、watch 1.1基本使用 作用:数据监听 语法: watch(监听的数据, (改变后的数据, 改变前的数据) > { console.log(newVal, oldVal); }) 注意点:watch写法上支持一个或者多个监听源,这些监听源必须只能是getter/effect函数…...
Vue 3中的Teleport:超越组件边界的渲染
Vue 3引入了许多新特性,其中之一便是Teleport。它为开发者提供了一种强有力的方式来控制组件的渲染位置,使得我们可以将组件的内容“传送”到DOM树的任何地方,而不仅仅局限于其父级组件的边界内。这在创建模态框、通知系统或任何需要脱离当前…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
Linux网站搭建(新手必看)
1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址:宝塔面板 - 简单好用的Linu…...
JVM - 年轻代和老年代
通过一些问题来讨论 JVM 中年轻代和老年代的内容 为什么要区分年轻代和老年代?哪些对像会进入老年代?什么时候会进行年轻代GC?什么时候会进行老年代GC? 1. 为什么要区分年轻代和老年代? 年轻代中的对象大部分都是短期…...
【C++初阶】---类和对象(上)
1.类的定义 1.1类的定义格式 • class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…...
【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】
数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析 在分布式系统和应用开发中,事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析,包括原理、特点、适用场景和对比…...
2-1 基本放大电路
放大的概念 mV →V mA→A 特征:放大功率(电压与电流)。 本质:能量在控制下的转换。(外接供电电源) 必要条件:有源元件(能量控制原件) 前提:不失真 测试的…...
什么是矩阵账号
矩阵账号是指在同一平台或多个平台上,围绕同一品牌或个人,创建的多个相互关联、协同工作的账号组合。这些账号虽然独立,但在内容定位和运营策略上有所区分,同时又相互引流,共同形成一个网络结构,类似于矩阵…...
【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8
目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…...
xcode开发swiftui项目的时候,怎么调试ui占位和ui大小
有时候元素之间可能存在很大的空间间隔,但是又不知道怎么产生的,无奈我又看不懂xcode里面的Debug View Hierarchy功能,只能使用笨方法,就是给不同的块元素设置上不同的背景色,然后看一下间隙区域到底是哪个背景色填充的…...
测试用例的优先级划分规则
测试用例的优先级划分是根据 业务重要性、风险程度、测试资源 等因素,确定测试执行的顺序,以最大化测试效率和风险控制。以下是常见的优先级划分规则和操作方法: 一、优先级划分的核心原则 风险驱动 高风险功能(如核心支付流程&a…...
信息安全的数学本质与工程实践
信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
k8s kubernetes dashboard一直CarshLoopBackoff
使用 kubectl get pods -A -o wide 发现pod一直CarshLoopBackoff 通过 kubectl describe pod kubernetes-dashboard-7c4f8ff86d-7k7bd -n kubernetes-dashboard 获取详细信息 发现一直报错 Warning Unhealthy 10m (x31 over 34m) kubelet Liveness probe fail…...
[C++面试] 你了解视图吗?
一、入门 1、什么是 C 视图(View)?请简要说明其概念和用途 它提供了对序列(如数组、容器等)的非拥有性、只读或可写的访问。(就像是个透明的放大镜,它能让你去看一组数据,但它自己…...
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…...
ollama迁移已下载的单个模型到服务器
ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的…...
Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程
文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师,还是刚接触图像处理的新手,…...
【Python · PyTorch】时域卷积网络 TCN
1. 概念 1.1 定义 TCN 是时域卷积网络(Temporal Convolutional Network)的简称。TCN是于2018年 Shaojie Bai 等人提出的一个处理时序数据的卷积模型。 TCN结合了CNN卷积并行性计算和RNN长期依赖的优势,CNN可在多个通道同时处理卷积核运算&…...
Mysql update更新数据执行流程
update 的执行流程是以select查询为基础执行的!!你不明白select执行流程?没关系,这篇博客照样让你明白,update执行流程! 存储引擎是什么? 如果把数据库比作一个大仓库,那么存储引擎…...
WMS WCS系统架构
1.1立体仓库现场网络架构图 1.2立体仓库WMS系统与WCS系统架构 1.3系统技术选型 WEB端技术:node.js、vue 、element、jquery、html、js、css等 API端技术:spring boot 、msyql、redis、mybatis等 WCS技术:c#、winform、OPC、socket、S7等 …...
数据结构5(初):续写排序
目录 1、外排序 2、计数排序 1、外排序 上一节中提到的排序都可以用来进行内排序,但是只有归并排序的思想可以用来进行外部排序,因为文件数据是没办法像数组那样进行访问的。 例如: #include <stdio.h> #include <assert.h> …...
ROS多机通信(三)——Ubuntu Ad-Hoc 组网通信配置指南
基本概念 Ad-Hoc 网络是一种简单的点对点无线网络,设备(称为节点)可以直接相互通信或者通过中继间接通信,而无需依赖中央接入点。在这种网络中,所有设备是对等的,没有固定的路由器或基础设施支持。 特点 …...
23种设计模式-状态(State)设计模式
状态设计模式 🚩什么是状态设计模式?🚩状态设计模式的特点🚩状态设计模式的结构🚩状态设计模式的优缺点🚩状态设计模式的Java实现🚩代码总结🚩总结 🚩什么是状态设计模式…...
ARM架构薄记2——ARM学习架构抓手(以ARMv7为例子)
ARM架构薄记2——ARM学习架构抓手(以ARMv7为例子) 架构学习需要学习哪一些部分呢?笔者接触过的架构有Intel-X86, AMD64,RISC-V和Arm架构(V7最多),笔者简单的翻了一些课本和教材,…...
STM32C011 进入停止模式和待机模式
对于STM32C011J4M3微控制器,你可以使用HAL库来实现进入停止模式(Stop Mode)和待机模式(Standby Mode)。下面是进入停止模式和待机模式的示例代码: 进入停止模式代码示例: #include "stm3…...
kaggle上经典泰坦尼克项目数据分析探索
之前了解在kaggle上这个项目很火,最近想要加强一下python数据分析,所以在kaggle上找到这个项目进行学习探索,下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…...
影刀魔法指令3.0:开启自动化新篇章
在数字化飞速发展的今天,自动化工具已经成为提升工作效率、优化工作流程的重要手段。影刀RPA作为一款强大的自动化软件,其最近推出的魔法指令3.0版本,更是让人大开眼界,为自动化操作带来了全新的可能性。 影刀魔法指令3.0简介 影…...
