带你从入门到精通——自然语言处理(十. BERT)

news2025/3/31 8:51:18

建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下:

带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-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的默认截断方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】DHCP工作原理

DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…

Linux网站搭建(新手必看)

1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址:宝塔面板 - 简单好用的Linu…

【C++初阶】---类和对象(上)

1.类的定义 1.1类的定义格式 • class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…

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功能,只能使用笨方法,就是给不同的块元素设置上不同的背景色,然后看一下间隙区域到底是哪个背景色填充的…

信息安全的数学本质与工程实践

信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…

Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程

文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师,还是刚接触图像处理的新手&#xff0c…

【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等 …

23种设计模式-状态(State)设计模式

状态设计模式 🚩什么是状态设计模式?🚩状态设计模式的特点🚩状态设计模式的结构🚩状态设计模式的优缺点🚩状态设计模式的Java实现🚩代码总结🚩总结 🚩什么是状态设计模式…

kaggle上经典泰坦尼克项目数据分析探索

之前了解在kaggle上这个项目很火,最近想要加强一下python数据分析,所以在kaggle上找到这个项目进行学习探索,下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…

15 python 数据容器-字典

在 Python 的编程世界里,字典是一种超实用的数据类型,它就像打工人的工作资料夹,能把各种不同类型的信息有条理地存起来,还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说,掌握字典的用法,能让你…

Linux的一些常见指令

一、ls指令 语法: ls (选项) 功能: ls可以查看当前目录下的所有文件和目录。 常用选项: -a:列出目录下的所有文件,包括以点(.)开头的隐含文件 。-d:将目录像文件一样显示,不显示其下的文件。…

jmm-java内存模型

java内存模型----底层原理 底层原理 从Java代码到最终执行的CPU指令的流程: 最开始,我们编写的Java代码,是*.java文件在编译(javac命令)后,从刚才的*.java文件会变出一个新的Java字节码文件(…

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录,使用合宙erp账号登录即可 点击右上角构建,点击右上角菜单新构建,自定义构建名称,可新建多个 勾选想要的组件 点击右上角保存修改,只有点击准备就绪(注意:一定…