Transformer超详细解读

论文:Attention Is All You Need
作者:Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin
机构:Google Brain
链接:https://arxiv.org/abs/1706.03762
代码:https://github.com/tensorflow/tensor2tensor


文章目录

  • 1、算法概述
  • 2、Transformer细节
    • 2.1 Attention
    • 2.2 Position-wise Feed-Forward Networks
    • 2.3 Positional Encoding
    • 2.4 Seq2seq with Attention
  • 3、训练
  • 4、实验


1、算法概述

这篇论文是transformer的开山之作,最早transformer是用于机器翻译的,也就是NLP领域,但是随着2020年DETR和ViT的出现,它在视觉领域的应用也大火了起来,为了后续解读transformer在视觉领域的其他应用算法,有必要解读一下transformer的理论基础。

作者在论文摘要中指出,之前的处理序列信号的任务例如机器翻译都是基于复杂的循环神经网络(RNN)、长短时记忆(LSTM)或者卷积神经网络(CNN)组成的编码器和解码器,为了使其表现好点,在编码的时候还可以结合注意力机制。这篇论文,作者完全摒弃了RNN和CNN结构,只基于注意力机制,相比于RNN和LSTM的串行处理结构,作者提出的transformer结构可以实现并行处理,大大减小了处理序列的时间。如下图是传统用RNN及CNN处理序列的示意图(图片来自台湾国立大学李宏毅老师的transformer课件ppt,侵删)
在这里插入图片描述

由上图可见,RNN和LSTM这类循环神经网络是串行处理,输出一串序列,耗时长,CNN虽然可以并行处理,但它关联到序列之间的关系范围有限,需要通过不断加深网络层数来扩大范围,使其能处理更长的序列。
而自注意力是一种将单个序列的不同位置联系起来以计算该序列的表示的注意机制。在处理序列问题上,它可以完全替代RNN及CNN的角色,如下图:
在这里插入图片描述


2、Transformer细节

在这里插入图片描述
Transformer整体架构如上图所示,它使用堆叠的自注意力层和point-wise层,由编码器和解码器两部分组成。论文中编码器和解码器中的N均设置为6。

编码器中一个block由两部分组成,第一个是多头自注意机制,第二个是一个简单的、位置明智(point-wise)的全连接前馈网络。其中的Add & Norm操作为LayerNorm(x + Sublayer(x)),这里的Sublayer(x)及代表Multi-Head Attention或Feed Forward模块。

解码器中一个block则由三部分组成,除了编码器中的Multi-Head Attention和Feed Forward模块,它还包含了Masked Multi-Head Attention模块,它负责对编码器堆栈的输出执行多头注意。为了确保位置i的预测只能依赖于位置小于i的已知输出。作者修改了解码器堆栈中的自注意子层,以防止关注后续位置。

可以看出本文的创新点在于Multi-Head Attention部分,下面详细阐述这个模块的计算方式。


2.1 Attention

注意函数可以描述为将查询(query)和一组键值对(key-value pairs)映射到输出,其中查询、键、值和输出都是向量。输出以值(value)的加权和形式计算得到,其中分配给每个值(value)的权重由查询与相应键的匹配度函数计算得到。

  • Scaled Dot-Product Attention
    如下图是Q,K,V的操作示意图
    在这里插入图片描述
    用公式可表示如下:
    在这里插入图片描述
    下面以李宏毅老师的ppt来展示对于序列 (x1,x2,x3,x4) 如何一步一步计算self-attention的。
    首先xi经过矩阵W变换得到ai,通过ai得到对应的qi、ki及vi。如下图:
    在这里插入图片描述
    在这里插入图片描述
    对于q1,它和每一个ki进行点积(dot product)计算并做scale操作得到a1,i,如下图:
    在这里插入图片描述
    对a1,i做softmax操作,得到a^1,i,这里就得到计算第一个输出值的b1所需要的各个vi的权重了,如下图:
    在这里插入图片描述
    第一个输出值b1可由权重a^1,i与vi加权求和得到,如下图:
    在这里插入图片描述
    同理,第二个节点b2也可以计算得到:
    在这里插入图片描述
    主要是b1,b2,b3,b4可以利用GPU进行并行计算,如下图:
    在这里插入图片描述
    在这里插入图片描述

  • Multi-Head Attention
    多头注意允许模型在不同位置共同注意来自不同表示子空间的信息。对于单一注意力头,平均会抑制这一点,如下图所示:
    在这里插入图片描述
    用公式可以表示为:
    在这里插入图片描述
    论文中h取8,dk=dv=dmodel/h=64。
    下面还是以李宏毅老师的ppt图片来展示两个注意力头的计算方式,非常直观。
    在这里插入图片描述
    图中两个注意力头,红色椭圆框住的是第一个头,绿色椭圆框住的是第二个头,对于第一个头输出的bi,1只需对第一个头的q,k,v进行相关计算即可。第二个头的输出结果同理,如下图:
    在这里插入图片描述
    两个头最终的输出结果bi由各个头的输出结果进行concat然后通过矩阵Wo相乘得到。如下图:
    在这里插入图片描述
    多个注意力头对语句关注点可视化如下,可见每个注意力头关注点都不一样。
    在这里插入图片描述

2.2 Position-wise Feed-Forward Networks

除了注意子层之外,编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别相同地应用于每个位置。它包括两个线性连接,中间有一个ReLU激活。用公式表示为:
在这里插入图片描述

2.3 Positional Encoding

由于作者设计的模型不包含递归和卷积,为了使模型有效利用序列的顺序,需向模型引入一些关于序列中标记的相对或绝对位置的信息。为此,作者在编码器和解码器底部的输入嵌入向量(embedding)中添加了“位置编码”。位置编码与嵌入向量具有相同的维数,因此可以对两者进行求和。

位置编码有很多选择,有通过学习获得也有直接设置的,本论文作者选择了后者,采用的位置编码公式为:
在这里插入图片描述
由于公式的三角函数特性,对于固定偏移位置k,PEpos+k都可以被PEpos线性表示出来:
s i n ⁡ ( a + b ) = s i n ⁡ a c o s ⁡ b + c o s ⁡ a s i n ⁡ b sin⁡(a+b)=sin⁡a cos⁡b+cos⁡a sin⁡b sin(a+b)=sinacosb+cosasinb
c o s ⁡ ( a + b ) = c o s ⁡ a c o s ⁡ b − s i n ⁡ a s i n ⁡ b cos⁡(a+b)=cos⁡a cos⁡b-sin⁡a sin⁡b cos(a+b)=cosacosbsinasinb
而李宏毅老师的ppt中位置编码是通过学习获得的,我们可以直观感受到位置编码如何与单词embedding相加得到的,如下图,李宏毅老师中定义每个单词位置pi为one-hot编码,然后通过矩阵变换Wp得到位置编码ei,这里ei的维度和单词的embedding向量ai维度需保持一致,最后相加得到最终的单词嵌入向量进入后续的自注意力模块。
在这里插入图片描述

2.4 Seq2seq with Attention

接下来看看对于seq2seq任务中,如何应用transformer中的自注意力机制的,把Encoder-Decoder中的RNN用self-attention取代掉,如下图:
在这里插入图片描述


3、训练

训练采用WMT 2014 英语-德语数据集,它由450万个句子对,具有大约37000个标记的源-目标词汇表。而且,作者还采用了WMT 2014英语-法语数据集,它的数据量更大,包含3600百万个句子对,包含大约32000个单词,25000个源-目标词汇对应表标记。

作者用了8个NVIDIA P100 GPUs训练模型,对于base model,训练了10万个steps用了12小时,对于big model,训练了30万个steps用了3.5天。作者采用Adam优化器,warmup设置了4000个step并且采用线性变化到初始学习率,然后按步长平方根的倒数成比例递减。
在这里插入图片描述
对于模型正则化,作者采用了三种方式:Residual Dropout,每个sub-layer的输出应用dropout,还有在编码器和解码器中的单词embedding和位置编码之和处应用dropout,在base model中,drop概率设置为0.1;还有就是label smoothing,概率设置为0.1。


4、实验

机器翻译的实验结果如下:
在这里插入图片描述

参考:
[1] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L., Polosukhin, I.: Attention is all you need. In: NeurIPS (2017)
[2]https://www.bilibili.com/video/av71295187/?spm_id_from=333.788.videocard.8&vd_source=dde073a03801571dd0b077e3e88ccfb7
[3] https://zhuanlan.zhihu.com/p/340149804
[4] https://zhuanlan.zhihu.com/p/308301901

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

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

相关文章

SQL Server Query Store Settings (查询存储设置)

参考:Query Store Settings - Erin Stellato 在 SQL Server 2017 中,有九 (9) 个设置与查询存储相关。虽然这些设置记录在sys.database_query_store_options中,但我经常被问到每个设置的值“应该”是多少。我在下面列出了每个设置&am…

EXCEL VBA工程密码破解 工作表保护破解

这里写目录标题 破解Excel宏工程加密方法一 新建破解宏文件方法二 修改二进制文件 破解工作表保护引用 破解Excel宏工程加密 如图所示 白料数据处理已工程被加密。 方法一 新建破解宏文件 1 创建一个XLSM文件,查看代码 ALTF11 2 新建一个模块,“插…

夏日狂欢水上漂流的爆笑奇遇记

【夏日狂欢,水上漂流的爆笑奇遇记 —— 月亮姐姐的“睫毛漂流记”】在这个炎炎夏日,当烈日炙烤着大地,每一寸空气弥漫着对清凉的渴望时,一场别开生面的“暑期嘉年华”正悄然掀起一场水上狂欢的浪潮。而在这场盛宴中,月…

【论文】(2024.6) KAN: Kolmogorov–Arnold Networks 阅读笔记 | KAN周边扩展

KAN的优势声称是能以更少的参数量实现更高的精度。KANs在数学上是可靠的、准确的和可解释的。 一 KAN 论文题目:KAN: Kolmogorov–Arnold Networks 论文地址:https://arxiv.org/pdf/2404.19756 代码地址:https://github.com/KindXiaoming/…

如何打造一个专属网盘?可道云teamOS这些个性化设置了解一下

在这个数字化时代,企业对于云端存储和协作工具的需求日益增长。而网盘作为企业协作的重要工具之一,其个性化、定制化的需求也日益凸显。 今天,我要为大家介绍的是一款高度个性化的企业网盘——可道云teamOS。 满足个性化需求的企业网盘 可…

防火墙NAT地址转换和智能选举综合实验

一、实验拓扑 目录 一、实验拓扑 二、实验要求(接上一个实验要求后) 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…

【深度学习】PyTorch框架(4):初始网络、残差网络 和密集连接网络

1、引言 在本篇文章中,我们将深入探讨并实现一些现代卷积神经网络(CNN)架构的变体。近年来,学界提出了众多新颖的网络架构。其中一些最具影响力,并且至今仍然具有重要地位的架构包括:GoogleNet/Inception架…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时,每个小部件都被视为具有四个同心矩形的框:边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式: 边距超出边框。边框绘制在边…

自学 阿里巴巴Java开发手册最新版(嵩山版)

🔴 阿里巴巴Java开发手册最新版(嵩山版) 一、编程规约(一) 命名风格(二) 常量定义(三) 代码格式(四) OOP 规约(五) 日期时间(六) 集合处理(七) 并发处理(八) 控制语句(九) 注释规约(十) 前后端规范 二、异常日志(一) 错误码(二) 异常处理(三)…

mac环境下安装python3的图文教程

Python 是一种功能多样且强大的编程语言,在各个领域得到广泛应用。许多 Mac 用户都在其设备上安装和运行 Python,以运行特定的应用程序或创建、运行自己的 Python 脚本。 文章源自设计学徒自学网-http://www.sx1c.com/49441.html 虽然某些版本的 macOS…

沃尔玛,temu测评: 搭建稳定高效的自养号测评体系时需要考虑的关键点

​自养号测评是通过自己培养账号进行测评,‌将整个过程的主导权掌握在自己手中,‌可以有效控制测评过程,‌降低风险。建议还是自己精养一批账号,账号在自己手里比较安全可控,随时随地可以给自己送测,精准搜…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源,可轻松替代电路中的各种标准器件,并按照客户要求组合成最优小型ASIC,缩短开发周期,降低成本。下面介绍LS98002现场可重构…

openwrt安装netbird

官方版本安装后无法启动,有报错,请使用以下版本: https://github.com/tbc0309/openwrt-netbird 下载地址: https://github.com/tbc0309/openwrt-netbird/releases/ 平台架构根据自己的设备选择,可以通过以下方法获得…

【LeetCode:试题 16.06. 最小差 + 双指针 + 防止整型溢出】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Visual Studio使用——在vs中给vb.net项目添加新的窗口:新建的方式、添加已有窗口的方式

目录 引出Visual Studio使用vb添加新的窗体自定义代码片段vs显示所有文件 总结Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 引出 Visual Studio使用—…

子进程继承父进程文件描述符导致父进程打开设备文件失败

开发过程中有时会遇到需要在程序中执行三方程序或者shell脚本,一般会通过system(), popen(), exec簇来完成该功能。我们知道以上方法会通过fork创建子进程后在子进程中执行相应指令。如图1为某个示例流程,具体的程序执行流程如图2所示,线程my…

[RK3588-Android12] 关于如何取消usb-typec的pd充电功能

问题描述 RK3588取消usb-typec的pd充电功能 解决方案: 在dts中fusb302节点下usb_con: connector子节点下添加如下熟悉: 打上如下2个补丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…

Linux文本工具之-Vim(一)

一、模式 1、普通模式 这是使用Vim打开一个文件时,Vim的默认模式。在普通模式下,您可以使用各种命令来移动光标、删除、复制、粘贴和其他编辑操作 2、插入模式 在插入模式下,您可以像在其他文本编辑器中一样输入和编辑文本。按下键盘上的…

2024年【北京市安全员-C3证】证考试及北京市安全员-C3证作业模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-C3证证考试根据新北京市安全员-C3证考试大纲要求,安全生产模拟考试一点通将北京市安全员-C3证模拟考试试题进行汇编,组成一套北京市安全员-C3证全真模拟考试试题,学员…

06. Hibernate 中主键映射的助攻

1. 前言 本节课和大家一起聊聊 Hibernate 中的主键策略。通过本节课程,你将了解到: 什么是主键策略及主键生成器的种类;如何映射复合主键。 2. 主键策略 Hibernate 进行数据库操作时,可依靠主键生成器组件更快速、准确地进行一…