一文梳理2020年大熱的對比學(xué)習模型
對比學(xué)習的概念很早就有了,但真正成為熱門方向是在2020年的2月份,Hinton組的Ting Chen提出了SimCLR,用該框架訓(xùn)練出的表示以7%的提升刷爆了之前的SOTA,甚至接近有監(jiān)督模型的效果。在SimCLR推出后,各路大佬們又陸續(xù)提出了不少有意義的工作,本文將對2020年的一些對比學(xué)習經(jīng)典研究進行總結(jié),方便大家快速掌握這個方向的原理和發(fā)展脈絡(luò)。
首先再簡要說下對比學(xué)習的基本原理,先從無監(jiān)督表示學(xué)習講起。表示學(xué)習的目標是為輸入 學(xué)習一個表示 ,最好的情況就是知道 就能知道 。這就引出了無監(jiān)督表示學(xué)習的第一種做法:生成式自監(jiān)督學(xué)習。比如還原句子中被mask的字,或者還原圖像中被mask的像素。但這種方式的前提需要假設(shè)被mask的元素是相互獨立的,不符合真實情況。另一方面,研究者們也質(zhì)疑如此細粒度的還原是否真正必要。
舉個例子,假如有人讓你憑空畫一張一美元,你可能只畫成這樣[1]:

而如果給你一張美元照著臨摹,可能還能畫好看點,比如這樣:

所以說我們記住的事物特征,不一定是像素級別的,而是更高維度的。更具體來說,比如用編碼去做分類任務(wù),我們不需要知道每個數(shù)據(jù)的細節(jié),只要抓住每個類別的主要特征,自然就能把他們分開了:

不重構(gòu)數(shù)據(jù),那如何衡量表示 的好壞呢?這時也可以用互信息 ,代表我們知道了 之后, 的信息量減少了多少。 如果對最大化互信息的目標進行推導(dǎo)[2],就會得到對比學(xué)習的loss(也稱InfoNCE),其核心是通過計算樣本表示間的距離,拉近正樣本,拉遠負樣本。也就是說,當我們能夠區(qū)分該樣本的正負例時,得到的表示就夠用了。
具體的做法是,輸入N個圖片,用不同的數(shù)據(jù)增強方法為每個圖片生成兩個view,分別對它們編碼得到y(tǒng)和y'。我們對上下兩批表示兩兩計算cosine,得到NxN的矩陣,每一行的對角線位置代表y和y'的相似度,其余代表y和N-1個負例的相似度。

對每一行做softmax分類,采用交叉熵損失作為loss,就得到對比學(xué)習的損失了:
其中 是可調(diào)節(jié)的系數(shù)。
對比學(xué)習的原理很簡單,比較粗暴的優(yōu)化方向就是增加view難度、增加更多負例、提升encoder表現(xiàn)等。下面就讓我們看看大佬們在這一年里是如何花式優(yōu)化的。
P.S.?在公眾號「李rumor」后臺回復(fù)「對比」直接下載7篇論文喔
MoCo(CVPR20)
既然對比是在正負例之間進行的,那負例越多,這個任務(wù)就越難,于是一個優(yōu)化方向就是增加負例。
純粹的增大batch size是不行的,總會受到GPU內(nèi)存限制。一個可行的辦法就是增加memory bank,把之前編碼好的樣本存儲起來,計算loss的時候一起作為負例:

但這樣有個問題是存儲好的編碼都是之前的編碼器計算的,而 的編碼器一直在更新,會有兩側(cè)不一致的情況,影響目標優(yōu)化。一個可行方法之一就是用最新的左側(cè)encoder更新編碼再放入memory bank,但這依然避免不了memory bank中表示不一致的情況,實驗效果很差。
所以何凱明大佬在2019年底推出了MoCo(Momentum Contrast)模型[3],延續(xù)memory bank的思想,使用動量的方式更新encoder參數(shù),解決新舊候選樣本編碼不一致的問題:

對于每個batch x:
隨機增強出 、 兩種view 分別用 、 對輸入進行編碼得到歸一化的 q 和 k,并去掉 k 的梯度更新 將 q 和 k 一一對應(yīng)相乘得到正例的cosine(Nx1),再將 q 和隊列中存儲的K個負樣本相乘(NxK),拼接起來的到 Nx(1+K) 大小的矩陣,這時第一個元素就是正例,直接計算交叉熵損失,更新 的參數(shù) 動量更新 的參數(shù): 將 k 加入隊列,把隊首的舊編碼出隊,負例最多時有65536個
這樣每次入隊的新編碼都是上一步更新后的編碼器輸出,以很低的速度慢慢迭代,與舊編碼盡量保持一致。實驗發(fā)現(xiàn),m=0.999時比m=0.9好上很多。最終在ImageNet的實驗效果也遠超前人,成為當時的SOTA:

SimCLR(ICML20)
SimCLR是Hinton組的Chen Ting在20年2月提出的工作,直接比MoCo高出了7個點,并直逼監(jiān)督模型的結(jié)果:

框架結(jié)構(gòu)還是采用雙塔:

主要做了以下改動:
探究了不同的數(shù)據(jù)增強組合方式,選取了最優(yōu)的 在encoder之后增加了一個非線性映射 。研究發(fā)現(xiàn)encoder編碼后的 會保留和數(shù)據(jù)增強變換相關(guān)的信息,而非線性層的作用就是去掉這些信息,讓表示回歸數(shù)據(jù)的本質(zhì)。注意非線性層只在無監(jiān)督訓(xùn)練時用,在遷移到其他任務(wù)時不使用 計算loss時多加了負例。以前都是拿右側(cè)數(shù)據(jù)的N-1個作為負例,SimCLR將左側(cè)的N-1個也加入了進來,總計2(N-1)個負例。另外SImCLR不采用memory bank,而是用更大的batch size,最多的時候bsz為8192,有16382個負例
MoCo v2
SimCLR推出后一個月,何凱明和Chen Xinlei同學(xué)對MoCo進行了一些小改動:
改進了數(shù)據(jù)增強方法 訓(xùn)練時在encoder的表示上增加了相同的非線性層 為了對比,學(xué)習率采用SimCLR的cosine衰減

經(jīng)過改動后,以更小的batch size就超過了SimCLR的表現(xiàn):

SimCLR v2(NIPS20)
在2020年中,Hinton組的Chen Ting同學(xué)又提出了SimCLR v2[4],主要做了以下改動:
采用更深但維度略小的encoder,從 ResNet-50 (4×) 改到了 ResNet-152 (3×+SK),在1%的監(jiān)督數(shù)據(jù)下提升了29個點 采用更深的3層MLP,并在遷移到下游任務(wù)時保留第一層(以前是完全舍棄),在1%的監(jiān)督數(shù)據(jù)下提升了14個點 參考了MoCo使用memory,但由于batch已經(jīng)足夠大了,只有1%左右的提升
最終模型比之前的SOTA好了不少:

SwAV(NIPS20)
對比學(xué)習需要很多負例進行比較,既耗時又耗內(nèi)存,于是FAIR聯(lián)合Inria也推出了一個新的方法SwAV。作者提出了一個新的想法:對各類樣本進行聚類,然后去區(qū)分每類的類簇。模型結(jié)構(gòu)如下:

具體的做法是,先用K個點 表示聚類中心(prototypes),給定一個batch的編碼 ,將其通過 映射到一組新的向量 。這里假設(shè)向量都是d維的[5],那C的維度就是 dxK,Z的維度是 dxB,Q的維度則是KxB,每個元素 相當于第k個聚類中心與第b個樣本的相似度,理想情況下,樣本與自己的類簇中心相似度為1,與其他的為0,其實就是一個one-hot label。不過作者發(fā)現(xiàn)soft label效果會好一些。這樣每個樣本又獲得了一個新的表示(Codes)。
有了 和 之后,理論上同一張圖片不同view所產(chǎn)生的 和 也可以相互預(yù)測,作者便定義了新的loss:
其中
同時SwAV也提出了一種新的數(shù)據(jù)增強方法,將不同分辨率的view進行mix。最終兩種方法的結(jié)合帶來了4.2個點的提升:

BYOL
上文講的方法來回都逃不過“對比”這個范式,而DeepMind提出的BYOL則給了我們一個不同視角。
在表示學(xué)習中,我們現(xiàn)在采用的框架本質(zhì)是通過一個view的表示去預(yù)測相同圖像其他view,能預(yù)測對說明抓住了圖像的本質(zhì)特征。但在做這樣的預(yù)測時會有坍縮(collapse)的風險,意思是全都變成一個表示,那也可以做到預(yù)測自己。對比學(xué)習為了解決這個問題,將表示預(yù)測問題轉(zhuǎn)換為了正負例判別問題,這樣就迫使模型的輸出是多樣的,避免坍縮。
于是BYOL的作者想:如何不用負例,也能學(xué)到好的表示呢?如果共用encoder,用MSE作為損失,縮小相同圖像不同view的距離,肯定會坍縮。而作者發(fā)現(xiàn)如果把其中一個encoder變成隨機初始化的固定下來(stop gradient),就能達到18.8%的準確率。為了得到更好的encoder,作者參考動量的方法對其中一個encoder做了改進:

這里我們按照論文,稱上半部分為online(更新梯度),下半部分為target(不更新梯度)。BYOL的優(yōu)化目的是用online表示預(yù)測target表示,采用MSE作為損失函數(shù)。Online梯度回傳后,使用滑動平均對targe的encoder和MLP參數(shù)進行更新。在預(yù)測階段只使用 。
雖然BYOL沒有顯示地使用對比學(xué)習loss,但一篇博主在實驗[6]中發(fā)現(xiàn)BYOL依靠的還是“對比”。他們在復(fù)現(xiàn)BYOL的時候直接基于了MoCo的代碼,結(jié)果發(fā)現(xiàn)效果還沒有隨機的好,原來是因為MLP中沒有加BN。如果深究BN的作用,就會發(fā)現(xiàn)它重新調(diào)整了輸出的分布,避免坍縮,同時BN也在隱式地進行對比,去除batch內(nèi)樣本相同的部分,保留不同的特征。
同時,在不依賴負樣本后,BYOL對于數(shù)據(jù)增強方法的選擇更加魯棒,下面是它的效果:

SimSiam
延續(xù)BYOL的思想,Chen Xinlei與何凱明大佬又對孿生網(wǎng)絡(luò)進行了研究,發(fā)現(xiàn)stop-gradient是避免坍縮的關(guān)鍵,于是提出了SimSiam。
SimSiam的結(jié)構(gòu)非常簡單:

左側(cè)的編碼器生成 ,經(jīng)過MLP后輸出 右側(cè)的編碼器生成 計算 與 的cosine相似度 左右調(diào)換,再計算 與 的cosine相似度 最大化3、4兩個步驟的和,且右側(cè)永遠不傳播梯度
訓(xùn)練步驟雖然簡潔,但為什么work卻有很多學(xué)問。簡單的解釋是,對于整體目標的優(yōu)化可以看作一個EM過程,左右兩邊交替更新,所以在更新左側(cè)encoder時可以將右側(cè)看成常數(shù)。更多的細節(jié)可以參考Andy的詳解。
最終SimSiam的效果超過了眾多前輩,但仍比BYOL差3個點:

同時他們提到,孿生網(wǎng)絡(luò)自帶建模不變性(invariance)的歸納偏置(inductive bias):
two observations of the same concept should produce the same outputs
這個發(fā)現(xiàn)可以幫我們理解為什么孿生網(wǎng)絡(luò)效果很好,表示學(xué)習就是要建模數(shù)據(jù)中的不變性。
其他細節(jié)
1. 數(shù)據(jù)增強方法

SimCLR中對數(shù)據(jù)增強方法進行了研究,得到了兩個結(jié)論:
不同的數(shù)據(jù)增強方式組合起來會更好,單一增強的任務(wù)太簡單 Crop和Color組合的方式最好,因為大多數(shù)圖像中的顏色是比較一致的,即使裁剪也會容易辨認,如果去掉顏色會增加任務(wù)難度
2. BatchNorm導(dǎo)致的信息泄露
在分布式訓(xùn)練中,BN都是分別在各個設(shè)備上做的。而對比學(xué)習的正例對在一個機器上計算,會出現(xiàn)信息泄露。個人認為,在BN去除batch內(nèi)共同特征時,很可能被歸一化到相似的分布,降低任務(wù)難度。
MoCo的解決辦法是把一邊的樣本重新shuffle再并行,另一邊順序不變,這樣batch的統(tǒng)計量就不同了;SimCLR的解法是計算一個全局的BN值。
3. MLP
在SimCLR以后的工作中都使用了MLP,SimSiam也對它的作用進行了探究:

可以看到不使用MLP基本沒效果可言。作者通過實驗發(fā)現(xiàn):MLP可能承擔了估計整體期望的功能。這同SimCLR最初增加MLP時的發(fā)現(xiàn)是一致的,核心思想還是過濾表示中的無效特征,得到本質(zhì),服務(wù)于“對比”任務(wù)。
總結(jié)
對比學(xué)習在2020年異常火爆,CV領(lǐng)域的高質(zhì)量研究層出不窮,很多都超過了有監(jiān)督學(xué)習的表現(xiàn)。這次我們只介紹了無監(jiān)督對比學(xué)習,實際上它在有監(jiān)督任務(wù)上也有應(yīng)用,同時NLP、Graph領(lǐng)域也都看得到它的身影。期待CV與NLP領(lǐng)域相互借鑒,碰撞出更好的工作。
參考資料
Contrastive Self-Supervised Learning: https://ankeshanand.com/blog/2020/01/26/contrative-self-supervised-learning.html
[2]深度學(xué)習的互信息:無監(jiān)督提取特: https://kexue.fm/archives/6024
[3]Momentum Contrast for Unsupervised Visual Representation Learning: https://arxiv.org/pdf/1911.05722.pdf
[4]Big Self-Supervised Models are Strong Semi-Supervised Learners: https://arxiv.org/pdf/2006.10029.pdf
[5]representation learning與clustering的結(jié)合(3): SwAV: https://zhuanlan.zhihu.com/p/259975814
[6]Understanding self-supervised and contrastive learning with BYOL: https://untitled-ai.github.io/understanding-self-supervised-contrastive-learning.html
往期精彩回顧
獲取本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/qFiUFMV
本站qq群704220115。
加入微信群請掃碼:
