CVPR 2023 autofocusformer核心部分翻译

这篇文章详细介绍了CVPR2023会议上AutoFocusFormer的核心组成部分,包括使用平衡聚类算法定义局部邻域、TransformerBlocks的注意力机制以及创新的自适应下采样模块,以优化深度学习模型中的信息流动和效率。

CVPR 2023 autofocusformer 核心部分翻译

前文摘要引言和部分方法见:乄洛尘的文章
代码链接见:https://github.com/apple/ml-autofocusformer

3. 方法

在backbone中,从patch embedding module(2层步长为2的3x3 conv)开始,然后聚类算法(3.1节),然后几个局部注意力的transformerblocks(3.2节),然后新的自适应下采样模块(3.3节)。ps:分割头本文不说。

3.1 聚类和邻域

  一个局部邻域可以方便地通过在2D网格上切出一个正方形窗口来定义。与此形成对比的是,对于一个无序的点集,确定3D点云中的邻域的传统方法依赖于诸如k近邻(kNN)等算法,它计算点之间的成对距离。朴素的kNN算法具有二次时间复杂度。有趣的是,许多加速kNN的算法的第一步都是在给定的点上进行k-means聚类,以减少邻域搜索的空间。受此启发,我们也使用簇来定义局部邻域,即我们将tokens分为若干簇,并将邻域定义为包含几个相邻的簇。不幸的是,传统的聚类算法如k-means或局部敏感哈希并不直接适合我们的目的。首先,它们需要多次迭代或哈希轮数,因此相比深度网的前向传播而言速度较慢。更重要的是,它们导致的簇中点的数量不一。不均匀大小的簇导致需要用零填充的张量,这将浪费内存和时间。注意我们仅对2D位置进行聚类而不是更高的维度,我们提出一种平衡聚类方法来解决上述问题。

3.1.1 平衡聚类

  我们的方法不是采用传统的迭代方法,而是将图像上的2D位置排列成1D数组,然后将数组划分成等大小的组。为此,我们考虑了空间填充曲线,它将2D位置排列在1D线上,同时尽量保留2D距离测度。因此,在线上接近的点在2D空间中也比较接近。然而,由于从2D到1D的转换,完全保留2D度量是不可能的,如果我们直接利用空间填充曲线将tokens划分为簇,就会出现伪影。为了部分减轻这一问题,我们采用了2阶段过程进行聚类。其思想是仅在粗糙级别上利用空间填充曲线来获得稀疏、正则采样的2D图像位置的顺序。然后,根据与这些位置的2D距离对tokens进行排序。
  具体而言,我们首先将图像划分为粗糙的规则网格,其中的正方形patches数量与预期的簇数量相似。我们将网格中每个正方形patches的中心称为空间填充锚点。空间填充曲线在锚点之间建立顺序。根据这个顺序,对于属于锚点 a i ∈ R 2 a_i ∈ R^2 aiR2的位置 p ∈ R 2 p ∈ R^2 pR2的tokens,我们可以定义其前一个锚点 a i − 1 a_{i−1} ai1和下一个锚点 a i + 1 a_{i+1} ai+1。然后,我们计算所有token p p p计算从 p p p到这两个锚点的距离比率r。
r ( p ) = d i − 1 ( p ) d i + 1 ( p ) = ∥ p − a i − 1 ∥ 2 ∥ p − a i + 1 ∥ 2 ,( 1 ) r(p) = \frac{d_{i−1}(p)} {d_{i+1}(p)} = \frac{∥p − a_{i−1}∥_2}{∥p − a_{i+1}∥_2}, (1) r(p)=di+1(p)di1(p)=pai+12pai12,(1
  现在,在每个正方形补丁内,我们按r的升序对tokens进行排序,使得接近前一个锚点的tokens排在前面。此过程因此建立了所有tokens的顺序。最后,为了获得平衡的聚类,我们简单地将数组划分成等大小的组。图3说明了整个算法。
figure 3
  因为我们可以在O(1)时间内通过简单量化它们的坐标来找到每个tokens对应的空间填充锚点,所以聚类的总体时间复杂度不超过对局部补丁中的所有tokens位置进行一次排序,与网络的时间复杂度相比可以忽略不计,因为没有涉及到特征通道。注意,聚类算法只需要在每个阶段开始时执行一次,簇信息可以用于该阶段的所有注意力块以及末端的下采样模块。与先前的平衡聚类工作不同,该算法不是迭代的,并产生完全平衡的簇。它也保证每个tokens只属于一个簇,不同于RoutingTransformer,其中一些tokens可能不属于任何簇。但是,请注意我们的平衡聚类仅适用于低维点。在这项研究的早期阶段,我们探索了使用嵌入特征而不是仅2D位置进行聚类,但性能差异可以忽略。因此,我们决定仅对位置进行聚类,这使我们能够利用所提出的算法生成完美平衡的簇。

3.1.2 聚类中的邻域

  为了促进整个图像中的信息流动,重要的是注意力不应仅限于同一簇内的位置。例如,在Swin Transformers中,连续层之间的窗口移动允许像素在不同层中关注不同的邻居。然而,在我们的情况下,对每一层重新进行聚类会增加不必要的计算量。因此,我们选择使用较小的簇,并允许每个tokens关注来自附近R个簇的tokens。为实现这一点,我们使用的邻域大小是簇大小的几倍。这是有利的,因为邻域是重叠的,保证了簇之间的信息交换。

3.2 Transformer Attention Blocks

  在任何阶段,设tokens数量为N,每个tokens的邻居数量为M,头数为H,特征通道数为C。具有相对位置嵌入的单个头的局部注意力A通过每个tokens关注其邻域中的所有其他tokens来计算,即
A = s o f t m a x ( Q K T + P ) , ( 2 ) A = softmax(QK^T + P),(2) A=softmax(QKT+P),2
  其中 Q ∈ R N × C / H , K ∈ R M × C / H , A ∈ R N × M , P ∈ R N × M Q ∈ R^{N×C/H},K ∈ R^{M×C/H},A ∈ R^{N×M},P ∈ R^{N×M} QRN×C/H,KRM×C/H,ARN×M,PRN×M 分别是查询、键、注意力和位置嵌入矩阵,且
P i , j = w ( p i − p j ) . ( 3 ) P_{i,j} = w(pi - pj).(3) Pi,j=w(pipj).3
  这里, p i pi pi, p j pj pj是两个相邻tokens的(x,y)坐标, w w w(·)是一个返回该头的标量位置嵌入的函数。对于固定形状邻域的模型,相对位置嵌入可以存储在矩阵中,并在需要时读取。但是对于我们的模型,邻居的位置事先是未知的,因此我们需要通过可学习函数将坐标差投影到位置嵌入中。我们用一个全连接层实现 w w w

3.3 Adaptive downsampling

  在每个阶段的末尾,除了最后一个阶段,我们采用一个下采样模块。下采样模块包含两部分,一个用于选择最重要tokens的可学习评分组件,以及周围选定tokens的邻域合并步骤。

3.3.1 Learnable Importance Score

  我们学习预测每个token i的标量分数si,以指示其相对于任务损失的重要性。学习该分数的主要困难在于下采样限制了选定tokens的数量。如果任务损失仅反向传播到选定的tokens,则未选定的tokens可能不会接收到任何梯度。为了向所有tokens反向传播梯度,我们提出学习每个token的重要性分数与邻域合并过程结合。
  具体而言,假设我们正在合并一个特定位置 p c p_c pc处token周围的邻域 N ( p c ) N(p_c) N(pc)。类似于注意力块的邻域 N ( p c ) N(p_c) N(pc)从其最近的R个簇获得,第i个邻居token表示为一个元组 ( p i , f i ) (pi, fi) (pi,fi),其中位置 p i = ( x i , y i ) pi = (xi, yi) pi=(xi,yi),特征 f i ∈ R C fi∈R^C fiRC。在邻域内,合并使用PointConv层的修改版本执行,如下所示:
f m e r g e d ( p c ) = v e c ( ∑ ( p i , f i ) ∈ N ( p c ) σ ( l ( f i ) ) ⏞ S i ⋅ W ( p i − p c ) f i ⊤ ) U , f_{merged}(p_c) = vec(\sum_{(pi,fi)∈N (p_c)}\overbrace{σ(l(fi))}^{S_i}·W(p_i − p_c)f_i^⊤)U, fmerged(pc)=vec(pi,fi)N(pc)σ(l(fi)) SiW(pipc)fiU,
其中 f m e r g e d ∈ R C ′ f_{merged} ∈ R^{C′} fmergedRC是具有 C ′ C^′ C输出的合并输出, v e c ( ⋅ ) vec(·) vec()表示向量化, σ ( ⋅ ) σ(·) σ()是sigmoid函数, l ( ⋅ ) l(·) l()是一个预测标量“重要性分数”的全连接层, W ( ⋅ ) W(·) W()是一个输出形状为 C m i d × 1 C_{mid} × 1 Cmid×1的多层感知机(MLP),它创建输入特征 f i f_i fi在邻域中的不同加权组合。权重学习为每个邻域token的位置与合并中心位置pc之间的相对坐标的函数。最后, U ∈ R C m i d C × C ′ U ∈ R^{C_{mid}C×C^′} URCmidC×C作为一个全连接层实现。
  注意,等式(4)与PointConv f = v e c ( ∑ W f ⊤ ) U f = vec(\sum Wf^⊤)U f=vec(Wf)U类似,已被证明等价于一个连续的卷积层。我们添加了 S i = σ ( l ( f i ) ) S_i = σ(l(f_i)) Si=σ(l(fi))来调节这个函数,这使得模型在邻域合并期间可以“关闭”不重要的token,使它们的特征不被用于下一阶段。因此,分数si可以看作是一个指示器,表示模型认为一个token的重要程度。这个分数接下来可以用于选择合并中心。
  这种形式化让我们可以直接从任务损失中学习分数si,而不必诉诸于先前工作中使用的昂贵技术,如策略梯度。一些以前的工作使用Gumbel Softmax/Sigmoid来获得一个可微的二值掩码,以保持在下采样后向“删除”的token的梯度流;由于我们采用合并策略而不是删除,我们不需要这样一个硬二值掩码。我们在图4中提供了邻域合并过程的可视化。
figure 4

3.3.2 Grid priors and Selection of Tokens to Sample

  最终用于选择作为合并中心的token的分数是 g i + α S i g_i +\alpha S_i gi+αSi,这是学习到的分数 s i s_i si和网格先验gi的加权和,其中 α \alpha α是超参数。虽然 s i s_i si仅基于特征向量,但网格先验帮助模型区分不同位置的相似token,从而方便模型在本地无纹理区域进行适当的、均匀步长的下采样。我们的网格先验 g i g_i gi模拟了传统网格下采样的行为——交替将1和0赋给token。然而,在token已经不规则采样的阶段,再添加规则网格先验就不再合理。因此,我们提倡一种“自适应”网格先验,它考虑采样token的局部密度。
  具体来说,自适应先验根据采样token的局部步幅选择局部网格级别。对于每个token p i = ( x i , y i ) p_i = (x_i, y_i) pi=(xi,yi),我们将其“步幅” t i t_i ti赋值为与其最近邻的距离,向上舍入至2的最近幂。例如,如果token与其最近邻距离为3像素,则将其步幅赋值为 t i t_i ti = 4。然后,如果 ( x i m o d 2 t i = 0 ) ∧ ( y i m o d 2 t i = 0 ) (x_i mod 2t_i = 0) ∧ (y_i mod 2t_i = 0) (ximod2ti=0)(yimod2ti=0),我们设 g i = 1 g_i = 1 gi=1,也就是说,我们希望将局部步幅从ti下采样到2 t i t_i ti。因此,如果 t i = 1 t_i = 1 ti=1,则 g i = 1 g_i = 1 gi=1对应交替像素,如果 t i t_i ti = 2,则 g i = 1 g_i = 1 gi=1对应每4个像素。此外,我们在第j阶段将 ( x i m o d 2 j + 1 = 0 ) ∧ ( y i m o d 2 j + 1 = 0 ) (x_i mod 2^{j+1} = 0) ∧ (y_i mod 2^{j+1} = 0) (ximod2j+1=0)(yimod2j+1=0)的token的网格先验设置为无穷大。我们称这些token为“保留”。我们保留这些粗网格token,以确保前向传播期间图像中远程区域之间的连通性。
  总之,自适应下采样的工作流程如下:
1)为每个token fi获得重要性分数 S i = σ ( l ( f i ) ) S_i = σ(l(fi)) Si=σ(l(fi)),
2)为每个token计算网格先验gi,
3)选取 g i + α S i g_i + \alpha S_i gi+αSi值最高的前x% token(例如1/4或1/5),
4)在前x% token的位置周围执行Eq. (4)给出的邻域合并公式,并获得下一阶段的合并token。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马敲马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值