Momentum Contrast for Unsupervised Visual Representation Learning
一、Methods Previously Proposed
1. End-to-end Mechanisms
-
方法簡介:對於每個mini-batch中的 image 進行增強,每一張圖片經過增強處理都得到兩張圖片q 和 $ k_+ $, 這兩張互為正樣本。采用兩個不同的 encoder 分別對 q和 dictionary中的keys(包含q對應的正樣本 $ k_+ $) 進行編碼得到相應特征,通過計算特征間的 contrastive loss 對兩個encoder都進行一次參數更新。
-
弊端:dictionary size 和 mini-batch 的強耦合性,也就是dictionary size = mini-batch size,而dictionary size 取決於最終的模型特征表達性能,也就是GPU大小限制了模型的性能。
2. Memory Bank
- 方法簡介:大致方式與 end-to-end 差不多,主要有以下幾點區別:
- decoupled:memory bank 讓 dictionary size 從 mini-batch 中解耦出來,這個 dictionary size 就是整個樣本的數量。
- update: query 的編碼器每次都通過SGD進行更新,而 dictionary key 對應的編碼器的更新時刻是當同一個樣本 image 再次出現的時候,進行更新。
- 弊端:當 dictionary 中的 key 再次更新的時候,可能是時隔好幾個 epoch 的事情,因此 dictionary 中的 key 可能是用不同時刻差異性較大的encoder編碼得到的,因此在計算 constrative loss 時,丟失了編碼的一致性,導致網絡的性能受到限制。
二、Motivation
- 無監督表征學習在NLP中獲得了巨大的成果(e.g. GPT,BERT),如何將無監督應用到計算機視覺任務中,取代原先的有監督與訓練模型。
- 如何將NLP無監督學習中適用於離散空間的建立字典方法應用到數據空間為連續的、高維的計算機視覺任務中去。
- 如何解決之前提出兩個方法的弊端:在解耦的同時,維護 dictionary 中 key 的一致性。
三、Proposed Method
先說一下我對 pretext task 的個人理解:在解決一個具體任務之前,先制定一個前置(代理)任務,用於得到一個好的特征表達的模型。本文設定的 pretext task 是 instance discrimination task。
1. Contrastive Learning
- 核心思想 : 將 dictionary 作為一個 queue 進行維護
- 方法簡介:在 memory bank 的機制上做一些優化,引入動量更新機制(MoCo),保持 dictionary 編碼的一致性。dictionary 的更新方式做了改進:對於當前的 mini-batch 進行排隊處理,進隊后相對於一些最早進入隊列的 mini-batch 對應的 key 進行出隊操作,這樣保證一些過時的、一致性較弱的 key 可以被清除掉。
2. Contrastive Loss Function(InfoNCE)
其中,\(\tau\) 是超參數,實驗設置為0.07,兩個向量的點積用於衡量兩個向量的相似性。
3. Momentum Contrast (MoCo)
每一次迭代的時候都用 MoCo 機制對 momentum encoder 進行模型參數更新,而 query 對應的 encoder 則是用SGD的方式進行更新,MoCo 機制對應的更新公式如下:
其中,\(\theta_k\) 對應的是 dictionary 的編碼器 momentum encoder 網絡的參數, \(\theta_q\) 對應的是 query 的編碼器參數,\(m\) 是動量系數, \(m\in [0, 1)\) , 實驗表明,當 \(m = 0.999\) 時效果最好,也證明了一點:對 momentum encoder 進行緩慢更新是使用隊列的關鍵所在,可以保證 dictionary keys 中的一致性。
4. Algorithm
5. Shuffling BN
這里提到傳統的 BN 不能得到很好的特征表示,因此作者用了 Shuffling BN ,針對 dictionary 編碼器,將 batch 中的樣本順序打亂后,放到多個GPUs中進行 BN 操作,編碼后,再進行打亂操作,從而達到 query 和 keys 來自於不同的子集。(純屬個人理解,如有誤請包涵並指出)
四、Experiments
1.Datasets
- Image Net - 1M ( IN - 1M )
- ~1.28 million images in 1000 classes
- well-ballanced
- Instragram - 1B ( IG - 1B )
- ~1 billion public images from Instagram
- uncurated, long-tailed, unbalanced
2. Trian Setting ( Optimizer:SGD )
3. ImageNet Validation
I. Albation: contrastive loss mechanisms
- End-to-end 機制受到了GPU內存大小的限制,無法繼續增加K的大小
- Memory bank 的性能也不如 MoCo, 再一次驗證了 dictionary key 中的一致性
- 從實驗中也可以看出,K越大也就是dictionary的大小越大,模型性能也越好
II. Albation: momentum
- 對 momentum encoder 進行緩慢更新是使用隊列的關鍵所在,可以保證 dictionary keys 中的一致性
III. Comparison with previous results
- 在同等參數量情況下,性能優於其他方法
- 隨着參數量增加,性能也隨之提升
4. PASCAL VOC Object Detection
I. Albation:backbones
- backbone 不同,模型性能也不同,R50-C4 的性能優於R50-dilated-C5
II. Albation:contrastive loss mechanisms (pre-trained on IN-1M)
- MoCo 性能優於 end-to-end 和 memory bank
III. Comparison with previous results
- MoCo 優秀!
5. COCO Object Detection and Segmentation
- MoCo 在多個任務上都有優異的性能,但在 VOC 的 Semantic Segmentation 任務中發現,性能不如有監督,這也是作者做了這么多實驗唯一一個反例,即便如此,MoCo的性能也是不容置疑的。
五、Conclusion
- 巧妙地利用了維護隊列的思想,讓 dictionary 的大小盡可能大的同時保證了 dictionary 中 key 的一致性。
- MoCo 的無監督學習得到的模型性能在下游任務中展現出同等甚至超越有監督預訓練模型的性能,大大拉近了有監督和無監督的鴻溝。
- 一些感慨:大牛之所以是大牛,是有原因的,想法與硬件條件起飛,想法的落地,還是需要強大的GPU啊。當然,有想法的前提,還是得有強大的知識儲備,一只默默仰望大佬的小菜蝸牛。