当前位置:   article > 正文

注意力机制_image patching vit

image patching vit

我们在生活中外观所接受的信息是非常庞大的,但我们的大脑只会专注于一件事。比如,你看到一个场景,里面有天空和云,还有飞机,你的注意力就会直接关注到飞机,因为天空和云在你大脑中会被提示为这是非重要的物品,而飞机则作为重点被当作关注对象。

而这种注意力也分为自主的和非自主的。

自主的即就是你想做一件事,你的注意力就在其中。(即由内心而发)

非自主即就是一种天性,比如你在听人说话时听到谁的八卦时就会很上心,注意力集中在这件事上。(即由感官得到的环境信息)

那么怎么才能使用两种方式设计注意力机制的框架呢。

首先还是从只有非自主性提示开始,我们最后所得到的选择偏向于感官的输入,那么就简单的使用参数化的全连接层,甚至是非参数化的最大汇聚(pooling池化)层或平均汇聚层。

即注意力机制主要是将自主性提示查询,和非自主性提示键结合起来输出一个值,这个值就是我们对一件事的选择。

查询和键是输入,而值是我们最终的输出,中间有一个注意力汇聚(池化)的过程。

平均汇聚层可以被视为输入的加权平均值, 其中各输入的权重是一样的。 实际上,注意力汇聚得到的是加权平均的总和值, 其中权重是在给定的查询和不同的键之间计算得出的。

注意力机制与全连接层或者汇聚层的区别源于增加的自主提示。

由于包含了自主性提示,注意力机制与全连接的层或汇聚层不同。

注意力机制通过注意力汇聚使选择偏向于值(感官输入),其中包含查询(自主性提示)和键(非自主性提示)。键和值是成对的。

查询(自主提示)和键(非自主提示)之间的交互形成了注意力汇聚; 注意力汇聚有选择地聚合了值(感官输入)以生成最终的输出。

这种是不带参数的。

带参数的。

从注意力的角度来看,分配给每个值的注意力权重取决于将值所对应的键和查询作为输入的函数。

上面中的alpha函数我们使用的是高斯核表示,最后用softmax表示。

注意力汇聚可以分为非参数型和带参数型。

注意力评分函数:高斯核指数部分可以视为注意力评分函数(attention scoring function), 简称评分函数(scoring function), 然后把这个函数的输出结果输入到softmax函数中进行运算。 通过上述步骤,将得到与键对应的值的概率分布(即注意力权重)。 最后,注意力汇聚的输出就是基于这些注意力权重的值的加权和。

softmax操作用于输出一个概率分布作为注意力权重。 在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。

掩码softmax操作,对于被屏蔽的元素用一个非常大的负值替换,使其softmax为0。

加性注意力:

缩放点积注意力:

将注意力汇聚的输出计算可以作为值的加权平均,选择不同的注意力评分函数会带来不同的注意力汇聚操作。

当查询和键是不同长度的矢量时,可以使用可加性注意力评分函数。当它们的长度相同时,使用缩放的“点-积”注意力评分函数的计算效率更高。

自注意力和位置编码:

 由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention), 也被称为内部注意力(intra-attention)。

一般使用正弦函数和余弦函数对固定位置编码。固定位置编码,既可以计算相对位置,也可以计算绝对位置。

在自注意力中,查询、键和值都来自同一组输入。

卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。

为了使用序列的顺序信息,可以通过在输入表示中添加位置编码,来注入绝对的或相对的位置信息。

transformer:

Transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层 (Vaswani et al., 2017)。尽管Transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。

Transformer是由编码器和解码器组成的。与 图10.4.1中基于Bahdanau注意力实现的序列到序列的学习相比,Transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中。

从宏观角度来看,Transformer的编码器是由多个相同的层叠加而成的,每个层都有两个子层(子层表示为sublayer)。第一个子层是多头自注意力(multi-head self-attention)汇聚;第二个子层是基于位置的前馈网络(positionwise feed-forward network)。具体来说,在计算编码器的自注意力时,查询、键和值都来自前一个编码器层的输出。受 7.6节中残差网络的启发,每个子层都采用了残差连接(residual connection)。在残差连接的加法计算之后,紧接着应用层规范化(layer normalization),因此,输入序列对应的每个位置,Transformer编码器都将d维表示向量。

Transformer解码器也是由多个相同的层叠加而成的,并且层中使用了残差连接和层规范化。除了编码器中描述的两个子层之外,解码器还在这两个子层之间插入了第三个子层,称为编码器-解码器注意力(encoder-decoder attention)层。在编码器-解码器注意力中,查询来自前一个解码器层的输出,而键和值来自整个编码器的输出。在解码器自注意力中,查询、键和值都来自上一个解码器层的输出。但是,解码器中的每个位置只能考虑该位置之前的所有位置。这种掩蔽(masked)注意力保留了自回归(auto-regressive)属性,确保预测仅依赖于已生成的输出词元。

其中基于位置的前馈网络:

基于位置的前馈网络对序列中的所有位置的表示进行变换时使用的是同一个多层感知机(MLP),这就是称前馈网络是基于位置的(positionwise)的原因。 linear relu linear

残差和层连接规范化:

层规范化和批量规范化的目标相同,但层规范化是基于特征维度进行规范化。尽管批量规范化在计算机视觉中被广泛应用,但在自然语言处理任务中(输入通常是变长序列)批量规范化通常不如层规范化的效果好。LayerNorm,还有BatchNorm

残差连接要求两个输入的形状相同,以便加法操作后输出张量的形状相同。

有了以上组成,就可以搭建transformer网络模型。 编码器(多头自注意力,残差连接加规范化)

Transformer编码器中的任何层都不会改变其输入的形状。

Transformer解码器也是由多个相同的层组成。在DecoderBlock类中实现的每个层包含了三个子层:解码器自注意力、“编码器-解码器”注意力和基于位置的前馈网络。这些子层也都被残差连接和紧随的层规范化围绕。

以上参考李沐的动手学深读学习。

tranfomer的更深一层理解:

https://github.com/zonechen1994/CV_Interview/blob/main/%E9%80%9A%E7%94%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E9%9D%A2%E7%BB%8F/Transformer%E9%9D%A2%E8%AF%95%E9%A2%98/%E8%AF%B4%E4%B8%80%E4%B8%8Btransformer.md

transfomer的工作流程:

例:任务翻译,中文到英文

输入:我是一只猫

第一步:提取单词的特征,并单词位置进行编码,二者相加,得到transformer的输入(向量矩阵)。

第二步:讲上述向量矩阵传入encoder中,经过几个编码块后得到所有单词的编码信息矩阵C,每个编码块的输出矩阵维度与输入完全一致。

第三步:讲编码信息矩阵C传递到到解码器,编码器依次翻译每个单词,这里会采用mask_softmax输出权重矩阵,最后输出翻译结果。

单词的特征提取,采用word2vec,glove等进行编码。

位置的编码使用正弦sin与余弦cos编码。

自注意力机制:

编码时:多头注意力,解码时使用带掩码的多头注意力,与多头注意力机制。

上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

其中自注意力结构:

上图是 Self-Attention 的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的。

q,k,v是怎么得到的呢?

使用权重矩阵wq,wk,wv线性变换得到。

输入4X6,wq/wk/wv均为6X3,得到q,k,v为4X3大小,其中输入和输出的每行表示1个单词。

而self-Attention的输出,一般使用上面提到的缩放点积:

使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1,得到 Softmax 矩阵之后可以和V相乘,得到最终的输出Z

多头自注意力机制:

Multi-Head Attention 是由多个 Self-Attention 组合形成的。

从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z

得到 8 个输出矩阵 z1 到 z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z

而编码结构由Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的。

Add指的是残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分

Norm指的是层规范化(常用于RNN结构)Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

Feed forward,两层全连接层,第一层激活函数为relu,第二层不使用激活函数。

这些组成transformer的encoder。

而decoder结构:与encoder类似

  • 包含两个 Multi-Head Attention 层。
  • 第一个 Multi-Head Attention 层采用了 Masked 操作。
  • 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。
  • 最后有一个 Softmax 层计算下一个翻译单词的概率。

 第一层Multi-Head Attention,masked操作可以防止前一个单词知道后面单词翻译的信息,因为翻译是顺序翻译的,翻译完前面的,才能翻译后面的,这里的mask是在softmax之前使用的。

 第二层Multi-Head Attention,主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。

根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。

这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。

transformer总结:

  • Transformer 与 RNN 不同,可以比较好地并行训练。
  • Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
  • Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
  • Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。

 如何训练一个transfomer网络:

比如机器翻译:

训练 Transformer 网络时,输入和输出的格式取决于特定的任务(如机器翻译、文本生成、情感分析等)。下面是一些常见的场景及其对应的输入输出格式:

1. 机器翻译

  • 输入:通常是一对语言的句子,其中一个是源语言(如英语),另一个是目标语言(如法语)。输入句子需要被标记化(分词),然后转换为词汇表中对应的索引。
  • 输出:模型的输出是目标语言中的句子,通常以概率分布的形式表示每个时间步的每个可能的单词。

2. 文本分类(如情感分析)

  • 输入:输入是一个文本序列,如一句话或一段评论。
  • 输出:输出是分类标签的概率分布,如正面情绪和负面情绪。

视觉类的transfomer,VITVision Transformer, ViT

下面是视觉类 Transformer 的基本架构组成:

1. 图像分割(Image Patching)

  • 图像分割:在视觉 Transformer 中,图像首先被分割成一系列固定大小的小块(称为“patches”)。例如,可以将一个 224x224 像素的图像分割成 16x16 像素的小块,从而得到 196 个图像块。
  • Flatten and Linear Projection:每个图像块被展平成一维向量,并通过一个线性层(全连接层)进行投影,使其转换为模型能够处理的格式。

2. 添加位置嵌入(Positional Embeddings)

  • 由于 Transformer 缺乏处理序列中元素顺序的机制,需要为每个图像块添加位置嵌入,以保留空间信息。

3. Transformer 编码器

  • 视觉 Transformer 使用标准的 Transformer 编码器架构。
  • 自注意力层(Self-Attention Layer):在这一层中,模型会学习图像块之间的关系。
  • 前馈网络(Feed-Forward Network):每个自注意力层后面都跟着一个前馈网络。
  • 层归一化和残差连接:这些都是 Transformer 架构的标准组成部分,有助于稳定训练过程。

4. 分类头(Classification Head)

  • 在进行图像分类任务时,通常会在 Transformer 编码器的输出上添加一个分类头。这通常是一个简单的全连接层,用于产生最终的分类输出。

变体和改进

  • 视觉 Transformer 的变体:一些变体和改进已经被提出,例如使用卷积层来改进图像块的处理,或者修改自注意力机制来更有效地处理图像数据。
  • 分层 Transformer:一些视觉 Transformer 变体使用分层结构,允许在不同的分辨率级别上捕捉信息,这有助于处理更大的图像或更复杂的视觉任务。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/448143
推荐阅读
相关标签
  

闽ICP备14008679号