NLP深入学习:结合源码详解 BERT 模型(一)

文章目录

  • 1. 前言
  • 2. BERT 关键流程
    • 2.1 整体流程
    • 2.2 Pre-training(预训练)
      • 2.2.1 Masked Language Model (MLM)
      • 2.2.2 Next Sentence Prediction (NSP)
    • 2.3 Fine-tuning(微调)
  • 3. 总结
  • 4. 参考


1. 前言

BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的自然语言处理(NLP)模型,由 Google 于2018年提出论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。BERT 采用 Transformer 架构,具体来说,是通过多层的 Transformer 编码器来实现。与以前的 NLP 模型不同,BERT 的关键创新在于使用双向(bidirectional)上下文来预训练模型,使其能够更好地理解和捕捉句子中的语境信息。
在这里插入图片描述
模型架构的差异对比。BERT 使用了一个双向 Transformer。OpenAI GPT使用一个从左到右的 Transformer。ELMo 使用从左到右、从右到左的 LSTMs, 用于为下游任务生成特性。在这三种方法中,只有 BERT 表示在所有层中都共同基于左右+上下文。

BERT 的出现极大地推动了自然语言处理领域的发展,成为了许多 NLP 任务中的基准模型。它的成功也激发了更多基于 Transformer 架构的模型的研发,如 GPT(Generative Pre-trained Transformer)等。

本文主要介绍 BERT 的关键流程。

2. BERT 关键流程

BERT采用了 Transformer,这是一种基于自注意力机制(Self-Attention Mechanism)的架构。Transformer允许模型在处理输入序列时同时考虑到所有位置的上下文信息。关于 Transformer 详细讲解可以阅读:
《NLP深入学习:大模型背后的Transformer模型究竟是什么?(一)》
《NLP深入学习:大模型背后的Transformer模型究竟是什么?(二)》

2.1 整体流程

在这里插入图片描述
BERT 的整体流程 Pre-training 和 Fine-tuning。除了输出层之外,在 Pre-training 和 Fine-tuning 中都使用了相同的架构。

注意图中的输入 Input,
在这里插入图片描述
I n p u t = T o k e n E m b e d d i n g s + S e g m e n t E m b e d d i n g s + P o s i t i o n E m b e d d i n g s Input = TokenEmbeddings + SegmentEmbeddings + PositionEmbeddings Input=TokenEmbeddings+SegmentEmbeddings+PositionEmbeddings
其中:

  • TokenEmbeddings 是单词的字嵌入表示
  • SegmentEmbeddings 是两个句子的区分标识,例如 “[CLS] My name is xx [SEP] How are you [SEP]” 那么对应的 SegmentEmbeddings 就是 0000001111,粗体0后1表示对应的单词
  • PositionEmbeddings 是单词所在句子的位置

2.2 Pre-training(预训练)

在预训练阶段,BERT 是通过两个主要任务来学习词汇表示和上下文信息:Masked Language Model(MLM)和 Next Sentence Prediction(NSP)。

2.2.1 Masked Language Model (MLM)

在 MLM 任务中,BERT 通过随机遮蔽输入文本中的一些 token,然后让模型预测这些被遮蔽的 token。这个任务使得模型能够双向(从左到右和从右到左)观察上下文信息,从而更好地捕捉到 token 之间的关系。具体的步骤如下:

  • 输入处理: 对于输入文本中的每个句子,随机选择15%的 token 进行遮蔽。然后,80%的被遮蔽的 token 被替换成一个特殊的 [MASK] 标记,10%的 token 被替换成其他随机的 token,而剩下的10%则保持原样。这样处理后,输入文本就变成了包含 [MASK] 标记的被遮蔽文本。例如:
    在这里插入图片描述

  • MLM目标: 模型的目标是根据上下文预测被遮蔽的 token。在训练期间,模型通过比较模型输出和实际被遮蔽的 token 来计算损失,通过反向传播和优化算法来更新模型参数。

2.2.2 Next Sentence Prediction (NSP)

NSP 任务旨在让 BERT 模型理解句子之间的语义关系,以便在后续微调阶段对更复杂的语言任务有更好的泛化能力。

  • 输入处理: 对于输入的一对句子,有50%的概率是真实的句子对(IsNext),另外50%是随机抽取的不相关的句子(NotNext)。然后,这一对句子被输入 BERT 模型。例如:
    在这里插入图片描述
  • NSP 目标: 模型的目标是预测这一对句子是否在语义上是相邻的(IsNext)还是不相关的(NotNext)。在训练期间,通过比较模型输出和实际标签来计算损失。

通过这 MLM 以及 NSP 两个任务的预训练,BERT 模型能够学到通用的语言表示,同时捕捉双向上下文信息,使得模型在微调到特定任务时具有更强的泛化能力。这种预训练方法帮助 BERT 成为在各种自然语言处理任务上取得优异表现的基础模型。

2.3 Fine-tuning(微调)

预训练完成后,BERT 模型可以通过微调用于特定的下游任务,如文本分类、命名实体识别等。在微调过程中,可以保持部分预训练的参数不变,也可以调整一些参数以适应特定任务。以下是BERT微调的一般过程:

  1. 准备数据:
    收集与目标任务相关的标注数据。这些数据需要包括输入文本和相应的标签,如情感分类标签、实体识别标签等。
  2. 数据处理:
    将任务相关数据进行适当的预处理,包括 tokenization、添加特殊标记(如[CLS]和[SEP])等,以使其符合 BERT 的输入格式。
  3. 模型输入:
    将微调数据输入 BERT 模型。通常,输入是一个句子或一对句子,具体取决于任务。对于分类任务,可能只需一个句子;而对于问答或文本匹配任务,则需要一对句子。
  4. Loss计算:
    根据任务类型选择适当的损失函数。对于分类任务,通常使用交叉熵损失;对于回归任务,可以使用均方误差等。Loss 计算的目标是使 BERT 模型的输出尽可能接近实际标签。
  5. 反向传播和优化:
    计算损失后,通过反向传播算法更新 BERT 模型的参数,以减小损失。通常采用梯度下降或其变种进行优化。
  6. 训练过程:
    在任务相关数据上进行多轮迭代的训练,确保模型能够充分学习任务特定的模式和特征。可以选择冻结一些层的参数,只微调部分参数,以减少训练时间和资源的需求。
  7. 性能评估:
    使用验证集评估模型的性能。可以根据任务需求选择不同的评价指标,如准确率、精确度、召回率、F1分数等。
  8. 调整和优化:
    根据性能评估的结果进行调整和优化,可能包括调整学习率、选择不同的模型配置,或进一步微调。
  9. 测试集评估:
    使用独立的测试集评估最终模型的性能。确保模型在未见过的数据上表现良好。

下图是论文里展示的 BERT 微调后适合的任务:
在这里插入图片描述

  • (a)表示成对句子的分类任务,输出采用 [CLS] 的输出,因为 [CLS] 已经包含上下文信息
  • (b)表示单个句子的分类任务,同样输出采用 [CLS] 的输出
  • (c)表示问答任务,输出采用问题的回答
  • (d)表示词标注任务,输出就是每个单词的标注结果

3. 总结

(1)什么是 BERT
BERT 是一种基于 Transformer 模型的深度双向语言表征模型。模型的输入是文本的token序列,输出是每个 token 的隐含表征。这些隐含表征包含了文本的上下文信息,可以用于各种自然语言处理任务。BERT 模型的发布推动了 NLP 领域的发展,并成为后续许多 NLP 模型的基础。例如,RoBERTa、DistilBERT、XLNet 等模型都是基 于BERT 模型改进的。

(2)预训练
BERT 模型的预训练采用了一种无监督学习方法。模型的输入是大量未标记文本,目标是预测下一个 token 的出现概率。通过这种预训练,模型可以学习到文本的上下文信息,并获得良好的语言表征能力。

(3)应用

  • 文本分类
  • 语义相似度
  • 机器阅读理解
  • 问答
  • 文本摘要
  • 机器翻译

(4)优缺点
优点:

  • 可以学习到文本的上下文信息
  • 具有良好的语言表征能力
  • 可以用于各种自然语言处理任务

缺点:

  • 模型参数量大,训练和推理成本高,训练慢
  • 对小数据集的性能不佳

4. 参考

《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

未完待续,后文将结合源码介绍 BERT 的训练过程!

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

欢迎关注知乎:SmallerFL

也欢迎关注我的wx公众号:一个比特定乾坤

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

访问一次网站的全过程

目录 流程图: 一、应用层开始 1. 在浏览器输入https://www.baidu.com 2. DNS获取IP地址 3. 根据HTTP协议生成HTTP请求报文 应用层结束 二、传输层开始 4. TCP三次握手 传输层结束 三、网络层开始 5. IP寻址 6. ARP协议获取MAC地址 网络层结束 四、数据…

Linux中三次握手,四次挥手状态图,端口复用 半关闭状态,心跳包

tcp三次握手和四次挥手状态图: 为什么需要2MSL: 原因1:让四次挥手过程更加可靠,确保最后一个发送给对方的ACK到达;若对方没有收到ACK应答,对方会再次发送FIN请求关闭,此时在2MSL时间内被动关闭…

实际应用中运放里多余的引脚怎么处理?

实际应用中运放里多余的引脚怎么处理?-电子发烧友网 (elecfans.com)

Python实现图片(合并)转PDF

在日常的工作和学习过程当中,我相信很多人遇到过这样一个很普通的需求,就是将某一个图片转为PDF或者是将多个图片合并到一个PDF文件。但是,在苦苦搜寻一圈之后发现要么要下载软件,下载了还要注册,注册了还要VIP,甚至SVIP才能实现这样的需求! 今天,我带大家把这个功能打…

SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)

1.配置Vue启动端口 1.修改vue.config.js const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true }) module.exports {devServer: {port: 9999 //启动端口} }2.启动 2.安装Element Plus 命令行输入 npm install eleme…

css相邻元素边框重合问题,解决方案

1、如下图所示&#xff0c;在给元素设置边框后&#xff0c;相邻元素会出现重合的问题 2、解决方案 给每个元素设置margin-top以及margin-left为负的边框 <div style"width: 300px;display: flex;flex-wrap: wrap;margin-top: 50px;"><div style"border…

Python——读写属性

采用读写属性的目的就是把录入的数据控制在合理区间。 如&#xff1a;学生的年龄&#xff08;age&#xff09;&#xff0c;学生的身高&#xff08;height&#xff09;... 方法一&#xff1a;利用实例方法来控制 class Student:def __init__(self,name"",age0):self.…

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…

基于yolov7与arduino的眼睛跟随模块

基于yolov7与arduino的眼睛跟随模块 整个模块的介绍摄像模块图片传输模块图像检测模块控制模块动力模块 整个模块的介绍 我们首先需要一个图片收集的模块来对当前的图片进行收集然后将图片传至服务端对图片中的眼睛利用YOLO进行检测最后将数据传至arduino使其控制动力模块来进…

物奇平台超距断连无蓝牙广播问题解决方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 物奇平台超距断连无蓝牙广播问题解决方法 一 问题反馈 二解决方法: 1 运行流程分析 对应代…

【RabbitMQ】RabbitMQ的交换机

交换机类型 在上文中&#xff0c;都没有交换机&#xff0c;生产者直接发送消息到队列。而一旦引入交换机&#xff0c;消息发送的模式会有很大变化&#xff1a;可以看到&#xff0c;在订阅模型中&#xff0c;多了一个exchange角色&#xff0c;而且过程略有变化&#xff1a; Pub…

数据结构与算法第三套试卷小题

1.删除链表节点 **分析&#xff1a;**首先用指针变量q指向结点A的后继结点B&#xff0c;然后将结点B的值复制到结点A中&#xff0c;最后删除结点B。 2.时间复杂度的计算 **分析&#xff1a;**当涉及嵌套循环的时候&#xff0c;我们可以直接分析内层循环即可&#xff0c;看内…

小白优化Oracle的利器”sqltrpt.sql”脚本

SQL调优顾问是Oracle自带的一个功能强大的内部诊断工具&#xff0c;用于对性能不佳的SQL语句给出优化建议。但如果从命令行调用它比较麻烦&#xff0c;幸运的是&#xff0c;Oracle提供了一个方便的内置脚本“sqltrpt.sql”&#xff0c;简化了调用过程。 sqltrpt.sql脚本位于Or…

实践:qemu 运行 linux riscv with AIA(APLICIMSIC)

RISCV架构 Linux AIA支持 目标&#xff1a;在 Qemu 中运行一个支持 riscv aia 的 linux 翻译参考自&#xff1a;https://lwn.net/Articles/963231/ 文章日期&#xff1a;2024年2月22日&#xff0c;星期四&#xff08;截至2024年3月&#xff0c;最新&#xff09; 这个网站里在不…

EasyExcel导出自定义表格

谈到新技术&#xff0c;每个人都会有点恐惧&#xff0c;怕处理不好。确实&#xff0c;第一次使用新技术会遇到很多坑&#xff0c;这次使用 EasyExcel 这个新技术去做 excel 导出&#xff0c;还要给表格加样式&#xff0c;遇到不同的版本问题&#xff0c;遇到颜色加错了地方&…

JavaEE企业开发新技术2

目录 2.7 Field类的基本概念 文字性概念描述&#xff1a; Field类 2.8 Field的基本操作-1 2.9 Field的基本操作-2 分析&#xff1a; 2.10 Field 的综合练习 总结&#xff1a; 和equals的区别&#xff1a; 使用 比较 使用equals比较 2.7 Field类的基本概念 文字性…

OpenCV 图像的几何变换

一、图像缩放 1.API cv2.resize(src, dsize, fx0,fy0,interpolation cv2.INTER_LINEAR) 参数&#xff1a; ①src &#xff1a;输入图像 ②dsize&#xff1a;绝对尺寸 ③fx&#xff0c;fy&#xff1a;相对尺寸 ④interpolation&#xff1a;插值方法 2.代码演示 import cv2 …

前端报错404,nginx正常、gateway没有转发请求

问题描述&#xff1a;前端报错 404 Not Found 原因&#xff1a;nacos中对应服务没有上线&#xff0c;下线后&#xff0c;可以启动本地服务&#xff0c;然后在测试上调试代码。&#xff01;&#xff01; 记住重启对应服务&#xff0c;也不会自动上线。

JVM的内存区域

JVM内存区域最粗略的划分可以分为堆和栈&#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个、区域 Java虚拟机运行时数据区 JVM内存分为线程私有区和线程共享区&#xff0c;其中方法区和堆是线程共享区&#xff0c;虚拟机栈、本地方法栈和程序计数器是…

植物病害识别:YOLO水稻病害识别/分类数据集(2000多张,2个类别,yolo标注)

YOLO水稻病害识别/分类数据集&#xff0c;包含疾病和正常2类&#xff0c;共2000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信