本文转自
Taskonomy: Disentangling Task Transfer Learning解读, 沈博魁
Taskonomy的网站:taskonomy.stanford.edu.
梗概:
人类的视觉具备多种多样的能力,计算机视觉届基于此定义了许多不同的视觉任务。长远来看,计算机视觉着眼于解决大多数甚至所有视觉任务,但现有方法大多尝试将视觉任务逐一击破。这种方法造成了两个问题:第一, 逐一击破需要为每一项任务收集大量数据,随着任务数量的增多,这将会是不可行的;第二,逐一击破会带来不同任务之间的冗余计算和重复学习。总的来说,逐一击破的策略忽略了视觉任务之间的关联性,比如法线 (Surface Normals) 是由深度 (Depth) 求导得来,语义分割 (Semantic Segmentation) 又似乎和遮挡边缘测试 (Occlusion edge detection) 有着千丝万缕的关联。基于上述两个问题,我们希望能有效测量并利用视觉任务之间的关联来避免重复学习,从而用更少的数据学习我们感兴趣的一组任务。
=================================================================
方法:
简单概括,方法分为两个大阶段,四个小步。第一大阶段涉及前三小步,我们要量化不同视觉任务之间的关联,并将任务关联表达成一个affinity matrix(关联矩阵)。第二大阶段,也就是最后一步,我们对求得的affinity matrix进行最优化,求得如何最高效地去学习一组任务。这个最高效的策略会由一个指向图 (directed graph) 来表示,我们称此指向图为Taskonomy。词语上Taskonomy是Task (任务) 和Taxonomy (分类论) 的合并简称。
问题定义:
首先,我们来定义我们想要解决的问题。我们想在有限的监督预算γ下最大化我们在一组目标任务 (target tasks) T = { t 1 , . . . , t n } \mathcal {T}=\{t_1,...,t_n\} T={t1,...,tn} 上的表现。同时,我们有一组起始任务 (source tasks) S \mathcal{S} S ,其定义为我们可从零学习的任务。监督预算 γ 的定义为多少起始任务我们愿意从零开始学习(从零开始学习需要收集大量数据,监督预算表达了我们所面对的金钱、计算力和时间上的限制)。那么, T \mathcal{T} T ∖ \setminus ∖ S \mathcal{S} S 代表了我们感兴趣但不能从零学习的任务,比如一个只能有少量数据的任务。 S \mathcal{S} S ∖ \setminus ∖ T \mathcal{T} T 代表了我们不感兴趣但可以从零学习(来帮助我们更好的学习 T \mathcal{T} T )的任务,如jigsaw、colorization等自我监督的视觉任务。 T \mathcal{T} T ∩ \cap ∩ S \mathcal{S} S 代表了我们感兴趣也能从零学习的任务,但因为从零学习会消耗监督预算,我们希望从中选择出符合预算的一组从零学习,余下的通过少量数据的迁移学习来实现。我们称 V \mathcal{V} V= T \mathcal{T} T ∪ \cup ∪ S \mathcal{S} S 为我们的任务词典 (task dictionary)。最后,我们对视觉任务 t 的定义为一个基于图片的方程 f_t 。
如下图所示,我们收集了一个有四百万张图片的数据题,每张图片均有26个不同视觉任务的标注(ground truth)。这26个任务涵盖了2D的、3D的和语义的任务,构成了本项research的任务词典。因为这26个任务均有标答, S \mathcal{S} S 也为这26个任务。
第一步:从零学习
对于每个起始任务, 我们为其从零开始学习一个神经网络。为了能更好地控制变量从而比较任务关联,每个任务的神经网络具有相似的encoder decoder结构。所有的encoder都是相同的类ResNet 50结构。因为每个任务的output维度各不相同,decoder的结构对不同的任务各不相同,但都只有几层,远小于encoder的大小。(注:CVPR poster session期间有人问起,decoder泛指read out functions,比如classification的FC Layers也算为decoder )
第二步:迁移学习
如上图所示,对于一个起始任务 s ∈ S s\in\mathcal{S} s∈S 和一个目标任务 t ∈ T t\in\mathcal{T} t∈T ,我们将以 s s s 的representation作为输入来学习 t t t 。我们将freeze任务 s s s 的encoder 参数,并基于encoder的输出 (representations) 学习一个浅层神经网络read out function。严谨来讲,如果我们用 E s E_s Es 表示 s s s 的encoder, f t f_t ft 表示 t t t 的标注, L t L_t Lt 表示 t t t 的loss函数, I ∈ D I\in \mathcal{D} I∈D 来表示图片和迁移训练集, D D D 表示要迁移学习的浅层神经网络,学习目标为:
D s → t : = arg min θ E I ∈ D [ L t ( D θ ( E s ( I ) ) , f t ( I ) ) ] D_{s \rightarrow t} :=\arg \min_{\theta} \mathbb{E}_{I \in \mathcal{D}}\Big[L_t\Big(D_{\theta}\big(E_s(I)\big), f_t(I)\Big)\Big] Ds→t:=argθminEI∈D[Lt(Dθ(Es(I)),ft(I))]
对于所有 s s s 和 t t t 组合,我们均训练了一个 D s → t D_{s \rightarrow t} Ds→t 。如下图所示,对于 t t t ,不同的 E s ( I ) E_s(I) Es(I) 会对 D s → t D_{s \rightarrow t} Ds→t 的表现造成不同的影响。更具关联的 s s s 会为 t t t 提供更有效的统计信息,从而仅用1/60的训练数据(相较于从零学习)就能取得不错的结果;相反不具备关联的 s 则并不能有此表现。因此,我们认为 D s → t D_{s \rightarrow t} Ds→t 在 t t t 任务中的表现可以很好地代表了 s s s 之于 t t t 的关联性。
上述迁移代表了任务之间一对一的关联,我们称其为一阶关联。如下图,几个任务之间可能具有互补性,结合几个起始任务的representations会对解决目标任务起到帮助。因此,我们也研究了任务之间多对一的关联,我们称其问高阶关联。在这种情况下,我们将几个起始任务的representation结合起来当作目标任务的输入,其余细节跟上段类似。
因为高阶的任务组合数量太大,我们基于一阶表现选择了一部分的组合进行迁移学习。对于小于五阶的高阶,我们根据一阶的表现,将前五的所有组合作为输入。对于n>5阶,我们选择结合一阶表现前n的起始任务作为输入。
第三步:Ordinal Normalization
这一步的目标为用一个 affinity matrix 量化任务之间的关联。虽然从上步习得的迁移网络中我们获得了许多的loss值 L s → t L_{s\rightarrow t} Ls→t ,但因这些loss值来自于不同的loss 函数,它们的值域有很大差别。如果我们把这些loss值直接放入一个矩阵(上图左,纵轴为目标任务、横轴为起始任务),那么这个矩阵内的值及其不均匀,并不能有效反应任务之间的关联。同时,简单的线性规范化也并不能解决问题,因为任务的loss值和表现并不构成线性关系(0.01的 l_2 loss并不代表其表现两倍好于0.02的loss)。由此,我们采用Ordinal Normalization(基于序数的规范化)来将loss值转换为关联度。该方法基于运筹学中的 AHP (Analytic Hierarchy Process)。概括来讲,affinity matrix中的第 (i,j) 个值为利用第 i 个起始任务迁移后,其网络有多大的几率表现好于用第 j 个网络(我们在下文称其为 i 对于 j 的胜率)。
对于每个目标任务 t t t ,我们构建pairwise tournament矩阵 W t W_t Wt ,其纵轴和横轴均对应所有的起始任务及我们计算过的高阶组合。给定一个测试集 D t e s t D_{test} Dtest , W t W_t Wt 的 ( i , j ) (i,j) (i,j) 项为 s i s_i si 在 D t e s t D_{test} Dtest 的所有图片输入中有多大的几率表现好于 s j s_j sj(有几成 I ∈ D t e s t I \in D_{test} I∈Dtest 会使 L t ( D s i → t ( I ) ) < L t ( D s j → t ( I ) ) ) L_t(D_{s_i \rightarrow t}(I)) < L_t(D_{s_j \rightarrow t}(I)) ) Lt(Dsi→t(I))<Lt(Dsj→t(I)))。在将 W t W_t Wt 的值clip到 [0.001,0.999] ,计算 W t ′ = W t / W t T W'_t = W_t / W_t^T Wt′=Wt/WtT , W t ′ W'_t Wt′ 的 ( i , j ) (i,j) (i,j) 项 w i , j ′ w'_{i,j} wi,j′ 现在代表着 s i s_i si 表现好于 s j s_j sj 几倍。这样:
w i , j ′ = E I ∈ D test [ D s i → t ( I ) > D s j → t ( I ) ] E I ∈ D test [ D s i → t ( I ) < D s j → t ( I ) ] \\ w'_{i,j} = \frac{\mathop{\mathbb{E}}_{I \in \mathcal{D_\textit{test}}}[D_{s_i \rightarrow t}(I) > D_{s_j \rightarrow t}(I)] }{\mathop{\mathbb{E}}_{I \in \mathcal{D_\textit{test}}}[D_{s_i \rightarrow t}(I) < D_{s_j \rightarrow t}(I)] } wi,j′=EI∈Dtest[Dsi→t(I)<Dsj→t(I)]EI∈Dtest[Dsi→t(I)>Dsj→t(I)]
在把 W t ′ W'_t Wt′ 规范化成数值和为1的矩阵后,我们将 s i s_i si 相对于 t t t 的关联性(抑或可迁移性)定义为 W t ′ W'_t Wt′ 的第 i 项principal eigenvector。将所有目标任务的 W t ′ W'_t Wt′ 合并起来,我们获得最终的affinity matrix P ,见上图右。
至此第一大阶段完结,我们通过上述affinity matrix量化了任务之间的关联性。
第四步:BIP (Binary Integer Programming) 最优化
最后一步,我们要基于affinity matrix求得如何最有效地学习一组我们感兴趣的任务。我们可以这个问题想象成一个subgraph selection的问题:选择一些任务从零学习,剩下的任务用少量数据进行迁移学习,具体迁移学习的策略由subgraph中的edge来决定(对一条directed edge,起始点代表我们从零学习的一个任务,终点代表要进行迁移的目标任务)。基于此,我们可以通过解如下BIP最优化问题来得到最优解:
这个最优问题有三个限制条件:
实验结果:
Taskonomy项目训练了3000+个神经网络,总耗时~50000小时的GPU。从零学习消耗120k张图片,迁移学习为16k张图片。
我认为现有公众号对Taskonomy翻译中最不准确的是对Taskonomy实验部分的评论。如文章一开头所说,Taskonomy的目标为用有限的监督预算来最有效地解决一组任务,并不是将state of the art提高百分之几。本文想宣扬的中心思想是计算机视觉届应注重视觉任务间的关联性,并让这些关联性为我们所用。回到本文的具体用途,Taskonomy的用途有两个:
Taskonomy作为解决一组任务的方法。
用Taskonomy的任务词典解决一个只有少量数据的新任务。
以下试验结果分为两个部分,分别对应以上两点。
一:解决一组任务
如何衡量Taskonomy解决一组任务的有效性?我们设定了两个评判标准。
下图是Taskonomy的迁移获利 (左) 和质量 (右) 的图表。两图的纵轴为所有目标任务,横轴为监督预算,胜率在0-1之间。可见,对于一个26个任务的目标集,在只有一半甚至1/3的监督预算时,Taskonomy 计算出的监督分配会使整体表现远远打败从零学习(迁移获利),并近似于(胜率超过40%)大量数据完全监督学习(迁移质量)。
二:解决新任务
对于解决新任务,我们可以把我们任务词典里的目标任务当作一个新任务,模拟只有少量数据的情况。实验结果如下,我们可以发现Taskonomy的表现超过了现有的行业pretrained features(包括imagenet fc7)。
总结:
在Taskonomy项目里,我们的目标是着眼于一组任务,并利用任务之间的关联性减少总体数据使用量。为此,我们量化了视觉任务的关联性,并基于求得的affinity matrix最优化得到如何分配任务监督数据量。实验表明,视觉任务之间确实存在很强的关联性,我们能通过更少的数据很好地解决一组任务。现在大家已经可以去Github来使用我们的任务词典:StanfordVL/taskonomy。