# [Contrastive Learning] Fast-MoCo

  • 论文链接:Arxiv
  • 期刊/会议:ECCV 2022
  • 是否有code: Code

关键词

对比学习

问题简述

Motiviation

这是篇卖“问题”的文章。作者发现使用目前的对比学习方法,想要得到理想的效果往往需要很长的训练时间(比方说MoCo需要训练800个epoch)。作者认为,这主要是因为这类“two-image-one-pair”的对比学习范式,对于数据的利用率并不高。简单来说,就是一个sample的经过增广后的两个view(文中的“two-image”就是two-view)只能用作一个正例pair,这在训练过程中对于数据的利用十分低效。基于这个假设,很自然就能想到“two-image-multi-pair”,来提升训练效率:

  • 那如何用two-image中生成多个正例pair呢?作者给出一个方法就是“combinatorial patches”的方法。大体就是一个image可以切分成多个patch,再把切出来的多个patch进行一定程度的排列组合,就可以构成多个“组合Patch”,然后这些组合Patches与另一个image(同sample的不同view)就可以构成多个pair啦;
  • 通过"two-image-multi-pair"这个特点,Fast-MoCo最大优势就是训练起来非常快,原始MoCo v3需要800个epoch才能达到的效果,Fast-MoCo只需要100个epoch就可以了。# [Contrastive Learning] Fast-MoCo_第1张图片

方法介绍

下图是Fast-MoCo的大致流程,可以看出Fast-MoCo与MoCo的范式是非常接近的,不然也不会叫做FastMoCo嘛。其最主要的改动是将且仅将MoCo中的 online分支路 的数据流从基于image改为了基于Patch,其他地方基本没有改变。FastMoCo的online分支路对于数据的处理可以大致分为三个步骤:

  1. Divide Step
  2. Encode Step
  3. Combine Step
    # [Contrastive Learning] Fast-MoCo_第2张图片

Divide Step:

非常简单,就是将整张image切分为彼此不交叠的 m × m m \times m m×m个 Patch,记作 { x p ∣ p ∈ { 1 , . . . , m 2 } } \{x_{p}|p \in \{1,...,m^2\}\} {xpp{1,...,m2}} p ∈ { 1 , . . . , m 2 } p\in\{1,...,m^2\} p{1,...,m2}代表这些Patch的序号;
作者通过实验证明, m = 2 m=2 m=2的值会比较好;

Encode Step:

对于Divide Step生成出来的 { x p ∣ p ∈ { 1 , . . . , m 2 } } \{x_{p}|p \in \{1,...,m^2\}\} {xpp{1,...,m2}},分别独自送到encode来提取特征 { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vpp{1,...,m2}}

Combine Step:

在这一环节,会从 { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vpp{1,...,m2}}取出一部分来进行组合:

  1. 从集合 p ∈ { 1 , . . . , m 2 } p\in\{1,...,m^2\} p{1,...,m2}中随机选出n个构成一个子集,记作 p n ∈ p p_n \in p pnp
  2. 组合后的特征 c c c则可以通过 c = 1 n ∑ p ∈   p n v p c = \frac{1}{n}\sum_{p \in\ p_n}v_p c=n1p pnvp来计算得到;这里作者根据实验效果与计算量平衡方面的考量,决定选直接平均的方式来生成 c c c,除此之外, s u m sum sum c o n c a t concat concat 以及 m a x max max 也都可以考虑;

通过简单的排列组合, { v p ∣ p ∈ { 1 , . . . , m 2 } } \{v_{p}|p \in \{1,...,m^2\}\} {vpp{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={cii{1,...,Cm2n}}

之后 c = { c i ∣ i ∈ { 1 , . . . , C m 2 n } } \textbf{c}=\{c_i|i \in \{1,...,C_{m^2}^n\}\} c={cii{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,大大提升数据利用效率;

Combine Step 为什么work

笔者理解:Online分支路生成的组合特征 c c c 仅包含了整个image的一部分,相比之下,Target分支路优于没有使用Divide-Encode-Combine过程,其生成的特征是包含整个image的。因此,将这两部分特征拉近会是一个更加难的学习任务,也可理解为 c c c 天然就是 hard-positive;

与其他Patch-Wised对比学习范式对比

那么作者对比了哪些其他的基于Patch的对比学习范式呢?
# [Contrastive Learning] Fast-MoCo_第3张图片
结果自然是Fast-MoCo效果最佳啦:
# [Contrastive Learning] Fast-MoCo_第4张图片
作者对比了这些组合,总结了两条规律:

  1. Divide Step是不能被Sample(random cropping)替换的,后者肯定会带来性能的下降;
  2. Combine-Step要进行在Encode Step之后;

总结

卖问题的,是一篇有一定启发性的文章

  1. Patch-Wise的引入挺巧妙,并不是为了用而用;笔者一直认为对比学习过程中,目前进行正负对比的"粒度"还是过于粗糙了,这无疑会限制对比学习的上限,这篇文章从这个角度上,听具有启发性的。
    缺点:
  2. 本文达到的效果只能说差强人意吧。减少了学习时间,但是并没有涨点or泛化性提升。笔者认为降低学习时间在工业界和学术界的意义都比较有限;

参考文献

本文基本均为原创

你可能感兴趣的:(对比学习,CV算法,人工智能,深度学习,机器学习)