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.hqwc.cn/news/521207.html

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

相关文章

【Linux】软件管理器yum和编辑器vim

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、Linux下安装软件的方案1.1 源代码安装1.2 rpm安装1.3 yum安装 二、Linux软件…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声,图像的能量主要集中在低频部分,而噪声和图像边缘信息的能量主要…

男人的玩具系统wordpress外贸网站主题模板

垂钓用品wordpress外贸模板 鱼饵、鱼竿、支架、钓箱、渔线轮、鱼竿等垂钓用品wordpress外贸模板。 https://www.jianzhanpress.com/?p3973 身体清洁wordpress外贸网站模板 浴盐、防蚊液、足部护理、沐浴液、洗手液、泡澡用品wordpress外贸网站模板。 https://www.jianzhan…

58代运营是什么意思?

58代运营是指由专业的代运营公司或团队来负责58同城等电商平台的商家店铺的运营管理。这种服务模式主要针对缺乏电商运营经验和专业知识的商家,代运营公司或团队通过其专业的团队和丰富的经验,帮助商家实现店铺的高效运营和品牌推广。 58代运营的服务内…

IR 召回测试数据集(中文测试集)——T2Ranking

文章排名包括两个阶段:文章检索和文章重排序,这对信息检索(IR)领域的学术界和业界来说都是重要而具有挑战性的课题。然而,常用的文章排名数据集通常集中在英语语言上。对于非英语场景,如中文,现…

Python 读取写入excel文件

使用Python读取和写入excel的xlsx、xls文件 目录 读取xlsx文件 安装三方库 引入三方库 读取数据 打开文件 表名 最大行数 最大列数 读取一张表 读取整个文件 返回xls整体内容 安装三方包 读取内容 写入xls文件 引入三方库 创建文件并写入数据 报错及解决 报错…

数据科学项目的工作流程

目录 前言1 收集数据1.1 重要性1.2 收集方法1.3 收集内容 2 分析数据2.1 描述性统计2.2 数据可视化2.3 探索性数据分析(EDA)2.4 相关性分析2.5 回归分析2.6 聚类分析2.7 时间序列分析2.8 假设检验 3 凝练成假设或者行动4 购买商品的案例4.1 调整促销策略…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展,并搜索remote ssh 它大概长这样,点击安装 安装成功后,在左侧栏会出现远程连接的图标,点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…

基于单片机的商品RFID射频安全防盗报警系统设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 3 1.1 总体设计要求 3 1.2 总体设计方案选择 3 1.3 总体控制方案选择 4 1.4 系统总体设计 5 2 项目硬件设计 7 2.1 单片机控制设计 7 2.2 按键电路设计 10 2.3 蜂鸣器报警电路设计 10 2.4 液晶显示电路设计 11 2.5 射频识别…

C++ · 代码笔记3 · 引用

目录 前言011引用初探_引用与普通变量012引用初探_引用作为函数参数013引用初探_引用作为函数返回值014引用初探_引用返回局部函数造成的错误015引用初探_多级引用020引用与指针递增的区别030const与引用040使用const限定的函数形参引用 前言 本笔记所涉及到的编程环境与 《C …

GitHub Action定时任务

GitHub Actions是GitHub推出的持续集成服务。除了持续集成常用的,push、pull_request等事件触发,还可以使用schedule设定时间自动触发。这样自己也可以做一些有用的定时任务,解放双手。 此示例在每天 5:30 和 17:30 UTC 触发工作流程&#xf…

创邻科技获评环紫金港创新生态圈智源创新企业

3月1日,由杭州城西科创大走廊管理委员会指导,中共杭州市西湖区委员会、西湖区人民政府主办的“环紫金港创新生态圈”行动推进大会暨2024年紫金港科技城经济高质量发展大会在杭州举办。凭借重要的生态位置和创新业务成果,创邻科技受邀参会并被…