Transformer图解

news2024/11/20 14:15:50

Transformer正在席卷自然语言处理领域。 这些令人难以置信的模型正在打破多项 NLP 记录并推动最先进的技术发展。 它们被用于许多应用程序,如机器语言翻译、会话聊天机器人,甚至为更好的搜索引擎提供动力。
在这里插入图片描述

Transformer在当今深度学习领域风靡一时,但它们是如何工作的呢? 为什么它们优于以前的序列数据模型,如递归神经网络、GRU 和 LSTM? 你可能听说过不同的著名Transform模型,例如 BERT、GPT 和 GPT2。 在这篇文章中,我们将重点关注开启这一切的一篇论文,“Attention is all you need”。

1、注意力机制

要了解Transformer,我们首先必须了解注意力(Attention)机制。 注意力机制使 transformer 具有极长的记忆力。 Transformer模型可以“参与”或“关注”之前生成的所有token。

让我们来看一个例子。 假设我们想写一部带有生成式transformer的短篇科幻小说。 使用 Hugging Face 的 Write With Transformer 应用程序,我们可以做到这一点。 我们将用我们的输入来启动模型,模型将生成其余的内容。
在这里插入图片描述

我们的输入是:“当外星人进入我们的星球时”。

Transformer则输出:“并开始殖民地球,一群外星人开始通过他们对一定数量的精英的影响来操纵我们的社会,以保持和铁腕控制民众。”

好吧,故事有点黑暗,但有趣的是模型是如何生成它的。 当模型逐字生成文本时,它可以“注意”或“关注”与生成的字词相关的字词。 知道要添加什么词的能力也是在训练期间通过反向传播学习的。
在这里插入图片描述

递归神经网络 (RNN) 也能够查看以前的输入。 但是注意力机制的强大之处在于它不会受到短期记忆的影响。 RNN 的参考窗口较短,因此当故事变长时,RNN 无法访问序列中较早生成的单词。 这对于门控循环单元 (GRU’s) 和长短期记忆 (LSTM’s) 网络仍然适用,尽管它们具有更大的容量来实现长期记忆,因此具有更长的参考窗口。 理论上,注意力机制在提供足够的计算资源的情况下,有一个无限的窗口可供参考,因此能够在生成文本时使用故事的整个上下文。

在这里插入图片描述

2、Attention Is All You Need — 分步演练

注意力机制的力量在论文“Attention Is All You Need”中得到了证明,作者在论文中介绍了一种名为 Transformers 的新型神经网络,它是一种基于注意力的编码器-解码器类型架构。

在这里插入图片描述

在高层次上,编码器将输入序列映射到一个抽象的连续表示中,该表示包含该输入的所有学习信息。 然后,解码器采用该连续表示并逐步生成单个输出,同时还提供先前的输出。

让我们来看一个例子。 该论文将 Transformer 模型应用于神经机器翻译问题。 在这篇文章中,我们将演示它如何用于对话式聊天机器人。

我们的输入:“Hi how are you”

Transformer输出:“I am fine”

3、输入嵌入

第一步是将输入馈送到词嵌入层。 词嵌入层可以被认为是一个查找表,用于获取每个词的学习向量表示。 神经网络通过数字进行学习,因此每个单词都映射到一个具有连续值的向量来表示该单词。
在这里插入图片描述

4、位置编码

下一步是将位置信息注入到嵌入中。 因为 Transformer 编码器没有像循环神经网络那样的循环,所以我们必须在输入嵌入中添加一些关于位置的信息。 这是使用位置编码完成的。 作者想出了一个使用 sin 和 cosine 函数的巧妙技巧。
在这里插入图片描述

我们不会深入探讨位置编码的数学细节,但这里谈一下基本思路。 对于输入向量上的每个奇数索引,使用 cos 函数创建一个向量。 对于每个偶数索引,使用 sin 函数创建一个向量。 然后将这些向量添加到它们相应的输入嵌入中。 这成功地为网络提供了每个向量位置的信息。 串联选择 sin 和 cosine 函数是因为它们具有模型可以轻松学习注意的线性属性。

5、编码器

现在我们有了编码器层。 编码器层的工作是将所有输入序列映射到一个抽象的连续表示中,该表示包含整个序列的学习信息。 它包含 2 个子模块,多头注意力模块,后面是一个全连接网络。 两个子层中的每一个都存在残差连接,然后进行层归一化。

在这里插入图片描述

为了对此进行分解,让我们首先看一下多头注意力模块。
在这里插入图片描述

查询、键和值向量

为了实现自注意力,我们将输入馈送到 3 个不同的全连接层以创建查询(Q)、键(K)和值(V)向量。

这些向量到底是什么? 我在stack exchange网站找到了一个很好的解释…

“查询键和值的概念来自检索系统。 例如,当你键入查询以在 Youtube 上搜索某个视频时,搜索引擎会将你的查询映射到与数据库中候选视频关联的一组键(视频标题、描述等),然后为你呈现最匹配的视频(值)。

查询和键的点积

在通过线性层提供查询、键和值向量后,查询和键进行点积矩阵乘法以产生得分矩阵。
在这里插入图片描述

得分矩阵决定了一个词应该在多大程度上关注其他词。 所以每个词都会有一个对应于时间步中其他词的分数。 分数越高越专注。 这就是查询映射到键的方式。
在这里插入图片描述

降低注意力分数

然后,通过除以查询和键维度的平方根来缩小分数。 这是为了允许更稳定的梯度,因为相乘的值会产生爆炸效应。
在这里插入图片描述

缩放后得分值的 Softmax

接下来,你使用缩放得分值的 softmax 来获得注意力权重,这会为你提供介于 0 和 1 之间的概率值。通过执行 softmax,较高的分数会提高,而较低的分数会降低。 这使模型对要关注的单词更有信心。
在这里插入图片描述

将 Softmax 输出与值向量相乘

然后你把注意力权重乘以值向量得到一个输出向量。 softmax 分数越高,模型学习到的词的价值就越重要。 较低的分数会淹没不相关的词。 然后将其输出输入线性层进行处理。

在这里插入图片描述

计算多头注意力

为了使其成为多头注意力计算,你需要在应用自注意力之前将查询、键和值拆分为 N 个向量。 分裂向量然后单独经历自我关注过程。 每个self-attention过程称为一个head。 每个头产生一个输出向量,在通过最终线性层之前将其连接成一个向量。 理论上,每个头都会学到不同的东西,因此赋予编码器模型更多的表示能力。
在这里插入图片描述

总而言之,多头注意力是 transformer 网络中的一个模块,它计算输入的注意力权重并生成一个输出向量,其中包含关于每个单词应该如何关注序列中所有其他单词的编码信息。

残差连接、层归一化和前馈网络

多头注意输出向量被添加到原始位置输入嵌入中。 这称为剩余连接。 残差连接的输出经过一层归一化。
在这里插入图片描述

归一化残差输出通过逐点前馈网络进行投影以进行进一步处理。 逐点前馈网络是一对线性层,中间有 ReLU 激活。 然后将其输出再次添加到逐点前馈网络的输入并进一步归一化。

在这里插入图片描述

残差连接通过允许梯度直接流过网络来帮助网络训练。 层归一化用于稳定网络,从而大大减少所需的训练时间。 逐点前馈层用于投射注意力输出,可能为其提供更丰富的表示。

编码器总结

这包装了编码器层。 所有这些操作都是将输入编码为具有注意力信息的连续表示。 这将有助于解码器在解码过程中专注于输入中的适当单词。 您可以将编码器堆叠 N 次以进一步编码信息,其中每一层都有机会学习不同的注意力表示,因此有可能提高 transformer 网络的预测能力。

6、解码器

解码器的工作是生成文本序列。 解码器具有与编码器类似的子层。 它有两个多头注意层、一个逐点前馈层、残差连接以及每个子层之后的层归一化。 这些子层的行为类似于编码器中的层,但每个多头注意力层都有不同的工作。 解码器被一个充当分类器的线性层和一个用于获取单词概率的 softmax 所覆盖。
在这里插入图片描述

解码器是自回归的,它以一个开始标记开始,它将先前输出的列表作为输入,以及包含来自输入的注意力信息的编码器输出。 解码器在生成令牌作为输出时停止解码。
在这里插入图片描述

让我们来看看解码步骤。

解码器输入嵌入和位置编码

解码器的开头与编码器几乎相同。 输入通过嵌入层和位置编码层以获得位置嵌入。 位置嵌入被送入第一个多头注意力层,该层计算解码器输入的注意力分数。

第一个多头注意力层

这个多头注意力层的运作方式略有不同。 由于解码器是自回归的并且逐字生成序列,因此你需要防止它对未来的标记进行调节。 例如,在计算“am”这个词的注意力分数时,你不应该访问“fine”这个词,因为这个词是之后生成的未来词。 “am”这个词应该只能访问它自己和它前面的词。 对于所有其他单词都是如此,它们只能注意前面的单词。

在这里插入图片描述

我们需要一种方法来防止计算未来单词的注意力分数。 这种方法称为掩蔽。 为了防止解码器查看未来的标记,需要应用了一个前向掩码。 在计算 softmax 之前和缩放分数之后添加掩码。 让我们来看看这是如何工作的。

前向掩码

掩码是一个矩阵,其大小与注意力分数相同,填充了 0 和负无穷大的值。 当你将掩码添加到缩放的注意力分数时,你会得到一个分数矩阵,右上角的三角形充满负无穷大。

在这里插入图片描述

使用掩码的原因是因为一旦你采用掩码分数的 softmax,负无穷大就会被清零,从而为未来的标记留下零注意力分数。 正如在下图中看到的,“am”的注意力分数对它自己和它前面的所有单词都有值,但对单词“fine”的注意力分数为零。 这实质上告诉模型不要关注这些词。
在这里插入图片描述

这种掩蔽是第一个多头注意力层中注意力分数计算方式的唯一区别。 这一层仍然有多个头,蒙版被应用到这些头上,然后连接起来并通过线性层进行进一步处理。 第一个多头注意力的输出是一个屏蔽输出向量,其中包含有关模型应如何关注解码器输入的信息。

在这里插入图片描述

第二个多头注意和逐点前馈层

第二个多头注意层。 对于这一层,编码器的输出是查询和键,第一个多头注意层输出是值。 此过程将编码器的输入与解码器的输入相匹配,从而允许解码器决定哪个编码器输入与关注相关。 第二个多头注意力的输出通过逐点前馈层进行进一步处理。

输出概率的线性分类器和最终 Softmax

最后的逐点前馈层的输出通过最后的线性层,充当分类器。 分类器与你拥有的类别数量一样大。 例如,如果 10,000 个单词有 10,000 个类,则该分类器的输出大小为 10,000。 然后分类器的输出被送入 softmax 层,这将产生 0 到 1 之间的概率分数。我们采用最高概率分数的索引,这等于我们的预测词。
在这里插入图片描述

然后解码器获取输出,将其添加到解码器输入列表中,并继续解码直到预测到标记。 对于我们的案例,最高概率预测是分配给结束标记的最终类别。

解码器也可以堆叠 N 层高,每一层都从编码器和它之前的层接收输入。 通过堆叠层,该模型可以学习从其注意力头中提取和关注不同的注意力组合,从而有可能提高其预测能力。
在这里插入图片描述

7、结束语

就是这样! 这就是Transformer的机制。 Transformer利用注意力机制的力量做出更好的预测。 循环神经网络试图实现类似的事情,但因为它们受到短期记忆的影响。 变形金刚可以更好,特别是如果你想编码或生成长序列。 因为transformer架构,自然语言处理行业可以取得前所未有的成果。


原文链接:Transformer图解 — BimAnt

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

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

相关文章

POSTGRESQL 13.1 bug 与 逻辑复制槽参数调优

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS,SQL SERVER 等,期待你的加入&#…

pytorch 多卡运行详细教程

先说明一下背景,目前正在魔改以下这篇论文的代码: https://github.com/QipengGuo/GraphWriter-DGLgithub.com 由于每次完成实验需要5个小时(baseline),自己的模型需要更久(2倍),非…

战略和什么相关?

(1)战略和创新企业做到最大,就是业务多元化/一体化、区域全球化。想再折腾折腾,那就手里这几张牌搞重新排列组合,这就是:企业再造。就是中国人说的:天下大势分久必合合久必分。按照波士顿咨询来…

20221224英语学习

今日词汇 lash v.将(物品)系牢,捆绑;(风、雨等)猛烈打击;鞭打;猛烈抨击,严厉斥责 detective n.侦探; 警探; 发掘者; 发现者 division n.分开; 分隔; 分配; 分隔物; 刻…

深度学习SSD算法

目录1 SSD网络结构1.1 backbone1.2 extra部分1.3 loc和cls1.3.1 PriorBox层先验框的生成方法1.3.2 loc的预测结果2 模型训练2.1 正负样本标记2.2 损失函数2.3 困难样本挖掘3 模型预测4 总结1 SSD网络结构 SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测…

Linux0.11 考古笔记

Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11 核心代码》,大致理解下 Linux0.11 内核的全貌。在我理解这些属于计算机基础类的知识,所以在未来的工作场景不太可能会直接用到它们,如果用不到的话这些知识可能会随着…

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本,那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年,Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项,总有一些值得期待的东西。 如果你想从 20…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

【Java 数据结构】-二叉树OJ题

作者:学Java的冬瓜 博客主页:☀冬瓜的博客🌙 专栏:【Java 数据结构】 分享:宇宙的最可理解之处在于它是不可理解的,宇宙的最不可理解之处在于它是可理解的。——《乡村教师》 主要内容:二叉树的…

离职时,是在公司群里大方告别,主动退群?还是一言不发,默默退出?

离职时怎么体面退出工作群?一位网友说,自己公司的同事离职那天,在公司群里发了一大段感谢的话,大大方方挥手告别后主动退了群。有同事夸这个离职的人情商高,这样告别大方得体,是离职的好表率。但楼主觉得&a…

SAP UI5 加载本地并不存在的 PDF 文件的错误处理

这个 _onLoadListener 函数什么时候注册的呢? iframe 完成加载之后,就触发这个 load 事件注册的处理函数: PDFViewer.prototype.onAfterRendering function () {var fnInitIframeElement function () {// cant use attachBrowserEvent be…

vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能 可直接使用

富文本编辑器功能实现详细过程 目录 富文本编辑器功能实现详细过程 1.安装富文本插件 2.实现效果 3.实现详细过程 可直接使用 全局引入 局部引入 配置option 扩展需求 自定义配置文字大小 1.安装富文本插件 npm install vue-quill-editor --save //或者 yarn add vu…

Android电源管理介绍

一、电源管理基础知识1.1电源管理的几种状态Android kernel源码中,定义了三种电源状态,在kernel/power/suspend.c中:对应的宏定义/include/linux/suspend.h1.2 电源管理状态的介绍:PM_SUSPEND_ON设备处于正常工作状态PM_SUSPEND_S…

VsCode搭建C语言运行环境以及终端乱码问题解决

在VsCode中搭建C/C运行环境需要先安装以下插件 1、安装c/c插件 2、安装code runner插件 当然也可以安装一些其他的美化插件根据个人习惯,但是以上这两个是必装的。 安装好插件后来到插件主页点击卸载旁边的小齿轮选择扩展设置 找到扩展设置中的下图选项并打上勾即可…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

LeetCode HOT 100 —— 560. 和为 K 的子数组

题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 思路 首先,要明白本题不能使用双指针或者滑动窗口,因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代,确定窗口的收缩方…

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效,像Diablo II中的魔法效果的实现,幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合,接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的: https://github.com/sayajin-labs/kakarot(ZK-EVM type 3 written in Cairo, leveraging STARK proof system.) Kakarot提供了相应的playground: https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作,也有几个现成的库能实现我需要的功能,但用起来总是感觉不顺手。 于是便抽了两天时间,在aaz.libxl库的基础上,按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址:http://che…