详解Transformer (Attention Is All You Need)

news2025/2/22 16:29:31

先导知识

  • Attention
  • 残差网络
  • Layer Normalization

前言

注意力(Attention)机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或者特征。谷歌团队近期提出的用于生成词向量的BERT[3]算法在NLP的11项任务中取得了效果的大幅提升,堪称2018年深度学习领域最振奋人心的消息。而BERT算法的最重要的部分便是本文中提出的Transformer的概念。

正如论文的题目所说的,Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。

作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:

  1. 时间片 � 的计算依赖 �−1 时刻的计算结果,这样限制了模型的并行能力;
  2. 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。

Transformer的提出解决了上面两个问题,首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。论文中给出Transformer的定义是:Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution。

遗憾的是,作者的论文比较难懂,尤其是Transformer的结构细节和实现方式并没有解释清楚。尤其是论文中的 � , � , � 究竟代表什么意思作者并没有说明。通过查阅资料,发现了一篇非常优秀的讲解Transformer的技术博客[4]。本文中的大量插图也会从该博客中截取。首先感谢Jay Alammer详细的讲解,其次推荐大家去阅读原汁原味的文章。

1. Transformer 详解

1.1 高层Transformer

论文中的验证Transformer的实验室基于机器翻译的,下面我们就以机器翻译为例子详细剖析Transformer的结构,在机器翻译中,Transformer可概括为如图1:

图1:Transformer用于机器翻译

Transformer的本质上是一个Encoder-Decoder的结构,那么图1可以表示为图2的结构:

图2:Transformer的Encoder-Decoder结构

如论文中所设置的,编码器由6个编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入,如图3所示:

图3:Transformer的Encoder和Decoder均由6个block堆叠而成

我们继续分析每个encoder的详细结构:在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量 � ,这个 � 便是论文公式1中的 Attention(�,�,�) :

(1)Attention(�,�,�)=softmax(�����)�

第一次看到这个公式你可能会一头雾水,在后面的文章中我们会揭开这个公式背后的实际含义,在这一段暂时将其叫做 � 。

得到 � 之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:

(2)FFN(�)=���(0,��1+�1)�2+�2

Encoder的结构如图4所示:

图4:Transformer由self-attention和Feed Forward neural network组成

Decoder的结构如图5所示,它和encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:

  1. Self-Attention:当前翻译和已经翻译的前文之间的关系;
  2. Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。

图5:Transformer的解码器由self-attention,encoder-decoder attention以及FFNN组成

1.2 输入编码

1.1节介绍的就是Transformer的主要框架,下面我们将介绍它的输入数据。如图6所示,首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量,论文中使用的词嵌入的维度为 ������=512 。

图6:单词的输入编码

在最底层的block中, � 将直接作为Transformer的输入,而在其他层中,输入则是上一个block的输出。为了画图更简单,我们使用更简单的例子来表示接下来的过程,如图7所示:

图7:输入编码作为一个tensor输入到encoder中

1.3 Self-Attention

Self-Attention是Transformer最核心的内容,然而作者并没有详细讲解,下面我们来补充一下作者遗漏的地方。回想Bahdanau等人提出的用Attention\[2\],其核心内容是为输入向量的每个单词学习一个权重,例如在下面的例子中我们判断it代指的内容,

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

通过加权之后可以得到类似图8的加权情况,在讲解self-attention的时候我们也会使用图8类似的表示方式

图8:经典Attention可视化示例图

在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( � ),Key向量( � )和Value向量( � ),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 � 乘以三个不同的权值矩阵 �� , �� , �� 得到,其中三个矩阵的尺寸也是相同的。均是 512×64 。

图9:Q,K,V的计算示例图

那么Query,Key,Value是什么意思呢?它们在Attention的计算中扮演着什么角色呢?我们先看一下Attention的计算方法,整个过程可以分成7步:

  1. 如上文,将输入单词转化成嵌入向量;
  2. 根据嵌入向量得到 � , � , � 三个向量;
  3. 为每个向量计算一个score: score=�⋅� ;
  4. 为了梯度的稳定,Transformer使用了score归一化,即除以 �� ;
  5. 对score施以softmax激活函数;
  6. softmax点乘Value值 � ,得到加权的每个输入向量的评分 � ;
  7. 相加之后得到最终的输出结果 � : �=∑� 。

上面步骤的可以表示为图10的形式。

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

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

相关文章

kvm GPU直通/GPU透传 之修改Windows虚拟机分辨率

为了方便对服务器进行自动管理,我们需要对硬件进行虚拟化。对于显卡而言,Nvidia有专门支持GPU虚拟化的显卡,比如GRID GPU系列。以NVIDIA GRID K2为例,显存8GB,可虚拟出2块GPU。 对于GTX系列的显卡,如果Host主机为linux系统,想将显卡给虚拟机(windows或者linux)使用,…

函数的栈帧与销毁(栈帧可不是战争哦)

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言》专栏,笔者用重金(时间和精力)打造,将C语言知识一网打尽,希望可…

码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal)

码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal) 前言一、引用类型二、ThreadLocal价值三、ThreadLocal副作用 前言 “水能载舟,亦能覆舟。”用这句话来形容 ThreadLocal 最贴切不过。ThreadLocal 初衷是在线程并…

《C和指针》笔记3:置一和清零

在C语言中&#xff0c;移位运算符<<和>>表示二进制数左移或右移&#xff0c;我们可以利用它们很轻松地对变量中单个位进行置一和清零。 我们可以规定变量二进制数最右边一位是第0位&#xff0c;定义bit_number是0&#xff0c;对应地&#xff0c;从最右边一位往左数…

iOS开发系列--打造自己的“美图秀秀”

--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果&#xff0c;一方面得益于成功系统的设计&#xff0c;另一方面得益于它强大的开发框架。今天我们将围绕iOS中两大图形、图像绘图框架进行介绍&#xff1a;Quartz 2D绘制2D图形和Core Image中强大的滤镜功能…

【OpenVinoSharp】基于C#和OpenVINO部署PaddleOCR模型

基于C#和OpenVINO部署PaddleOCR模型 1.OpenVINO2.PaddleOCRPP-OCRv2PP-OCRv3 3.模型下载与转换3.1 Detection model3.2 Direction classifier3.3 Recognition model 4.OpenVinoSharp安装4.1 获取OpenVinoSharp源码4.2 配置OpenVINO依赖项 5. PaddleOCR5. 1模型推理C#实现&#…

Kali 安装中文输入法(超详细)

1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的命令。 apt install fcitx 4.敲击回车后会开始安装&#xff0c;这里输入“y”。 5.回车后会继续进行安装&#xff0c;安装完成后会自动停止。 6.输入下面的命令来安装google输入法。 apt-get in…

【Python】【进阶篇】22、Django模板加载与响应

目录 22、Django模板加载与响应1. 什么是模板1) 模板的配置2) 修改settings配置文件 2. 模板的加载与响应方式3. render方法详解 22、Django模板加载与响应 在前文章节《Django模板系统》中&#xff0c;我们对 Django 的模板系统有了初步的认识&#xff0c;在本章我们将重点讲…

mongodb v4.4.19 分片精进实操,吐血分享

第一步&#xff1a;创建文件夹&#xff0c;data1111存放config server,data2222/data3333存放shard 第二步&#xff1a;启动服务 2.1 启动config server 2.2 启动shard --port 设置端口 --dbpath 设置数据库路径 --logappend 使用追加的方式写日志 --replS…

ReentrantLock原理剖析

前言 本文主要讲解底层逻辑&#xff0c;基本不会贴代码&#xff0c;目的是让大家能够真正的知晓原理&#xff0c;对照着逻辑去理解代码看代码也会很快就能看懂。 在讲ReentrantLock原理之前&#xff0c;我们先回顾下ReentrantLock的基本用法。ReentrantLock是一个锁编程api&am…

Compiler Lab2- 自制极简编译器

笔者实现的这个超级迷你版编译器&#xff08;词法分析、语法分析、生成中间代码&#xff08;cpp&#xff09;&#xff09;仅支持四则运算&#xff0c;功能真的是非常非常简单&#xff0c;不过其中的流程&#xff08;词法分析 -> 语法分析 -> 中间代码生成&#xff09;还是…

各SQL引擎的SQL转换过程对比

SQL引擎 参考文档:高级语言的解析过程—解析树 从 MySQL、Oracle、TiDB、CK,到 Hive、HBase、Spark,从关系型数据库到大数据计算引擎,他们大都可以借助 SQL 引擎,实现 “接受一条 sql 语句然后返回查询结果” 的功能。 他们核心的执行逻辑都是一样的,大致可以通过下面…

【五一创作】《嵌入式系统》知识总结7:GPIO寄存器

总述 每组端口具有7个寄存器 • 实现对GPIO端口初始化配置和数据输入输出控制 1. 配置寄存器&#xff1a;GPIOx_CRL、GPIOx_CRH 用来选择引脚功能&#xff0c;例如输入或输出 2. 数据寄存器&#xff1a;GPIOx_IDR、GPIOx_ODR 用来保存引脚输入电平或输出电平 3. 位控寄存器…

数据库管理-第七十一期 五一,休息?(20230503)

数据库管理 2023-05-03 第七十一期 五一&#xff0c;休息&#xff1f;1 备份2 两个DDL3 问题处理4 问题排查总结 第七十一期 五一&#xff0c;休息&#xff1f; 好不容易&#xff0c;熬过万恶的6天班来到了五一假期&#xff0c;想着好好休息&#xff0c;顺便把绝地幸存者给通关…

Java 基础进阶篇(九)—— 常用 API

文章目录 一、Object 类二、Objects 工具类三、Math 类四、System 类五、BigDecimal 类 一、Object 类 一个类要么默认继承了 Object 类&#xff0c;要么间接继承了 Object 类&#xff0c;Object 类是 java 中的祖宗类。Object 类的方法是一切子类都可以直接使用的。 因此&…

Obsidian +Obsidian Git插件 + Gitee 自动同步笔记

在Obsidian 关闭安全模式 然后再插件市场里面搜索并下载Obsidian Git 这个插件 注意&#xff1a;这里需要科学上网才能搜索并下载&#xff0c;我看很多博主都没说这件事情 然后再你的Gitee中&#xff0c;新建一个仓库 把这两个勾选上&#xff0c;然后随便选个语言&#xff0…

【JavaEE】应用层UDP协议

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将为大家介绍应用层中UDP协议~~ 在应用层这里&#xff0c;虽然存在一些现有的协议&#xff08;HTTP&#xff09;&#xff0c;但是也有很多情况&#xff0c;需要程序猿自定制协议&a…

Windeployqt 打包,缺少DLL 的原因分析,解决方法

很多同学使用工具windeployqt进行打包发布后&#xff0c;运行exe文件时&#xff0c;还是会出现下图所示的系统错误提示&#xff0c;这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显示运行正常啊&#xff0c;难道是QT自家的windeployqt这个工具有bug&…

2024年浙大MBA创客班项目提面如何申请?

2024年浙大MBA创客班提面如何申请&#xff1f;在目前的提前批面试申请过程中不少考生都不太清楚&#xff0c;专注浙大的杭州达立易考教育本期将项目的提前批面试和常规批复试申请基本流程和关键信息整理出来&#xff0c;帮助考生更精准的进行面试准备。 一、浙大MBA创客班项目…

基于比较排序算法总结

1.数据无法全部放入内存 2.数据以数据流形式