初步了解预训练语言模型BERT

fbc93c68f04ae0d2cb22274fa064c9a8.gif

本文字数::4024

预计阅读时间:12分钟

BERT是由Google提出的预训练语言模型,它基于transformer架构,被广泛应用于自然语言处理领域,是当前自然语言处理领域最流行的预训练模型之一。而了解BERT需要先了解注意力机制与Transformers

注意力机制

注意力机制(Attention Mechanism)是一种在机器学习和自然语言处理中广泛使用的技术,它可以帮助模型在处理输入数据时集中关注其中最重要的部分,从而提高模型的准确性。

原理

注意力机制最初是从认知神经科学中引入到机器学习领域的,19世纪90年代的威廉·詹姆斯发现人类注意力焦点受到非自主性提示和自主性提示有选择地引导[7]。简单来说,非自主性提示是一种无意注意,例如人会先看到最显眼的物品,而自主性提示是一种有意注意,例如人会根据自己的需要先关注到自己需要到物品。非自主性提示与自主性提示会导致人类神经网络选择性地加强或减弱一些特定的神经元的活动。

在机器学习中,注意力机制模拟了人类的这种认知行为,采用的方式主要是通过查询向量query模拟自主提示,键值向量key模拟非自主提示,二者交互形成注意力焦点,从而有选择的聚合了值向量value(模拟感官输入)最终形成输出[8]。具体的计算过程可以用下图表示:

d7a243cf5983ef834ebc9cb0fccefc7c.png

图1 注意力得分计算示意图

假设有一个查询向量q∈Rq和m个“键—值”对(k1,v1),...,(km,vm),其中ki∈Rk,vi∈Rv。在计算注意力得分时,首先通过注意力评分函数a将查询向量q和键向量ki映射成标量,不同的注意力评分函数可以产生不同的注意力汇聚效果,常见的有缩放点积注意力评分函数(公式1)

efc1212dc9751732a33af9c57c8bcfe8.png

公式1

再经过softmax运算,得到注意力权重α(公式2),

0e6e23a2689e4a44056a9c3e24bdf968.png

公式2

而最终的输出也就是注意力权重与值向量的加权和:

39fee2c8582525ac79c8e83907d17914.png

公式3

在实际应用中,通常将同一组词源输入到注意力池化中,以便同一组词元同时充当querykeyvalue。具体来说,每个query都会关注所有的key-value对并产生一个注意力输出。由于querykeyvalue来自同一组输入,因此被称为自注意力(self-attention)。

Transformer

transformers是继MLP,RNN,CNN(第四大类模型架构),最早被google research团队 Ashish Vaswani 等人提出,是一种完全基于注意力机制的encoder-decoder架构,最早应用于机器翻译这个任务。在transformer之前,主要采用依赖神经网络的注意力模型,但是RNN、CNN等传统神经网络在处理长序列数据时效率较低,而自注意力机制同时具有并行计算和最大路径长度两个优势,而完全基于注意力机制的transformer模型解决了传统神经网络的问题。

Transformer的核心思想是使用注意力机制来实现序列中的信息交互,它将输入序列和输出序列中的每一个元素连接起来,同时对它们进行加权计算,以决定对于当前元素的关注程度。这种机制将整个输入序列通过Encoders编码成一个编码向量,再通过Decoders将之解码为输出序列,从而实现了序列到序列的转换,可以用来完成机器翻译、文本生成等任务。在实际应用中,encodersdecoders可以单独使用。简单的模型如下图所示(图2),Encoders是由6个结构相同encoder组成,但是每个encoder参数不相同;Decoders是由6个结构相同decoder组成,但是每个decoder参数不相同;

14075ea2a2e226b6a3ce381c03fc7400.png图2 注意力模型结构图

Transformer的整体网络架构中的encoderdecoder都采用多层堆叠的自注意力机制。encoder将输入序列转换成隐藏表示,decoder将隐藏表示转换成输出序列。其整体架构图如下图3所示,其中左边是encoder,右边是decoder,下面我将结合下图详细介绍encoderdecoder的内部实现。

76df0de52b1152014087803d5a83807a.png

图3 注意力模型网络架构

encoder

对于encoder,输入数据首先通过一个嵌入层(embedding layer)将每个单词转化为一个向量表示,由于注意力机制不是顺序读取码元的,所以在输入中会加上位置编码信息(positional encoding),位置编码加上输入向量就构成了注意力机制的输入。如上图所示,输入向量会分为查询向量(query,下文简写为q)、键向量(key,下文简写为k)、值向量(value,下文简写为v)三个向量输入到多头注意力(Muiti-Head Attention)中,其中由输入向量得到q、k、v的过程如下图所示。

ccd3c997b7575b56c2e3398c3cc1c2fc.png

图4 输入向量投影示意图

q、k、v是通过每一个输入向量x分别投影到WQ WKWV矩阵得到的,而其中WQWKWV最初是随机初始化得到,然后不断学习更新。在多头注意力机制中,就是通过多套WQ、 WKWV不同的参数矩阵实现的,具体实现方式是将q、k、v投影到低维度矩阵,投影h次,也就是h头注意力。使用多头注意力的好处就是可以通过多角度学习输入的信息,从而提升学习的效果。

得到q、k、v向量后,就可以根据上文介绍的注意力机制在Muiti-Head Attention中得到注意力的输出。这里的注意力公式如下所示(公式5),该公式可由上文的2-1公式推演得出。

b6fd4e9382ddecbbf52ba540f18e8459.png

公式5

其中q、k、v这三个参数由上文介绍的过程投影得出的矩阵,dk表示向量长度。这里是k和q做内积,每个词的q与所有的词k(包括本身)做内积,得到每个向量的相似度,可以理解为当前词与整句话里所有词的相似度。每个词都要做一遍上述计算,然后softmax之后输出注意力权重,得到的一套注意力权重和所有的字v做加权和(相乘再相加) ,就是当前词最后的输出。在多头注意力中,就是经过多次注意力函数,然后将输出拼接在一起,在经过高维度矩阵投影回来,得到多头注意力的输出。

在多头注意力层外,每个子层都采用了残差连接和层规范化机制,也就是上图2-3中的Add&Norm,这两者是构成深度架构的关键,可以有效地避免梯度消失或爆炸问题,提升模型性能。残差连接是指在每个子层之后都加入了一个直接连接,将输出与未经过注意力机制的输入进行相加,使得模型可以直接学习到残差信息。层规范化则是对于每个子层的输出进行标准化处理,避免了输入项的数值不同而导致的训练过程中的不稳定性。

最后,每个子层后接一个前馈神经网络(feed-forward neural network),作为最后一步转换。前馈神经网络采用门控线性单元(gated linear unit, GLU)的形式,这样做的目的是为了实现语义空间的转换,有效的使用序列信息,将已经抓取出来的序列信息映射到更想要的那个语义空间,增加模型的拟合能力。经过多层堆叠的encoder会生成一个编码向量,作为decoder的输入。

decoder

对于decoder,可以看作是encoder的逆过程。从上图3中可以看出encoder和decoder的不同之处主要在于decoder有两个注意力机制,第一个是mask-attention,第二个是与encoder部分相同的多头注意力机制。decoder的第一个mask-attention是为了防止后面信息参与计算,将后面的词mask掉,被mask掉的词就不参与计算,从而保留自回归属性。decoder第二个多头注意力,q、k、v维度是一样的,其中k、q来自上一层encoder的输出,然后作用于value上,这一层的作用可以理解为encoder的输出汇聚出想要的信息。与encoder相同,在经过注意力机制后输出的作为前馈神经网络的输入,实现语义空间的转换,同样decoder中的子层也被残差连接和紧随的层规范化围绕。

BERT

BERT全称Bidirectional Encoder Representations from Transformers,是Google于2018年提出的一种基于Transformer模型的预训练模型。BERT基于Transformer模型,通过多任务学习的方式,在大规模无标注的语料库上进行预训练,并对各种下游自然语言处理任务进行微调,取得了极好的成绩。

BERT的核心原理是通过多层双向Transformer编码器,将输入文本表示成高维语义空间中的向量,使得语义相近的词或句子在向量空间内彼此接近。与传统基于语言学规则或统计方法的自然语言处理技术相比,BERT可以从大规模的无标注文本中学习到更全局、更复杂的语义信息,取得了更好的效果。

在BERT中,与原始Transformer模型不同的是,通过双向Transformer编码器,BERT能够更好地捕捉上下文的相关性,在单词或句子级别上对文本进行建模。此外,BERT采用了掩码语言建模和下一句预测等多种预训练任务,进一步提高了模型的泛化能力。

具体来说,BERT通过多层堆叠的Transformer 编码器来对输入文本进行建模,并采用掩码技术,让编码器只能看见输入序列中一部分的信息,从而使得编码器具有非常强的泛化能力。此外,BERT还利用了两个新的预训练任务,即掩码语言建模和下一句预测,来增强模型对上下文的理解。

在掩码语言建模任务中,采用了一种类似于“完形填空”的思路构建掩码模型。BERT随机掩盖句子中的一些单词具体方式是随机把一句话中15%的token(字)替换成以下内容:

(1)这些token有80%的几率被替换成[MASK]

(2)有10%的几率被替换成任意一个其它的token

(3)有10%的几率原封不动。完成掩码后,再用模型预测这些掩盖掉的单词。

在下一句预测任务中,BERT输入一对句子,模型判断这两个句子对是连续的还是随机采样两个句子放在一起的。这些任务都是基于无标注文本的,通过预训练让BERT学习理解语言的能力,从而可以在下游任务中取得更好的效果。

BERT模型的输入主要包括三个部分:token embedding、segment embedding和position embedding。其中,token embedding表示为每个输入词汇对应的向量表示;而segment embedding和position embedding则分别表示为每个句子对应的标识符和每个词在序列中的位置信息。具体来说,对于输入句子中的每个词汇,BERT模型都会将其转化为一个向量表示,这个向量表示是该词汇在BERT模型的预训练过程中学习得到的。同时,BERT模型还会在输入的每个句子之前加上一个特殊的标记[CLS],在每个句子之后加上另一个标记[SEP],以便模型学习句子之间的关系。
在输入数据的基础上,BERT模型还需要进行构造数据的处理。具体来说,BERT模型会把输入的文本序列按照一定的规则组合起来,构造成一段首尾各有一个特殊标记的文本序列。在这个文本序列中,对于两个句子之间的分界点,BERT模型会用一个特殊的segment embedding进行区分。同时,对于每个词在序列中的位置信息,BERT模型也会使用一个特殊的position embedding进行标记。
通过对输入数据的处理,BERT模型可以将文本序列转换成一个高维向量表示,这个高维向量通常被称为上下文向量。BERT模型的输出则主要包括上下文向量和[CLS]标记对应的向量。其中,上下文向量可以用来进行各种下游任务的特征提取和计算,而[CLS]标记对应的向量则通常被用作整个文本序列的汇总表示,它可以用来进行文本分类、语义相似度计算等任务。在语意相似度计算任务中,得到的语义向量会作为特征输入给一个线性分类器,如逻辑回归或支持向量机等,在此基础上进行二分类或多分类的任务,从而实现语意相似度的计算。

在BERT模型中,由于使用了横向和纵向的自注意力机制,可以充分地考虑和利用不同位置和不同上下文的信息,但也导致了模型对于不同维度和方向的信息处理能力不同,此外,自注意力机制无法处理一些长序列的依赖关系问题,因此在计算时会将过长的文本或序列截断,这也会导致模型对于长序列中不同方向和不同偏移量的编码能力存在差异,这都会导致各项异性的问题,从而进一步影响结果的准确性。

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

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

相关文章

Verilog语法学习——LV6_多功能数据处理器

LV6_多功能数据处理器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a…

Ubuntu的安装与部分配置

该教程使用的虚拟机是virtuabox,镜像源的版本是ubuntu20.04.5桌面版 可通过下面的链接在Ubuntu官网下载:Alternative downloads | Ubuntu 也可直接通过下面的链接进入百度网盘下载【有Ubuntu20.04.5与hadoop3.3.2以及jdk1.8.0_162,该篇需要使…

ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱

一、ChatGPT结合知识图谱 在本专栏的前面文章中构建 ChatGPT 本地知识库问答应用,都是基于词向量检索 Embedding 嵌入的方式实现的,在传统的问答领域中,一般知识源采用知识图谱来进行构建,但基于知识图谱的问答对于自然语言的处理…

使用预训练的2D扩散模型改进3D成像

扩散模型已经成为一种新的生成高质量样本的生成模型,也被作为有效的逆问题求解器。然而,由于生成过程仍然处于相同的高维(即与数据维相同)空间中,极高的内存和计算成本导致模型尚未扩展到3D逆问题。在本文中&#xff0…

内部类(下)匿名内部类,静态内部类的使用

文章目录 前言一、匿名内部类二、静态内部类三、内部类的继承总结 前言 该文将会介绍匿名内部类、静态内部类的使用,补充完毕java中的内部类。补充内容为向上转型为接口、使用this关键字获取引用、内部类的继承。 一、匿名内部类 定义:没有名称的内部类。…

嵌入式开发:单片机嵌入式Linux学习路径

SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。…

Matlab Image Processing toolbox 下载安装方法

当安装好Matlab之后,发现没有Image Processing toolbox这个图像处理工具箱 从新安装一遍, 选上 Image Processing toolbox 但是不用选matlab即可 1.找到之前安装时的Setup安装程序包,按照之前安装Matlab步骤,到选择需要安装的Ma…

360T7路由器进行WiFi无线中继教程

360T7路由器进行WiFi中继教程 1. 概述2. 360T7路由器进行WiFi中继实现教程2.1 登录路由器管理界面2.2 选择上网方式2.3 搜索WiFi2.4 连接WiFi2.5 点击确认2.6 在主页面查看网络 1. 概述 中继路由系统由一组中继路由器组成,为不能交换路由信息的路由域提供中继路由。…

本土机器视觉创业企业涌现,深眸科技携手AI+3D视觉勇闯小场景赛道

随着工业自动化技术向智能化方向发展,人工智能实现快速落地,机器视觉应用产品在算力、算法和技术等方面得到持续升级,助力中国机器视觉行业进入高质量发展阶段。 在制造业转型升级、新兴产业发展的过程中,中国作为全球制造中心之…

深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis

目录 一、Jedis 依赖 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧道) 2.2、概要 2.2、string 2.3、hash 2.4、list 2.5、set 2.5、zset 一、Jedis 依赖 自己去 中央仓库 上面找. 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧…

简要介绍 | 自编码器:神经网络中的自我复制艺术

注1:本文系“简要介绍”系列之一,仅从概念上对自编码器进行非常简要的介绍,不适合用于深入和详细的了解。 自编码器:神经网络中的自我复制艺术 Autoencoders Explained - MATLAB & Simulink 一、背景介绍 自编码器&#xff0…

高可用(keepalived)部署方案

前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性。同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上。同时提供一个虚拟IP,然后外面通过这个虚拟IP来访问三维…

[数据集][目标检测]城市道路井盖破损丢失目标检测1377张

数据集制作单位:未来自主研究中心(FIRC) 数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1377 标注数量(xml文件个数):1377 标注类别数&a…

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务小结 项目拉取 原项目使用ant进行项目构建,我已经更改为Maven构建,大家直接拉取我改好后的项目即可: …

【Linux】网络基础

🍎作者:阿润菜菜 📖专栏:Linux系统网络编程 文章目录 一、协议初识和网络协议分层(TCP/IP四层模型)认识协议TCP/IP五层(或四层)模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…

关闭深度学习训练/推理进程的方法

引言 设想有一种情况,在ssh服务器训练/推理的时候,突然断线,再次打开ssh的时候,发现后台在运行,此时无法使用 ctrlc 终止,从而,可以用一个很简单的办法来结束:手动关闭进程。 方法 输…

rust 闭包函数

函数有自己的类型,可以像使用基础类型一样使用函数,包括将函数保存在变量中、保存在 vec 中、声明在结构体成员字段中。闭包函数也是函数,也有自己的类型定义。不过,函数实际上是指针类型,在 rust 所有权中属于借用的关…

小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)

目录 二、MySQL Replication优点: 三、MySQL复制类型 1、异步复制(Asynchronous repication) 2、全同步复制(Fully synchronous replication) 3、半同步复制(Semisynchronous replication)…

设计模式-中介者模式在Java中使用示例-客户信息管理

场景 欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户, 要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个; 如果增加一个客户信息,…

网络安全行业相关证书

一:前言 对于考证这个话题,笔者的意见是:“有比没有好,有一定更好,但不一定必须;纸上证明终觉浅,安全还得实力行”。很多人对于各种机构的考证宣传搞得是云里雾里,不知道网络安全行业…