跳至主要内容

[20.03] MoCo v2

Z. Yuan
Dosaid maintainer, Full-Stack AI Engineer

扳回一城

Improved Baselines with Momentum Contrastive Learning


FAIR 提出了 MoCo v1,還沒得意多久,就有了 Google 提出的 SimCLR,效果提升非常多!

這是一棒打在 FAIR 頭上,簡直不能忍!於是在 SimCLR 發表後一個月,FAIR 擷取了 SimCLR 的一些優點,推出了 MoCo v2。

意思很明確,就是告訴其他人 MoCo 架構依然是個比較好的選擇!

提示

本篇論文的主要比較對象是 SimCLR,感興趣的讀者可以參考我們之前的文章:

定義問題

SimCLR 在實作上做了三項改進:

  1. 非常大的 batch(4k 或 8k),保證能看到足夠多的負樣本。
  2. MLP 頭:把編碼器輸出的特徵先接到一個 2 層的 MLP(含 ReLU)之後,再做對比損失。訓練完後,做下游任務時,通常會只用編碼器輸出的特徵(不包含 MLP 的輸出)。
  3. 更強的資料增強:包含較強的顏色抖動、模糊等。

但是,SimCLR 雖然效果好,但是那個 batch size 真的太大了,一般人根本跑不動。

提示

財大氣粗的 Google 有 TPU,所以才能跑得動 4k 或 8k 的 batch size。

所以作者在這篇論文中試著把 SimCLR 的兩大主要設計改進整合進 MoCo:

  1. MLP projection head
  2. 更強的資料增強

然後發現這些改進在 MoCo 框架同樣有效,而且可以在一般 8-GPU 的環境就做出超越 SimCLR 的結果(不需要超大 batch)。

這顯然對普通使用者來說更友善,也讓對比學習的研究更容易複現。

解決問題

model_arch

上圖展示了 SimCLR 與 MoCo 的架構差異。

SimCLR 屬於 End-to-end 機制,需要同一個 batch 裡面同時存在足夠多的負樣本,所以通常要用 4k ~ 8k 這麼大的 batch size。

而 MoCo 則使用一個「動量編碼器(momentum encoder)」來維護負樣本的表徵。負樣本的向量存在一個「隊列」中,批次之間共享;因此就算 batch 很小,也可以使用一個很大的隊列,提供大量的負樣本。

因此,MoCo 不需要大 batch 也能保有很多負樣本,對硬體資源的需求相對小。

加強 MLP 頭

mlp_head

作者先把 MoCo 原本最後一層的全連接(fc)投影頭替換成 2 層的 MLP(中間層 2048 維,帶 ReLU),並嘗試不同的溫度參數 τ\tau

結果顯示如上表,如果只用 fc(無 MLP),ImageNet 線性分類大約 60%~61%;但換成 MLP 之後可以升到 66% 左右(在最佳 τ=0.2\tau = 0.2 時),提升非常顯著。

不過在物件偵測的轉移學習上,MLP 頭帶來的提升比較小。這也說明了一個常見疑惑:

  • 「線性分類的結果一定愈高愈好嗎?和實際下游任務有沒有直接關係?」

其實有些時候並不呈現完全正相關;線性分類的分數是一個參考指標,但不保證在所有下游任務上都會有同樣幅度的改善。

加強資料增強

more_aug

接下來作者把 MoCo 原本的增強策略再加上 SimCLR 的「模糊增強」,以及稍微更強的顏色扭曲。結果發現,就算不加入 MLP 頭,光是加強資料增強就能讓 ImageNet 線性分類從 60.6% 提高到 63.4%。而在偵測的結果上,也與使用 MLP 頭後的提升相當或者更好。

最後,如果同時使用 MLP 頭和強增強,ImageNet 線性分類可以到 67.3%,偵測也有明顯提升。

討論

與 SimCLR 的比較

compare

SimCLR 在文章中用 4k 或 8k 的 batch size,而且預訓練了 1000 epoch,拿到 69.3% 的 ImageNet 線性分類正確率。

作者在相對可行的硬體環境下(8-GPU,batch size = 256),把上述兩個改進(MLP + 增強)整合到 MoCo,成為「MoCo v2」。

結果顯示:

  • 當預訓練 200 epoch 時,MoCo v2 可以到 67.5%,比起相同設定下的 SimCLR(61.9%)高出 5.6%,也比用大 batch 的 SimCLR 66.6% 更好。
  • 如果把預訓練延長到 800 epoch,MoCo v2 可以達到 71.1%,超過 SimCLR 的 69.3%。

也就是說,MoCo 不需要超大 batch,就能藉由隊列(queue)機制處理大量負樣本,且同時套用 SimCLR 介紹的 MLP 頭與更強增強,就能達到比 SimCLR 更好的結果。

計算量與資源消耗

train_cost

作者也比較了 end-to-end 機制和 MoCo 機制在 8-GPU 下的記憶體和時間成本。

如果想在 end-to-end 機制中用 batch size = 4k 幾乎無法在 8-GPU 上實行;即使是 batch size = 256,end-to-end 也會比 MoCo 花費更多的記憶體與時間,因為要同時對查詢與關鍵編碼器做反向傳播。

反觀 MoCo 則只需要對查詢編碼器做更新,整體效率更高。

結論

總之,SimCLR 的概念都可以照搬到 MoCo 上,而且由於 MoCo 的記憶庫機制,訓練時不需要大量的 GPU 資源。不管怎麼看,都是一個經濟實惠,效果絕佳的好選擇。

FAIR 和 Google 在這次較量中,成功扳回一城。

☕ 一杯咖啡,就是我創作的燃料!

贊助我持續分享 AI 實作、全端架構與開源經驗,讓好文章不斷更新。

cta-button
AI / 全端 / 客製 一次搞定 icon
ALL

AI / 全端 / 客製 一次搞定

從構想到上線,涵蓋顧問、開發與部署,全方位支援你的技術實作。

包含內容
  • 顧問服務 + 系統建置 + 客製開發
  • 長期維運與擴充規劃

🚀 你的專案準備好了嗎?

如果你需要客製服務或長期顧問,歡迎與我聯繫!