NLP学习笔记(七) BERT简明介绍

news2024/12/23 3:47:00

大家好,我是半虹,这篇文章来讲 BERT \text{BERT} BERT (Bidirectional Encoder Representations from Transformers)

原始论文请戳这里


0  概述

从某种程度上来说,深度学习至关重要的一环就是表征学习,也就是学习如何得到数据的向量表示

对于自然语言领域,一个典型的场景是学习文本的向量表示,关于这一点,前人已经做了很多探索


从一开始的 one-hot \text{one-hot} one-hot,到后来的 word2vec \text{word2vec} word2vec,然后到 ELMo \text{ELMo} ELMo,最后到现在的 BERT \text{BERT} BERT  及其众多变种

这些技术的发展代表着自然语言表征学习的历史进程,为各项自然语言处理任务提供了有力的支撑


在这里,我们不会展开说每种技术的细节以及它们之间的发展关系,这些内容会在之后有一篇文章单独介绍

现在大家只需要清楚,本文介绍的 BERT \text{BERT} BERT 本质上就是一个语言表征模型,用来获取文本向量表示


1  模型架构

事实上, BERT \text{BERT} BERT 的模型架构非常简单,就是 Transformer \text{Transformer} Transformer 的编码器,具体的结构如下图所示

编码器由若干个编码层堆叠而成,而且模型中上一个编码层的输出会作为下一个编码层的输入

编码层包括多头注意力机制和前馈神经网络两个子模块,每个子模块后有残差连接和层正则化

由于我们在上一篇文章中已经非常详细介绍过模型细节,所以这里就不再重复

模型架构

BERT \text{BERT} BERT 有两个版本,它们的架构是一样的,不同之处仅在于超参,具体的区别如下 :

  • BERT-BASE  :编码层数量是 12,多头注意力头数是 12,隐藏层维度是 768  ,总参数量是 110M
  • BERT-LARGE:编码层数量是 24,多头注意力头数是 16,隐藏层维度是 1024,总参数量是 340M

2  模型输入

首先明确一件事情, BERT \text{BERT} BERT  这个模型的输入输出究竟是啥

给定一段文本序列, BERT \text{BERT} BERT  的目标是得到序列中每个词元的向量表示


然而,计算机是无法直接识别文本的,我们需要先将其转化成数字表示,这样才能够作为模型的输入

通常,只需要将输入文本经过嵌入层,得到对应每个词元的可学习向量,然后通过数据进行训练即可

模型输入原始

除了词元本身之外,模型还需要词元的位置信息以及用于区分不同句子的分割信息

这些都可以通过添加不同的嵌入层解决,最后同一词元的各种嵌入会以按元素相加的方式来进行融合

模型输入进阶

这里注意,对于原始输入文本,模型会在其中插入一些特殊标记后才将其送进嵌入层,特殊标记如下:

  • [CLS]:将该标记插入到文本开头,当模型训练完后,该标记的向量表示可表征整段文本的语义
  • [SEP]:当文本中包含两个句子时,将该标记插入到两个句子中间,可起到相当于分隔符的作用
  • [PAD]:将该标记插入到文本末尾,使得同一批量里文本长度相同,要注意该标记可以多次插入

这样说可能还不是很清晰,下面看一个实际的例子

模型输入例子

最后再来对比一下 Transformer \text{Transformer} Transformer BERT \text{BERT} BERT 两个模型间输入表示的差异

  1. Transformer \text{Transformer} Transformer 的输入表示由词元表示、位置表示相加得到

    BERT \text{BERT} BERT 的输入表示由词元表示、位置表示、分割表示相加得到

  2. Transformer \text{Transformer} Transformer 的位置表示不需要学习,能够直接计算得到

    BERT \text{BERT} BERT 的位置表示由嵌入层中的可学习向量经过数据训练得到


3  预训练和微调

BERT \text{BERT} BERT  提出后,预训练和微调 ( pre-training and fine-tuning \text{pre-training and fine-tuning} pre-training and fine-tuning ) 这个训练范式逐渐流行起来

所谓预训练,就是让模型在大规模无标注数据集上针对预设任务进行训练,使模型获得某些基础能力

所谓的微调,就是让模型在特定的有标注数据集上针对下游任务继续训练,使模型适应不同下游任务


在预训练后, BERT \text{BERT} BERT   能够得到输入文本中每个词元的向量表示,这些向量表示是融合上下文信息的

在微调时候, BERT \text{BERT} BERT   使用预训练好的模型参数进行初始化,添加额外的预测层在不同下游任务继续训练

只要预训练得到的向量表示足够的好,那么预测层很容易就可以适应各种下游任务


就目前来说,预训练通常是在大规模的数据集上进行的,因此需要花费大量的计算资源

这一般都是由大公司主导并把预训练好的模型开源出来,大家去下载这些模型并在各自下游任务进行微调

进行微调的优点在于:针对不同下游任务,模型架构无需修改,只要添加不同的预测层继续训练即可


3.1 预训练

在预训练和微调这个范式里,对于预训练任务的设计至关重要,这决定了模型所具备的基础能力

BERT \text{BERT} BERT   设计的预训练任务,正是其大获成功的关键,具体为:

  1. 掩码语言模型,英文名称为 Masked Language Model \text{Masked Language Model} Masked Language Model ,简称为 Masked LM \text{Masked LM} Masked LM
  2. 下一句子预测,英文名称为 Next Sentence Prediction \text{Next Sentence Prediction} Next Sentence Prediction,简称为 NSP \text{NSP} NSP

掩码语言模型可使 BERT \text{BERT} BERT  获得捕捉词元级别语义表示的能力

下一句子预测可使 BERT \text{BERT} BERT  获得捕捉句子级别语义表示的能力

这里值得说明的是,这两个任务都不需要标注的数据,只需要连续的句子即可,而这在互联网上随处可见

下面将会详细地介绍这两个任务的相关细节哈


先来说掩码语言模型

所谓的掩码语言模型,其做法就是将句子中的某些词掩盖起来,然后让模型去预测这些掩盖的词是啥

若对比单向语言模型,掩码语言模型最重要的改进在于:预测词语时能同时利用前后两个方向的信息


正是因为如此,掩码语言模型所学到的向量表示会比单向语言模型所学到的向量表示要好

所以像 BERT \text{BERT} BERT  这种将掩码语言模型作为预训练任务的预训练模型会更适合做特征提取器,用于判别式任务

反之像 GPT \text{GPT} GPT     这种将单向语言模型作为预训练任务的预训练模型会更适合做文本生成器,用于生成式任务


更加具体来说, BERT \text{BERT} BERT 会随机选择 15% 的词元,将其替换成特殊标记 [MASK],然后对这些标记进行预测

对应图示如下:

掩码语言模型

在预训练阶段,模型通过 [MASK] 标记显式确认要预测的位置在哪里

但在微调阶段,是不存在 [MASK] 标记的,这就导致两个阶段的行为不匹配 ( mismatch \text{mismatch} mismatch )

这个不匹配会导致什么呢 ?

模型在预训练阶段学到的是根据掩码标记的上下文得到其对应的向量表示,从而推测掩码标记对应的值

这可能会导致模型较少地考虑其他正常词语的向量表示,但是在微调阶段,输入文本全部都是正常词语


为了解决不匹配的问题,模型用了一些设置掩码的技巧

BERT \text{BERT} BERT 还是先随机选择 15% 的词元,对这些被选中的词元,会有以下三种处理方式:

  1. 80% 的概率替换成掩码标记
  2. 10% 的概率替换成随机词语
  3. 10% 的概率不替换

之后,同样是对这些被选中的处理后的词元进行预测,但是,此时模型并不知道哪些词元是被替换掉的

这使得模型需要考虑每个位置上的词,如此在微调时,模型对所有的词都能得到一个比较好的向量表示


再来说下一句子预测

在自然语言处理领域,很多任务都需要考虑句子之间的关系,例如问答以及自然语言推理

而引入下一句子预测,有助于模型学习到这种关系,增强模型对于长文本的建模能力


模型会以一定的概率从语料库中随机抽取两个句子来作为输入:

  1. 50% 的概率抽取两个相关的句子作为正样本,默认语料中前后两个句子是相关的
  2. 50% 的概率抽取两个无关的句子作为负样本

要求模型判断出输入的两句话是否相关, 其实本质上就是一个二分类问题,图示如下:

下一句子预测

3.2 微调

经过预训练阶段后,我们就可以得到一个具备语言表征能力的 BERT \text{BERT} BERT  模型

然后,我们可以用该模型在特定数据集与下游任务继续训练,从而使得模型能够适应各种下游任务

这就是微调的作用


具体来说,就是在预训练好的 BERT \text{BERT} BERT  模型的基础上,针对不同下游任务添加对应的预测层就可以

然后,我们会以下游任务作为目标同时优化 BERT \text{BERT} BERT  和预测层的参数

通常, BERT \text{BERT} BERT   的参数只需要微调,而预测层的参数则需要重新学习


BERT \text{BERT} BERT   可完成的下游任务基本能够涵盖所有自然语言处理领域中的问题,具体可以分为以下几类:

  1. 单句子分类:输入单句子,输出该句子的类别
  2. 单句子标注:输入单句子,输出句子中每个词的类别
  3. 句子对分类:输入句子对,输出句子对的类别
  4. 抽取式问答:输入问题以及段落,输出答案在段落中的位置

四种下游任务对应的示意图如下:

下游任务

前三个任务很容易理解,这里主要解释一下最后一个任务

所谓抽取式问答,就是说给定问题及对应的段落,问题的答案就是段落中某段连续的词元序列

这意味着,只要能识别出这个序列的开始位置和结束位置,就能找到答案所在的位置

因此模型对段落中的每个词元有两个预测层,一个用于预测开始位置,一个用于预测结束位置

此时预测层的作用是计算词元作为开始位置或作为结束位置的置信度

最后段落中所有词元作为开始位置的置信度最大的作为预测值,结束位置也用同样的方式得到


好啦,本文到此结束,感谢您的阅读!

如果你觉得这篇文章有阐述不够清晰的地方,欢迎在评论区留下你宝贵的意见或者建议

如果你觉得这篇文章还不错的话,欢迎点赞、收藏、关注,你的支持是对我最大的鼓励 (/ω\)

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

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

相关文章

怎么把两个PDF合并?教你们几个简单的方法

不知道大家平时处理文件的数量多不多,但是小编日常处理文件真的特别多,所以小编经常会使用专业的格式转换器来处理文件,这样就可以高效处理文件了,例如我们需要将多个PDF文件合并,这样就只需要传输一个文件就可以了&am…

自定义starter解决请求绕过网关问题

引言 微服务项目中网关是一个常见的模块,通过网关的分发可以实现负载均衡、鉴权等操作;但是搭建好网关可以发现,虽然可以通过网关端口请求后端,如果有其他服务的地址依然可以使用其他服务地址绕过网关请求,这里我提供…

利用RadminLan和TcpRoute2将工作带回家

需要准备的工具 1.RadminLan 下载地址–>https://www.radmin-lan.cn/ 2.TcpRoute2 项目地址–>https://github.com/GameXG/TcpRoute2 *选用:浏览器插件proxy-switchyomega:https://microsoftedge.microsoft.com/addons/detail/proxy-switchyomega…

Visual Studio Code 的安装和使用

Visual Stuio Code 微软出的一款免费编辑器。 有 Windows、Linux 和macOS 三种版本的,属于跨平台的编辑器。它功能强大,支持插件工具安装,对于写代码、阅读代码的人来说是非常方便的。 1、安装 Visual Stuio Code 下载地址如下: h…

win10修改jdk版本之后不生效的有效解决方法

问题起因今天学习seata的时候,启动seata服务发现启动不了报下图错误。发现是自己jdk版本太高了,现在我用的是jdk17。然后我修改jdk的环境变量,确定保存好。发现jdk的版本还是没有变化。问题原因当使用安装版本的JDK程序时(一般是1…

jmeter 并发测试

1.右键测试计划(Test plan), 添加线程组 2.线程组配置 3.右键线程组, 添加取样器-HTTP请求 4.HTTP请求配置 5. 添加查看结果树(也可以在Test plan 测试计划上右键添加)

Grafana 系列文章(二):使用 Grafana Agent 和 Grafana Tempo 进行 Tracing

👉️URL: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ ✍Author: Robert Fratto • 17 Nov 2020 📝Description: Heres your starter guide to configuring the Grafana Agent to collect traces and…

【刷题】多数元素

这是leetcode第169题的解答。 目录 一、多数元素 二、实现思路 1.排序中间下标求众数 2.投票法 总结 一、多数元素 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 二、实现思路 1.排序中间下标求众数 原理: 通过排序使得数组有序,因为多数元素…

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637-驱动4位7段数码管 1、TM1637介绍 TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。 TM1637有如下…

【C++】初识C++

本期博客我们来正式进入到期待已久C嘎嘎的学习希望C语言以后别给我打电话了,我怕C误会😼一、认识C1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和…

蓝奥声无线单火控制技术在单火开关应用中的优势

随着科技的发展,智能产品在生活中越来越常见,为方便业主使用,就连开关也有了高阶智能版,据相关专家介绍,智能开关主要分为单火和零火两种,很多非专业人士搞不明白,但又害怕因此选择失误。那么&a…

关于微服务的一些总结和经验之谈,来看看你都了解吗

文章目录一 谈谈对微服务的理解1. 什么微服务?2. 微服务体系3. 微服务优点4. 微服务缺点5. 什么是gRPC?6. ProtoBuf协议好处?7. gPRC和ProtoBuf联系?二 本次微服务项目学习流程梳理三 微服务项目一般开发流程梳理四 从本次微服务项…

数据结构 | 图结构的讲解与模拟实现 | DFS与BFS的实现

文章目录前言常见概念总结图的模拟实现邻接矩阵和邻接表的优劣图的模拟实现(邻接表)广度优先遍历(BFS)深度优先遍历(DFS)前言 在聊图的结构之前,我们可以先从熟悉的地方开始,这有一…

Leetcode 剑指 Offer II 012. 左右两边子数组的和相等

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一个整数数组 nums ,请计算数组的 中心下标 。 …

Android 启动速度优化

Android 启动速度优化前序统计adb测量手动打点方案预加载class字节码的预加载Activity预创建Glide预初始化WebView预加载数据预加载三方库初始化布局方面ViewStub标签减少层级主题的选择约束布局使用X2C方案过度绘制如何检测过度绘制如何监控页面的渲染速度移除多余背景Recycle…

Linux系列 Linux常用命令(2)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.Linux常用命令后续 1.创建目录和文件 (1&#x…

DaVinci:Camera Raw(Blackmagic RAW)

本文主要介绍 Blackmagic Raw 格式(.braw)素材相关的 Camera Raw 参数。解码质量Decode Quality解码质量决定了图像解拜耳之后所呈现的素质。默认为“使用项目设置” Use project setting,表示使用项目设置对话框中的“Camera RAW”解码质量设…

PPT录制视频的方法有哪些?分享5种亲测好用的方法

PPT文稿可以通过图文或者动画的形式,直观形象地把内容展现给观众,从而给观众留下深刻的印象。比如老师讲课时会用到PPT,公司开会时也会用到PPT。除了需要使用到PPT文稿之外,有时还要对它进行录制。那你知道PPT录制视频的方法有哪些…

[JavaWeb]HTML

目录1.简介1.1 HTML基本结构1.2 标签使用细节2.常用标签使用2.1 font 字体标签2.2 字符实体2.3 标题标签2.4 超链接标签2.5 有序无序标签(1)无序列表ul/li(2)有序列表ol/li2.6 图像标签(img)2.7 表格(table)标签表格标签-跨行跨列表格2.8 form(表单)标签介绍2.9 input单选多选标…

Unity-ROS与Navigation 2(四)

0. 简介 对于Gazebo而言,我们知道其是可以通过与ROS的连接完成机器人建图导航的,那我们是否可以通过Unity来完成相同的工作呢,答案是肯定的。这一讲我们就来讲述使用Unity的“Turtlebot3”模拟环境,来运行ROS2中的“Navigation 2…