Day 14: Not All Images are Worth 16 x 16 Words: Dynamic Visition Transformer 动态视觉 Transformer

本文介绍了华为和清华大学合作研发的Dynamic Vision Transformer (DVT),旨在通过动态调整token数量,降低Transformer计算复杂度,针对不同复杂度图片自适应推理,利用特征复用和关系复用机制优化计算。模型设计用于在保持精度的同时,有效平衡复杂样本和简单样本的计算负载。

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

这篇是华为和清华共同发表的文章,果然清华出品,还是比较硬核!看完第一遍并没有特别了解,也许需要结合代码再看一遍。

总体上来说,也是为了在不影响效果的情况下,降低计算复杂度。

要点总结

之前的 Transformer 结构计算量都很大,因此需要找方法降低它的计算复杂度。

并非所有的图片都需要被分割成特别多的 token 来参与计算,有的图片相对简单,只需要拆成 4 × 4 4 \times 4 4×4 的 token,就能有很好的准确率,因此提出了动态视觉 Transformer 的模型。模型的目的是自动地根据每张图片来调节 token 的数量,以达到较高的计算效率。

在这里插入图片描述

具体来讲,就是用了一连串 token 数量逐渐增加的 transformer。在测试阶段,这些模型从使用较少 token 的开始依次激活。当一个具有足够高确信度的预测产生后,推断过程就会立刻中止。这样做的结果,就是通过对 token 数量的调控,整个计算量是非平均地分布在“简单”和“困难”的样本之间的。

此外,我们还提出了“特征间(feature-wise)”和“关系间(relationship-wise)”复用机制,来减少冗余的计算。其中,前者使得下游模型能在之前提取出来的深层特征上进行训练,后者则使得模型可以利用现有的上游任务中产生的自注意力关系,来学习到更准确的注意力图。

其它不太重要的一些点

DVT 是作为一个通用框架来设计的,像目前很多 SOTA 的模型,比如 ViT, T2T-ViT,都可以直接作为 backbone 来部署。

通过调节早中止(early-termination)的条件,DVT 的计算量可以在训练时动态调节。

Dynamic Vision Transformer

在这里插入图片描述

概述

我们提出部署多个 Transformer 结构,而且每个 Transformer 结构使用的 token 数量逐渐增加。这样,在测试中,我们可以挨个激活它们,直到得到一个可以接受的预测准确率。

如果 transformer 分别单独训练,那当下游的 transformer 被激活后,上游模型所有的计算结果都会被抛弃,这样会导致模型非常低效。因此作者才提出特征和关系的复用机制,来解决这个问题。

如上图,对于每张图片,我们首先用比较少的一维 token 来嵌入它。我们可以直接将图片块拉成一维,或者用 tokens-to-token 中的方法。我们通过这样使用比较少的 token,来快速地得到一个预测结果。这么做的好处是效率非常高,因为计算量是和 token 数目成二次方增长的。

接下来,根据评价指标的结果,我们会决定当前的结果是否可以立即提取出来。在本文中,当结果足够可信时,我们会使用早中止(early termination)。

但当结果不够可信时,我们会将原始的图片拆成更多的 token,以通过更复杂的计算来得到更精确的结果。需要注意,此处我们仅仅是 token 的数量变多了,但每个 token 的 embedding 维数是不变的。

此时,一个有着完全相同架构,仅仅是参数不同的 transformer 会被激活。根据设定,这一阶段,我们用更复杂的计算来换取在“困难”样本上更准确的结果。

为了使模型更高效,这一新模型可以复用之前模型中学习到的特征和关系。

同样的,当得到新的预测结果后,我们会再次对它进行评价,看是否中止的条件。如果没有达到,则上面的过程会再重复,直到最后退出(sample exits)或者最后一个 transformer 的推断结束

训练

训练阶段,我们训练 DVT,在每个出口处(如图,每个有着对应 token 数量的 transformer 的最末端)产生正确的预测结果。最终优化目标为:

minimize ⁡ 1 ∣ D train  ∣ ∑ ( x , y ) ∈ D tain  [ ∑ i L C E ( p i , y ) ] \operatorname{minimize} \frac{1}{\left|\mathcal{D}_{\text {train }}\right|} \sum_{(x, y) \in \mathcal{D}_{\text {tain }}}\left[\sum_{i} L_{\mathrm{CE}}\left(\boldsymbol{p}_{i}, y\right)\right] minimizeDtrain 1(x,y)Dtain [iLCE(pi,y)]

其中, ( x , y ) (x,y) (x,y) 表示训练集 D t r a i n \mathcal D_{train} Dtrain 中的一个样本及标签。 L C E L_{CE} LCE 是交叉熵 cross-entropy。 p i \mathcal p_i pi 是第 i i i个出口处预测概率经过 softmax 函数后的结果。我们发现这么一个简单的训练目标在实际训练中就有不错的效果。

特征和关系复用(feature and relationship reuse)

设计中的一个主要挑战就是,如何复用先前的计算。也就是,当下游含有更多 token 的 transformer 推断结束后,如果直接将上游中先前得到的计算结果直接抛弃,显得是非常低效的。尽管上游模型中的 token 数量较少,但毕竟它们的目标都是一样的,有着同样有价值的信息。因此,作者提出下面的两种复用机制。二者都能在轻微地增加计算量的情况下,显著地提高测试准确率。

Transformer 回顾

z l ′ = MSA ⁡ ( LN ⁡ ( z l − 1 ) ) + z l − 1 , l ∈ { 1 , … , L } z l = MLP ⁡ ( LN ⁡ ( z l ′ ) ) + z l ′ , l ∈ { 1 , … , L } \begin{array}{ll}\boldsymbol{z}_{l}^{\prime}=\operatorname{MSA}\left(\operatorname{LN}\left(\boldsymbol{z}_{l-1}\right)\right)+\boldsymbol{z}_{l-1}, & l \in\{1, \ldots, L\} \\\boldsymbol{z}_{l}=\operatorname{MLP}\left(\operatorname{LN}\left(\boldsymbol{z}_{l}^{\prime}\right)\right)+\boldsymbol{z}_{l}^{\prime}, & l \in\{1, \ldots, L\}\end{array} zl=MSA(LN(zl1))+zl1,zl=MLP(LN(zl))+zl,l{1,,L}l{1,,L}

其中 z l ∈ R N × D \boldsymbol{z}_{l} \in \mathbb{R}^{N \times D} zlRN×D 是第 l l l 个 transformer 层的输出, N N N 是每个样本的 token 数,它等于 H W + 1 HW+ 1 HW+1,1 是 classification token。 D D D 是每个 token embedding 的维度

特征复用

在这里插入图片描述

我们使用上游 transformer 最后一层中输出的图片 token,比如 z L up  \boldsymbol{z}_{L}^{\text {up }} zLup ,来学习下游模型中的 layer-wise 嵌入 E l E_l El

E l = f l ( z L up  ) ∈ R N × D ′ \mathbf{E}_{l}=f_{l}\left(\boldsymbol{z}_{L}^{\text {up }}\right) \in \mathbb{R}^{N \times D^{\prime}} El=fl(zLup )RN×D

上式中, f l : R N × D → R N × D ′ f_{l}: \mathbb{R}^{N \times D} \rightarrow \mathbb{R}^{N \times D^{\prime}} fl:RN×DRN×D 由一系列的操作组成,这些操作的第一步是 LN-MLP ( R D → R D ′ ) \left(\mathbb{R}^{D} \rightarrow \mathbb{R}^{D^{\prime}}\right) (RDRD),作用是引入非线性,以及增加一些更灵活的变换。

接下来,这个图片 token 被 reshape 到原始图片中对应的位置,再被上采样,然后展平,来匹配下游模型中的 token 数量。通常我们使用一个比较小的 D ′ D' D 来获得一个更高效的 f l f_l fl

结果就是,上游任务中得到的嵌入 E l E_l El 被输入到下游模型中,提供了一些可以用来识别图片的先验知识。这样,上面的传统 transformer 中的第二个方程,可以被替换成下面的这个:

z l = MLP ⁡ ( LN ⁡ ( Concat ⁡ ( z l ′ , E l ) ) ) + z l ′ , l ∈ { 1 , … , L } z_{l}=\operatorname{MLP}\left(\operatorname{LN}\left(\operatorname{Concat}\left(z_{l}^{\prime}, \mathbf{E}_{l}\right)\right)\right)+z_{l}^{\prime}, \quad l \in\{1, \ldots, L\} zl=MLP(LN(Concat(zl,El)))+zl,l{1,,L}

这里的 E l E_l El 与中间的 token z l ′ \boldsymbol{z}_{l}^{\prime} zl concatenate 到了一起,我们只需要在 LN 和 MLP 层中,把维度从之前的 D D D 换成现在的 D + D ′ D+D' D+D

此外,我们并不会复用 classification token 和 pad zero。

上面这个特征复用公式,也可以理解为是增大了模型的深度。

关系复用

在这里插入图片描述

下游模型也能读取上游模型中的注意力图,因此我们也可以复用这些信息。

给定一个输入 z l \boldsymbol{z}_{l} zl,自注意力是这么计算的。首先,Q, K, V 矩阵分别由下面的线性映射得到,

Q l = z l W l Q , K l = z l W l K , V l = z l W l V \mathbf{Q}_{l}=\boldsymbol{z}_{l} \mathbf{W}_{l}^{\mathrm{Q}}, \quad \mathbf{K}_{l}=\boldsymbol{z}_{l} \mathbf{W}_{l}^{\mathrm{K}}, \quad \mathbf{V}_{l}=\boldsymbol{z}_{l} \mathbf{W}_{l}^{\mathrm{V}} Ql=zlWlQ,Kl=zlWlK,Vl=zlWlV

接着,注意力由以下公式得到:

Attention ⁡ ( z l ) = Softmax ⁡ ( A l ) V l , A l = Q l K l ⊤ / d \operatorname{Attention}\left(\boldsymbol{z}_{l}\right)=\operatorname{Softmax}\left(\mathbf{A}_{l}\right) \mathbf{V}_{l}, \quad \mathbf{A}_{l}=\mathbf{Q}_{l} \mathbf{K}_{l}^{\top} / \sqrt{d} Attention(zl)=Softmax(Al)Vl,Al=QlKl/d

上式中 d d d 是 Q 或者 K 中的隐藏维度, A l ∈ R N × N \mathbf{A}_{l} \in \mathbb{R}^{N \times N} AlRN×N 表示注意力图的数值。我们在上式中忽略了多头,因为并不影响我们的描述。

为了复用关系,我们首先将所有上游模型中产生的注意力数值按如下方式拼接(concatenate)起来

A up  = Concat ⁡ ( A 1 up  , A 2 up  , … , A L up  ) ∈ R N up  × N up  × N up  At  \mathbf{A}^{\text {up }}=\operatorname{Concat}\left(\mathbf{A}_{1}^{\text {up }}, \mathbf{A}_{2}^{\text {up }}, \ldots, \mathbf{A}_{L}^{\text {up }}\right) \in \mathbb{R}^{N_{\text {up }} \times N_{\text {up }} \times N_{\text {up }}^{\text {At }}} Aup =Concat(A1up ,A2up ,,ALup )RNup ×Nup ×Nup At 

上式中 N u p N_{up} Nup N u p a t t N^{att}_{up} Nupatt 分别表示上游模型中 token 的数量和所有注意力图的力量。通常情况下, N u p a t t = N H L N^{att}_{up} = N^HL Nupatt=NHL ,其中 N H N^H NH 表示多头注意力中头的个数, L L L 表示层数。这样一来,下游的 transformer 通过同时利用自身的 token 和 A u p A^{up} Aup,来学习注意力图。我们便可将上面的注意力公式换成下面的:

 Attention  ( z l ) = Softmax ⁡ ( A l + r l ( A u p ) ) V l , A l = Q l K l ⊤ / d , \text { Attention }\left(\boldsymbol{z}_{l}\right)=\operatorname{Softmax}\left(\mathbf{A}_{l}+r_{l}\left(\mathbf{A}^{\mathbf{u p}}\right)\right) \mathbf{V}_{l}, \quad \mathbf{A}_{l}=\mathbf{Q}_{l} \mathbf{K}_{l}^{\top} / \sqrt{d},  Attention (zl)=Softmax(Al+rl(Aup))Vl,Al=QlKl/d ,

上式中 r l ( ∗ ) r_l(*) rl() 是一个转换网络,它将 A u p A^{up} Aup 提供的信息集中到一起,来改善下游中的注意力值 A l A_l Al
r l r_l rl 网络的结构如上图4,包括一个用来提供非线性的 MLP,和一个用来匹配注意力图尺寸的上采样操作。当采用多头注意力时,MLP 的输入维度设成头的个数。

需要注意的是,普通的上采样操作不能直接运用在 r l r_l rl 中,而需要采用像下图中的上采样过程:

在这里插入图片描述

上图是将一个 H W × H W ( H = W = 2 ) H W \times H W(H=W=2) HW×HW(H=W=2) (也即 4x4)的注意力图,上采样到 H ′ W ′ × H ′ W ′ ( H ′ = W ′ = 3 ) H^{\prime} W^{\prime} \times H^{\prime} W^{\prime}\left(H^{\prime}=W^{\prime}=3\right) HW×HW(H=W=3) (也即 9x9)的过程。由于 H W HW HW 的每一行和每一列,都对应着 H × W H \times W H×W 个图片 token,首先将它的行和列 reshape 成 H × W H \times W H×W,再将它们缩放至 H ′ × W ′ H' \times W' H×W,然后再拉平成 H ′ W ′ H'W' HW 个向量。(不太明白为什么这样效果会更好

( H W × H W ) (HW \times HW ) (HW×HW) —> reshape —> ( H × W × H W ) (H \times W \times HW) (H×W×HW) —> scale —> ( H ′ × W ′ × H W ) (H' \times W' \times HW) (H×W×HW) —> flatten —> ( H W × H ′ W ′ ) (HW \times H'W') (HW×HW)

自适应性推断

如上所述,DVT 是逐渐增加每个样本中的 token 个数的,且会执行提早中止,这样一来,“容易的”和“困难的”样本就会用不同的 token 个数来代表,且处理时的计算复杂度也会不同,这样就提高了整体的计算效率。具体地说,在产生 softmax 预测 p i p_i pi 的第 i i i 个出口处, p i p_i pi 的最大值 m a x j p i j max_jp_{ij} maxjpij 会和一个阈值 η i \eta_{i} ηi 进行比较,只有当 m a x j p i j > η i max_jp_{ij} > \eta_i maxjpij>ηi 时,推断才结束,同时我们将 p i p_i pi 输出。否则的话,图片将会被拆成更多的 token,并激活下游的 transformer。此外,在最后一个 transformer 处,我们将 threshold 的值设为 0。

{ η 1 , η 2 , … } \left\{\eta_{1}, \eta_{2}, \ldots\right\} {η1,η2,} 的取值是在 validation set 上决定的。我们假设有一个“给定预算下的批量分类”(即预算是固定的,不能超出预算)的设定,规定 DVT 需要在一个给定的计算量预算下,识别出 validation 数据集上的图片。让 Acc ⁡ ( D v a l , { η 1 , η 2 , … } ) \operatorname{Acc}\left(\mathcal{D}_{\mathrm{val}},\left\{\eta_{1}, \eta_{2}, \ldots\right\}\right) Acc(Dval,{η1,η2,}) F L O P s ( D v a l , { η 1 , η 2 , … } ) \mathrm{FLOPs}\left(\mathcal{D}_{\mathrm{val}},\left\{\eta_{1}, \eta_{2}, \ldots\right\}\right) FLOPs(Dval,{η1,η2,}) 分别代表当设置的阈值为 { η 1 , η 2 , … } \left\{\eta_{1}, \eta_{2}, \ldots\right\} {η1,η2,} 时,在验证集上的准确率和计算量开销,最优的阈值可以通过求解以下的优化来得到:

maximize ⁡ η 1 , η 2 , … Acc ⁡ ( D val  , { η 1 , η 2 , … } ) ,  s.t.  FLOPs ⁡ ( D val  , { η 1 , η 2 , … } ) ≤ B \underset{\eta_{1}, \eta_{2}, \ldots}{\operatorname{maximize}} \operatorname{Acc}\left(\mathcal{D}_{\text {val }},\left\{\eta_{1}, \eta_{2}, \ldots\right\}\right), \quad \text { s.t. } \operatorname{FLOPs}\left(\mathcal{D}_{\text {val }},\left\{\eta_{1}, \eta_{2}, \ldots\right\}\right) \leq B η1,η2,maximizeAcc(Dval ,{η1,η2,}), s.t. FLOPs(Dval ,{η1,η2,})B

由于上式不可微,因此需要通过 Darrell Whitley. A genetic algorithm tutorial. Statistics and computing, 4(2):65–85, 1994 本文中的遗传算法来求解。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值