带你从入门到精通——自然语言处理(十. 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甚至可能对某些任务产生负面影响,许多改进的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博客 带你从入门到精通——自然语言处理(二…...
八股JAVA并发
多线程 线程的创建方式有哪些? 1.继承Thread类 2.实现Runnable接口 3.Callable接口FutureTask 4.线程池 1.继承Thread类 这是最直接的一种方式,用户自定义类继承java.lang.Thread类,重写其run()方法,run()方法中定义了线程执行的具体任务。…...
#include <hello.h> 与 #include “hello.h“的区别
#include <hello.h> 和 #include "hello.h" 在C/C中用于包含头文件,但它们在搜索头文件时的行为有所不同,这可能导致前者找不到头文件的情况。 ### 区别 1. **搜索路径不同** - #include "hello.h":编译器首先…...
PyPDF2简单介绍
PyPDF2 是一个开源的纯 Python 库,用于读取、操作和创建 PDF 文件。它最初是 PyPDF 的改进版,功能更丰富。 安装: bash pip install PyPDF2核心功能 1.合并 PDF 文件 python from PyPDF2 import PdfMergermerger PdfMerger() merger.appe…...
记录flutter编译项目遇到的问题
目录 1.更换flutter版本 2.解压到指定地址 3.在Android Studio配置 问题: Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source! Resolving dependencies... The current Dart SDK version is 3.3.0. Because coach d…...
小米AX6000上安装tailscale
在之前的文章中,已经介绍了如何解锁ax6000的ssh,以及必坑指南。 今天突发奇想,为了不让我的nas天天开着tailscale,所以我想让我的tailscale运行在路由器,这样完美实现穿透。 首先,通过ssh登录ax6000&#x…...
git使用经验(一)
git使用经验(一) 我之前已经下载了别人的代码,我想在此基础上进行修改,并移动到自己的私有仓库,方便上传到自己的私有仓库自己进行版本控制 git clone下来别人的代码,删除有关git的隐藏文件 进入到自己的…...
C语言【文件操作】详解中
引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前,希望您先仔细看一下这篇博文,理解一下文件指针和流的概念:C语言【文件操作】详解上-CSDN博客文章浏览阅读606次,点赞26次,收藏4次。先整体认识一下文件是…...
基于SpringBoot的在线学习平台
项目介绍 平台采用B/S结构,后端采用主流的SpringBoot语言进行开发,前端采用主流的Vue.js进行开发。是一个综合的在线学习平台,该平台有管理员、教师、学生三类角色,各项功能根据不同角色分别设定。 整个平台包括前台和后台两个部分…...
鸿蒙生态开发
鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙(OpenHarmony)构建的分布式操作系统生态,旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务,覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…...
qt实现一个简单http服务器和客户端
一、功能简介 服务器: 登录功能、下载文件功能 客户端: 登录功能、下载文件功能、上传成绩功能 二、服务器代码 //HttpServer.h #ifndef HTTPSERVER_H #define HTTPSERVER_H#include <QMainWindow> #include <QTcpSocket> #include <QTc…...
深入理解Linux网络随笔(五):深度理解本机网络I/O
深入理解Linux网络随笔(五):深度理解本机网络I/O 文章目录 深入理解Linux网络随笔(五):深度理解本机网络I/O本机发送过程本机接收过程总结 分析本机网络I/O部分源码需要知道本机I/O是什么?扮演什…...
Debian12生产环境配置笔记
在 Debian 12 上进行生产环境配置的详细步骤,涵盖软件更新、基础软件安装、Docker 及 Redis 部署,以及 Nginx 配置多个虚拟主机等内容。所有命令均以 root 用户身份执行,无需添加 sudo 1. 更新软件 首先,确保系统上的所有软件包…...
工业物联网的范式革命:从“云边“ 到“边边” 协的技术跃迁
基于DIOS操作系统的去中心化重构 一、云边协同模式的局限性:技术瓶颈与成本困局 当前工业物联网主流的云边协同架构(Cloud-Edge Collaboration)已暴露出显著短板,其核心问题源于对中心云的过度依赖: 带宽资源挤占与…...
python学习笔记--实现简单的爬虫(二)
任务:爬取B站上最爱欢迎的编程课程 网址:编程-哔哩哔哩_bilibili 打开网页的代码模块,如下图: 标题均位于class_"bili-video-card__info--tit"的h3标签中,下面通过代码来实现,需要说明的是URL中…...
【蓝桥杯速成】| 8.回溯算法
因为在进行背包问题的练习时,发现很多题目需要回溯,但本人作为小白当然是啥也不知道 那么就先来补充一下回溯算法的知识点,再进行练习 理论基础 回溯算法本质上是一种递归函数,是纯暴力搜索方法, 适合组合问题、排列…...
聚水潭商品信息集成MySQL的高效解决方案
聚水潭商品信息集成到MySQL的技术案例分享 在数据驱动的业务环境中,如何高效、准确地将聚水潭系统中的商品信息集成到MySQL数据库,是许多企业面临的重要挑战。本文将详细介绍一个实际运行的方案——“聚水潭-商品信息查询-->BI崛起-商品信息表_copy”…...
【数学建模】多目标规划模型:原理、方法与应用
多目标规划模型:原理、方法与应用 文章目录 多目标规划模型:原理、方法与应用引言1. 多目标规划的基本概念1.1 数学模型1.2 Pareto最优解/有效解1.3 满意解方法 2. 多目标规划的主要求解方法2.1 加权求和法2.2 ε-约束法2.3 理想点法2.4 优先级法&#x…...
基于Spring Boot的党员学习交流平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Flink CDC 与 SeaTunnel CDC 简单对比
Flink CDC 与 SeaTunnel CDC 简单对比 CDC 技术概述 变更数据捕获(Change Data Capture,简称 CDC)是一种用于捕获数据库中数据变更的技术,能够实时识别、捕获并输出数据库中的插入、更新和删除操作。CDC 技术在现代数据架构中扮…...
ARM 汇编基础
ARM 汇编是嵌入式开发、操作系统底层编程和性能优化的核心技能之一。以下是一份系统的 ARM 汇编指令教学指南,涵盖基础语法、核心指令、编程模式和实用示例。 1. ARM 汇编基础 1.1 寄存器 ARM 架构(32位)包含 16 个通用寄存器&…...
【嵌入式狂刷100题】- 1基础知识部分
准备新开专栏【嵌入式狂刷100题】😶🌫️😶🌫️🤧加油!!!,内容包括 基础知识部分操作系统部分处理器架构部分外设驱动部分通信协议部分存储器管理部分硬件设计部分多媒体部分调试故障排除部分编码开发部…...
【模板】计算几何入门
来源 计算几何基本模板(二维) 目录 基本设置点 向量 Point(Vector)点积(数量积、内积)向量积,叉积两点间距离向量的模单位向量两向量的夹角判断点在直线的哪边逆转角 线 直线表达式Line判断…...
PostgreSQL 数据库中导入大量数据
在 PostgreSQL 数据库中导入大量数据,可根据数据来源和格式选择不同的方法。以下为你详细介绍几种常见的方式: 1. 使用 COPY 命令(适用于本地数据文件) COPY 命令是 PostgreSQL 内置的高效数据导入工具,适合处理本地的数据文件。 步骤 准备数据文件 确保你的数据文件格…...
DeepSeek和Kimi在Neo4j中的表现
以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…...
xQueueSendToBack的中文释义和裸机调用
如果不在 FreeRTOS 环境下运行,而是裸机环境中实现类似的功能,需要移除 xQueueSendToBack 的依赖,并直接调用 CAN 发送函数。以下是修改后的代码和实现思路: 1. FreeRTOS 中的 xQueueSendToBack 功能 作用:将消息发送…...
2025年- G24-Lc98-217.包含重复(使用hashSet解决)-java版
1.题目描述 2.思路 思路一: 我的想法是直接用集合来判断,如果集合的元素不能添加说明之前已经存在这个元素,也就是发现了重复元素,所以返回false。 补充一: Map、ArrayList的定义和声明 3.代码实现 class Soluti…...
【树莓派驱动验证步骤】
终端操作和输出: 清理项目 adaraspberrypi:~/mt3502 $ make clean make -C /lib/modules/6.6.51rpt-rpi-v8/build M/home/ada/mt3502 clean make[1]: 进入目录“/usr/src/linux-headers-6.6.51rpt-rpi-v8”CLEAN /home/ada/mt3502/Module.symvers make[1]: 离开…...
百度SEO和必应SEO优化方法
如需SEO服务,可以搜索:深圳市信科网络科技有限公司。 一、搜索引擎生态格局:流量入口的重新洗牌 2025 年,中国 PC 端搜索引擎市场正经历戏剧性变革。StatCounter 数据显示,必应凭借 Edge 浏览器的预装优势与 ChatGPT …...
2025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构
025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构 一、行业动态:巨头布局与技术升级 谷歌推出“AI模式”,重新定义搜索体验 谷歌上线全新“AI模式”,集成多模态交互与实时数据能力,用户可通过文本、图片或语音…...
封闭图形个数
0封闭图形个数 - 蓝桥云课 小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你n个数a1, a2, ..., an,请你按照蓝桥王国的数字大小规则,将这n数从小到大排序,并输出排序后结果。 输入格式 第一行包含一个整数n࿰…...
VSCode 抽风之 两个conda环境同时在被激活
出现了神奇的(toolsZCH)(base) 提示符,如下图所示: 原因大概是:conda 环境的双重激活:可能是 conda 环境没有被正确清理或初始化,导致 base 和 toolsZCH 同时被激活。 解决办法就是 :conda deactivate 两次…...
Django 生产环境静态文件处理
python manage.py collectstatic 是 Django 提供的一个非常重要的管理命令,用于将项目中的静态文件收集到一个指定的目录中。这在部署 Django 项目时尤其重要,因为静态文件需要被 Web 服务器(如 Nginx 或 Apache)提供服务…...
语法: result=frexp(value, exp);
FREXP()是C语言里的内部函数,根据需要了解。 语法: resultfrexp(value, &exp); 参数: value是一个浮点数; exp是一个有符号的整型数; 返回值: 返回值result是一个浮点数,其有效范围是 0.5(含)到 1.0(不含&…...
ArcGIS Pro 制作风台路径图:从数据到可视化
一、引言 台风,作为自然界极具破坏力的气象现象之一,其路径的精准预测与直观呈现对于防灾减灾工作至关重要。 在数字化时代,借助专业的地理信息系统(GIS)软件,如 ArcGIS Pro,我们能够高效地将…...
#pandas #python#数据标注 pd.crosstab()
题目: device_status.txt 存储了工业互联网平台上收集的设备运行状态数据,数 据中有以下内容: device_id:设备编号,字符串类型,长度为 8 status_time:状态时间,日期时间类型&…...
self Attention为何除以根号dk?(全新角度)
全网最独特解析:self Attention为何除根号dk? 一、假设条件:查询向量和键向量服从正态分布 假设查询向量 q i q_i qi和键向量 k j k_j kj的每个分量均为独立同分布的随机变量,且服从标准正态分布,即:…...
SpringBoot @Scheduled注解详解
Scheduled 是 Spring Framework 中用于实现定时任务的核心注解,能够方便地配置方法在特定时间或周期执行。以下是详细解析: 1. 启用定时任务 在 Spring Boot 中,需在配置类添加 EnableScheduling 注解以启用定时任务支持: Co…...
在大数据开发中spark是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济蓬勃发展的今天,数据已成为驱动商业决策、科学研究和城市治理的核心燃料。面对…...
从点灯开始的51单片机生活
陵谷纷纭新事改,筑台土石未应迟。 目录 sfr与sbit?不靠定时器的delay_ms延时函数所谓寄存器 sfr与sbit? 这第一课咱们主要来先理解一下sfr与sbit,以下可能是咱们这些新手朋友常见的点灯代码: #include<regx52.h&g…...
AI大模型落地:昆仑技术的东方解法
DeepSeek的横空出世,一举打破“算力封锁”的神话,标志着中国AI企业在AI大模型技术路径上取得彻底突破。 不过,DeepSeek等AI大模型的突破,固然大幅推动AI产业的整体发展,但算力基础设施能否跟上,也将决定未…...
Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问
引言 本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程,并结合在本地搭建的 KWDB 数据库(版本为:2.0.3)来演示 Spring Boot 与 MyBatis Plus 的集成,以及对 KWDB 数据库的数据操作…...
VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于STM32的标准库/HAL库)
前言:什么是CMake? Answer:简而言之,CMake是Make的maker。 一、CMake的安装 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 …...
MarsCode AI实战:利用DeepSeek 快速搭建你的口语学习搭子
资料来源:火山引擎-开发者社区 成品抢先看! 自从MarsCode AI Chat模型全新升级,接入 Deepseek-R1、Deepseek-V3和豆包大模型1.5 三大模型,越来越多朋友注意到了AI编程能给我们带来的无限可能,也开始跃跃欲试想要尝试从…...
导出的使用
一.导出的具体使用步骤 1.在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制…...
【OCR】总结github上开源 OCR 工具:让文字识别更简单
前言 在数字化的时代,光学字符识别(OCR)技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据,极大地提高了信息处理的效率。今天,我要给大家介绍一些优秀的开源…...
struts1+struts2项目兼容升级到了spring boot 2.7
原项目比较复杂,集成了各种框架(struts1 struts2 spring3等),趁工作之余练练手,学习一下springboot。大概花了一周时间才调通。 一、调整jar版本,寻找合适的版本。 第一步、首先原项目JDK6,要…...
Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例
Odoo 18 中的 视图应用实例 在 Odoo 中,视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能,业务对象都至关重要。这些对象通过不同类型的视图向用户展示,而 Odoo 会根据 XML 描述动态生成这些视图。 列…...
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
PDF文件转Markdown,基于开源项目marker
首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。跟其他的阿猫阿狗工具没法比。 看下官网 https://github.com/VikParuchuri/marker 一看头像是个印度佬,自吹——又快又好。…...