Transformer之self-attention

注意力是一个有助于提高神经机器翻译应用程序性能的概念。在这篇文章中,我们将看看Transformer,一个使用注意力来提高这些模型训练速度的模型。Transformer在特定任务中优于谷歌神经机器翻译模型。最大的好处来自于Transformer如何使自己适合并行化。

在这篇文章中,我们将尝试简化一些内容,并逐一介绍概念,希望能够让没有深入了解主题的人更容易理解。

A High-Level Look

让我们首先将模型视为一个单一的黑盒。在机器翻译应用程序中,它将以一种语言获取句子,并以另一种语言输出其翻译。
在这里插入图片描述
打开它,我们看到一个编码组件,一个解码组件,以及它们之间的连接。
在这里插入图片描述
编码组件是一堆编码器(6个编码器堆叠在一起,数字6没有什么神奇的,你可以尝试其他的排列方式)。解码组件是一堆相同数量的解码器。

在这里插入图片描述
编码器在结构上都是相同的(但它们不共享权重)。每一层都被分解成两个子层
在这里插入图片描述
编码器的输入首先通过自注意层,这一层帮助编码器在编码特定单词时查看输入句子中的其他单词。我们将在后面的文章中详细介绍自我关注。

自注意层的输出被馈送到前馈神经网络。完全相同的前馈网络独立应用于每个位置。

解码器有这两个层,但在它们之间是一个注意力层,它帮助解码器专注于输入句子的相关部分(类似于注意力在seq2seq模型中的作用)。
在这里插入图片描述

把张量带入图像

现在我们已经看到了模型的主要组件,让我们开始看看各种向量/张量,以及它们如何在这些组件之间流动,将训练模型的输入转换为输出。

与一般的NLP应用程序一样,我们首先使用嵌入算法将每个输入词转换为向量。
在这里插入图片描述
嵌入只发生在最底部的编码器中。所有编码器的共同抽象是,它们接收一个大小为512的向量列表,在底部的编码器中,这将是单词嵌入,但在其他编码器中,它将是编码器直接在下面的输出。这个列表的大小是我们可以设置的超参数,基本上它是我们训练数据集中最长句子的长度。
在这里插入图片描述
这里我们开始看到Transformer的一个关键属性,即每个位置上的单词在编码器中流经自己的路径。在self-attention层中,这些路径之间存在依赖关系。但是,前馈层没有这些依赖关系,因此,在流经前馈层时,各种路径可以并行执行。

接下来,我们将把示例转换为更短的句子,并查看编码器的每个子层中发生了什么。

Now We’re Encoding!

正如我们已经提到的,编码器接收一个向量列表作为输入。它通过将这些向量传递到 self-attention 来处理这个列表,然后进入前馈神经网络,然后将输出向上发送到下一个编码器。
在这里插入图片描述
每个位置的单词都经过一个 self-attention 的过程。然后,它们分别通过一个前馈神经网络——完全相同的网络,每个向量分别流过它。

Self-Attention at a High Level

不要被我抛出的“self-attention”这个词所迷惑,好像它是每个人都应该熟悉的概念一样。在阅读《Attention is All You Need 》这篇论文之前,我个人从未接触过这个概念。让我们提炼一下它是如何工作的。

假设下面的句子是我们想要翻译的输入句子

”The animal didn’t cross the street because it was too tired”

“it” 在这个句子里指的是什么?它指的是街道还是动物?这对人类来说是一个简单的问题,但对算法来说就不那么简单了。

当模型处理单词“it”时,self-attention 允许它将其与动物联系起来。

当模型处理每个单词(输入序列中的每个位置)时,self-attention 允许它查看输入序列中的其他位置,以寻找有助于对该单词进行更好编码的线索。

如果您熟悉RNN,请考虑维护隐藏状态如何允许RNN将其之前处理的单词/向量的表示与正在处理的当前单词/向量的表示相结合。self-attention 是 Transformer 用来将其他相关单词的“理解”烘焙成我们目前正在处理的单词的方法。
在这里插入图片描述
当我们在编码器#5(堆栈中的顶部编码器)中编码单词“it”时,部分注意力机制集中在“动物”上,并将其部分表示放入“it”的编码中。

一定要查看Tensor2Tensor笔记本,在那里您可以加载Transformer模型,并使用这个交互式可视化来检查它。

Self-Attention in Detail

让我们首先看一下如何使用向量来计算自注意力,然后继续看一下如何使用矩阵来实际实现它。

计算自注意的第一步是从每个编码器的输入向量(在本例中是每个单词的嵌入)中创建三个向量。因此,对于每个单词,我们创建一个 Query 向量、一个 Key 向量和一个 Value 向量。这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵来创建的。

请注意,这些新向量的尺寸比嵌入向量小。它们的维度为64,而嵌入和编码器输入/输出矢量的维度为512。它们不必更小,这是一个使多头注意力(大多数)的计算保持不变的架构选择。
在这里插入图片描述
将x1乘以WQ权重矩阵得到q1,即与该单词相关的“query”向量。我们最终为输入句子中的每个单词创建了一个“query”、一个“key”和一个“value”投影。

什么是query、key和value?

它们是对计算和思考注意力有用的抽象概念。一旦你继续阅读下面的注意力是如何计算的,你就会知道所有你需要知道的关于这些向量所扮演的角色。

计算 self-attention 的第二步是计算分数。假设我们正在计算本例中第一个单词“Thinking”的self-attention。我们需要对输入句子中的每个单词与这个单词进行评分。分数决定了当我们在某个位置编码单词时,对输入句子的其他部分的关注程度。

分数是通过将 query vector 与我们正在评分的相应单词的 key vector 进行点积来计算的。因此,如果我们重新处理位置 #1 的单词的自注意,第一个分数将是 q1 和 k1 的点积。第二个分数是 q1 和 k2 的点积。
在这里插入图片描述
第三步和第四步是将分数除以8(论文中使用的key向量维度的平方根)。这将导致更稳定的梯度。这里可能有其他可能的值,但这是默认值),然后通过softmax操作传递结果。Softmax将分数归一化,所以它们都是正的,加起来等于1。
在这里插入图片描述
这个softmax分数决定了每个单词在这个位置表示多少。很明显,在这个位置的单词将有最高的softmax得分,但有时注意与当前单词相关的另一个单词是有用的。

第五步是将每个 value vector 乘以 softmax 分数(准备将它们相加)。这里的直觉是保持我们想要关注的单词的值不变,并淹没不相关的单词(例如,通过将它们乘以像0.001这样的小数字)。

第六步是对加权值向量求和。这就产生了自注意层在这个位置的输出(对于第一个单词)。
在这里插入图片描述
self-attention 计算到此结束。得到的向量是我们可以发送给前馈神经网络的向量。然而,在实际实现中,为了更快地处理,这种计算是以矩阵形式完成的。因此,既然我们已经看到了单词层面计算的直觉,让我们来看看这一点。

Matrix Calculation of Self-Attention

第一步是计算Query、Key和Value矩阵。我们通过将我们的嵌入打包到矩阵X中,并将其乘以我们训练的权重矩阵(WQ, WK, WV)来做到这一点。
在这里插入图片描述
X矩阵中的每一行都对应于输入句子中的一个单词。我们再次看到嵌入向量(图中的512或4个框)和q/k/v矢量(图中的64个或3个框)的大小差异

最后,由于我们处理的是矩阵,我们可以将步骤2到步骤6浓缩成一个公式来计算自关注层的输出。
在这里插入图片描述

Reference

https://jalammar.github.io/illustrated-transformer/

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

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

相关文章

135.乐理基础-半音是小二度吗?全音是大二度吗?三全音

内存参考于:三分钟音乐社 上一个内容:134.乐理基础-音程名字的简写-CSDN博客 上一个内容里练习的答案: 半音可以与小二度划等号吗?全音可以和大二度划等号吗? 严格来说它们是不能划等号的,半音与全音是侧…

Android Studio level过滤查看各个等级的日志

Android Studio level过滤查看各个等级的日志 旧版as可以在下方的日志输出框选择debug、info,warn、error日志,新版的需要通过在过滤框手动/联想输入 level:xxx,过滤相应等级的日志,如图: android studio/idea返回/前进…

vue使用gitshot生成gif

vue使用gitshot生成gif 问题背景 本文将介绍vue中使用gitshot生成gif。 问题分析 解决思路: 使用input组件上传一个视频,获取视频文件后用一个video组件进行播放,播放过程进行截图生成图片数组。 demo演示上传一个视频,然后生…

Python 从文件中读取JSON 数据并解析转存

文章目录 文章开篇Json简介Json数据类型Json硬性规则Json数据转化网站Json和Dict类型转换json模块的使用Python数据和Json数据的类型映射json.dumps1.字典数据中含有**存在中文**2.json数据通过缩进符**美观输出**3.对Python数据类型中键进行**排序输出**4.json数据**分隔符的控…

K8S常用kubectl命令汇总(持续更新中)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Leetcode—63. 不同路径 II【中等】

2024每日刷题&#xff08;115&#xff09; Leetcode—63. 不同路径 II 动态规划算法思想 实现代码 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();…

HTTPS 原理和常见面试题及解析

在互联网安全领域&#xff0c;HTTPS 是一个非常重要的协议&#xff0c;也是很多技术岗位面试中经常涉及的话题。下面我们来看一些关于 HTTPS 的常见面试题及答案解析。 ## 1. 什么是 HTTPS&#xff1f; **答案&#xff1a;** HTTPS 是 Hypertext Transfer Protocol Secure&am…

杭州半日游 - 规划

杭州半日游 https://mbd.baidu.com/newspage/data/dtlandingsuper?niddt_4902055370698452252 11:00 到杭州站 》地铁1号线 30min 午餐可选&#xff1a; 新白鹿餐厅(银泰城店) 最近 17min 2km 知味观(湖滨总店) 30min 3km 》去码头&#xff0c;知味观(湖滨总店) 距此 120…

2024年3月5-7日年生物发酵装备展-环科环保科技

参展企业介绍 山东环科环保科技有限公司,是一家集环保设备的设计、制造、安装、服务及环境治理工程总承包于一体的企业。 公司长期专注于大气、水、危固废三大领域&#xff0c;以科技创造碧水蓝天&#xff0c;为客户提供环保解决方案。 以稳定的产品及服务质量、适用的技术、…

GIT 拉取代码报错error:some local refs could not be updated

文章目录 报错信息处理办法在这里插入图片描述小结 报错信息 ![new branch] dev->orgin/dev(unable to update local ref) error:some local refs could not be updated;try running git remote prune orginto remove any old,confilicting branches 处理办法 git gc --pru…

【Vue】路由

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 目录 路由 单页应用程序 总结&#xff1a; VueRouter 核心步骤&#xff1a; 组件存放目录的问题 路由的封装 声明式导航 声明式导航 - 导航链…

一款高温型霍尔效应传感器

一、产品概述 HAL443A单极性霍尔位置传感器是由内部电压稳压器、霍尔电压发生器、差分 放大器、温度补偿单 元、施密特触发器和集 电极开路输出级组成的磁敏传感电路&#xff0c;其输入为磁感应强度&#xff0c;输出是一个数字电压 信号。它是一种单磁极工作的磁敏电路&…

【Java程序设计】【C00327】基于Springboot的高校教师教研信息填报系统(有论文)

基于Springboot的高校教师教研信息填报系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校教师教研信息填报系统&#xff0c;本系统有管理员、教研管理以及教研人员三种角色&#xff1b; 管理员&#xff1a…

C++设计模式——抽象工厂模式

文章目录 抽象工厂模式的主要组成部分抽象工厂模式的一个典型例子抽象工厂模式用于其他场景抽象工厂模式与其他设计模式结合使用 C 中的抽象工厂模式是一种创建型设计模式&#xff0c;它主要用于处理对象家族的创建&#xff0c;这些对象之间可能存在一定的关联关系或属于相同的…

Vue页面更新后刷新页面不会渲染解决

小编今天犯了个很低级的错误&#xff0c;导致VUE页面刷新样式不会更新的问题&#xff01; 解决方法&#xff1a;查看你的路由路径大小写是否正确&#xff01;小编是犯了这种错误&#xff0c;特此分享下&#xff01;

HarmonyOS—端云一体化组件

概述 DevEco Studio还为您提供多种端云一体化组件。集成端云一体化组件后&#xff0c;您只需进行简单配置即可向应用用户提供登录、支付等众多功能。 登录组件 您可使用端云一体化登录组件向应用用户提供登录和登出功能&#xff0c;目前支持帐号密码登录、手机验证码登录、以…

k8s部署 多master节点负载均衡以及集群高可用

一、k8s 添加多master节点实验 1、master02节点初始化操作 2、在master01节点基础上&#xff0c;完成master02节点部署 ①从master01节点复制所需要的文件 需要从master01节点复制etcd数据库所需要的ssl证书、kubernetes安装目录&#xff08;二进制文件、组件与apiserver通信…

单调栈-算法题

739. 每日温度 题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示…

select * from 表 c=‘1‘ and b=‘2‘ and a=‘3‘; abc是联合索引,这样查询会命中索引吗?

倒叙也会命中索引 但是要注意&#xff0c;倒叙的时候必须要有a存在&#xff0c;否则就会索引失效 因为mysql底层会有优化器去进行优化&#xff0c;但是如果没有a的话&#xff0c;那么优化器就不知道要优化那个索引了&#xff0c;所以他走了全表&#xff0c;导致索引失效

深入理解Linux线程(LWP):概念、结构与实现机制(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…