对比学习
这是篇卖“问题”的文章。作者发现使用目前的对比学习方法,想要得到理想的效果往往需要很长的训练时间(比方说MoCo需要训练800个epoch)。作者认为,这主要是因为这类“two-image-one-pair”的对比学习范式,对于数据的利用率并不高。简单来说,就是一个sample的经过增广后的两个view(文中的“two-image”就是two-view)只能用作一个正例pair,这在训练过程中对于数据的利用十分低效。基于这个假设,很自然就能想到“two-image-multi-pair”,来提升训练效率:
下图是Fast-MoCo的大致流程,可以看出Fast-MoCo与MoCo的范式是非常接近的,不然也不会叫做FastMoCo嘛。其最主要的改动是将且仅将MoCo中的 online分支路 的数据流从基于image改为了基于Patch,其他地方基本没有改变。FastMoCo的online分支路对于数据的处理可以大致分为三个步骤:
非常简单,就是将整张image切分为彼此不交叠的 m × m m \times m m×m个 Patch,记作 { x p ∣ p ∈ { 1 , . . . , m 2 } } \{x_{p}|p \in \{1,...,m^2\}\} {xp∣p∈{1,...,m2}}, p ∈ { 1 , . . . , m 2 } p\in\{1,...,m^2\} p∈{1,...,m2}代表这些Patch的序号;
作者通过实验证明, m = 2 m=2 m=2的值会比较好;
对于Divide Step生成出来的 { x p ∣ p ∈ { 1 , . . . , m 2 } } \{x_{p}|p \in \{1,...,m^2\}\} {xp∣p∈{1,...,m2}},分别独自送到encode来提取特征 { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vp∣p∈{1,...,m2}};
在这一环节,会从 { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vp∣p∈{1,...,m2}}取出一部分来进行组合:
通过简单的排列组合, { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vp∣p∈{1,...,m2}}可以生成 C m 2 n C_{m^2}^n Cm2n 种组合特征 c c c,他们共同构成 组合特征集合 c = { c i ∣ i ∈ { 1 , . . . , C m 2 n } } \textbf{c}=\{c_i|i \in \{1,...,C_{m^2}^n\}\} c={ci∣i∈{1,...,Cm2n}}。
之后 c = { c i ∣ i ∈ { 1 , . . . , C m 2 n } } \textbf{c}=\{c_i|i \in \{1,...,C_{m^2}^n\}\} c={ci∣i∈{1,...,Cm2n}}种的每个 c c c都在去经过projector和predictor处理,去和target分支路(与MoCo v3完全一致,还是使用基于image的数据流,没有以上Divide->Encode->Combine步骤)一起计算InfoNCE损失。相当于从原来的一个正例pair变为了现在的 C m 2 n C_{m^2}^n Cm2n 个pair,大大提升数据利用效率;
笔者理解:Online分支路生成的组合特征 c c c 仅包含了整个image的一部分,相比之下,Target分支路优于没有使用Divide-Encode-Combine过程,其生成的特征是包含整个image的。因此,将这两部分特征拉近会是一个更加难的学习任务,也可理解为 c c c 天然就是 hard-positive;
那么作者对比了哪些其他的基于Patch的对比学习范式呢?
结果自然是Fast-MoCo效果最佳啦:
作者对比了这些组合,总结了两条规律:
卖问题的,是一篇有一定启发性的文章
本文基本均为原创