MoCo 方法回顾
把对比学习看成了一个分类问题,用当前图像上提取到的 feature
q
q
q 与当前图像进行 augmentation 得到的 feature
k
+
k_+
k+ 以及其他图像上提取到的 feature
k
k
k 分别计算内积,内积的结果作为分类概率,并用交叉熵损失函数进行优化:
L
q
=
−
log
exp
(
q
⋅
k
+
/
τ
)
∑
i
=
0
K
exp
(
q
⋅
k
i
/
τ
)
L_q=-\log{\frac{\exp(q\cdot k_+/\tau)}{\sum_{i=0}^K\exp(q\cdot k_i/\tau)}}
Lq=−log∑i=0Kexp(q⋅ki/τ)exp(q⋅k+/τ) 本质是一个分类问题,希望同一张图片经过不同 augmentation 提取的特征能分到一类,不同的图片提取到的特征分到不同的类。
训练过程中,query_encoder 是直接训练的,key_encoder 是根据 query_encoder 逐渐更新的:
θ
k
←
m
θ
k
+
(
1
−
m
)
θ
q
\theta_k\leftarrow m\theta_k+(1-m)\theta_q
θk←mθk+(1−m)θq
这是为了保证 key 尽量稳定,否则如果 key_encoder 变化太快的话,提取到的 feature 差异就会很大,再去比较 feature 是不是一致就没有意义了,因为网络都变了。
VideoMoCo 的改进
Temporally Adversarial Learning
该模块可以看作在时间维度上进行的 augmentation,通过对抗训练使 encoder 在时间维度上更稳定。生成器预测每一帧的重要性,并且删掉其中 25%最重要的帧,判别器希望抽帧后提取的特征与抽帧前相同。这里与一般的 GAN 思路略有差别,VideoMoCo 里生成器希望生成的视频尽量不同,判别器希望学到的特征尽量相同。
Temporal Decay
越早计算的 key,采用的模型与 query 差距越大,因此 VideoMoCo 根据 key 进入队列的时间,逐步降低了 key 的权重:
L q = − log exp ( q ⋅ k + / τ ) ∑ i = 0 K t i ⋅ exp ( q ⋅ k i / τ ) L_q=-\log{\frac{\exp(q\cdot k_+/\tau)}{\sum_{i=0}^Kt^i\cdot\exp(q\cdot k_i/\tau)}} Lq=−log∑i=0Kti⋅exp(q⋅ki/τ)exp(q⋅k+/τ)