選單

對比學習概述

最近深度學習兩巨頭 Bengio 和 LeCun 在 ICLR 2020 上點名 Self-Supervised Learning(SSL,自監督學習) 是 AI 的未來,而其的代表的 Framework 便是 Contrastive Learning(CL,對比學習)。 另一巨頭 Hinton 和 Kaiming 兩尊大神也在這問題上隔空過招,MoCo、SimCLR、MoCo V2 打得火熱,這和 BERT 之後,各大公司出 XL-Net、RoBerta 刷榜的場景何其相似。本篇文章,將會從對比學習的背後的直覺原理出發,介紹其框架,並且對目前的一些相關的工作進行簡要介紹,希望能夠為感興趣的同學提供一些幫助。

Motivation & Framework

很多研究者認為,深度學習的本質就是做兩件事情:Representation Learning(表示學習)和 Inductive Bias Learning(歸納偏好學習)。目前的一個趨勢就是,學好了樣本的表示,在一些不涉及邏輯、推理等的問題上,例如判斷句子的情感極性、識別影象中有哪些東西,AI 系統都可以完成非常不錯;而涉及到更高層的語義、組合邏輯,則需要設計一些過程來輔助 AI 系統去分解複雜的任務,ICLR 19 的一篇 oral 就是做的類似的事情。因為歸納偏好的設計更多的是 任務相關的,複雜的過程需要非常精心的設計,所以很多工作都開始關注到表示學習上,NLP 最近大火的預訓練模型,例如 BERT,就是利用大規模的語料預訓練得到文字的好的表示。那麼,CV 領域的 BERT 是什麼呢?答案已經呼之欲出,就是對比學習。

Illustrative Example

對比學習概述

當你被要求畫一張美元,左邊是沒有鈔票在你面前,右邊是面前擺著一張鈔票畫出來的結果

上面這個例子來自於 Contrastive Self-supervised Learning 這篇 Blog,表達的一個核心思想就是:儘管我們已經見過很多次鈔票長什麼樣子,但我們很少能一模一樣的畫出鈔票;雖然我們畫不出栩栩如生的鈔票,但我們依舊可以輕易地辨別出鈔票。基於此,也就意味著表示學習演算法並不一定要關注到樣本的每一個細節,只要學到的特徵能夠使其和其他樣本區別開來就行,這就是對比學習和對抗生成網路(GAN)的一個主要不同所在。

Contrastive Learning Framework

既然是表示學習,那麼我們的核心就是要學習一個對映函式 f,把樣本 x 編碼成其表示 f(x),對比學習的核心就是使得這個 f, 滿足下面這個式子:

對比學習概述

這裡的 X +就是和 X類似的樣本;X-就是和  X  不相似的樣本,S (。。) 這是一個度量樣本之間相似程度的函式,一個比較典型的 score 函式就是就是向量內積,即最佳化下面這一期望:

對比學習概述

如果對於一個 X ,我們有  1 個正例和 N -1 個負例,那麼這個 loss 就可以看做是一個 N 分類問題,實際上就是一個交叉熵,而這個函式在對比學習的文章中被稱之為 InfoNCE。事實上,最小化這一 loss 能夠最大化  f(x) 和  f(x+)互資訊的下界,讓二者的表示更為接近。理解了這個式子其實就理解了整個對比學習的框架,後續研究的核心往往就聚焦於這個式子的兩個方面:

如何定義目標函式?最簡單的一種就是上面提到的內積函式,另外一中 triplet 的形式就是

,直觀上理解,就是希望正例 pair 和負例 pair 隔開至少 η的距離,這一函式同樣可以寫成另外一種形式,讓正例 pair 和負例 pair 採用不同的 S函式,例如,

對比學習概述

對比學習概述

如何構建正例和負例?針對不同型別資料,例如影象、文字和音訊,如何合理的定義哪些樣本應該被視作是 X+,哪些該被視作是 X- ;如何增加負例樣本的數量,也就是上面式子裡的 ?這個問題是目前很多 paper 關注的一個方向,因為雖然自監督的資料有很多,但是設計出合理的正例和負例 pair,並且儘可能提升 pair 能夠 cover 的 semantic relation,才能讓得到的表示在 downstream task 表現的更好。

接下來,就會介紹一下 MoCo、SimCLR 以及 Contrasitve Predictive Coding(CPC) 這三篇文章,在構建對比樣例中的一些核心觀點。

Contrastive PairMoCo

對比學習概述

論文連結:https://arxiv。org/abs/1911。05722

論文標題:Momentum Contrast for Unsupervised Visual Representation Learning

論文來源:CVPR 2020

對比學習概述

程式碼連結:https://github。com/facebookresearch/moco

前面提到了,樣本數量對於學習到的樣本質量有很大的影響。MoCo 做的事情很簡單,就是把負例樣本的 encoder f(。)和 mini-batch 大小解耦。也就是說,原先在算目標函式的時候,負例樣本對也會為 loss 產生貢獻,因為也就會有梯度回傳給對應的 encoder,那麼這樣在實現的時候,樣本數量必然會受到 batch size 的限制,從而影響學習到表示的質量。

為此,Memory Bank 提出我把所有樣本的表示都存起來,然後每次隨機取樣,這樣就可以認為我的負例樣本理論上可以達到所有樣本的數量,具體的做法就是每一輪來 encode 一次所有的變數,顯然,這樣很吃記憶體,並且得到的表示也和引數更新存在一定的滯後。

MoCo 則改善了上述的兩個缺點,一方面,用一個 queue 來維護當前的 negative candidates pool,queue 有著進出的動態更新機制,一方面能夠和 Mini-batch 解耦,queue size 可以設定的比較大,另外一方面也就不用對所有樣本做類似預處理的進行編碼;對於負例樣本的引數,採用 Momentum update 的方式,來把正例 encoder 的引數 Θqcopy 給負例 encoder Θk :

對比學習概述

三種方式的示意圖也在這一小節的開頭給出了,可以清楚的看到三種方式的區別。這種對比畫圖的方式對於說明問題很有幫助,可以在論文中進行嘗試。

SimCLR

對比學習概述

論文連結:https://arxiv。org/abs/2002。05709

論文標題:A Simple Framework for Contrastive Learning of Visual Representations

程式碼連結:https://github。com/google-research/simclr

MoCo 剛說完樣本數量對於對比學習很重要,這邊 SimCLR 就從另外一個角度,說構建負例的方式(影象上,就是對於影象的 transformation)也很重要,探究了 transformation 、batch-size 大小等對於學習到的表示的影響,並且把這個框架用下面這張圖來說明:

對比學習概述

文章主要得出了下面幾個結論:

對於樣本進行變化,即構建正例和負例的 transformation 對於結果至關重要;

用 entropy loss 的 Contrastive Learning,可以透過 normalize representation embedding 以及 temperature adjustment 提點;

在計算 loss 之前,讓表示再過一個 non-linear hard 能大幅提升效果,即上面框架圖中的 g(*);

大 batch-size 對於 CL 的增益比 Supervised Learning 更大。

其中最後一個結論,和 MoCo 的初衷是符合的,並且作者雖說不用 Memory-bank,但是 SimCLR 嘗試的 bsz 也達到了令人髮指的 8192,用了 128 塊 TPU,又是算力黨的一大勝利。MoCo v2 也是利用了上面的第一點和第三點,在 MoCo 基礎上得到了進一步的提升,然後作者還也明確的點名了 SimCLR,稱不需要使用那麼大的 batch size 也能超過它,可能這就是神仙打架吧。

CPC

對比學習概述

論文標題:Representation Learning with Contrastive Predictive Coding

前面討論的兩篇文章主要集中在影象資料上,那麼對於文字、音訊這樣的資料,常見的裁剪、旋轉等變換操作就無法適用了,並且,因為其資料本身的時序性,設計合理的方法來把這一點考慮進去是至關重要的。Contrastive Predictive Coding(CPC) 這篇文章就提出,可以利用一定視窗內作為 Positive pair,並從輸入序列之中隨機取樣一個輸入  作為負例,下圖說明了 CPC 的工作過程:

對比學習概述

為了把歷史的資訊也加入進去,作者提出可以在 Zt上額外增加一個自遞迴模型,例如 GRU,來在表示之中融入時序關係,得到相應的 Ct 來進行對比學習。在下游任務中,既可以使用 Zt也可以使用 Ct,又或者是二者的融合,可以根據任務需要來進行靈活的選擇。

Theory & Application

接下來,會簡要的討論幾篇關於對比學習的理論和應用類的文章:

ICML 2019

對比學習概述

論文連結:https://arxiv。org/abs/1902。09229

論文標題:A Theoretical Analysis of Contrastive Unsupervised Representation Learning

論文來源:ICML 2019

這篇文章發表在 ICML 2019 上,對比學習這一框架雖然在直覺上非常 make sense,但是理論上為什麼得到的表示就能夠在 downstream 例如 classification 上表現良好?

這篇文章透過定義 latent class 以及樣本和 latent class 的距離入手,推匯出了二分類情況下的 loss bound,保證了其的泛化效能。文章提出了一個改進演算法就是進行 block 處理,不再直接最佳化各個 pair 的 inner product,而是轉而最佳化 positive block以及 negative block 的內積:

對比學習概述

文章在後續的實驗上也驗證了這一方法會優於內積方法。

NIPS 2017

對比學習概述

論文連結:https://arxiv。org/abs/1710。02534

論文標題:Contrastive Learning for Image Captioning

論文來源:NIPS 2017

這篇文章希望透過使用對比學習來解決 image captioning 中標題文字可區別性的問題,即儘可能讓標題描述和唯一的一張圖片對應,而不是籠統而又模糊的可能和多張圖片對應。作者引入對比學習,把對應的影象和標題作為正例 pair (C,I+)

,並把其中的影象隨機取樣得到負例 pair (C,I-),並且在已有的 sota 模型上最佳化 p(C|I+) - p(C| I-),提升生成的 caption 的效果。

ICLR 2020

對比學習概述

論文連結:https://arxiv。org/abs/1911。12247

論文標題:Contrastive Learning of Structured World Models

論文來源:ICLR 2020

前面提到,表示學習能夠較好的解決一些簡單的任務,但是理解物體之間的關係以及建模其間的互動關係不單單需要好的表示,同樣需要一個好的歸納偏好。這篇文章就是透過利用 state set 來表示世界中各個物體的狀態,並且利用圖神經網路來建模其之間的互動,再進一步地利用對比學習來提升效能,下圖給出了模型的示意圖:

對比學習概述

這裡的對比學習是從 TransE 架構遷移而來,具體地,在 TransE 中,我們會希望一個三元組

的能夠讓

對比學習概述

儘可能的小,即 et的表示加上 relation Tt 的表示和 Ot 的表示儘可能地接近,而遷移到世界模型中,就是要將 entity 換成物體的 state,relation 換成 action,即經過圖卷積後的得到的新的表示,透過下面的式子進行最佳化:

對比學習概述

這裡的 Zt 是從 experience buffer 中取樣得到的負例樣本,文章在後續多物體互動環境的模擬實驗中驗證了其方法的優越性。

對比學習概述

Summary

本文介紹了關於對比學習背後的動機,以及一系列在影象、文字上的一些工作,在計算機視覺領域,其習得的表示能夠很好地在下游任務泛化,甚至能夠超過監督學習的方法。

回過頭來看,預訓練模型從 ImageNet 開始,後來這一思想遷移到 NLP,有了 BERT 等一系列透過自監督的預訓練方法來學習表示,後來這一想法又反哺了計算機視覺領域,引出了諸如 MoCo、SimCLR 等工作,在一系列分割、分類任務上都取得了驚人的表現。那麼,這一思想會不會又再次和 NLP 結合,碰撞出新的火花呢,讓我們拭目以待。