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
ai∈R2的位置
p
∈
R
2
p ∈ R^2
p∈R2的tokens,我们可以定义其前一个锚点
a
i
−
1
a_{i−1}
ai−1和下一个锚点
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)di−1(p)=∥p−ai+1∥2∥p−ai−1∥2,(1)
现在,在每个正方形补丁内,我们按r的升序对tokens进行排序,使得接近前一个锚点的tokens排在前面。此过程因此建立了所有tokens的顺序。最后,为了获得平衡的聚类,我们简单地将数组划分成等大小的组。图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}
Q∈RN×C/H,K∈RM×C/H,A∈RN×M,P∈RN×M 分别是查询、键、注意力和位置嵌入矩阵,且
P
i
,
j
=
w
(
p
i
−
p
j
)
.
(
3
)
P_{i,j} = w(pi - pj).(3)
Pi,j=w(pi−pj).(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
fi∈RC。在邻域内,合并使用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))
Si⋅W(pi−pc)fi⊤)U,
其中
f
m
e
r
g
e
d
∈
R
C
′
f_{merged} ∈ R^{C′}
fmerged∈RC′是具有
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^′}
U∈RCmidC×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中提供了邻域合并过程的可视化。

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

被折叠的 条评论
为什么被折叠?



