Attention is all you need论文学习

news/2025/11/30 19:01:30/文章来源:https://www.cnblogs.com/quan9i/p/19289944

前置知识

注意力机制

注意力机制的核心思想来源于人类在感知外部信息时所展现出的选择性注意能力。在面对复杂信息或长序列时,人类不会平均地处理所有信息,而是有选择地关注其中对当前任务更关键的部分。

深度学习中的注意力机制正是对这一现象的模拟,它使得神经网络在处理序列或结构化数据时,能够动态地调整对不同信息部分的关注程度。传统的神经网络在处理序列输入(如句子)时,往往将所有输入编码成一个固定维度的向量。这种方式在短序列上表现尚可,但在面对长序列时,容易导致关键信息的丢失。

注意力机制通过引入可学习的权重,对输入序列中的每一个元素动态赋权,使得模型可以聚焦于与当前预测任务更相关的信息,从而提升表达能力与泛化性能。

公式表达

注意力机制通常有三个向量,Q(查询),K(键),V(值),这里我们的目的就是为了计算Q和K的相似度,然后通过Softmax函数转换为概率分布。

缩放点积注意力

通常采用的是缩放点击注意力,其公式如下

image-20251127161927738

常见的注意力计算方式有三种,最常见的就是上面的缩放点积注意力,还有两种分别是点积注意力和加性注意力。

点击注意力

点击注意力就是没有进行缩放的,这种虽然计算较为简单一些,但会引发一个问题就是可能会引发梯度爆炸和梯度消失的情况,比如QKT=[12,3,1],那么再经过Softmax处理后,e的12次是远超e的3次方和e的,所以概率几乎达到了100%。其公式如下

image-20251127162317339

加性注意力

加性注意力并没有对两个向量进行直接相乘,而是对Q和K进行拼接,然后经过非线性激活函数(tanh)处理再乘上vT,最终进行softmax函数得到概率分布。

需要注意的是这里的v是一个可学习的向量,而非上面QKV中的V(值)。

image-20251127163243190

image-20251127163250314

类型

自注意力

自注意力的Q、K、V均来自同一序列,它常用于图像或句子,挖掘出像素与像素或词与词之间的关系。

示例:苹果是一种酸甜可口的水果,它受很多人喜欢。这句话经过自注意力处理后,就可以得出它是代指苹果。

交叉注意力

Q来自目标序列,K,V来自源序列,实现跨序列交互。

示例:Transfrom解码器生成输出时,一部分输入来自编码端的输出。

多头注意力

这个并不是第三种类型,它只是有多个自注意力头或者交叉注意力头,核心思想是将将Q、K、V投影到多个子空间,并行计算多组注意力,增强模型表达能力,类似于卷积中的多通道。

步骤:

1、将Q、K、V拆分为指定的n个头

2、每个头单独计算注意力,每个头中对应的Wq,Wk,Wv权重也不同

3、拼接所有头的输出,并通过线性层融合。

归一化

层归一化旨在提升训练的稳定性和模型的泛化能力,常见的有两种,一种是BatchNorm,一种是LayerNorm,接下来讲述二者区别。

假设张量的形状为 (batch_size, feature_size),其中 batch_size=32feature_size=512

batch_size:表示批次中的样本数量。
feature_size:表示每个样本的特征维度,即每个样本包含 512 个特征。

这里的一行就对应一个样本,一列就对应一种特种维度。

BatchNorm 基于一个批次(batch)内的所有样本,针对特征维度(列)进行归一化,即在每一列(相同特征或嵌入维度上的 batch_size 个样本)上计算均值和方差。

对第j列(特征)计算均值和方差:

image-20251128123714086

LayerNorm 基于每个样本的所有特征,针对样本自身(行内所有特征)进行归一化,即在每一行(一个样本的 embed_size 个特征)上计算均值和方差

image-20251128123803470

操作 处理维度 解释
BatchNorm 对列(特征维度)归一化 每个特征在所有样本中的归一化
LayerNorm 对行(样本内的特征维度)归一化 每个样本的所有特征一起归一化

如下图所示

这个是BatchNorm,它每次取一个特征,切一块(蓝色线),拉成一个向量,均值为 0 、方差为 1 的标准化。

img

这个是LayerNorm,它每次取一个样本,在一个样本中取所有特征(图中黄色)。

image-20251128162011398

流程

该论文摒弃了传统的RNN和LSTM,独创了一种只依靠注意力实现的架构,且使得效果很好。

image-20251127230926157

编码器

(1)输入编码和信息编码

首先进行输入,再进行输入时,机器是无法理解我们所输入的语言的,所以需要进行Input Embedding,将文字转换为机器识别的向量,然后进行位置编码。

这里为什么要进行位置编码呢

这是因为在之前的RNN中,它们是从前往后进行的,是有次序的,想得到Tn的前提是有T1....Tn-1,而Transfrom则不同,它是读取全局,如果打乱顺序拆分所有句子成词,就无法找到其对应先后顺序,因此,我们对位置进行编码,以此获取对应前后关系。

这里具体使用的函数是

image-20251128123010805

通过正弦函数和余弦函数处理,可以使得编码大小是都差不多的,位于0-1之间,而且满足了不同的pos之间有相对关系。

(2)多头注意力

这里一个输入被拆分为了三个,他们也就是上面讲的Q、K、V,同时可以看出,这里使用的就是自注意力。自注意力的QKV来源于Embedding和权重相乘得到,具体如下:

image-20251128173028801

自注意力的具体计算方式是:一个Query会给定n个keyvalue对,这个query和每个keyvalue做内积得到n个相似度,然后使用Softmax函数就可以得到n个非负、和为1的权重值。然后把Value和权重值相乘,就得到了Attention输出。

实际中,因为数据较多,所以不会一个一个的计算,通常是使用把它们写成矩阵的形式进行计算。

Q:n*dk
K:m*dk
Q*KT:n*m

其中,dk是K的维度

编码器用的是是多头注意力,其实就是用了多个自注意力头来进行,其计算方式如下:

image-20251128112629410

至于为什么要使用多头注意力,是因为与其做一个单个的注意力函数,不如使用h组不同的投影权重,将输入投影到h个不同的低维子空间,然后再做 h 次的注意力函数,把每一个函数的输出 拼接在一起,然后 再次投影,因为拼接只是将各个维度的值汇总了,但是并没有融合,再次投影就可以将各个维度的进行混合,得到最终的输出。

其中的Add&Norm是指进行残差网络以及进行归一化。

每个子层的输出可以用如下公式来进行描述:

image-20251128112225435

这里为什么要使用LayerNorm而非BatchNorm,是因为Seq这个长度是不固定的,每次的句子有长有短,我们按照BatchNorm的方法,它会对长的和短的进行平均,然后算出均值和方差,而当遇到一个全局的较长的,训练时未曾见过的全新序列,训练时计算的均值和方差可能不好用。

img

相反来看LayerNorm归一化,他是每次只有一个样本,每次都是对每个样本自己算的均值和方差,不需要存全局的均值和方差

img

(3)前向反馈神经网络

接下来进行的是前馈神经网络,其实就是MLP,然后再次进行拼接和归一化。

image-20251128112659696

解码器

(1)输出编码和信息编码

Decoder对输出进行编码和信息编码,同之前编码器的输入所处理的流程相同。

(2)掩码多头注意力机制

这里为什么要多掩码二字,这是因为和编码器不同,解码器的输出是一个接一个的,所以它应该看之前的,而不应该关注后面的,举个例子,我们输出Th时,我们只有Th-1的信息,Th是需要我们进行预测的,所以Th...Tn我们是不能让它提前知道的,要对其进行掩码处理。

这个掩码Mask如何实现呢,如果我们直接设置为0的话,经过Softmax后它并不是0(e的0次方是1),所以我们这里设置它为一个很大的负数即可。

(3)多头注意力和前馈网络

同之前的编码器的操作一样,不同的是这里的Q是来自解码器,K,V均来自编码器。

(4)线性层+Softmax

通过线性层转换为一维向量,最后经过Softmax输出概率分布。

常见问题

Transform相关常见问题可以看这篇文章

https://zhuanlan.zhihu.com/p/496012402?utm_medium=social&utm_oi=629375409599549440

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

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

相关文章

loj 515 贪心只能过样例

DP 题。 设 \(f_{i ,j}\) 为前 \(i\) 个数能否凑出 \(j\),转移即为: \[f_{i ,j} \gets f_{i ,j} \ \operatorname{or}\ f_{i ,j - k^2} \left( a\le k \le b\right) \]时间复杂度为 \(\mathcal O(n^5)\)。 注意这个式…

从数据采集到智能诊断:阿尔泰科技实时高精度远距离管道状态监测全流程 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2D3DICL-I2PReg论文学习

公式解读 前情提要:什么是相机 相机是虚拟的,实际上,它是指一个数学模型,它定义了我们如何将三维空间的点映射到二维照片上,它包含外参和内参,其中: (1)外参是指你所站的位置t,和你的朝向R。这个描述了相机在…

Spring使用el表达式

Spring使用el表达式 0. 背景 在项目中需要一个可动态执表达式的功能.项目本身是基于Springboot,可直接使用Spring提供的核心模块Spring Expression Language(SpEL). 在测试前,需要了解一些基本前置条件整体可以按照jav…

《程序员修建之道:从小工到专家》阅读笔记2

《程序员修建之道:从小工到专家》阅读笔记2当正确的 mindset 确立后,我们需要更高级的方法论来应对软件固有的复杂性。《程序员修炼之道》在软件设计方面提供了许多历久弥新的智慧,这些原则帮助我们在刚性与柔性、当…

《程序员修建之道:从小工到专家》阅读笔记3

《程序员修建之道:从小工到专家》阅读笔记3在技术快速迭代的今天,程序员最宝贵的资产不是当前掌握的某个框架或语言,而是持续学习与知识管理的能力。《程序员修炼之道》将我们的职业素养视为需要精心管理的"知…

AipexBase怎么用?AI 原生BaaS平台一句话做后端开发 - 实践

AipexBase怎么用?AI 原生BaaS平台一句话做后端开发 - 实践2025-11-30 18:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

CCPC2025 重庆站游记

游记开场写了 A,听了一下队友的 BE。然后一个小时的时候会了 F,看还没队过就开始抢一血,但直到封榜前这个题过了三十多个队了还一直过不去。中间会了 J,感觉这个题没道理才过四个队,趁着队友写 M 的间隙写完了。封…

完整教程:Elasticsearch:分布式搜索引擎数据库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

wsl基本使用以及使用过程中遇到的问题

使用 任务栏搜索框中输入“Ubuntu xx.xx”后,直接进入对应Linux系统问题 1.git clone失败 fatal: unable to access https://github.com/xxx/xxx.git/: GnuTLS recv error (-110): The TLS connection was non-proper…

人工智能之数据分析 Matplotlib:第五章 常见函数

人工智能之数据分析 Matplotlib:第五章 常见函数人工智能之数据分析 Matplotlib 第五章 常见函数@目录人工智能之数据分析 Matplotlib前言一、Matplotlib 图像处理三剑客:imread / imshow / imsave1. plt.imread() …

CTF基础介绍与入门讲解

什么是CTF夺旗赛 CTF(Capture The Flag,夺旗赛) 是一种流行的信息安全竞赛形式,起源于1996年的DEFCON大会。CTF竞赛通过解决各种网络安全相关的挑战,帮助参赛者提升技术能力,同时也为网络安全领域培养人才。 当然…

2025/11/29 今天上课所以没有自我学习

2025/11/29 今天上课所以没有自我学习今日没有学习新内容,把前两天的内容随笔写了一下

基于大数据的全国降水可视化分析预测框架

基于大数据的全国降水可视化分析预测框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Day7-20251130

Java标识符与数据类型摘要: Java标识符命名规则:必须以字母、$或_开头,后续可包含数字,区分大小写且不能使用关键字。虽然支持中文命名但不推荐。 数据类型分为基本类型和引用类型。基本类型包括:数值类型:byte(…

Java项目中最常用的6个设计模式

在 Java 项目开发中,以下 6 种设计模式因实用性强、应用场景广泛而被高频使用: 1. 单例模式(Singleton Pattern) 用途:确保一个类仅有一个实例,并提供全局访问点。场景:线程池、数据库连接池、配置类、日志工具…

记录容器云基于debian镜像的自由组合

当然很多镜像都是有着专用的功能,这也是docker的设计目标,但是有时候我们也想把docker当vps使用。 所以,就想基于debian的镜像自由发挥。。。第一步:基于 debian:12-slim 开启一个容器 关键要设置:挂载一个目录,…

IDEA中使用http协议

IDEA中使用http协议三、如何使用协议 3.1使用http协议 项目右键-》Git -》 repository -》 remote -》选择http协议的地址3.2 使用ssh协议 首先Git Bash或软件生成SSH秘钥 生成秘钥请参考 SSH公钥默认存储在账户的主目…

详细介绍:Elasticsearch从入门到实践:核心概念到Kibana测试与C++客户端封装

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C语言结构体全面解析与内存优化 - 实践

C语言结构体全面解析与内存优化 - 实践2025-11-30 18:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…