一文详解Attention机制

本文深入解析了Attention机制在解决Seq2Seq模型中长句处理问题上的应用。Attention使Decoder能关注到Encoder的所有状态,通过计算相关性权重,形成Contextvector,有效解决RNN遗忘问题。尽管计算量大,但其全局联系捕捉、并行计算和模型简洁性等优点显著。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Attention机制

我们知道Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全,我们看一下下面这个图,纵轴BLUE是机器翻译的指标,横轴是句子的单词量,我们可以看出用了attention之后模型的性能大大提升。
在这里插入图片描述
用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。
在这里插入图片描述

Attention原理

在encoder结束之后,attention和decoder同时工作, 回忆一下,decoder的初始状态 s0s_{0}s0 是 encoder最后一个状态, 不同于常规的Seq2Seq, encoder所有状态都要保留,这里需要计算 s0s_{0}s0 与每个状态的相关性, 我使用 αi=aligh⁡(hi,s0)\alpha_{i}=\operatorname{aligh}\left(h_{i}, s_{0}\right)αi=aligh(hi,s0) 这个公式表示计算两者相关性,把结果即为 αi,\alpha_{i},αi, 记做Weight, encoder有m个状态, 所以一共有m个 α,\alpha,α, 这里所有的值都是介于0和1的实 数, 全部加起来为1。
在这里插入图片描述
下面看一下怎么计算这个相似性。第一种方法是把 hih_{i}hiSoS_{o}So 做concat得到更高的向量,然后求矩 阵W与这个向量的乘积, 得到一个向量, 然后再将tanh作用于向量每一个元素,将他压到-1和1之 间,最后计算向量V与刚才计算出来的向量的内积, 这里的向量V和矩阵W都是参数,需要从训练 算出m个 α\alphaα 后,需要对他们做一个softmax变换, 把输出结果记做 α1\alpha_{1}α1αm,\alpha_{m},αm, 因为 是softmax输出,所以他们都大于0相加为1,这是第一篇attention论文提出计算的方法,往后有 很多其他计算的方法,我们来介绍一种更常用的方法。
在这里插入图片描述
输入还是 hih_{i}hiS0,S_{0},S0, 第一步是分别使用两个参数矩阵 Wk,WqW_{k}, \quad W_{q}Wk,Wq 做线性变换, 得到 kik_{i}kiq0q_{0}q0 这两 个向量, 这两个参数矩阵要从训练数据中学习。第二步是计算 kik_{i}kiq0q_{0}q0 的内积, 由于有m个K向 量, 所以得到L个 αi\alpha_{i}αi 。第三步就是对这些值做一个softmax变换, α1\alpha_{1}α1αm,\alpha_{m},αm, 因为是softmax输 出,所以他们都大于0相加为1。这种计算方法被Transformer模型采用, Transformer模型是当前 很多nlp问题采用的先进模型。
在这里插入图片描述
刚才讲了两种方法来计算 hih_{i}hiS0S_{0}S0 的相关性,现在我们得到了m个相关性 α,\alpha,α, 每个 α\alphaα 对应每个状 态 hi,h_{i},hi, 有了这些权車 α\alphaα 我们可以对m个状态计算加权平均, 得到一个Context vector C0C_{0}C0 。每一 个Context vector都会对应一个decoder状态 sis_{i}si
在这里插入图片描述
接下来我们来看一下decoder是怎么计算新的状态的。我们来回顾一下,假如不用attention,我 们是这样更新状态的,新的状态 S1S_{1}S1 是旧状态 S0S_{0}S0 与新输入 X1X_{1}X1 的函数, 看一下下图左边的公式, 将两者做concat,然后乘上权重矩阵加上偏置b, 最后通过tanh就是我们的新状态,也就是说状态 的更新仅仅是根据上一个状态,并不会看encoder的状态。用attention的话更新状态还要用到我 们计算出的Context vector C0,C_{0},C0, 把三个参数一起做concat后更新。
在这里插入图片描述
回忆一下, C0C_{0}C0 是所有encoder状态 hih_{i}hi 的加权平均, 所以 C0C_{0}C0 知道输入 X1X_{1}X1XmX_{m}Xm 的完整信息, decoder新的状态 S1S_{1}S1 依赖于 C0,C_{0},C0, 这样RNN遗忘的问题就解决了。下一步则是计算context vector C1,C_{1},C1, 跟之前一样, 先计算权重 αi,\alpha_{i},αi, 这里是计算 S1S_{1}S1 跟之前encoder所有状态的相关性, 得到了m个 α,\alpha,α, 注意一下这里的权重也是要更新的,上一轮算的是跟 s0s_{0}s0 的相关性现在算的是跟 S1S_{1}S1 的相关性,这样就可以通过加权平均计算出新的 C1C_{1}C1
在这里插入图片描述
Decoder接受新的输入 X 2,_{2},2, 还是用那个公式计算出新状态, 然后一直循环下去直到结束。
在这里插入图片描述
我们知道在这个过程中我们会计算出很多权車 αi,\alpha_{i},αi, 我们思考一下我们究竟计算了多少个 α\alphaα ?想要 计算出一个context vector Cj,C_{j},Cj, 我们要计算出m个相似性权重 α,\alpha,α, 所以每轮更新都需要计算m个 权重,假如一共有t个state, 那么一共就要计算m\timest个权重, 也就是encoder和decoder数量的乘 积。attention为了不遗忘,代价就是高数量级的计算。
在这里插入图片描述

更抽象的理解

简而言之,Attention 机制就是对输入的每个元素考虑不同的权重参数,从而更加关注与输入的元素相似的部分,而抑制其它无用的信息,具体是通过一个叫做attention函数来实现的,它是用来得到attention value的。比较主流的attention框架如下:
在这里插入图片描述
上图其实可以描述出attention value的本质:它其实就是一个查询(query)到一系列键值(key-value)对的映射。

更具体的,也就是attention函数的工作实质,如下图所示:
在这里插入图片描述
可以看出Attention其实就是把序列中各个元素分配一个权重系数,上面从attention函数是attention机制的工作过程。现在换一个角度来理解,我们将attention机制看做软寻址。就是说序列中每一个元素都由key(地址)和value(元素)数据对存储在存储器里,当有query=key的查询时,需要取出元素的value值(也即query查询的attention值),与传统的寻址不一样,它不是按照地址取出值的,它是通过计算key与query的相似度来完成寻址。这就是所谓的软寻址,它可能会把所有地址(key)的值(value)取出来,上步计算出的相似度决定了取出来值的重要程度,然后按重要程度合并value值得到attention值,此处的合并指的是加权求和。

Attention 的优缺点

优点:

  • 一步到位的全局联系捕捉。attention机制可以灵活的捕捉全局和局部的联系,而且是一步到位的。另一方面从attention函数就可以看出来,它先是进行序列的每一个元素与其他元素的对比,在这个过程中每一个元素间的距离都是一,因此它比时间序列RNNs的一步步递推得到长期依赖关系好的多,越长的序列RNNs捕捉长期依赖关系就越弱。
  • 并行计算减少模型训练时间。Attention 机制每一步的计算都不依赖于上一步的计算结果,因此可以并行处理。
  • 模型复杂度小,参数少

缺点:
缺点很明显,attention机制不是一个"distance-aware"的,它不能捕捉语序顺序(这里是语序哦,就是元素的顺序)。这在NLP中是比较糟糕的,自然语言的语序是包含太多的信息。如果确实了这方面的信息,结果往往会是打折扣的。 当然这个缺点也好搞定,再添加位置信息就好了,所以就有了 position-embedding(位置向量)的概念了,这里就不细说了。

转载来源
https://zhuanlan.zhihu.com/p/135970560
https://zhuanlan.zhihu.com/p/35571412?spm=a2c4e.10696291.0.0.3f4619a49c8SGU
https://www.cnblogs.com/ydcode/p/11038064.html

### Vision Transformer (ViT) 的详细解释、原理、架构与实现 #### ViT 的核心概念 Vision Transformer 是一种基于 Transformer 架构的深度学习模型,其设计初衷是为了处理视觉任务。传统的卷积神经网络(CNNs)主导了计算机视觉领域多年,然而随着自然语言处理中 Transformer 的成功应用,研究者们尝试将其扩展到图像识别等领域。ViT 将图像分割成固定大小的小块(patches),并通过线性变换将这些小块映射为一维向量序列[^1]。 #### 图像预处理流程 在实际应用中,输入的高分辨率图像会被划分为多个不重叠的小块(flattened patches)。每个 patch 被视为独立的 token,并通过一个可训练的线性层投影至统一维度的空间。这一过程被称为 **Linear Projection of Flattened Patches**,它是 ViT 模型的关键部分之一[^3]。 #### 自注意力机制的作用 自注意力机制允许模型动态调整不同区域的重要性权重,从而捕捉全局依赖关系。相比于 CNN 中局部感受野的设计理念,Transformer 可以一次性关注整个输入序列,这使得它更适合建模复杂的长距离交互模式。具体来说,在编码器阶段,每个多头注意力模块会计算 query、key 和 value 向量之间的相似度得分,进而生成加权后的特征表示[^2]。 #### 位置嵌入的意义 由于原始 Transformer 设计用于处理顺序数据(如文本句子),因此需要引入额外的位置信息来保留 tokens 在原图中的空间布局特性。通常采用的方法是在输入 embedding 上叠加一组固定的正弦/余弦波形或者随机初始化并随时间优化得到的学习型参数作为绝对位置编码[^2]。 #### 整体架构描述 完整的 ViT 结构由以下几个组件构成: - 输入准备:把图片切分成若干个相同尺寸的patch; - Embedding 层:执行上述提到过的 flatten operation 加 linear transformation 得到初始 embeddings; - Positional Encoding 添加步骤; - 多层堆叠的标准 transformer encoder blocks —— 包含 multi-head self attention layer 和 feed forward network layers; - Classification head 输出最终预测类别概率分布。 以下是 Python 实现的一个简化版例子: ```python import torch from torch import nn, optim class PatchEmbedding(nn.Module): def __init__(self, img_size=224, patch_size=16, embed_dim=768): super().__init__() num_patches = (img_size // patch_size)**2 self.patch_embeddings = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.patch_embeddings(x).flatten(2).transpose(1, 2) return x class MultiHeadAttention(nn.Module): pass # Implementation omitted for brevity. class EncoderBlock(nn.Module): pass # Implementation omitted for brevity. class VisionTransformer(nn.Module): def __init__(self,...): ... model = VisionTransformer() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 以上代码片段仅展示了如何定义基本构建单元以及搭建整体框架的大致思路,并未包含全部细节内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值