Transformer的诞生和崛起

news2024/10/6 5:58:07

图片

智能问答与文本生成:Transformer模型的超能力

©作者|wy

来源|神州问学

一、引言

NLP(自然语言处理)作为人工智能领域的一个重要分支,致力于使计算机能够理解和处理人类语言。随着互联网的发展和信息时代的到来,NLP的应用场景日益广泛,从机器翻译、智能问答到情感分析等,都离不开NLP技术的支持。然而,传统的NLP方法在处理复杂语言现象时存在诸多局限性,如无法准确理解语义、无法捕捉长距离依赖等。

Transformer模型的出现,为NLP领域带来了革命性的变革。它摒弃了传统的循环神经网络(RNN)架构,转而采用自注意力机制,使得模型在处理长序列时能够更有效地捕捉依赖关系。

自2017年诞生以来,Transformer模型迅速崛起,成为NLP领域的主流模型之一。基于Transformer架构的BERT、GPT等模型在各项NLP任务上取得了显著的性能提升,推动了NLP技术的快速发展。

二、简单理解Transformer

传统的方法(RNN)在处理文本时,遵循着逐词处理的模式,就像阅读书籍时,一个词一个词往后读取信息。然而,Transformer模型打破了这一传统,它能够同时处理一句话或一段话中的所有词语,无需像RNN(循环神经网络)那样,每个时间步(t步骤)的计算都必须依赖于前一个时间步(t-1步骤)的结果。

Transformer模型特别擅长于识别并关注句子中不同的重要部分。就像我们在阅读文章时,会自然而然地关注章节标题、关键词或句子中的核心信息一样,Transformer也能通过其注意力机制来聚焦这些关键信息。

尽管Transformer能够一次性处理整个句子中的所有词语,但它无法直接捕获序列中单词的位置信息。为了弥补这一缺陷,Transformer引入了位置编码的概念,这样模型就能够知道每个单词在句子中的具体位置,从而保留了语言的顺序性。

三. Transformer原理

Transformer模型整体架构由一个堆叠的编码器和一个堆叠的解码器组成。编码器负责将输入序列转换为语义表示,解码器则利用这些表示生成目标序列。在训练过程中,解码器通过逐步生成序列的方式,结合编码器的输出和先前生成的部分序列,来预测下一个词或符号。

Transformer编码器(Encoder)

Transformer的编码器负责将输入序列转换为一系列高级抽象的表示,其中包含了输入序列的语义信息和特征。编码器由多层堆叠的相同模块组成,每个模块本身又包含两个主要的子层:

Self-Attention层:

在每个编码器模块中,首先执行的是self-attention操作。这一操作允许模型在每个位置上将输入序列的所有其他位置作为上下文,动态地计算出该位置的表示。具体来说,对于每个位置,通过计算Query、Key和Value向量的线性变换,然后计算它们之间的注意力权重,最终通过加权和来生成该位置的输出表示。

全连接前馈网络:

在经过self-attention层后,每个位置的表示会被送入一个两层的全连接前馈神经网络。这一网络对位置特定的表示进行非线性变换和映射,从而增强模型对每个位置特征的建模能力。

数据解析

就如同任何其他模型,我们在做任何事情之前,首先要做的就是要对数据进行处理。比如说我们要获取以下6个字母的序列"CBABBBC"。

图片

我们将每个字母称为一个标记,模型的不同标记集合构成了它的词汇表:

图片

从该表中,每个标记都被分配一个数字,即其标记索引。现在我们可以将这个数字序列输入到模型中。

位置嵌入(Embedding)

我们将左侧(Token Embed)作为标记嵌入矩阵,将右侧(Position Embed)作为位置嵌入矩阵

图片

我们之前看到了如何使用简单的查找表将标记映射到整数序列。这些整数(即标记索引)是我们第一次也是唯一一次在模型中看到整数。从现在开始,我们使用浮点数(十进制数)。

让我们看一下如何使用第 4 个标记(索引 3)来生成输入嵌入的第 4 列向量。

我们使用标记索引B = 1来选择左边标记嵌入矩阵的第2列。注意,这里我们使用的是基于0的索引,所以第一列位于索引0。

这将生成一个大小为C = 48的列向量,我们称之为标记嵌入。然后选择右边的位置嵌入矩阵的第四列,也会生成一个大小为48的列向量

然后将这两个列向量相加,产生另一个大小为C = 48,我们将其描述为位置嵌入。

图片

我们看到,对输入序列中的所有标记运行此过程会产生一个大小为T x C的矩阵。T代表时间,也就是说,你可以将序列中较晚的标记视为时间较晚的标记。C代表通道,但也被称为“特征”或“维度”或“嵌入大小”。这个长度C是模型的几个“超参数”之一,由设计者在模型大小和性能之间进行权衡而选择。

层归一化(Layer Norm)

输入嵌入矩阵式我们第一个 Transformer 块的输入。Transformer 模块的第一步是将层归一化应用于该矩阵。此操作分别对矩阵的每一列中的值进行归一化。

我们还是先关注第四列(t=3)

图片

我们的目的是使列中的平均值等于 0,标准差等于 1。为此,我们找到该列的这两个量(平均值 (μ)和标准差 (σ)),然后减去平均值并除以标准差。在这里使用的符号是 E[x] 表示平均值,Var[x] 表示方差(长度为C的列)。方差就是标准差的平方。epsilon 项(ε = 1×10 -5)用于防止除以零。

在聚合层中计算并存储这些值,因为我们将它们应用于列中的所有值。

最后,一旦我们有了标准化值,我们就将列中的每个元素乘以学习到的 权重(γ),然后添加偏差(β)值,从而得到我们的标准化值。

我们对输入嵌入矩阵中每一列进行这个操作 ,然后传递到自注意力层。

自注意力层(Self Attention)

自注意力层是Transformer和GPT等模型的核心部分。在这一阶段,输入嵌入矩阵中的列(即嵌入向量)会“互相交流”。在此之前以及在其他所有阶段中,这些列(嵌入向量)都可以被视为独立的。

自注意力层由多个“头”(heads)组成,这些头允许模型并行关注输入序列中的不同位置。现在,我们将专注于其中一个头来解释其工作原理。

在自注意力层中,每个头都会独立地计算注意力权重,这些权重决定了在生成某个位置的输出时,应该给予输入序列中其他位置多大的关注。这个过程涉及三个关键组件:查询(Query)、键(Key)和值(Value),它们都是从输入嵌入矩阵中通过线性变换得到的。

查询(Query,查询向量):用于与键(Key)进行比较,以确定对值(Value)的关注程度。

键(Key,key向量):用于与查询(Query)进行比较,以产生注意力权重。

值(Value,值向量):包含实际的信息,将被用于生成输出。注意力权重将决定在生成输出时,应如何加权这些值。

通过计算查询与所有键的点积,并应用softmax函数,可以得到一个注意力权重分布。这个分布表示了在生成当前位置的输出时,对输入序列中每个位置的关注程度。然后,这个注意力权重分布将被用于对值进行加权求和,从而得到当前位置的输出。

对于自注意力机制,我们不会返回单个条目,而是返回条目的某个加权组合。为了找到该权重,我们取 Q 向量和 K 向量中的每一个向量的点积。我们对该权重进行归一化,最后将其与相应的 V 向量相乘,然后将它们全部相加。

图片

Transformer解码器(Decoder)

Transformer的解码器接受编码器生成的固定长度的向量表示,并将其转换为目标序列。解码器同样由多层堆叠的模块组成,每个模块包含三个主要的子层:

Self-Attention层:

与编码器的self-attention层类似,但在解码器中,这一层通常是掩码的,以确保在预测每个位置时只依赖已生成的部分序列,避免信息泄漏。

编码器-解码器Attention层:

解码器的每个位置通过将编码器的输出作为Query,自身当前位置的表示作为Key和Value,利用编码器的全局信息来进行上下文理解。

全连接前馈网络:

与编码器类似,解码器每个位置都有一个两层的全连接前馈网络,用于增强解码器对每个位置特定特征的建模能力。

解码器也使用残差连接和层归一化来提升模型的训练效果和稳定性。

四、Transformer模型的特点与优势

1. 并行计算能力

传统的RNN模型在处理序列数据时,需要按照序列的顺序逐步进行计算,这限制了其并行计算的能力。而Transformer模型则通过自注意力机制,使得模型在计算每个位置的输出时,都可以并行地考虑整个序列的信息,从而大大提高了模型的计算效率。

2. 长距离依赖捕捉

RNN模型在处理长序列时,由于梯度消失和梯度爆炸的问题,往往难以有效地捕捉长距离依赖关系。而Transformer模型的自注意力机制在计算注意力权重时,会考虑整个输入序列的信息,因此能够很好地捕捉长距离依赖关系。这一特点使得Transformer模型在处理如机器翻译、文本摘要等需要关注长距离依赖关系的任务时,表现出色。

3. 灵活性与通用性

Transformer模型采用了统一的架构来处理不同的NLP任务,只需通过调整输入和输出的形式,就可以适应各种任务的需求。此外,由于Transformer模型的编码器和解码器都是堆叠了多个相同的层,因此可以灵活地调整模型的深度,以适应不同的任务复杂度。这种灵活性和通用性使得Transformer模型成为了一个通用的NLP框架。

4. 高效的训练与推理速度

Transformer模型的计算过程高度并行化,使得模型在训练和推理时都具有很高的效率。同时,由于Transformer模型采用了自注意力机制,避免了RNN的循环结构,因此在计算过程中减少了不必要的计算量,进一步提高了模型的训练和推理速度。

5. 多头注意力机制

Transformer模型中的多头注意力机制使得模型能够同时关注输入序列的多个不同方面,从而得到更加全面和丰富的特征表示。这种机制不仅提高了模型的表示能力,还使得模型在处理复杂NLP任务时更加灵活和有效。

五、Transformer在NLP领域的崛起

1、机器翻译

Transformer模型最初的设计就是为了解决机器翻译问题,它显著提高了机器翻译的性能。基于Transformer的模型,如Google的神经网络机器翻译(GNMT)系统,已经在实际应用中取得了与人类翻译相近甚至更好的效果。

2、文本生成

Transformer模型中的解码器部分可以作为一个强大的文本生成器。通过给定一个初始的输入或上下文,解码器可以生成连贯且富有意义的文本。这种能力使得Transformer模型在文本摘要、对话系统、文本创作等任务中表现出色。

六、总结

Transformer凭借其独特的自注意力机制和高效的并行计算能力,实现了对传统序列模型的革命性突破。它不仅解决了长期以来的依赖问题,还大幅提升了模型训练的效率与性能。从机器翻译到文本生成,从语音识别到图像处理,Transformer的广泛应用已经证明了其强大的泛化能力和适应性。我们甚至可以说Transformer是AI的“宇宙起源”,开启了人工智能的全新时代,它将继续引领着人工智能领域向更高、更远的目标迈进。

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

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

相关文章

docker 容器设置中文环境

1.容器中安装和设置 1.1.进入容器查看已有语言包 locale -a 默认情况下: 1.2 安装中文语言环境 如果没有zh_CN.utf8就安装。 方式1: #直接安装中文语言包 apt-get install -y language-pack-zh-hans 方式2: #安装中文语言环境 apt-g…

系统初始化进程与文件、systemd概述、单元类型、切换运行级别、查看系统默认默认运行、永久切换、常见的系统服务(centos)

init进程 init进程是Linux系统(“/sbin/init”)中的第一个进程,它是所有其他进程的祖先进程。init进程的进程号(PID)始终为1。它负责启动和停止系统中的所有其他进程,以及处理系统的各种系统级任务。 ini…

大模型系列之被我忽视的Assistants API

前言 在这篇文章中,我们提到在GPT4.0 turbo发布时,GPTs和Assistants API的出现使得众多创业者一夜无眠。当时看完之后就被我丢到一边,并没有太多关注,随着我们对RAG和Agent的不断深入了解,蓦然回首,越发感…

HarmonyOS Next开发学习手册——通过startAbility拉起文件处理类应用

使用场景 开发者可以通过调用startAbility接口,由系统从已安装的应用中寻找符合要求的应用来实现打开特定文件的意图,例如:浏览器下应用下载PDF文件,可以调用此接口选择文件处理应用打开此PDF文件。开发者需要在请求中设置待打开…

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区(称为Cache),是存贮数据的临时地方&#xff…

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

Linux 异步 I/O 框架 io_uring 前言Linux I/O 系统调用演进io_uring与 Linux AIO 的不同原理及核心数据结构:SQ/CQ/SQE/CQE带来的好处三种工作模式io_uring 系统调用 API 前言 io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架,能显著…

【干货】Jupyter Lab操作文档

Jupyter Lab操作文档1. 使用须知2. 定制化Jupyter设置主题显示代码行数设置语言更多设置 3. 认识Jupyter界面4. 初用Jupyter运行调试格式化查看源码 5. 使用Jupyter Terminal6. 使用Jupyter Markdown7. 上传下载文件(云服务器中的Jupyter Lab)上传文件到…

SAP的RFID

射频识别 (RFID) 避免了条码扫描的局限性,条码扫描需要对每个条码进行视线访问,并且一次只能用于扫描一个项目。 一次扫描一个标签可能会令人厌烦和压力大,这会增加人为错误的机会。相反,RFID 标签不需要直…

入局AI手机 苹果公布Apple Intelligence

日前,苹果WWDC 2024如期召开。在这持续1个小时44分钟的开发者大会上,苹果在前一个小时里更新了iOS、iPadOS、MacOS等操作系统,而且还首次更新了visionOS。余下的时间全部留给了苹果的“AI大礼包”——Apple Intelligence(苹果智能…

全网最强SpringMVC教程 | 万字长文爆肝SpringMVC(一)

SpringMVC_day01 今日内容 理解SpringMVC相关概念完成SpringMVC的入门案例学会使用PostMan工具发送请求和数据掌握SpringMVC如何接收请求、数据和响应结果掌握RESTful风格及其使用完成基于RESTful的案例编写 SpringMVC是隶属于Spring框架的一部分,主要是用来进行We…

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项…

Ollama模型部署工具在Linux平台的部署

1.新建普通用户dmx(可选) [rootnode3 ~]$ useradd dmx2.切换普通用户dmx环境(可选) [dmxnode3 ~]$ su - dmx3.下载ollama-linux-amd64服务 下载ollama-linux-amd64到 ~/server目录,并将ollama-linux-amd64服务重命名为ollamaEED curl -L …

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线 0. 引言1. 关于绘制m_contour2. 关于绘制m_contourf3. 关于绘制m_elev4. 结语 0. 引言 本篇介绍下m_map中添加绘制等高线的一系列函数及其用法,主要函数包括m_elev、m_contour、m_contourf还有一些函数也和绘制…

线性和二次判别分析

线性判别分析 线性判别分析(Linear Discriminant Analysis,LDA)亦称 Fisher 判别分析。其基本思想是:将训练样本投影到低维超平面上,使得同类的样例尽可能近,不同类的样例尽可能远。在对新样本进行分类时&…

Spring+Vue项目部署

目录 一、需要的资源 二、步骤 1.首先要拥有一个服务器 2.项目准备 vue: 打包: 3.服务器装环境 文件上传 设置application.yml覆盖 添加启动和停止脚本 ​编辑 安装jdk1.8 安装nginx 安装mysql 报错:「ERR」1273-Unknown collation: utf8m…

ROS2中的CMakeLists(一)——基础知识

在使用ROS2框架开发机器人应用时,对各个功能包Cmakelist.txt文件的更改尤为重要。本系列旨在总头开始介绍Cmakelist.txt各条语句的意义和内涵。 Cmake已经是高度集成的构建工具,其作用是在不同开发环境下生成makefile文件,以此来执行make指令…

聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子

前言:System.Linq.Dynamic 是什么? System.Linq.Dynamic 扩展了 .NET 中的 LINQ 查询功能,通过它,我们可以在运行时动态构造 LINQ 查询表达式,就像是写原生 SQL 语句一样,更加灵活直观。 利用 System.Lin…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析,可以使用外置的逻辑分析仪,但成本较高,对初学者来说没有必要,可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析,不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…

YOLOv5改进(八)--引入Soft-NMS非极大值抑制

文章目录 1、前言2、各类NMS代码实现2.1、general.py 3、各类NMS实现3.1、Soft-NMS3.2、GIoU-NMS3.3、DIoU-NMS3.4、CIoU-NMS3.5、EIoU-NMS 4、目标检测系列文章 1、前言 目前yolov5使用的是NMS进行极大值抑制,本篇文章是要将各类NMS添加到yolov5中,同时…