Transformer中Self-Attention的详细解读

Transformer最早是在论文《Attention is All You Need》中提出的,目前已广泛应用于NLP领域,如语言翻译、文本分类、问答系统等。由于在产品规划中需要使用这样的模型结构,因此花了一些时间对其进行了一些学习理解。

除了阅读论文及配套的代码之外,还参考了Jay Alammar的技术讲解博客The Illustrated Transformer。这篇博客非常推荐Transformer的初学者,像我这样的语言模型菜鸟读起来都没什么压力。

1. Transformer模型结构

在讲Self-Attention之前,我们先来看看Transformer的结构。论文中给出的Transformer结构如下:

图1 model architecture

不同数量的Encoder和Decoder的堆叠,就可以组成不同的Transformer结构,例如在翻译模型中,可以使用6个Encoder和6个Decoder来组成整个模型:

图2 NMT模型的完整结构

那么,接下来我们看看每个Encoder和Decoder内部的结构。简单来理解,每个Encoder内部包含两大部分:Self-Attention和Feed-Forward;而Decoder内部结构则略复杂一点,比起Decoder,还多了一层Encoder-Decoder Attention。

图3 encoder和decoder内部模块划分

2.  数据流

我们关注的第二个议题是,作为文字的输入数据是如何在模型中处理的?答案就是:需要将文字转换为数字,也就是Word Embedding。这是因为机器学习算法通常要求输入为数值向量,网络并不擅长处理字符串。将词汇或短语从文字映射成实数向量,除了易于神经网络处理,另外还有两个重要而有力的特性:(1) 降维, (2) 上下文相似性,这两方面都使得语言能够被更有效地表示。

Word Embedding只在最下面一层的Encoder进行,其他Encoder接收上一个Encoder输出的向量。向量大小为512。对一整个句子中的词语完成Embedding之后,这些vector将会经过每个encoder的Self-attention层和Feed-forward层。

图4 Encoder中的数据流

从上图中我们可以看到,每一个位置的词向量按照自己的路径经过Encoder,在Self-attention模块,这些词向量会有交互,在Feed-forward模块,每个词向量是独立传播的,这也有利于它们的并行执行。

3. Self-Attention的实现

论文中对Self-attention的描述为Scaled Dot-Product Attention,并给出了实现公式:

 输入为dk维的Queries和Keys,以及dv维的Values,图形化表示如下:

图5 Scaled Dot-Product Attention

有点抽象对吧?那我们就跟随文章开头提到的那篇博客的脚步,来解释这个结构。

Self-attention的目的是要寻找输入向量(可以理解为输入语句)内部的关联,例如要翻译下面这句话:

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

那么,句子中的it指代什么呢?是指the animal,还是指the street?对于机器学习来说,这就是个问题。那么通过学习句子中不同单词的关联性,就可以知道it指代的是the animal。

图6 Self-attention应用解释示例

3.1 Self-attention的分步理解

对Self-attention的理解可以分为几个步骤:

(1) 首先,我们需要创建三个vector,分别是Query vector、Key vector和Value vector,这几个vectors的获取是通过输入的embedding和三个矩阵WQ、WK和WV相乘,这三个矩阵是网络在训练中学习到的。论文中设计的三个输出vector维度为64。

图7 Query, Key, Value三个vector的生成

(2) 接下来,我们要使用计算出来的三个vectors进行打分计算具体做法是:对每一个单词位置,计算该位置的Query vector和每一个位置的Key vector的点积,以下图为例,第一个单词在整个输入序列(本例中只有两个单词)中对应位置的分数计算分别为:q1·k1,q1·k2;同样的,如果计算第二个单词在整个输入序列对应位置的分数,则应该是:q2·k1,q2·k2。

图8 Self-attention中的score计算

(3) (4) 我们把第三步和第四步合并,首先,上面的score计算结果要除以8(见上面Attention公式,dk为64,其平方根为8),接下来进行softmax操作,将分数归一化到0~1之间,并使其和为1:

图9 对score除以8并归一化

进行以上操作之后,我们就可以看到,每个单词在每个位置上的关注度。在此例中,“Thinking”这个单词在自身位置的关注度最大。当然也会有些句子,当前位置的单词对其他位置的单词关注度比较大,比如我们前面例子中的“it”和“the animal”。

(5) 前面步骤我们已经算出了每个单词处理时,在不同位置上的关注度,相当于权重,那么接下来我们需要将该权重作用在Value vector上,可以理解为对关注位置的单词进行保持,而抑制非相关位置上单词的权重。

(6) 第六步是对第(5)步的加权向量进行求和。该步会产生Self-attention在当前单词位置的输出。

图10 求和并输出

3.2 Self-attention的矩阵实现

上面我们分步骤理解了Self-attention的原理和实现,但在实际应用中,为了快速执行,是通过矩阵的形式来进行的。那么矩阵如何实现呢?

首先,计算Query、Key和Value几个矩阵(在前面讲的分步理解中,是Query vector、Key vector和Value vector),矩阵的计算通过将输入embedding vectors打包成一个Matrix X(相当于把前面的X1、x2...堆叠在一起),再跟训练出来的权重矩阵(WQ、WK和WV)做矩阵乘法。

图11 计算Q, K, V矩阵

接下来,通过矩阵运算把3.1中的六个步骤压缩到一步中处理,如下图所示:

图12 Self-attention的完整矩阵运算

以上就是Transformer中Self-Attention的完整解读了。网络结构中还有Multi-Head Attention等结构,为了篇幅简洁,我们放在下一篇中来解读。

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

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

相关文章

JS-05-字符串

一、字符串的表示 JavaScript的字符串就是用...或"..."括起来的字符表示。 如果本身也是一个字符,那就可以用"..."括起来,比如: var a "Im ok"; 如果字符串内部既包含又包含"怎么办?可以…

每日一题-环形链表的约瑟夫问题

🌈个人主页: 会编辑的果子君 💫个人格言:“成为自己未来的主人~” /*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param n int整型 * param m int整型 * return int整型*/ typedef struct…

【MATLAB 】 EMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 EMD信号分解算法 EMD 分解又叫经验模态分解,英文全称为 Empirical Mode Decomposition。 EMD 是一种信号分解方法,它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c…

地平线零之曙光图文攻略,地平线零之曙光在MAC电脑能玩吗

《地平线零之曙光》是一款由Guerrilla Games开发的动作角色扮演游戏,。 如果你非常想在MAC电脑体验这款游戏,可以考虑通过crossover来实现在MAC电脑上进行游玩。 本文讲描述如何在MAC电脑玩地平线:黎明时分 首先下载安装好crossover&#…

想交易盈利?Anzo Capital昂首资本发现了一本畅销书

要想在复杂多变的外汇市场中迅速加深了解并想通过交易每天都可以盈利,是通过每天阅读大量的书籍吗?是每天成为行业培训网络资源和论坛的常客吗?是通过花钱请有经验的交易者进行个人培训吗?还是进行EA交易呢? 都不是&a…

【VTKExamples::Points】第二期 DensifyPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例DensifyPoints,并解析接口vtkDensifyPointCloudFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力…

第十五课 PCB保姆级规则设置(四)

1.常用的规则设置 2.设置完规则后,重新设置规则检查 将不设置的规则,不勾选 3.布线规则 (1)先走短线(模块之内的线) 模块之内的线需要连接,长线的话提前打孔(占位置)…

盘点热门的5个AI视频工具(上):附保姆级教程,居然还有免费的?(建议收藏)

一条完全使用 AI 做出的短视频,点赞上万,转发上万! 你敢信,这是我在前几天刷视频的时候,看到的一个 AI 视频案例。 这种 AI 视频为什么会火? AI 虽然不是什么新的领域,但 2023 年&#xff0c…

如何批量更改图片的创建时间和修改时间 ? 图片属性更改

在数字时代,图像已经成为我们日常生活中不可或缺的一部分。无论是在社交媒体上分享生活点滴,还是在工作报告中展示数据成果,图像都扮演着至关重要的角色。然而,有时我们可能需要对图像进行一些调整,以更好地满足我们的…

【MyBatis面试题】

目录 前言 1.MyBatis执行流程。 2.Mybatis是否支持延迟加载? 3.延迟加载的底层原理知道吗? 4.Mybatis的一级、二级缓存用过吗? 5.Mybatis的二级缓存什么时候会清理缓存中的数据? 总结 前言 本文主要介绍了MyBatis面试题相…

机器学习的魔法(一)从零开始理解吴恩达的精炼笔记

一、机器学习是什么? 1、机器学习的概念 机器学习是一种人工智能领域的技术和方法,旨在使计算机系统能够从经验数据中自动学习和改进,而无需显式地进行编程。它涉及开发算法和模型,使计算机能够自动分析和理解数据,并…

基于DoDAF的航空装备智能保障系统体系结构建模

源自:系统工程与电子技术 作者:苗学问, 董骁雄, 钱征文, 胡杨, 李牧东 “人工智能技术与咨询” 发布 摘 要 保障系统结构建模是发展和构建新一代航空装备智能保障系统的重要基础。航空装备保障系统涉及保障要素多、交联关系复杂, 需从系统工程的角度…

单链表的实现(数据结构)

本篇博客主要是单链表(无头单项不循环)的实现的代码分享 说明:因为此单链表无头(哨兵位),可以说成没有初始化也可以说初始化时没有一个有效地址作为单链表的起始地址 例如下面代码中的plist NULL。 所以在…

倒计时!数境·第七届工业互联网数据创新应用大赛即将截止报名

共赴数据之旅,赋能工业未来! 由深圳市宝安区人民政府和 中国信息通信研究院共同主办的 数境第七届工业互联网数据创新应用大赛 以“数实融合,助推新型工业化”为主题 聚焦先进制造、新能源和电子信息领域 设置算法赛和方案赛共三大赛道…

#QT(串口助手-界面)

1.IDE:QTCreator 2.实验:编写串口助手 3.记录 接收框:Plain Text Edit 属性选择:Combo Box 发送框:Line Edit 广告:Group Box (1)仿照现有串口助手设计UI界面 (2)此时串口助手大…

爬虫入门到精通_框架篇15(Scrapy框架安装)

1 Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或Python3.3版本及以上。下面说明Python3环境下的安装。 Scrapy依赖的库比较多,至少需要依赖库有Twisted14.0,lxml 3.4,pyOpenSSL 0.14。而在不同平台环境又各不相同,所以在安…

3/7—21. 合并两个有序链表

代码实现: 方法1:递归 ---->难点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {/*1.如果l1为…

2024最新图标设计趋势!附超好用的图标工具清单

图标,在界面设计中的作用不容小觑。正所谓浓缩的就是精华,一个小小的图标,却有着高效传递信息、美化界面排版、提升用户体验的巨大能力。 既然图标如此重要,了解图标设计趋势对设计师来说几乎是必须要做的事,它可以让…

python3安装chrome,chromedriver亲测有效

客户用python写了个脚本,需要用到chrome和chromedriver扩展,结果说安装不了,各种报错,好吧我来研究一下。众所周知linux自带python2.7,根据报错查了一下资料发现是版本冲突导致的,系统自带2.7,代…

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习:创建并调用函数-字符集合的并集-上机代码

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习&#xff1a;创建并调用函数-字符集合的并集-上机代码 本文环境&#xff1a; win10 Thonny4.1.4 # 函数训练字符集合的并集 def my_union(str1,str2):list1 []list2 []i 0 while i < len(str1):lis…