Skip to content

一些感悟

约 12172 个字 37 张图片 预计阅读时间 61 分钟

  • 基本组件
  • (并行 Pool)MaxPool 提取到最重要的特征,丢失次要信息,AvgPool 补充
  • 级联并联卷积
  • 融合通道信息、空间信息(CBAM 卷积块block注意力模块module)

IMG_0291

  • MLP (H×W×2 → H×W×1)降维,聚合空间特征
  • SKNets(selective kernels)

IMG_31CB733D233B-1

  • 坐标注意力,位置信息嵌入到空间信息,两个方向感知特征图,输入特征沿着空间方向的长程依赖

image-20250222165833856

image-20250222165849679

  • (三分支注意力)模块图、计算流程图、有颜色的模块图,公式,代码

image-20250222172458460

image-20250222172527415

image-20250222172556669

计算流程图

image-20250222201134314

SENet

image-20250222201226854

CBAM

image-20250222201425307

image-20250222201351466

image-20250222201401789

改自 CBAM

image-20250222201741478

SKNet

image-20250222201608748

  • 坐标注意力一定要试试

IMG_6311E03AB75F-1

双重注意力网络(DANet

image-20250222204311429

image-20250222205337787

IMG_99B2C2F05CF6-1

image-20250222205740125

多特征融合策略

门控的三种应用,通过门控单元sigmoid 函数来得到权重,权重可以用来调整通道的重要性,用来选择一部分重要的信息进行输出,也有效地融合两个特征

而稍复杂点的融合模块,不仅局限于两个特征越多越好

给定四个不同的特征表示,然后应用全局平均池化操作,将它压缩到1×1×C, 这样类似于通道注意力中的操作,然后再用sigmoid 函数得到自身的权重,调整权重这个过程维度是不会变化的, 依然是1×1×C

补充:self-gating自身门控是很常见的一种做法,通常情况下是可以稳定涨点的,就是说对输入通过sigmoid函数得到权重之后,再与输入进行相乘,用自己的权重来调整自己,==但是==在涉及到多个输入的时候,self-gating显然是比较欠缺的,因为只考虑了各自的特征,而没有考虑到多个特征之间的交互

因此,作者将这四个权重进行一个拼接,然后用==softmax==函数重新分配权重,看看到底谁才是最重要的那个,以这样的方式既考虑了==自身==的特征,也考虑了特征之间的一个==交互== , 最后,通过权重调整对应输入的,每个通道的一个重要性,并将它们最后进行相加,非常适合用于多个特征进行融合的场景下

  • sigmoid自身门控
  • softmax权重交互

关于门控:

image-20250418231518592

自身门控:

image-20250418231640664

image-20250419102342772

门控单元的三种应用

门控单元的三种应用

最典型的应用:①LSTM ② GRU

LSTM

  • 输入门
  • 遗忘门
  • 输出门

GRU

  • 更新门
  • 重置门

目的是通过门来控制,谁有资格进去,谁没资格进去,所以我们需要这个门,产生一个0~1之间的数值

  • 0 表示谁也不准进去
  • 1 表示全部都进去
  • 中间的数值表示部分可以进去

\(\rightarrow \mathrm{Sigmoid()}\)

可以看LSTM和GRU中的门控单元,在生成权重之后呀,会和其他的特征呢进行相乘,这就是紧接着的信息选择的过程

接下来重点来看看门控单元的三个应用,着重关注看看门控单元通常在哪些地方出现

  • 第一个:通道注意力,首先输入通过压缩操作,也就是在空间维度H乘W上,通过全局池化操作聚合特征,从而生成空间上的全局特征表示,然后通过一系列的变化,来学习通道之间的相关性,最后通过一个sigmoid函数,来生成权重表示,那么这种获取输入上的全局信息表示,然后再和原始的输入相乘,来增强或者削弱某一个维度,它在不同通道上的一个重要性,这就是门控单元的第一个应用,生成权重来控制不同通道的重要性 (1 个输入,多个通道,通过通道调整维度)
  • 第二个:可以看到输入分别通过两个分支,并且这两个分支的操作是一致的,但是在第二个分支中额外添加了一个门控单元,也就是Sigmoid 函数来生成权重,表示这个权重和第一个分支的输出进行相乘,来选择一部分信息进行输出,这是门控单元的第二个应用生成权重来选择一部分有用的信息(1个输入,自身门控)
  • 第三个:门控单元用于融合,可以看到门控单元接受两个不同模块的输出来作为输入,依靠两部分的信息来生成权重 $a(0<a<1) $ ,我们可以使用这个权重 \(a\) 与第一个模块的输出进行相乘,使用 \((1-a)\) 与第二个模块的输出进行相乘,然后两部分再进行拼接(add)或者相乘,得到融合后的信息表示,这是门控单元的第三个应用,生成权重来融合两部分的信息表示(2 个输入)

  • 第四个:(多个输入,sigmoid 权重,softmax 权重交互)

Agent attention

线性注意力相关

\(\text{agent\ attention}\) :softmax和线性注意力的集成

本文的研究动机是 自注意力的二次复杂度,限制了其在各种场景中的适用,作者提出了一种新的注意力范式,代理注意力,在计算效率和表示能力之间取得有利的平衡。

线性注意力的动机都是一致的,那就是传统注意力的二次复杂度

那么能做的改进呢? 就是在不影响性能的前提下,降低计算复杂度,具体而言,表示为四元组(Q,A,K,V)的agent注意力,将一组额外的agent tokens,引入到传统的注意力模块中,传统的注意力,是 (Q,K,V),Q和K进行矩阵乘法,得到权重矩阵,然后根据这个权重矩阵,对这个value矩阵进行加权

\(\text{agent\ attention}\) 是在QKV的基础上添加了一个A矩阵,也就是作者在这里提到的agent tokens,这个agent tokens,首先充当 Q 矩阵的代理,以聚合来自K和V的信息,然后将信息广播回 Q

以上涉及到了两个操作:聚合和广播

举个最简单的例子,(聚合) 例如有三个向量ABC,我们把它们进行相加或者说是加权求和,就可以得到一个向量D,这样的过程叫做聚合。==(广播)==那么相反,如果我们把向量D分别添加到向量ABC上,使这三个向量呀都具有了D向量的信息,这个过程就叫做广播。

那么直观上简单来说就是:在M远远大于N的情况下,

( 1) 信息从M个池子引入N个池子叫做聚合

(2)信息从N个池子引入M个池子叫做广播

那么聚合和广播和注意力怎么联系在一块呢,我们来看这个图

image-20250419131452764

注意力有两种类型① 一种是自注意力 ② 一种是交叉注意力

  • 自注意力QKV的维度应当是一致的,这样的话就做不到聚合和广播
  • 但是交叉注意力,Q的维度和KV可以是不一样的,但是KV的来源是相同的,而且最重要的一点是注意力的输出和Q矩阵的shape是一致的

(1)当Q矩阵的token的数量,也就是这个==M小于KV==的时候,那么这个注意力就可以看作是一个==聚合==操作,根据这个注意力矩阵来聚合来自value矩阵的信息 (2)当这个Q矩阵的token数量大于KV的时候,这个注意力矩阵就可以看作是一个广播操作,根据这个注意力矩阵,把value信息广播到M个token中

作者在这里提到了聚合和广播,就意味着可能存在两阶段注意力

作者提到鉴于agent的tokens的数量可以设计为比Q矩阵token的数量小得多,agent的注意力,明显比广泛采用的softmax注意力更有效,同时保留全局上下文的建模能力

首先看计算过程:如果agent的tokens的数量很少,那么这个\(N×N\)的注意力矩阵,就可以降低为N乘M,这个M是远远小于N的,这就意味着复杂度是降低了,我们来对比一下softmax的注意力、线性注意力、本文提出的 \(\text{agent attention}\)

image-20250419132613282

case1 softmax 注意力 :这个softmax注意力就是传统的注意力机制,Q和K先执行矩阵乘法,然后softmax操作,这是最耗时的操作了,并且具有二次方的计算复杂度

case2 线性注意力:让K和V先做矩阵乘法,然后再与这个K做矩阵乘法,这样的话,就巧妙的避开了二次方的计算和softmax操作

case3 \(\text{agent attention}\) 有三点首先注意:

① 第一点有四个输入,分别是QKV以及这个A矩阵,首先,QKV的维度是相同的,并且和这个A矩阵的维度不同,其中 A矩阵中的token数量 $ n \ll N$

N是 Q 矩阵的 token 数量

② 第二点可以看到这是一个两阶段注意力,左侧一个,右侧一个,并且都是带有softmax操作的

③ 第三点如图所示,是只有一个输出的,这就意味着两个注意力,是联动的

(右边注意力)然后我们来仔细看一下右边注意力,接受的是AKV作为输入,其中作者在这里标注A矩阵是充当Q矩阵的,那么很显然这应当是一个聚合注意力操作,聚合value矩阵中N个token信息的

(左边注意力)左边注意力也接收了三个输入,分别是QA以及右侧注意力的输出,作为value矩阵,此时A矩阵在左侧注意力中充当K矩阵,这是一个广播注意力,将 A 矩阵的中 n个token的信息广播回Q 矩阵中的 N 个的token中去(这个思想非常常见:回顾一下通道注意力,使用两层全连接来建模通道间的相关性,先降维后升维度,为什么不直接使用一个全连接层呢,因为复杂度高,先降维后升为参数量更少,计算更快,这里的 \(\text{agent attention}\)\(\text{SE net}\) 实际是一个道理)

以上是 Agent 注意力的思想。


还有三个问题需要考虑: 🔴 第一个问题:A矩阵是怎么来的?

Agent注意力是一个两阶段注意力先聚合再广播,那么这个A矩阵,它在聚合value矩阵信息的时候,它需要自身含有一定的信息吗?也不一定,1️⃣ 所以说它可以是随机初始化得到的,2️⃣ 那么当然也可以事先包含一部分先验信息,可以使用聚类或者说是池化下采样操作,可以从原始特征中采集一部分信息来作为A矩阵

🔴 第二个问题:线性注意力的性能真的好吗?

在ReLu线性注意力中,有一句话是这样描述的,由于缺乏局部信息提取和多尺度的学习能力,ReLu 单独的线性注意力能力有限,因此作者提出用卷积来增强 ReLu 线性注意力,并引入了多尺度线性注意力模块,来解决 ReLu 线性注意力的能力限制,那么这个Agent 注意力是否有同样的问题?很相似,Agent 注意力原文中有类似的一句话:尽管Agent的注意力受益于低计算复杂度和高模型表达性,但作为广义的线性注意力,也受到了特征多样性不足的影响

作为补救措施,Agent 注意力 采用深度卷积操作来保持特征多样性

完整的流程图:

image-20250419134931334

谨记: \(softmax(QK^T)V\)

Agent 注意力图描述:首先通过三个线性变换 \(W_Q、W_K、W_V\) 得到 \(Q、K、V\) ,接下来对 Q 矩阵进行下采样Pooling得到Agent Tokens \(A\) ,① 首先这个 Agent tokens 充当 query 与原始是 KV 进行 softmax 和注意力操作,也就是 \(V_A = softmax(AK^T)V\) (A 矩阵聚合 Vlaue 的信息)② \(V_A\) 矩阵充当 key,进行 softmax,也就是 \(softmax(QA^T)V_A\) (A 矩阵广播 Value 的信息)

图中可以看到:

作者添加了深度卷积操作DWC,以及通过池化呢来构造A矩阵

🔴 第三个问题:在这个图中,还有一个没有提到的模块agent bias

作者的出发点,是为了更好的利用位置信息,从而为agent的注意力的两阶段分别添加了agent bias,从虚线指向可以看到它们是分别添加到注意力矩阵上的, 所以 \(shape\in N× n\),作者没有随机初始化这个偏置矩阵,而是通过三个分量来构建的,后面去看代码把。

总结一下,Agent 注意力的思想:降低计算复杂度,引入聚合和广播的概念,对原始 Query 矩阵进行下采样,得到 Agent,与原始 KV 进行注意力计算聚合 V 的信息,得到的是 \(V_A\) ,同时这个 Agent 还作为 key,再结合聚合得到的 \(V_A\) ,得到了输出。还有提了一嘴的 DWC 深度可分离卷积和 Agent Bias

ReLU 线性注意力

ICCV2023

这是一个多尺度线性注意力,算法的核心是多尺度性和复杂性

随手补充

通用五大性质:局部性、全局性、稀疏性、多尺度性、复杂性

本文指出,与依赖于softmax注意力,硬件低效的大核卷积或复杂拓扑结构,来获得良好性能的现有高分辨率密集预测模型不同

随手补充

作者提到之前的方法,要不然是基于softmax的注意力机制,要么是具有大卷积核的卷积网络,要不然就是大力出奇迹的模型 众所周知,softmax,指数计算很耗费时间,硬件对于大核卷积是低效的 (可能没有专门的优化,大概是这个意思),具有复杂拓扑结构的模型,就是使劲堆模块,给模型上强度,这样的模型一般性能还不错,但是复杂度可能会很高

作者提出的多尺度线性注意力,仅通过轻量级和硬件高效的操作,实现了全局感受野和多尺度学习,这是高分辨率密集预测的两个理想特征。

全局感受野 & 多尺度学习

来看模型图:

image-20250419141927472

左边是一个整体架构,很简单,就是一个多尺度的线性注意力,然后接一个全连接层和DW卷积得到输出

右图是多尺度线性注意力有三个分支,每个分支都有一个ReLU线性注意力

pic

知乎上作者的详解,最左边是传统的注意力机制,它主要的计算复杂度,来源于Q矩阵和K矩阵的相乘, 计算成本是\(N^2\),想要降低注意力的计算复杂度,并且要保持QKV整体框架不变,可以从这个注意力矩阵的计算入手。

传统的注意力使用的是Q和K的点积,然后接一个softmax操作,这里要做的就是替换点积和softmax操作,在这里作者提出了一种新的方法,重新定义关于Q和K的相似度函数

看中间等式: $$ Sim(Q,K)=ReLU(Q)ReLU(K)^T $$ 看这个等式,相比传统的注意力,实际就是为Q和K添加了 ReLU 操作,并且去掉了softmax操作,看见这个还挺迷糊的,好像变了又好像没有变

第三个图,作者利用矩阵乘法的性质,(ab)c = a(bc),变成K和V 先计算,Q 摘出来,分子分母都是的,都是把 Q 摘出来了。

经过以上两个操作,实现了在不改变注意力功能的情况下, 将计算复杂度和内存占用从二次降低到了线性,简单点说就是:先计算K和V的乘积,再计算它们与 Q 的乘积

再看:

2025-04-19 Saturday 15:19:00

再来看这个多尺度线性注意力, 🔴 在这里为什么要设置三个分支呢?其中两个分支还带有3×3和5×5的卷积

作者在论文中用实验证明了,由于改进后的这个 \(ReLU\) 线性注意力,不再是Q和K之间的点击操作了,它缺失了非线性的因素,所以说它在提取局部特征方面也是比较差的,因此作者在这两个分支中补充了卷积操作(应该是做了很多实验试出来的),来增强局部建模的能力以及多尺度建模的能力

补充一个知识点:为什么大家一直在魔改这个注意力,而不对后面的FFN进行魔改

原因:注意力机制主要是token层次的融合,FFN是通道层次的融合,两者是互补的 不过,之前有论文证实过,将这个注意力机制换成MLP或者池化,效果也还不错,但目前普遍认同的,注意力机制终归是在token层次上做融合,效果也还不错,两者是缺一不可的

SwiftFormer

ICCV2023

引入:自注意力机制的二次计算,复杂性性限制了其在实时应用中的使用,特别是在资源受限的移动设备上的部署,指出动机 注意力机制的二次复杂度。

随手补充

对注意力机制的改进:复杂性、局部性、全局性、稀疏性、多尺度性

作者介绍了一种新的有效的加法注意力机制,用线性元素乘法有效地替换了二次矩阵乘法运算显著降低了模型的计算复杂性,实现更有效的上下文信息捕获,实验表明 K & Value 的交互可以用线性层替代,而不会有任何精度损失

📌 在这里是用线性元素乘法替换了二次矩阵乘法

线性元素乘法:一个数字和一个向量或者矩阵相乘

矩阵乘法:矩阵和矩阵的乘法

因此这里作者指出用线性元素乘法代替矩阵乘法,光看这个定义,就知道复杂度肯定更低的。

🔴接下来需要思考:这个线性元素乘法中的数字是谁,矩阵是谁

加法注意力的模型图:

image-20250419153612488

描述图:给定一个输入X,通过两个线性变换可以得到Q矩阵和K矩阵,注意这里面是没有Value矩阵,K矩阵和Q矩阵的维度都是\(n\times D\)

  • n是token的数量

  • D是每个特征的通道数

看 Q 矩阵变换,可以看到作者为每一个token, 都分配了一个可学习的向量 \(W_{a_1}、W_{a_2},...,W_{a_N} \in R ^{1 \times d}\)

更直观的说明:将 \(Q\in R^{n \times d}\) 划分成n个 \(d \times 1\) 的列向量,然后分配 n 个 \(d \times 1\) 的行向量 \(W_{a_1}、W_{a_2},...,W_{a_N} \in R ^{1 \times d}\) 学习它们的表示,然后聚合(相乘)成一个数,得到单个数值表示,也就是 \(\alpha_1、\alpha_2、......、\alpha_N\),作者称为注意力权重。

然后这些权重与对应的token向量进行相乘,最后再把这n个调整过的token向量进行相加

其实这个过程就是一个加权求和,得到权重,通过广播与原始向量相乘

加权求和,得到一个全局query向量,shape是 1×d

仔细说明一下,这里加权求和的过程。我觉得不必纠结这里的转置操作。重要的是就是得到的权重又和原来的向量相乘,本来是 n 个没有权重的列向量,现在变成 n 个有权重的列向量,再相加就好咯。变成一个列向量,只不过这里又转置什么的。其实你说如果原矩阵式 n×d 的,那你想划分成 n 个 d×1 的列向量,不也是有转置操作?奥,没有,脑子里想一下形状变化就转过来了。太细枝末节的。

然后这个全局query向量,与这个K矩阵进行相乘,得到的还是n×D的矩阵。

这一步类似于通道注意力机制中的激励操作,使用的是 \(1×1×C\)的通道描述符,来调整图像中每个像素点的通道重要性,在这里是同样的意思,使用的是具有全局特征表示的query向量(又加权又求和),调整K矩阵中每个token的每个通道的一个重要性,这样的话就可以得到全局上下文表示,shape是n×D,与输入X的shape保持一致的,最后通过一个线性层,然后再接一个残差连接,得到整个模块的输出。

🚩 总结: 这个线性注意力分为两个部分。第一个部分是左边分支,目的是构造一个全局向量,是通过对n个token的加权求和来实现的;第二个部分是右边分支,通过全局向量来更新K矩阵中每个token的表示。

这个思想和通道注意力很像

这里还有一点:作者为这n个token,使用的是同一个向量;也就是说这n个token,共享一个可学习的向量

UNetTSF

arxiv2024

  • 熟的不能再熟了
  • 通道独立的策略
  • 每一层:并行的,一个下采样,一个线性映射。
  • 恢复维度,是 cat,再继续 Linear

image-20250419164309011

T-Conv

主题:多元时间序列预测

多元:指的是多个时间序列

KDD2020

  • 时间卷积模块:Temporal convolution module
  • DIL:Dilated Inception Layer

介绍:作者提出了一个时间卷积模块,该模块由两个膨胀的inception层组成(DIL),一个 DIL后面跟一个tanh的激活函数用作滤波器;另一层后面是一个Sigmoid的激活函数,作为一个门来控制 滤波器可以传递给下一模块的信息量

  • tanh 激活函数:特征提取、增加非线性变换
  • sigmoid 函数:特征选择、控制信息流通

改进的方向:特征提取 & 特征选择

此外每个DIL层用一组标准的==1D膨胀因果卷积==来发现各种范围的时间模式。

各种范围的时间模式就是多尺度,也就是说作者在这里用多个不同的卷积层实现了多尺度的时间建模。

通过结合卷积神经网络的两种广泛的应用策略, Inception层以及1D膨胀卷积,该模块不仅能够处理很长的时间序列,还能够提取多尺度的时间特征

该模块的优点:

  • 能够处理很长的时间序列
  • 提取多尺度的时间特征

模块图:

image-20250419165800923

左图:就是所提出的时间卷积模块,有两个分支,主干网络都是这个扩散inception层,区别就是左边这个主干网络之后,接了一个tanh的激活函数;右边这个主干网络之后,接了一个 Sigmoid 激活函数。

显然tanh是特征提取层,Sigmoid 是特征选择层。

扩散inception层的内部实际也很简单,就是多个具有不同卷积核大小的卷积层来实现的,最后将它们进行拼接,得到多尺度的特征表示

卷积层的实现既可以padding,也可以不 padding

(1)不 padding 的好处是卷积层之后序列长度会变小,相应的计算效率就会提高,在拼接之后只需要通过一个全连接层,恢复与这个输入相同的shape就可以了

(2)padding 的好处是每个卷积层的输入以及输出的shape是一致的,这样可以确保每个时间步的信息是对齐的,此时拼接不是必须的了,直接相加就可以实现相同的效果。

同时,如果设置了3个以上的1D因果卷积层,那么就可以通过一个softmax函数来分配权重,然后进行加权求和,这样看起来会更好看一些(是)

随手补充

在这个时间卷积模块的场景下,继续套用五大性质,局部性,全局性,稀疏性,多尺度性,复杂性 这个扩散inception层首先实现的就是局部性、稀疏性、多尺度性 因为1D扩散卷积,卷积核的大小就表示局部范围,扩散就是稀疏性,多个卷积层就表示多尺度性,这里的复杂性,因为卷积操作的复杂度很小,所以实际上也满足复杂性。 那么就只剩下一个全局性了,如果把卷积核的大小,设置为和这个序列长度是一致的,实际也算是全局性。 回顾通道注意力,通过压缩空间表示来生成一个通道描述符,然后对不同的通道进行加权,在这里已经对这个序列进行处理了,那可不可以再联合通道一块建模,目的是什么?是为了调整每个尺度下的通道特征表示,在每个卷积层输出的基础上,可以在这个时间维度上面压缩它们,压缩可以通过卷积,也可以通过池化来实现,然后我们得到了一个$1×C$的通道描述符表示, 然后这个通道描述符,再和这个输入进行相乘,进而来调整通道的重要性,这个操作要在这个每个卷积层的后面都要添加上。

M-GTU

ICML2022

作者提出了一种多尺度门控tanh单元:MGTU,首先利用多个1D因果卷积,提取时间序列的多尺度特征,首先引出一个多尺度构造,多尺度的方法有哪些呢,一般都是通过卷积或者池化,因为速度最快,性能最好。然后通过门控单元控制信息流向下一模块的比例

随手补充:About 门控单元

门控单元是一个名字,通常由 Sigmoid 函数实现,生成 0~1 之间的权重表示,选择信息来流向下一个模块的比例

用门控单元控制信息流向下一模块的比例,那么应该选择哪些信息来流向下一个模块呢?应该让模型来自适应选择,所以在这里通过Sigmoid函数,根据不同的输入来生成不同的权重,然后两者相乘得到一个过滤后的特征。

为每个GTU单元的输出,应用池化层,以保留重要的局部信息

随手补充

池化层不仅能够降低维度还能够提取不同类别的信息 例如最大池化可以提取最有用或者说是辨识度最好的特征 平均池化一般是提取通用的特征 一般情况下来说,最大池化可能更好用一些 不过也要根据具体的任务来测试

最后将多个尺度的信息在时间维度上进行拼接,并通过线性层以恢复和输入相同的shape,最后通过添加残差连接和 ReLU 激活函数,作为整个模块的输出

尺度的个数不确定,尺度的大小也不是固定不变的

那么在拼接之后,我们得到的序列长度和最开始输入的序列长度很有可能是不相同的,所以需要设置一个线性层来把序列长度变换为我们所需要的长度。最后接一个残差连接和ReLU激活函数作为整个模块的输出

模型图:

image-20250419175816115

给定一个输入Z,在这里是定义了三个尺度,并且每个尺度都是通过一维的卷积层,(注意 一维卷积 是 1D 卷积, 不代表卷积核大小=1)

分别是1×S1、1×S2、1×S3,通过卷积层之后有两个分支,一个是Tanh的函数,一个是Sigmoid的函数

  • tan的函数:是作为激活函数出现的,增加非线性操作
  • Sigmoid 函数:用来生成权重,与非线性的输出进行相乘,得到当前尺度的输出,然后再通过一个最大池化操作,提取窗口内最重要的一个特征

最后将多个尺度的输出进行一个拼接,然后通过一个线性层恢复,和输入相同的shape,并添加残差连接和ReLU激活函数,得到整个模块的输出。

随手补充:思考如何改进

局部性、全局性、稀疏性、多尺度性、复杂性 (1)1D卷积 操作换成扩散卷积,提取稀疏的局部时间相关性,因为邻接的几个时间步,很有可能存在冗余信息。所以说在这里可以使用扩散卷积来避免这种现象。 (2)更换门控操作,换成注意力,比如换成线性注意力,来提取全局相关性 $\rightarrow$ 动机:局部性 加稀疏性,加注意力的全局性,还有多尺度性,还有线性注意力,关注的是复杂性 (3)❓ 一些细节方面:使用卷积和池化,共同来提取局部性,在最后的这个输出层,添加一个元素点积操作,这里的思想是,将输出与输入进行元素点积操作

Trend-aware Attention

TKDE2021

学习的时候一定要注意学习的不仅是算法还有演变的过程。根据别人的创新点,寻找一个自己的切入点

引入:传统的自注意力机制,通过逐点计算query和K之间的相似性,而没有利用上下文的信息。依然是先点出普通注意力的缺点,没有利用上下文信息,这会导致什么样的问题呢?如果某个时间步的观察值是个异常值,会错误的匹配相关点,从而为自注意力带来潜在的优化问题。

首先,注意力就是一个加权求和, 如果有异常值出现,(所以注意力机制其实是异常值敏感的),就会导致权重的计算错误,自然而然求和的过程就会产生误差,基于此,作者设计了时间趋势感知注意力,通过为每个节点提取局部的上下文信息,从而使每个节点拥有感知上下文环境的能力 ,然后通过局部趋势的形式,来构建注意力矩阵

解释这里趋势的概念:首先,原始的时间序列是以每个时间点作为基本单位的,当提取每个时间点的上下文信息之后,就相当于具备了连续的几个时间点的信息(还是很好奇,怎么实现的),这样就可以掌握这一段时间内的趋势走向,然后再以趋势作为基本单位,计算趋势和趋势之间的性相关性。

最后一句,相比传统的注意力机制所提出的趋势感知注意力机制,有助于更准确的预测,并且稳定性更强,直观上说,趋势和趋势的匹配,确实要比点和点之间的匹配好。

作者在问题的引入给出了更具体的图:

image-20250419202755669

这是作者给出的一个例子,图中的这个曲线,表示交通信号序列,A,B,C表示在不同时间步的一个数据点,在这种情况下,传统的自注意力机制,会错误的将A点和B点进行匹配,因为它们具有相同的数值点,可是实际上,A和B具有不同的局部趋势:

在左图中,A处于一个平台期,而B处于波峰波动的峰值,也就是说这里的A和B近期的历史走势明显不同。因此如果将注意力机制,应用到这段序列中,可能就会为序列中的数据点,错误的分配相关强度,那可能就会得到一个不好的序列表示,最终会影响预测性能。

基于这样的观察,作者设计了考虑局部上下文信息的时间趋势感知自注意力机制。它是卷积注意力的一种变体,使用1D卷积来取代query和K原本的线性层操作,由于这个卷积操作,能够将每个点的局部上下文信息作为一个新的输入来计算两两趋势之间的一个相关性,这样的话就能够使模型意识到隐藏在这个时间序列中的一个局部变化趋势

厉害,用卷积代替线性操作,得到局部感知。

以上是卷积注意力的思想(嗯!)

补充:卷积注意力的思想发表在Nips2019,时间很早了,但是思想不过时。接下来 看 原文:

image-20250419204146863

作者说,由于各种事件例如假期和极端天气,时间序列中的模式可能会随时间显著变化,因此观测点是异常点,变化点还是模式中的一部分,都高度依赖于其周围的环境,然而在规范transformer模型的自注意力层中query和K之间的相似性,是基于它们之间的逐点值来计算的,而没有充分利用局部上下文(从这个图中就可以看出),而这种与局部上下文无关的QK的匹配,可能就会在观察点是异常点,变化点还是模式的一部分方面混淆自注意力模块,并带来潜在的优化问题,

简单来说,就是模型识别不了这个点,无法判断这个点是是正常的还是不正常的。

🚩 这里想强调的是 局部上下文

接下来扩展改进的思路:局部性、 全局性、稀疏性、多尺度性、复杂性

(1)从局部性和多尺度性的角度:

以上只考虑局部性,很显然可以把局部性和多尺度性联合起来。

具体来说,设置不同的卷积核大小,如设置为3、5、7。也就是基于不同的尺度的上下文信息,来计算趋势和趋势之间的相关性。然后这三个注意力机制,可以并行串行都可以

(2)其次把局部性和稀疏性结合起来, 由于局部的上下文信息,在内部的信息的相似度,可能比较高,通过一个1D扩散卷积,来提取稀疏的局部上下文信息,避免冗余信息

(3)还可以加入门控单元等

(AirFormer)CT-MSA

AAAI2023

Air former使用transformer来预测全国的空气质量。

时空预测、空气质量预测

引入:作者设计了因果时间多头注意力机制来学习时间相关性,首先确保时间的因果关系,即每个时间步的状态总是和之前的紧密相关,而无法窥探到未来的状况,这意味着T时间的特征,只能通过 1{T-1}时间范围内的加权和来表示。

因果是时序里面特有的,因为我们无法窥探到未来的信息,这是直观上的感觉,所以说在做注意力或者卷积的时候,我们通常会加上因果的概念。

现在的论文有两个做法:

(1)加因果

(2)不加因果,不加因果的出发点是:如果给的是t个历史时间步的数据,那给了就是给了,怎么用就是另一回事了。只要不涉及数据泄露即可。

嗯,所以加还是不加,看涨不涨点。

回到原文:其次为了提高计算效率,作者考虑了时间注意力的局部性,也就是窗口注意力,假设输入的序列长度为8,在注意力机制的第一层,令窗口大小为2,在第二层令窗口大小为4,在第3层令窗口大小为8,以这种方式,在保证计算效率的情况下,还可以提取多尺度的时间依赖性

又是 局部性 加 多尺度性(嗯,学着点),图像中有这方面的代表性工作:①DilatedFormer②HiLoAttention③P2TAttention

局部建模方法,用的经典的窗口注意力机制。

本文结构图:

image-20250419211503931

左图是经典的transformer encoder架构,先layer normal规范化,然后接一个因果时间多头自注意力,然后再接一个layer normal和MLP,这就是一个完整的窗口时间注意力模块,如果我们堆叠多个这样的窗口时间注意力模块,并且在每个注意力的内部,设置不同的大小窗口,就可以提取多尺度的局部时间特征。

右图展示的就是在多尺度建模的时候,感受野的变化范围:

在这里给定八个时间步的输入序列,那么在第一个多头自注意力机制中,在这里窗口大小设置为2,可以看到有4个窗口,在窗口内部执行注意力机制的时候,可以看到第一个时间步 \(t_1\) ,更新的第一个时间步只能依靠自身的信息,更新的第二个时间步 \(t_2\) , 就可以利用第一个时间步和第二个时间步的信息。那么在第二层多头自注意力机制中,比如说第三个时间步,可以利用第一个时间步、第二个时间步、第三个时间步的信息,但是无法利用第四个时间步的信息。而第四个时间步,就可以使用当前窗口内的所有时间步的信息来进行更新

随手补充:扩展创新点

局部性、稀疏性、全局性、多尺度性、复杂性 这里还没有使用稀疏性,以 DilatedFormer 为例,如果输入的序列足够长,就可以稀疏的选取窗口内时间步的信息,而不需要与窗口内所有的时间步都计算相关性,可以变成多尺度扩散窗口注意力, 还有全局性,如果想要实现全局的建模,传统的注意力机制肯定不合适了, 因为使用窗口注意力的本意就是除了建模局部相关性,还有一点就是降低计算复杂度,再搭配个原始注意力,又回到原点了。可以使用具有低复杂度的线性注意力,进行全局建模,作为窗口注意力机制的一个补充

Pyraformer

ICLR2022

引入:Py former,低复杂度的金字塔,注意力网络用于长期时间序列预测,CV里面中的金字塔建模思想,在本文中,作者通过探索时间序列的多分辨率表示来提出Pyraformer,直接点明动机,多分辨率实际就是多尺度的问题,分辨率是图像中的概念,作者直接拿到了时间序列当中(领域迁移)。

金字塔注意力模块,尺度间的数据结构总结了不同分辨率的特征,尺度内的相邻连接,建模了不同范围的时间依赖性,并且其时间和空间复杂度与序列长度L成线性比例,也就是说金字塔包含两个部分:

(1)第一个:尺度间的建模:指的是在一个固定的序列内部,让两两时间步进行交互

(2)第二个:尺度内的建模,尺度间指的是具有不同尺度的序列之间进行交互,它们可能分别具有大的感受野和小的感受野,它们相互学习对方的信息

这里还提到了一个复杂度的问题呈线性比例,也就是线性复杂度,最后一句作者在长序列实践预测,验证了Pyraformer的有效性和高效性,也就是优点:性能好、 复杂度低

image-20250419220613333

首先,在介绍之前,肯定要先对比传统的,传统的注意力,在任意的两点时间步之间计算相关性,然后对它们进行加权求和,从而来更新每个时间步新的特征,是一种具有全局感受野的方法,代价就是计算复杂度很高,是序列长度的二次方

第二个卷积神经网络,通过卷积核来聚合相邻几个时间步的信息,感受野的大小,取决于卷积核的大小,CNN在学习局部相关性方面是很优秀的,所以说现在主流的方法都是CNN加attention,局部 & 全局建模

第三个循环神经网络,只能循环处理每一个时间步的特征,越往后走,之前时间步的信息保留的就越少,计算慢且无法并行,此时注意力机制的提出,就是为了解决循环神经网络无法并行的问题

接下来看Pyraformer,一眼看上去是一个金字塔架构,最下面这一层是原始的序列表示,也就是本文提出的方法,越往上走,序列越短,相应的每个节点具备的感受野就越大,直到最高这一层一个节点,具备了全局的感受野,也就是具备了全局信息表示

然后在两两节点之间进行一个选择性的连接,大家可以看到,它并不是任意两点之间都有连接的,然后我们来仔细分析一下金字塔注意力

image-20250419221034581

(1)首先是多尺度,也就是每一层所所具备的感受也大小是不同的,首先要明确它是怎么来的。

  • 首先看左边这个图,它叫做 粗尺度构造模块,很显然,从这个名字就可以看出,金字塔上面这些具备大感受野的序列,就是从这个模块来提取出来的
  • 给定一个输入 \(B \times L \times D\) B表示batch size、L是序列长度、D是特征维度,也叫做通道数量,先暂时忽略掉这个B
  • 首先通过一个线性层变换一下,得到这个\(L \times D_K\) ,紧接是三个卷积层,它的卷积核大小和这个步长都是 \(C\)
  • 所以说在第一个卷积层之后,shape就变成了 \(\frac{L}{C} \times D_K\)\(\frac{L}{C}\) 是目前的序列长度,\(\frac{L}{C}\) 显然是小于长度 \(L\) 的 ,也就是说明了现在的新的时间序列具有了更大的感受野,感受野的大小是 \(C\)
  • 第二个卷积层之后,shape就变成了 \(\frac{L}{C^2} \times D_K\) ,感受野的大小就是 $ C^2$
  • 第三个卷积层之后,shape就变成了 \(\frac{L}{C^3} \times D_K\) ,感受野的大小就是 $ C^3$
  • 如果是\(N\)个卷积层, shape就变成了 \(\frac{L}{C^N} \times D_K\) ,感受野的大小就是 $ C^N $
  • 很显然这个卷积层,越往下走,这个序列长度就会变得越短,相应的感受野就会越来越大,按照作者的说法来说,尺度会变得越来越粗,然后将这三个卷积层得到的序列,进行一个拼接,还有原始的序列 (残差连接) ,一起拼接后,再通过一个线性层得到输出,输出的长度也就是 \((L+\frac{L}{C}+\frac{L}{C^2}+\frac{L}{C^3} \times D\)
  • 以这样的方式,得到多尺度的序列表示,这里还有一个点需要注意一下,有可能在输入的时候,长序列L会非常非常大,所以说后面在计算卷积层多个卷积层的时候,可能就会提高计算量和参数量,所以作者在进行线性层之前做了降维操作,降维之后再做卷积操作
  • 执行完之后再通过一个线性层,恢复维度D,这样的话不仅能够显著降低参数量,还可以防止过拟合(这里先降维后升维的操作)

(2)在得到多个尺度的序列表示之后,就完成了构造金字塔的第一步

随手补充

时间序列中的多尺度问题 在图像中不同的尺度就代表图像不同的大小区域 多尺度有助于捕捉各类图像中的不同目标大小信息 这一思想在时间序列中同样适用,例如在原始的时间序列中,是按照一个小时的间间隔来采样的,这里有八个时间步,就是八个小时的信息 如果将两点时间进行聚合,就可以得到一个新的时间步特征表示,那么这个新的时间步,就具备了2个小时的信息,再往上走是具备了4个小时的信息,再往上走就具备了全局的8个小时的信息 如果这个输入的序列足够长,那么每个新生成的时间步,可能就包含了一天甚至一周的信息,从下往上走,感受野越来越大,除了有利于描述长期的时间相关性,还能够显著降低计算复杂度 因为我们把很多的信息压缩到了一个时间步的特征里面 以上是对多尺度的时间序列的补充描述

继续来看金字塔注意力的第二步,得到每个尺度的序列表示之后,第一个、第二个、第三个、第四个尺度应当在两两节点之间建立连接,如果在任意两两节点之间建立连接就变成传统的注意力机制。

因此作者第二个考虑的问题是在哪些节点之间建立连接,这很重要,这里的节点和时间步是等价的

首先在每一个序列的内部,每个节点只和它相邻的左右两个节点进行连接,也就是只关注局部上下文信息,当然了不要忘记还有自身的原有的信息(残差连接)

在整个金字塔架构中,所有的节点都是默认和自身是相连的,在不同的序列之间,这个父节点和两个子节点直接相连接

🔴 什么是父节点,什么是子节点?

看图,以第二层为例, 第二层的序列是通过第一层的序列,通过一个卷积核大小为2, 步长为2的卷积层得到的, 也就是说卷积核对应的节点,就是子节点, 那么卷积层生成的新节点就是父节点, 很显然子节点的个数取决于卷积核的大小, 同样的规律, 在任意两两个相邻的尺度序列之间是一致的,比如说第二个和第三个序列之间,第三个和第四个序列之间都是这样的做法,

还有一点需要注意,里面所有的箭头都是双向的,因此金字塔注意力中的注意力矩阵是一个对称矩阵

总结 金字塔注意力

(1)第一个粗尺度构造模块,通过多个连续的卷积层,来初始化金字塔中的各层的节点表示的

(2)第二步金字塔的内部,进行mask操作,该建立连接的就建立连接,不该有连接的,就把它们之间的权重设置为零

随手补充

领域迁移,然后描述方法,重新解构模型图

add_circle2025-02-20 16:49:11update2025-04-20 12:10:24