對(duì)比學(xué)習(xí)論文綜述【論文精讀】

對(duì)比學(xué)習(xí)綜述
發(fā)展歷程大概可以分為四個(gè)階段
1、百花齊放
- InstDisc(instance discrimination)
- cpc
- CMC
- 在這個(gè)階段中,方法、模型、目標(biāo)函數(shù)、代理任務(wù)都還沒(méi)有統(tǒng)一,所以說(shuō)是一個(gè)百花齊放的時(shí)代
2、CV雙雄
- MoCo v1
- SimCLR v1
- MoCo v2
- SimCLR v2
- cpc、CMC的延伸工作
- SwAV
- 這個(gè)階段發(fā)展非常迅速,上述工作有的間隔一兩個(gè)月,有的間隔甚至不到一個(gè)月,ImageNet上的成績(jī)基本上每個(gè)月都在被刷新
3、不用負(fù)樣本
- BYOL以及它后續(xù)的一些改進(jìn)
- 最后SimSiam將所有的方法都?xì)w納總結(jié)了一下,融入到了SimSiam的框架中,基本上是用卷積神經(jīng)網(wǎng)絡(luò)做對(duì)比學(xué)習(xí)的一個(gè)總結(jié)性工作
4、transformer
- MoCo v3
- DINO
- 對(duì)于自監(jiān)督學(xué)習(xí)來(lái)說(shuō),無(wú)論是對(duì)比學(xué)習(xí)還是最新的掩碼學(xué)習(xí),都是用Vision Transformer做的
這里只是把最有聯(lián)系的一些工作串到一起,講述他們的相似之處和不同之處
1、百花齊放
Unsupervised Feature Learning via Non-Parametric Instance Discrimination
InstDisc(instance discrimination)
這篇論文提出了個(gè)體判別任務(wù)以及memory bank

- 圖1:本文的方法是受到有監(jiān)督學(xué)習(xí)結(jié)果的啟發(fā),如果將一張豹子的圖片喂給一個(gè)已經(jīng)用有監(jiān)督學(xué)習(xí)方式訓(xùn)練好的分類器,會(huì)發(fā)現(xiàn)他給出來(lái)的分類結(jié)果排名前幾的全都是跟豹子相關(guān)的,有獵豹、雪豹,總之從圖片來(lái)看這些物體都是長(zhǎng)非常相近的;而排名靠后的那些判斷往往是跟豹子一點(diǎn)關(guān)系都沒(méi)有的類別
- 通過(guò)很多這樣的現(xiàn)象,作者覺(jué)得讓這些圖片聚集在一起的原因并不是因?yàn)樗鼈冇邢嗨频恼Z(yǔ)義標(biāo)簽,而是因?yàn)檫@些照片長(zhǎng)得太像了,某一些 object 就是很相似,它們跟另外一些 object 的呢就是不相似,所以才會(huì)導(dǎo)致有些分類分?jǐn)?shù)都很高,而有些分?jǐn)?shù)非常低
- 最后作者根據(jù)這個(gè)觀察提出了個(gè)體判別任務(wù):無(wú)監(jiān)督的學(xué)習(xí)方式就是把按照類別走的有監(jiān)督信號(hào)推到了極致,現(xiàn)在把每一個(gè) instance都看成是一個(gè)類別,也就是每一張圖片都看作是一個(gè)類別,目標(biāo)是能學(xué)一種特征能把每一個(gè)圖片都區(qū)分開(kāi)來(lái)
- 所以圖一畫的很好,起到了一石二鳥(niǎo)的作用:不僅很簡(jiǎn)單的介紹了研究動(dòng)機(jī),自然而然地引入了問(wèn)題,而且用一句話的形式引入了個(gè)體判別這個(gè)代理任務(wù)

- 圖二講述了文章中的方法
- 通過(guò)一個(gè)卷積神經(jīng)網(wǎng)絡(luò)把所有的圖片都編碼成一個(gè)特征(這些特征在最后的特征空間里能夠盡可能的分開(kāi),因?yàn)閷?duì)于個(gè)體判別任務(wù)來(lái)說(shuō)每個(gè)圖片都是自己的類,所以說(shuō)每個(gè)圖片都應(yīng)該和別的圖片盡量的分開(kāi))
- 訓(xùn)練這個(gè)卷積神經(jīng)網(wǎng)絡(luò)使用的是對(duì)比學(xué)習(xí),所以需要有正樣本和負(fù)樣本,根據(jù)個(gè)體判別這個(gè)任務(wù),正樣本就是這個(gè)圖片本身(可能經(jīng)過(guò)一些數(shù)據(jù)增強(qiáng)),負(fù)樣本就是數(shù)據(jù)集里所有其它的圖片
- 做對(duì)比學(xué)習(xí),大量的負(fù)樣本特征到底應(yīng)該存在哪呢?本文用了 memory bank 的形式:就是說(shuō)把所有圖片的特征全都存到memory bank 里,也就是一個(gè)字典(ImageNet數(shù)據(jù)集有128萬(wàn)的圖片,也就是說(shuō)memory bank里要存128萬(wàn)行,也就意味著每個(gè)特征的維度不能太高,否則存儲(chǔ)代價(jià)太大了,本文用的是128維)
前向過(guò)程:
- 假如batch size是256,也就是說(shuō)有256個(gè)圖片進(jìn)入到編碼器中,通過(guò)一個(gè) Res 50,最后的特征維度是2048維,然后把它降維降到128維,這就是每個(gè)圖片的特征大小
- batch size 是 256 的話也就意味著有256個(gè)正樣本,那負(fù)樣本從哪來(lái)呢?自然是從 memory bank 里隨機(jī)地抽一些負(fù)樣本出來(lái)。本文抽了4,096個(gè)負(fù)樣本出來(lái)
- 有了正樣本也有了負(fù)樣本,就可以用NCE loss 計(jì)算對(duì)比學(xué)習(xí)的目標(biāo)函數(shù)
- 一旦更新完這個(gè)網(wǎng)絡(luò),就可以把 mini batch里的數(shù)據(jù)樣本所對(duì)應(yīng)的那些特征,在 memory bank 里更換掉,這樣 memory bank 就得到了更新
- 接下來(lái)就是反復(fù)這個(gè)過(guò)程,不停的去更新這個(gè)編碼 t,不停的更新這個(gè) memory bank,最后學(xué)到這個(gè)特征盡可能的有區(qū)分性
本文的方法還有很多細(xì)節(jié)都設(shè)計(jì)的非常巧妙
- 比如說(shuō) proximal regularization:它給模型的訓(xùn)練加了一個(gè)約束,從而能讓 memory bank 里的那些特征進(jìn)行動(dòng)量式的更新,跟 MoCo 的想法是非常一致的

- 另外設(shè)置里面超參數(shù)的設(shè)定,比如說(shuō)算 loss 的時(shí)候溫度的設(shè)置是0.07,選了4,000個(gè)負(fù)樣本,訓(xùn)練是200個(gè)epochs,batch size 是256,起始的 learning rate 是0.03,之后其它論文(尤其是 MoCo)所有的這些實(shí)驗(yàn)細(xì)節(jié),MoCo 都是嚴(yán)格按照 Inst Disc 來(lái)的,這些超參數(shù)都沒(méi)有進(jìn)行更改。所以說(shuō) Inst Disc 這篇論文也是一個(gè)里程碑式的工作:它不僅提出了個(gè)體判別這個(gè)代理任務(wù),而且用這個(gè)代理任務(wù)和 NCE loss做對(duì)比學(xué)習(xí),從而取得了不錯(cuò)的無(wú)監(jiān)督表征學(xué)習(xí)的結(jié)果,同時(shí)它還提出了用別的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)這種大量的負(fù)樣本,以及如何對(duì)特征進(jìn)行動(dòng)量的更新,所以真的是對(duì)后來(lái)對(duì)比學(xué)習(xí)的工作起到了至關(guān)重要的推進(jìn)作用

Unsupervised Embedding Learning via Invariant and Spreading Instance Feature

這是一篇 CVPR 19的論文,跟今天要說(shuō)的其它論文相比,它的影響力可能不是那么大,之所以提一下這篇論文,是因?yàn)樗梢员焕斫獬?/p>
是 SimCLR 的一個(gè)前身,它沒(méi)有使用額外的數(shù)據(jù)結(jié)構(gòu)去存儲(chǔ)大量的負(fù)樣本,它的正負(fù)樣本就是來(lái)自于同一個(gè) minibach,而且它只用一個(gè)編碼器進(jìn)行端到端的學(xué)習(xí)
這篇文章也沒(méi)有給自己起名字,所以就像 Inst Disc 一樣就叫它 Inva Spread 好了,所以寫論文的時(shí)候,最好還是給自己的方法起個(gè)名字,而不是叫 ours,這樣方便別人記住也方便別人引用,也是一個(gè)雙贏的事情
本文的想法其實(shí)就是最基本的對(duì)比學(xué)習(xí)

- 如圖1所示,同樣的圖片通過(guò)編碼器以后,它的特征應(yīng)該很類似,不同的圖片,它的特征出來(lái)就應(yīng)該不類似,這就是題目中說(shuō)的invariant和 spreading,就是說(shuō)對(duì)于相似的圖片、相似的物體,特征應(yīng)該保持不變性,但是對(duì)于不相似的物體或者完全不沾邊的物體,特征應(yīng)該盡可能的分散開(kāi)
具體做法:

- 代理任務(wù)也是選取了個(gè)體判別這個(gè)任務(wù)
前向過(guò)程:
- 如果 batch size 是256,也就是說(shuō)一共有256個(gè)圖片,經(jīng)過(guò)數(shù)據(jù)增強(qiáng),又得到了256張圖片
- 對(duì)于 x1 這張圖片來(lái)說(shuō), x1' 就是它的正樣本,它的負(fù)樣本是所有剩下的這些圖片(包括原始的圖片以及經(jīng)過(guò)數(shù)據(jù)增強(qiáng)后的圖片),也就是說(shuō)正樣本是256,負(fù)樣本是256減1*2,就是除去樣本本身之外 mini-batch 剩下的所有樣本以及它經(jīng)過(guò)數(shù)據(jù)增強(qiáng)后的樣本,也就是這里為什么要*2,這些都是負(fù)樣本
- 它和 Inst Disc d的區(qū)別:Inst Disc中,正樣本雖然是256,它的負(fù)樣本是從一個(gè) memory bank 里抽出來(lái)的,它用的負(fù)樣本是4096甚至還可以更大
- 本文為什么要從同一個(gè) mini-batch 里去選正負(fù)樣本?因?yàn)檫@樣就可以用一個(gè)編碼器做端到端的訓(xùn)練了,這也就是MoCo里講過(guò)的端到端的學(xué)習(xí)方式
- 剩下的前向過(guò)程都是差不多的,就是過(guò)完編碼器以后,再過(guò)一層全連接層就把這個(gè)特征的維度降的很低,就變成128了,正樣本比如說(shuō)上圖中綠色的球在最后的特征空間上應(yīng)該盡可能的接近,但是這個(gè)綠色的球跟別的顏色的特征應(yīng)該盡可能的拉遠(yuǎn)
- 本文所用的目標(biāo)函數(shù)也是 NCE loss 的一個(gè)變體
- 所以說(shuō)之所以講這篇論文,是因?yàn)樗鼊偤脤儆诹硪粋€(gè)流派,也就是端到端的學(xué)習(xí),而且只用一個(gè)編碼器,不需要借助外部的數(shù)據(jù)結(jié)構(gòu)去存儲(chǔ)大量的負(fù)樣本,它的正負(fù)樣本都來(lái)自于同一個(gè) minibach
- 既然它跟 SimCLR 這么像,為什么它沒(méi)有取得那么好的結(jié)果呢?就是之前在MoCo那篇論文里反復(fù)強(qiáng)調(diào)過(guò)的,就是這個(gè)字典必須足夠大,也就是說(shuō)在做對(duì)比學(xué)習(xí)的時(shí)候,負(fù)樣本最好是足夠多,而本文的作者是沒(méi)有 TPU 的,所以說(shuō)它的 batch size 就是256,也就意味著它的負(fù)樣本只有500多個(gè),再加上它還缺少像 SimCLR 那樣那么強(qiáng)大的數(shù)據(jù)增廣以及最后提出的那個(gè) mlp projector,所以說(shuō)呢這篇論文的結(jié)果沒(méi)有那么炸裂,自然也就沒(méi)有吸引大量的關(guān)注,但事實(shí)上它是可以理解成 SimCLR 的前身
Representation Learning with Contrastive Predictive Coding
cpc(contrastive predictive coding)
一般機(jī)器學(xué)習(xí)分為判別式模型和生成式模型,個(gè)體判別顯然是屬于判別式范疇的,那肯定就會(huì)有一些生成式的代理任務(wù),比如最常見(jiàn)的預(yù)測(cè)型的任務(wù)
cpc 這篇論文其實(shí)非常厲害,因?yàn)樗且粋€(gè)很通用的結(jié)構(gòu)

- 圖1中描述的是cpc不僅可以處理音頻,還可以處理圖片、文字以及在強(qiáng)化學(xué)習(xí)里使用
- 這里為了簡(jiǎn)單,它用的是一個(gè)音頻的信號(hào)作為輸入
- 本文的想法:假如說(shuō)有一個(gè)輸入 x(一個(gè)持續(xù)的序列),t表示當(dāng)前時(shí)刻,t-i表示過(guò)去的時(shí)刻,t+i表示未來(lái)的時(shí)刻。把之前時(shí)刻的輸入全都扔給一個(gè)編碼器,這個(gè)編碼器就會(huì)返回一些特征,然后把這些特征喂給一個(gè)自回歸的模型(gar,auto regressive),一般常見(jiàn)的自回歸模型,就是 RNN 或者 LSTM的模型,所以每一步最后的輸出,就會(huì)得到圖中紅色的方塊(ct,context representation,代表上下文的一個(gè)特征表示),如果這個(gè)上下文的特征表示足夠好(它真的包含了當(dāng)前和之前所有的這些信息),那它應(yīng)該可以做出一些合理的預(yù)測(cè),所以就可以用ct預(yù)測(cè)未來(lái)時(shí)刻的這個(gè)zt +1、zt + 2(未來(lái)時(shí)刻的特征輸出)
- 對(duì)比學(xué)習(xí)在哪里體現(xiàn)的呢?正樣本其實(shí)就是未來(lái)的輸入通過(guò)編碼器以后得到的未來(lái)時(shí)刻的特征輸出,這相當(dāng)于做的預(yù)測(cè)是 query,而真正未來(lái)時(shí)刻的輸出是由輸入決定的,也就是說(shuō)它們相對(duì)于預(yù)測(cè)來(lái)說(shuō)是正樣本;負(fù)樣本的定義其實(shí)很廣泛,比如可以任意選取輸入通過(guò)這個(gè)編碼器得到輸出,它都應(yīng)該跟預(yù)測(cè)是不相似的,這就是cpc定義正負(fù)樣本的方式
- 這套思想是很樸實(shí)的,把輸入序列換成一個(gè)句子,也可以說(shuō)用前面的單詞來(lái)預(yù)測(cè)后面的單詞的特征輸出;如果把這個(gè)序列想象成一個(gè)圖片的patch塊從左上到右下形成一個(gè)序列,就可以用上半部分的圖片特征去預(yù)測(cè)后半部分的圖片特征,總之是非常靈活
Contrastive Multiview Coding
CMC(contrastive multiview coding)
cpc是用預(yù)測(cè)的代理任務(wù)做對(duì)比學(xué)習(xí)
cmc這篇論文定義正樣本的方式就更為廣泛了:一個(gè)物體的很多個(gè)視角都可以被當(dāng)做正樣本
cmc 的摘要寫的非常好:
- 人觀察這個(gè)世界是通過(guò)很多個(gè)傳感器,比如說(shuō)眼睛或者耳朵都充當(dāng)著不同的傳感器來(lái)給大腦提供不同的信號(hào)
- 每一個(gè)視角都是帶有噪聲的,而且有可能是不完整的,但是最重要的那些信息其實(shí)是在所有的這些視角中間共享,比如說(shuō)基礎(chǔ)的物理定律、幾何形狀或者說(shuō)它們的語(yǔ)音信息都是共享的
- 在這里舉了個(gè)很好的例子:比如一個(gè)狗既可以被看見(jiàn),也可以被聽(tīng)到或者被感受到
- 基于這個(gè)現(xiàn)象作者就提出:他想要學(xué)一個(gè)非常強(qiáng)大的特征,它具有視角的不變性(不管看哪個(gè)視角,到底是看到了一只狗,還是聽(tīng)到了狗叫聲,都能判斷出這是個(gè)狗)
- cmc工作的目的就是去增大互信息(所有的視角之間的互信息)
- 如果能學(xué)到一種特征能夠抓住所有視角下的關(guān)鍵的因素,那這個(gè)特征就很好了,至少解決分類問(wèn)題不在話下

- cmc到底是怎么樣去形成正樣本和負(fù)樣本從而去做對(duì)比學(xué)習(xí)的呢?如圖一所示,它選取的是 NYU RGBD 這個(gè)數(shù)據(jù)集(這個(gè)數(shù)據(jù)集有同時(shí)4個(gè)view,也就是有四個(gè)視角:原始的圖像、這個(gè)圖像對(duì)應(yīng)的深度信息(每個(gè)物體離觀察者到底有多遠(yuǎn))、SwAV ace normal、這個(gè)物體的分割圖像)
- cmc 的意思是說(shuō),雖然這些不同的輸入來(lái)自于不同的傳感器或者說(shuō)不同的模態(tài),但是所有的這些輸入其實(shí)對(duì)應(yīng)的都是一整圖片,都是一個(gè)東西,那它們就應(yīng)該互為正樣本,也就是說(shuō),當(dāng)有一個(gè)特征空間的時(shí)候,比如圖中圓圈所示的特征空間,這四個(gè)綠色的點(diǎn)在這個(gè)特征空間里就應(yīng)該非常的接近。這時(shí)候如果隨機(jī)再去挑一張圖片,不論是用圖片還是用風(fēng)格的圖像(總之屬于一個(gè)不配對(duì)的視角)的話,這個(gè)特征就應(yīng)該跟這些綠色的特征遠(yuǎn)離
- 這就是 cmc 定義正負(fù)樣本的方式,它的正樣本來(lái)自于多個(gè)視角,一旦定義好了正負(fù)樣本,剩下的工作就大差不差了
- cmc是第一個(gè)或者說(shuō)比較早的工作去做這種多視角的對(duì)比學(xué)習(xí),它不僅證明了對(duì)比學(xué)習(xí)的靈活性,而且證明了這種多視角、多模態(tài)的這種可行性。所以說(shuō)接下來(lái)open AI,很快就出了clip模型:也就是說(shuō)如果有一個(gè)圖片,還有一個(gè)描述這個(gè)圖片的文本,那這個(gè)圖像和文本就可以當(dāng)成是一個(gè)正樣本對(duì),就可以拿來(lái)做多模態(tài)的對(duì)比學(xué)習(xí)
- cmc原班作者人馬用對(duì)比學(xué)習(xí)的思想做了一篇蒸餾的工作:不論用什么網(wǎng)絡(luò),不論這個(gè)網(wǎng)絡(luò)是好是壞是大是小,只要你的輸入是同一張圖片,那得到的這個(gè)特征就應(yīng)該盡可能的類似,也就意味著想讓 teacher 模型的輸出跟 student 模型的輸出盡可能的相似,它就通過(guò)這種方式把 teacher和student做成了一個(gè)正樣本對(duì),從而可以做對(duì)比學(xué)習(xí)
- 所以說(shuō)讓大家意識(shí)到對(duì)比學(xué)習(xí)如此靈活,可以應(yīng)用到不同的領(lǐng)域,cmc功不可沒(méi)
- 一個(gè)小小的局限性:當(dāng)處理不同的視角或者說(shuō)不同的模態(tài)時(shí)候,可能需要不同的編碼器,因?yàn)椴煌妮斎肟赡荛L(zhǎng)得很不一樣,這就有可能會(huì)導(dǎo)致使用幾個(gè)視角,有可能就得配幾個(gè)編碼器,在訓(xùn)練的時(shí)候這個(gè)計(jì)算代價(jià)就有點(diǎn)高(比如說(shuō)在 clip 這篇論文里,它的文本端就是用一個(gè)大型的語(yǔ)言模型,比如說(shuō) bert,它的圖像端就是用一個(gè) vit,就需要有兩個(gè)編碼器),這樣其實(shí)又回到了剛開(kāi)始講ViT時(shí)候所說(shuō)的說(shuō)這個(gè)Transformer的好處--Transformer有可能能同時(shí)處理不同模態(tài)的數(shù)據(jù)
- 事實(shí)上現(xiàn)在已經(jīng)有人這么做了,今年的ICLR就有一篇ma clip,它就用一個(gè)Transformer去同時(shí)處理兩個(gè)輸入模態(tài),效果反而更好,所以說(shuō)這可能才是 Transformer 真正吸引人的地方:一個(gè)網(wǎng)絡(luò)能處理很多類型的數(shù)據(jù),而不用做針對(duì)每個(gè)數(shù)據(jù)特有的改進(jìn)
第一階段大概講了這四篇論文,可以看到
- 它們使用的代理任務(wù)是不一樣的,有個(gè)體判別,有預(yù)測(cè)未來(lái),還有多視角多模態(tài)
- 它們使用的目標(biāo)函數(shù)也不盡相同,有 NCE,有infoNCE,還有NCE的其它變體
- 它們使用的模型也都不一樣,比如說(shuō)invariant spread用了一個(gè)編碼器;Inst Disc用一個(gè)編碼器和memory bank;cpc有一個(gè)編碼器,還有一個(gè)自回歸模型;cmc可能有兩個(gè)甚至多個(gè)編碼器
- 它們做的任務(wù)從圖像到視頻到音頻到文字到強(qiáng)化學(xué)習(xí),非常的豐富多彩
2、CV雙雄
這里之所以是雙雄,其實(shí)主要想講的是MoCo和SimCLR
Momentum Contrast for Unsupervised Visual Representation Learning
MoCo
這次主要就講和其它工作的區(qū)別和聯(lián)系
MoCo 的主要貢獻(xiàn)就是把之前對(duì)比學(xué)習(xí)的一些方法都?xì)w納總結(jié)成了一個(gè)字典查詢的問(wèn)題,它提出了兩個(gè)東西
- 隊(duì)列
- 動(dòng)量編碼器
從而去形成一個(gè)又大又一致的字典,能幫助更好的對(duì)比學(xué)習(xí)
MoCo跟Inst Disc是非常相似的
- 它用隊(duì)列取代了原來(lái)的memory bank作為一個(gè)額外的數(shù)據(jù)結(jié)構(gòu)去存儲(chǔ)負(fù)樣本
- 它用動(dòng)量編碼器去取代了原來(lái)loss里的約束項(xiàng),從而能達(dá)到動(dòng)量的更新編碼器的目的,而不是動(dòng)量的去更新特征,從而能得到更好的結(jié)果
但是整體的出發(fā)點(diǎn)以及一些實(shí)現(xiàn)的細(xì)節(jié)都是非常類似的
MoCo 的這個(gè)實(shí)現(xiàn)細(xì)節(jié):
- 首先從模型的角度上來(lái)說(shuō),它用的是殘差網(wǎng)絡(luò),它的基線模型都用的是Res 50,其實(shí)Inst Disc也用的是Res 50,模型上是一樣的
- 最后每個(gè)圖片的特征維度也沿用了128維
- 它也對(duì)所有的特征做了L2 歸一化
- 至于目標(biāo)函數(shù),MoCo 采用的是info NCE,而不是像Inst Disc是NCE但是算loss用的溫度也是0.07
- 數(shù)據(jù)增強(qiáng)的方式也是直接借鑒過(guò)來(lái)的
- 包括后面訓(xùn)練的學(xué)習(xí)率0.03,訓(xùn)練200個(gè)epochs這些也都是跟Inst Disc保持一致的
所以,說(shuō)MoCo是Inst Disc一個(gè)改進(jìn)型工作也不為過(guò),但是MoCo真正出色的地方其實(shí)有兩點(diǎn)
- 一個(gè)是它的改進(jìn)真的是簡(jiǎn)單有效,而且有很大的影響力的,比如說(shuō)它的動(dòng)量編碼器,在后面的SimCLR、BYOL,一直到最新的對(duì)比學(xué)習(xí)的工作都還在使用。它提出的這個(gè)技術(shù)不僅在當(dāng)時(shí)幫助 MoCo第一次證明了無(wú)監(jiān)督學(xué)習(xí)也能比有監(jiān)督特征學(xué)習(xí)的預(yù)訓(xùn)練模型好,而且還能產(chǎn)生持續(xù)的影響力,幫助之后的工作取得更好的結(jié)果,所以它的改進(jìn)很深刻而且很有效
- 另外一個(gè)可圈可點(diǎn)的地方就是MoCo的寫作真的是高人一等非常不一樣,其實(shí)如果是一個(gè)簡(jiǎn)單直白的寫作方式,在語(yǔ)言里先介紹對(duì)比學(xué)習(xí)是什么,然后再介紹之前的工作有哪些,比如說(shuō)有端到端的工作,然后有看Inst Disc,這個(gè) memory bank 的這個(gè)工作,然后它們各自都有各自的缺點(diǎn)和局限性,所以說(shuō)提出MoCo ,用隊(duì)列去解決大字典的問(wèn)題,用動(dòng)量編碼器去解決字典特征不一致的問(wèn)題,最后結(jié)果很好,第一次證明了在下游任務(wù)中用一個(gè)無(wú)監(jiān)督訓(xùn)預(yù)訓(xùn)練的模型也會(huì)比有監(jiān)督預(yù)訓(xùn)練的模型好,那這種寫法也是一種很簡(jiǎn)潔直白明了的寫作方式,大部分論文的寫作都是按照這個(gè)套路來(lái)的。但是MoCo的作者明顯就高了一個(gè)層次:引言上來(lái)先說(shuō)這個(gè)cv和nlp之間的區(qū)別,以及到底為什么無(wú)監(jiān)督學(xué)習(xí)在 cv 這邊做的不好,然后第二段它才開(kāi)始講對(duì)比學(xué)習(xí),但是它也不是細(xì)細(xì)地去講對(duì)比學(xué)習(xí),或者細(xì)細(xì)的去講那些方法,而是直接把之前所有的方法都總結(jié)成了一個(gè)字典查找的問(wèn)題,所以直接把問(wèn)題給歸納升華了,然后在這個(gè)框架下,就是 cv 和 nlp 大一統(tǒng)的框架以及所有的對(duì)比學(xué)習(xí)也都大一統(tǒng)的框架之下,然后作者提出了 MoCo 這個(gè)框架,希望能用一個(gè)又大又一致的字典去整體地提高對(duì)比學(xué)習(xí)的性能,那論文的scope整體就擴(kuò)大了,遠(yuǎn)不是之前的那種簡(jiǎn)單的寫作方式可以比的,而且這樣的寫作風(fēng)格呢還延續(xù)到了方法部分,在3.1里,作者沒(méi)有先寫一個(gè)模型總覽圖,也沒(méi)有具體說(shuō)是什么模型、什么任務(wù),而是先從最后的目標(biāo)函數(shù)入手,說(shuō)是用info NCE來(lái)做的,先把正負(fù)樣本定義了一下,然后再去講網(wǎng)絡(luò)結(jié)構(gòu)然后再去講實(shí)現(xiàn)細(xì)節(jié)和偽代碼,而且在3.1里,為了讓MoCo看起來(lái)更樸實(shí),在這里沒(méi)有直接定義輸入是什么,也沒(méi)有定義這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)到底是什么樣的,它是說(shuō)什么樣的輸入都可以,比如說(shuō)它可以是圖片,也可以是圖片塊,或者是上下文的圖片塊(文獻(xiàn)46其實(shí)就是cpc),至于網(wǎng)絡(luò),它說(shuō)query 的編碼器和key的編碼器既可以是相同的(invariant spread),也可以是部分共享的,還可以是完全不同的(文獻(xiàn)56就是cmc,因?yàn)槭嵌鄠€(gè)視角嘛所以是多個(gè)編碼器)
所以說(shuō)MoCo這種自頂向下的寫作方式也是非常值得借鑒的,但這個(gè)真的是需要功力,稍有把握不慎別人可能就看不懂了
A Simple Framework for Contrastive Learning of Visual Representations
SimCLR(simple contrastive learning)
這個(gè)方法真的是夠簡(jiǎn)單,這就是為什么很多博客在介紹對(duì)比學(xué)習(xí)的時(shí)候都用SimCLR當(dāng)例子,因?yàn)樗拍钌细菀桌斫猓椒ㄉ弦埠苋菀捉忉?,只不過(guò)batch size太大,一般人不好上手

- 圖二里說(shuō),如果有一個(gè)mini-batch的圖片,假如說(shuō)是x,對(duì)這個(gè)mini-batch里的所有圖片做不同的數(shù)據(jù)增強(qiáng)就會(huì)得到x i和xj,同一個(gè)圖片延伸得到的兩個(gè)圖片就是正樣本,也就是說(shuō)如果batch size是n的話,正樣本個(gè)數(shù)就是n,負(fù)樣本的個(gè)數(shù)就是這個(gè) batch size 剩下所有的樣本以及它們數(shù)據(jù)增強(qiáng)過(guò)后的樣本,也就和invariant spread里講的一樣,是兩倍的 n 減1
- 然后當(dāng)有了正負(fù)樣本之后通過(guò)編碼器f對(duì)它進(jìn)行編碼,這兩f是共享權(quán)重,也就說(shuō)其實(shí)只有一個(gè)編碼器,如果把它想象成一個(gè) res 50的話,得到的h(特征表示)是2048維了
- SimCLR的重大創(chuàng)新點(diǎn)其實(shí)是在特征之后又加了一個(gè)projector,也就是上圖中的g函數(shù),它就是一個(gè)mlp層(只有一個(gè)全連接層,后面跟一個(gè) relu 的激活函數(shù)),但是就這么簡(jiǎn)簡(jiǎn)單單的一層mlp能讓最后學(xué)到的特征在ImageNet 這個(gè)分類任務(wù)上直接提點(diǎn)將近10個(gè)點(diǎn),這個(gè)效果在別的任何的任務(wù)里或者說(shuō)在有監(jiān)督學(xué)習(xí)里是很難觀測(cè)到的,很少有說(shuō)加一個(gè)全連接層就能直接提點(diǎn)10個(gè)點(diǎn),所以說(shuō)是一個(gè)非常有趣而且非常驚訝的結(jié)果
- 但是在這個(gè)框架里,可以想象出有一個(gè)特征之后再做一個(gè)非線性變化,就得到了另外一個(gè)特征,也就是最后去做對(duì)比學(xué)習(xí)的那個(gè)特征,一般這個(gè)特征z,它的維度會(huì)小一點(diǎn),為了跟之前的工作保持一致性,它也用了128維
- 最后要衡量一下正樣本之間是不是能達(dá)到最大的一致性,它采用的是normalized temperature-scaled的交叉熵函數(shù)。normalized就是說(shuō)在這個(gè)特征后面進(jìn)行了 L2 歸一化,temperature-scaled 就是說(shuō)在這個(gè) loss 成了個(gè)tao,所以說(shuō)其實(shí)這個(gè)loss跟之前說(shuō)的infoNCE loss也是非常接近的
- g函數(shù)只有在訓(xùn)練的時(shí)候才用,而在做下游任務(wù)的時(shí)候,是把g函數(shù)扔掉了,還是只用h這個(gè)特征去做下游任務(wù),這樣的話跟之前的工作也還是公平對(duì)比,因?yàn)橹八鼈內(nèi)绻?res 50,還是用 res 50并沒(méi)有多加一層,加上這個(gè)g函數(shù)只是為了能讓模型訓(xùn)練的更好
和MoCo比起來(lái)確實(shí)很簡(jiǎn)單,這里只有一個(gè)編碼器,既不需要memory bank,也不需要隊(duì)列和動(dòng)量編碼器;正負(fù)樣本全都是從同一個(gè)mini-batch里來(lái)的;整個(gè)前向過(guò)程非常的直接,就是圖片進(jìn)入編碼器編碼然后projector降維,最后算個(gè)對(duì)比學(xué)習(xí)的loss,非常符合大家對(duì)深度學(xué)習(xí)工作的期待
前面說(shuō)invariant spread可以看作是SimCLR的前身,為什么這么說(shuō)呢?本文其實(shí)整體的這個(gè)思路和結(jié)構(gòu)跟SimCLR是基本一致的,SimCLR跟Inva Spread的區(qū)別其實(shí)都寫在SimCLR的貢獻(xiàn)列表里了
- 首先第一個(gè)就是它用了更多的數(shù)據(jù)增強(qiáng),它發(fā)現(xiàn)對(duì)比學(xué)習(xí)真的是需要很強(qiáng)的數(shù)據(jù)增強(qiáng)的技術(shù)
- 第二就是它加了一個(gè)g函數(shù)(一個(gè)可以學(xué)習(xí)的分線性的變換,就是一個(gè) mlp層)
- 第三就是它們用了更大的batch size ,而且訓(xùn)練的時(shí)間更久,它發(fā)現(xiàn)這兩個(gè)策略都能讓網(wǎng)絡(luò)學(xué)到的特征變得更好
乍一看這些貢獻(xiàn)有些讀者可能就會(huì)覺(jué)得這些技術(shù)不都或多或少在之前的工作里被提出來(lái)過(guò)嗎?所以說(shuō)在這篇論文里,作者專門把相關(guān)工作放到了第七節(jié),相當(dāng)于文章的最后才去講相關(guān)工作,它比較細(xì)致的跟之前手工的代理任務(wù)做了對(duì)比,然后跟最近的對(duì)比學(xué)習(xí)也做了對(duì)比,而且作者最后非常謙虛的寫了這么一段話:就是說(shuō)基本上所有的這些單個(gè)的這些貢獻(xiàn)在之前的工作里都被提出來(lái)過(guò)了,雖然有的時(shí)候這個(gè)實(shí)現(xiàn)的形式可能不太一樣,但是作者強(qiáng)調(diào)說(shuō)SimCLR 的優(yōu)越之處就是在于它的成功不是由任何一個(gè)單一的設(shè)計(jì)決定,而是把所有的這些技術(shù)結(jié)合起來(lái)而得到的一個(gè)結(jié)果,而且作者把詳細(xì)的消融實(shí)驗(yàn),以及它們的設(shè)計(jì)選擇全都放到了附錄里,所以說(shuō)作者團(tuán)隊(duì)真的是非常貼心,而且非常謙虛了
而事實(shí)上呢,SimCLR這篇文章中提出來(lái)的很多技術(shù)都對(duì)后續(xù)的工作產(chǎn)生了長(zhǎng)遠(yuǎn)的影響力,比如說(shuō)在編碼器之后加這么一個(gè)mlp層,在之后的MoCo v2、BYOL這些工作里全都有使用;它使用的數(shù)據(jù)增強(qiáng)的策略在之后的工作里也是被廣泛的使用;它使用lars這個(gè)優(yōu)化器去做大batch size的這個(gè)模型訓(xùn)練,之后BYOL 也采用了同樣的策略??傊甋imCLR真的是夠簡(jiǎn)單,而且為后續(xù)的很多研究鋪平了道路
最后稍微講一下SimCLR這篇論文里的貢獻(xiàn)
第一個(gè)就是數(shù)據(jù)增強(qiáng)
- 如下圖圖4所示,SimCLR這篇論文使用了這么多的數(shù)據(jù)增強(qiáng)的方法,從最開(kāi)始的原始圖片,到裁剪,到改變色彩,到旋轉(zhuǎn),使用 cut out,還有使用高斯的噪聲和高斯 blur,以及最后使用sobel的這種濾波器。真的是把前人想到的這些數(shù)據(jù)增強(qiáng)的方式全都用了個(gè)遍,然后為了讓讀者知道,到底哪些數(shù)據(jù)增強(qiáng)有用,哪些數(shù)據(jù)增強(qiáng)沒(méi)用,作者還做了詳細(xì)的這個(gè)消融實(shí)驗(yàn)

- 下圖中除了最后一列是 average,剩下的數(shù)字就是這七種數(shù)據(jù)增強(qiáng)兩兩互相合并之后的這個(gè)效果如何,比如說(shuō)中間的對(duì)角線其實(shí)就是使用一個(gè)數(shù)據(jù)增強(qiáng),發(fā)現(xiàn)其實(shí)最有效的兩個(gè)數(shù)據(jù)增強(qiáng)就是這個(gè)crop和這個(gè)color,也就是隨機(jī)的裁剪和隨機(jī)的這種色彩變換,其它的數(shù)據(jù)增強(qiáng)其實(shí)最后都是錦上添花、可有可無(wú)的,但這兩個(gè)是必須得有的
另外一個(gè)就是說(shuō)SimCLR這篇文章提出的非線性變換,也就是說(shuō)在編碼器后面加一層mlp
如圖8所示,如果h是一個(gè)res 50出來(lái)的特征,也就是2048維的話,那z就是經(jīng)過(guò)了projector之后的維度,一般是128

- g函數(shù)其實(shí)里面就包含了一個(gè)全連接層和一個(gè) relu 激活函數(shù)
- projection head指的是non-linear,之所以是 non-linear是因?yàn)橛衦elu的激活層(relu就會(huì)把一個(gè)線性函數(shù)變成非線性)
- linear線性指的是不要relu,只加一層全連接層就可以了
- None其實(shí)就是說(shuō)像Inva Spread或者像MoCo一樣,直接編碼器出來(lái)的特征拿去做對(duì)比學(xué)習(xí),不要projection head
然后會(huì)發(fā)現(xiàn)兩個(gè)很有意思的現(xiàn)象
- 第一個(gè)就是如果用non-linear的層,相比原來(lái)什么都不用,結(jié)果提了十幾個(gè)點(diǎn),所以是非常顯著的
- 第二個(gè)就是說(shuō)z最后的維度不論是32、64還是2048其實(shí)都沒(méi)太大區(qū)別,這就是為什么對(duì)比學(xué)習(xí)現(xiàn)在一般都選一個(gè)比較低的特征維度,因?yàn)?28就夠了,再高再低其實(shí)最后的結(jié)果也沒(méi)有太大的變化
因?yàn)檫@里提升10個(gè)點(diǎn)實(shí)在是太過(guò)詭異,所以作者還做了很多實(shí)驗(yàn)
去驗(yàn)證這個(gè)想法,比如說(shuō)在表3里就做了一些實(shí)驗(yàn),但是也僅僅是一些實(shí)驗(yàn),并不一定能真的證明這個(gè)事,至今好像也沒(méi)有一個(gè)理論上的解釋
Improved Baselines With Momentum Contrastive Learning
因?yàn)镸oCo和SimCLR的結(jié)果實(shí)在是太過(guò)驚艷,所以從2020年開(kāi)始就掀起了一波對(duì)比學(xué)習(xí)的狂潮,基本上每天只要去刷arxiv,都會(huì)有對(duì)比學(xué)習(xí)的論文,這波熱浪一直到20年年底Vision Transformer出來(lái)以后才逐漸消退
MoCo v2其實(shí)是一個(gè)只有兩頁(yè)的技術(shù)報(bào)告,嚴(yán)格意義上不算是一篇論文了,但即使只有兩頁(yè),信息量也是相當(dāng)大
MoCo v2主要就是說(shuō),在看到SimCLR這個(gè)比較好的結(jié)果以后,它們發(fā)現(xiàn)SimCLR里的那些技術(shù)都是即插即用型的,所以說(shuō)它們就把那些就拿過(guò)來(lái)了,它直接說(shuō),就在MoCo上面做很簡(jiǎn)單的改動(dòng),引入了mlp projection head以及使用更多的數(shù)據(jù)增強(qiáng),就又刷新ImageNet 上的最好成績(jī),不僅比之前的MoCo高很多,而且比最新的SimCLR也要高很多
注意,SimCLR是2月13號(hào)才放到arxiv上的,MoCo v2是3月9號(hào)就放到arxiv上了,所以說(shuō)這個(gè)節(jié)奏是相當(dāng)快的
MoCo v2 具體進(jìn)行了哪些改進(jìn)?如下表表1所示

準(zhǔn)確的說(shuō)就四個(gè)方面
- 加了一個(gè) mlp 層
- 加了更多的數(shù)據(jù)增強(qiáng)
- 訓(xùn)練的時(shí)候用了cosine的learning rate schedule
- 訓(xùn)練更長(zhǎng)的 epoch,從200變到了800
ImageNet 上結(jié)果
- 灰色的結(jié)果76.5屬于是有監(jiān)督的這個(gè)基線模型
- MoCo v 1只能達(dá)到60.6,差的還是比較遠(yuǎn)的
- 就在上面加上這個(gè)projection head mlp層,一下準(zhǔn)確率就提高到66.2,就長(zhǎng)了6個(gè)點(diǎn),所以說(shuō)加projection head 不光是對(duì) SimCLR 有用,對(duì)MoCo也有用,其實(shí)對(duì)其之后的很多方法都有用,像SwAV呢也用了,BYOL也用了
- 如果使用更強(qiáng)的數(shù)據(jù)增強(qiáng),就是也能提三個(gè)點(diǎn),從60到63,但是不如mlp提升的多
- 如果把這個(gè)mlp 和augmentation一起用就已經(jīng)到67.3了,就非常高了
- 再加上這個(gè)cos的這個(gè)學(xué)習(xí)率,就到67.5還能再提0.2個(gè)點(diǎn),那這個(gè)提升就很小了可以忽略不計(jì)
- 最后如果訓(xùn)練更長(zhǎng)的時(shí)間,訓(xùn)練800 epochs,就能再提高到71.1,SimCLR結(jié)果也是這樣,如果它訓(xùn)練更久的話,它的結(jié)果也會(huì)提升很多,一直到現(xiàn)在為止,就連凱明最新的MAE這個(gè)工作,也是訓(xùn)練了1,600個(gè)epochs,而且的這個(gè)效果還在繼續(xù)往上漲
無(wú)監(jiān)督學(xué)習(xí)真的是訓(xùn)練的越久或者模型越大,它的結(jié)果就會(huì)越好
接下來(lái)作者主要跟SOTA進(jìn)行了比較,其實(shí)也就是MoCov1和 SimCLR這些工作,如下表表2所示

- 在只訓(xùn)練200epochs的情況下,MoCo v2比SimCLR高了大概一個(gè)點(diǎn)
- 如果訓(xùn)練更長(zhǎng)的時(shí)間,在訓(xùn)練800個(gè)epochs的時(shí)候MoCo v2能到71.1,比SimCLR訓(xùn)練了1,000個(gè)epochs還要好將近2個(gè)點(diǎn),所以就意味著MoCo v2能更好的利用數(shù)據(jù),能在更短的時(shí)間內(nèi)取得更好的結(jié)果
接下來(lái)作者又再次強(qiáng)調(diào)了一下為什么要用MoCo以及MoCo相比于SimCLR的優(yōu)越性如上圖中表3所示:
- 其實(shí)這個(gè)優(yōu)越性就在于硬件:機(jī)器的內(nèi)存以及訓(xùn)練的時(shí)長(zhǎng)
- MoCo v2的作者使用的機(jī)器配置是8張v 100的顯卡,MoCo在普通這個(gè)batch size 256的情況下就能訓(xùn)練,內(nèi)存只消耗5個(gè)G,其實(shí)還有很多的剩余空間,還可以再加大batch size或者再增大模型都可以,它非常省內(nèi)存,而且訓(xùn)練一個(gè)模型也只需要53個(gè)小時(shí),在ImageNet這種規(guī)模的數(shù)據(jù)集上來(lái)說(shuō),兩天多的時(shí)間已經(jīng)算是很快了
- 如果這個(gè)時(shí)候換成end-to-end這種端到端的學(xué)習(xí),也就之前說(shuō)的invariant spread或者SimCLR,這里主要指的就是SimCLR 我們?nèi)绻挥眯atch size是256的時(shí)候,SimCLR在小 batch size的情況下只有61.9的結(jié)果
- 相對(duì)MoCo v2來(lái)說(shuō)就差很多了,為什么呢?因?yàn)樽值洳粔虼?、提供的?fù)樣本不夠多,所以導(dǎo)致對(duì)比學(xué)習(xí)對(duì)比不是很有效,而且不光是效果低,它的內(nèi)存占用7.4 G也明顯高,訓(xùn)練的時(shí)長(zhǎng)也多了十幾個(gè)小時(shí),就是全方位呢都不劃算
如果想要端到端的這個(gè)學(xué)習(xí)走4096的這個(gè)batch size就是說(shuō)讓它的performance變好,變成66.6,雖然說(shuō)還沒(méi)有MoCo v2好,但也差不多,性能上比較相近,那它對(duì)硬件的要求就太高了
- 比如說(shuō)對(duì) gpu 的這個(gè)內(nèi)存要求,它需要93個(gè)g的內(nèi)存,這里畫了個(gè)腳注,意思就是說(shuō)這只是估計(jì),因?yàn)楝F(xiàn)在也沒(méi)有這么大內(nèi)存的gpu,所以說(shuō)它只能估計(jì)一下,訓(xùn)練時(shí)長(zhǎng)當(dāng)然也就不得而知了
因?yàn)檫@種端到端的學(xué)習(xí)方式,包括SimCLR、BYOL、SwAV默認(rèn)都是用8臺(tái)8卡機(jī)去做訓(xùn)練的,也就是有64張gpu,才能在一兩天這個(gè)合理的時(shí)間內(nèi)把訓(xùn)練完成,而MoCo只需要一臺(tái)8卡機(jī)就可以在兩天的時(shí)間內(nèi)完成
Big Self-Supervised Models are Strong Semi-Supervised Learners
SimCLR v2
其實(shí)SimCLR v2,只是這篇論文一個(gè)很小的部分,它只是說(shuō)怎么從v1變到v2,就是一個(gè)模型上的改進(jìn),而事實(shí)上都在講如何去做半監(jiān)督的學(xué)習(xí)
它主要想說(shuō)的體現(xiàn)在它的這個(gè)標(biāo)題里了:非常大的自監(jiān)督訓(xùn)練出來(lái)的模型非常適合去做半監(jiān)督學(xué)習(xí)
模型總覽圖如下圖中圖3所示

這篇文章分了三個(gè)部分
- 第一部分就是SimCLR,怎樣自監(jiān)督或者說(shuō)自監(jiān)督的對(duì)比學(xué)習(xí)去訓(xùn)練一個(gè)大的模型出來(lái)
- 第二部分就是說(shuō),一旦有了這么好的一個(gè)模型,只需要一小部分有標(biāo)簽的數(shù)據(jù),然后去做一下有監(jiān)督的微調(diào),一旦微調(diào)結(jié)束了,就相當(dāng)于有一個(gè) teacher 模型,就可以用這個(gè)teacher模型去生成很多偽標(biāo)簽,這樣就可以在更多的無(wú)標(biāo)簽的數(shù)據(jù)上去做自學(xué)習(xí)了
整個(gè)框架其實(shí)也是受啟發(fā)于google的另外一篇工作(19年的一篇叫
noisy student 的工作)
- 因?yàn)閚oisy student就是在ImageNet數(shù)據(jù)集上先訓(xùn)練了一個(gè) teacher 模型,然后在JFT 300M那個(gè)數(shù)據(jù)集上生成了很多的偽標(biāo)簽,最后一起訓(xùn)練了一個(gè)student模型,而這個(gè) student 的模型算是 ImageNet 上的SOTA,大概是88點(diǎn)多的準(zhǔn)確率,霸占了ImageNet上這個(gè)sota很長(zhǎng)時(shí)間,大概有一年的時(shí)間
- Vision Transformer就跟這個(gè) noisy student 比過(guò),因?yàn)榻刂沟侥莻€(gè)時(shí)候,noisy student還是ImageNet上的 SOTA
作者其實(shí)就在第三頁(yè)大概花了半頁(yè)的篇幅來(lái)講了一講怎么把v1變成v2了,其實(shí)大概就是提高了這三個(gè)點(diǎn):
- 第一個(gè)就是大家其實(shí)都公認(rèn)的一個(gè)事實(shí),就是用更大的模型,無(wú)監(jiān)督訓(xùn)練就會(huì)訓(xùn)練的更好,在這里就換了一個(gè)更大的模型,換了一個(gè)152層的殘差網(wǎng)絡(luò),同時(shí)用了這個(gè)selective kernels,也就是SK net,這個(gè)骨干網(wǎng)絡(luò)變得非常的強(qiáng)
- 第二點(diǎn)改進(jìn)就是,之前SimCLR說(shuō)protection head的mlp層特別有用,而且MoCo v2也證明了特別特別的有用,所以SimCLR的作者就想那一層都這么有用了,把它再變深點(diǎn)會(huì)不會(huì)更有用,所以它就試了試變成兩層變成三層這個(gè)性能會(huì)不會(huì)繼續(xù)提升,最后發(fā)現(xiàn)其實(shí)就是兩層就夠了,原來(lái)是 fc + relu,現(xiàn)在是 fc + relu fc + relu,一層變成兩層的 mlp,這個(gè)效果呢就最好了,就是加深了這個(gè)projection head
- 第三點(diǎn)改進(jìn)就是它們也使用了動(dòng)量編碼器(這里說(shuō) motivated by 29,就是MoCo v2 ,20就是 MoCo),就是SimCLR的作者發(fā)現(xiàn)MoCo 的這個(gè)動(dòng)量編碼器真的很管用,所以也想試一試,事實(shí)上動(dòng)量編碼器真的管用,后面BYOL 都用了動(dòng)量編碼器,但在這里作者說(shuō)動(dòng)量編碼器在SimCLR 里的提升并不是很大可能就提了一個(gè)點(diǎn),具體原因它們解釋說(shuō),因?yàn)樗鼈円呀?jīng)有非常大的這個(gè)mini-batch,要么是4096,要么是8192,所以它們的負(fù)樣本已經(jīng)相當(dāng)多了,所以不論是從字典的大小,還是從字典里特征一致性來(lái)說(shuō),SimCLR v2 都已經(jīng)做的很好了,所以說(shuō)再加這種隊(duì)列或者加這種動(dòng)量編碼器其實(shí)都不會(huì)帶來(lái)很大的提升
總的來(lái)說(shuō)就是三點(diǎn)改進(jìn):
- 使用了更大的模型
- 加深了projection head
- 引入了動(dòng)量編碼器
如果不算半監(jiān)督學(xué)習(xí)的內(nèi)容的話,SimCLR v2也是一個(gè)2頁(yè)的技術(shù)報(bào)告,而且不論是SimCLR v1還是v2,都只做了分類這個(gè)任務(wù),但是MoCo就廣泛的很多了,至少做了四五個(gè)下游的任務(wù),而且刷了很多的數(shù)據(jù)集,所以MoCo系列工作就更c(diǎn)v friendly,所以它投的都是cv的會(huì)議,而SimCLR v1就是 ICML,而SimCLR v2就是 Neural IPS,所以說(shuō)投對(duì)口的會(huì)議也很重要
Unsupervised Learning of Visual Features by Contrasting Cluster Assignment
SwAV
- Swap
- assignment
- views
給定同樣一張圖片,如果生成不同的視角,不同的 views 的話,希望可以用一個(gè)視角得到的特征去預(yù)測(cè)另外一個(gè)視角得到的特征,因?yàn)樗羞@些視角的特征按道理來(lái)說(shuō)都應(yīng)該是非常接近的
本文的具體的做法就是把對(duì)比學(xué)習(xí)和之前的聚類的方法合在了一起,當(dāng)然這么想也不是偶然
- 首先,聚類方法也是一種無(wú)監(jiān)督的特征表示學(xué)習(xí)方式,而且呢它也是希望相似的物體都聚集在某一個(gè)聚類中心附近,不相似的物體盡量推開(kāi)推到別的聚類中心,所以跟對(duì)比學(xué)習(xí)的目標(biāo)和做法都比較接近
- 另外,這篇文章的一作其實(shí)之前一直也是做聚類的,它之前就做過(guò)deep cluster這篇工作,也是一篇非常好的無(wú)監(jiān)督學(xué)習(xí)的論文
具體 SwAV 是怎么和聚類的方法融合起來(lái)的呢?

- 上圖圖1把之前對(duì)比學(xué)習(xí)的方法總結(jié)了一下畫到了左邊,然后把SwAV的方法畫到了右邊,這樣就比較好對(duì)比
- 左邊當(dāng)然很好理解了,就是同一個(gè)圖片,做兩次數(shù)據(jù)增強(qiáng)就得到了x1、x 2,然后所有的樣本通過(guò)一個(gè)編碼器,這個(gè)編碼器有可能就是個(gè) Res 50,也有可能是一個(gè) Res 50加了一個(gè) projection head,它這里沒(méi)有明說(shuō),反正就是所有的這些都屬于一個(gè)模型,最后這個(gè)模型輸出一個(gè)特征,一旦有了這個(gè)特征,用它做一個(gè)對(duì)比學(xué)習(xí)的 loss 就可以了
- SwAV說(shuō),這么做雖然比較簡(jiǎn)單,但是直接拿所有圖片的特征跟特征做對(duì)比有點(diǎn)原始而且有點(diǎn)費(fèi)資源,因?yàn)樗械膱D片都是自己的類,所以其實(shí)像MoCo一樣,取了6萬(wàn)個(gè)負(fù)樣本,這還只是個(gè)近似,因?yàn)槠鋵?shí)所有的數(shù)據(jù)集,所有的負(fù)樣本理應(yīng)是128萬(wàn)個(gè)圖片
- SwAV的作者就想,能不能不去做近似,能不能借助一些先驗(yàn)信息不去跟大量的負(fù)樣本比,而去跟一些更簡(jiǎn)潔的東西比,然后SwAV的作者就想出來(lái)了,可以去跟聚類的中心比(聚類中心就是右圖里的c,也就是個(gè)prototype,它其實(shí)就是個(gè)矩陣,它的維度是d 乘以 k,d是特征的維度,這里的d和特征的d 是一樣的,比如說(shuō)就是之前說(shuō)的128維,這個(gè)k就是有多少個(gè)聚類中心,在這篇文章中它們選的是3,000,也就是說(shuō)你有3,000個(gè) cluster center,3,000這個(gè)數(shù)字也是之前的一些聚類方法在ImageNet數(shù)據(jù)集上常用的一個(gè)參數(shù))
SwAV的前向過(guò)程
- 前面還是都一樣的:一個(gè)mini-batch的圖片,做兩次數(shù)據(jù)增強(qiáng),得到x1、x2分別通過(guò)編碼器得到最后的特征z1、z2
- 有了z1、z2之后并不是直接在這個(gè)特征上去做對(duì)比學(xué)習(xí)的loss,而是說(shuō)先通過(guò)clustering讓特征z和prototype c生成一個(gè)目標(biāo),也就是這里的q1、q 2
- q1、q2就相當(dāng)于ground truth,那它真正要做的這個(gè)代理任務(wù)是什么呢?它的意思是說(shuō)如果x1、x2是正樣本的話,那z1 和 z 2的特征就應(yīng)該很相似,也就跟之前對(duì)比學(xué)習(xí)一樣,z1和z2要盡可能的相似
- 那如果兩個(gè)特征非常相似,或者說(shuō)含有等量的信息的時(shí)候,按道理來(lái)說(shuō)應(yīng)該是可以互相去做預(yù)測(cè)的,也就是說(shuō),如果拿z1這個(gè)特征去跟c去做點(diǎn)乘,按道理來(lái)說(shuō)也是可以去預(yù)測(cè)q2;反之亦然,z2和這個(gè)c去做點(diǎn)乘也可以預(yù)測(cè)q1,所以說(shuō)點(diǎn)乘之后的結(jié)果就是預(yù)測(cè),而ground truth就是之前按照clustering分類而得到的q1和q2
- 所以通過(guò)這種Swapped prediction,也就是換位預(yù)測(cè)的方法,SwAV可以對(duì)模型進(jìn)行訓(xùn)練
用聚類的好處到底有哪些?
- 首先,就像SwAV 這篇論文里講過(guò)的一樣,如果要跟很多的負(fù)樣本去做類比,可能就需要成千上萬(wàn)的負(fù)樣本,而且即使如此也只是一個(gè)近似,而如果只是跟聚類中心做對(duì)比,則可以用幾百或者最多3,000個(gè)聚類中心,就足以表示了,因?yàn)槠鋵?shí)也并沒(méi)有那么多類,ImageNet也就1,000類,COCO才80類,所以說(shuō) 3,000個(gè)聚類中心就足夠用了,這相對(duì)于幾萬(wàn)個(gè)負(fù)樣本來(lái)說(shuō)還是小了很多的
- 第二,這些聚類中心是有明確的語(yǔ)意含義的,如果之前只是隨機(jī)抽樣抽取負(fù)樣本去做對(duì)比的話,那些負(fù)樣本有的可能還是正樣的,而且有的時(shí)候抽出來(lái)的負(fù)樣本類別也不均衡,所以不如使用聚類中心有效。其實(shí)這就是SwAV的基本思想。(如果對(duì)聚類算法比較感興趣,以先去看deep cluster deep cluster two,然后再來(lái)看這篇 SwAV 的論文)

- SwAV的結(jié)果非常好,它不僅比我們之前講過(guò)的方法效果好,其實(shí)比之后要講的BYOL、SimSiam這些都好,算是卷積神經(jīng)網(wǎng)絡(luò)里用Res 50分刷的最高的一篇工作,達(dá)到了75.3
- 上圖表里的性能做的還是ImageNet的linear evaluation,也就之前說(shuō)的提前預(yù)訓(xùn)練好一個(gè)模型以后,把這個(gè)模型的backbone凍住,只訓(xùn)練最后的那個(gè)全連接層
- 表中之前不是對(duì)比學(xué)習(xí)的方法都還比較低,可能都是在60以下,有了對(duì)比學(xué)習(xí)以后,從 MoCo 開(kāi)始基本上就上60了,然后cpc v2刷到63.8,SimCLR刷到70,MoCo v2刷到71.1,之后要講的BYOL其實(shí)74點(diǎn)幾,SimSiam也是74點(diǎn)幾
- 所以說(shuō)75.3就算是最高的了,而且這個(gè)75.3是你把backbone凍住的情況下去做的,如果跟有監(jiān)督的基線模型去比的話,這個(gè)有監(jiān)督的基線模型是從頭到尾都在ImageNet 上訓(xùn)練,最后的結(jié)果也就是76.5,所以說(shuō)SwAV 已經(jīng)是非常非常逼近這個(gè)結(jié)果
- 而且當(dāng)使用更大的模型的時(shí)候,也就是像右圖里說(shuō)的一樣,把一個(gè)Res 50變寬,而且就是這里的2倍、4倍、5倍這么寬的時(shí)候,SwAV的結(jié)果還能不停地漲
- 當(dāng)用最大的模型(5倍的模型)的時(shí)候,SwAV已經(jīng)跟有監(jiān)督的模型,差距非常的小,而且SwAV也是要比SimCLR *2、SimCLR 4要高的,所以說(shuō)從性能上來(lái)講,SwAV 是真的不錯(cuò)

但其實(shí)讓SwAV有這么好的性能,不光是因?yàn)樗途垲惖姆椒ㄈ诤显诹艘黄穑硗庖粋€(gè)主要的性能提升點(diǎn)來(lái)自于一個(gè)叫multi crop的trick:
- 之前的那些對(duì)比的學(xué)習(xí)方法都是用的兩個(gè)crop,也就是說(shuō)一個(gè)正樣本對(duì)x1、x2兩個(gè)圖片,如上圖左下角所示,本來(lái)我們有一個(gè)圖片,先把它resize 到256*256,然后隨機(jī)crop兩個(gè)224*224的圖片當(dāng)成 x1 x2,因?yàn)檫@兩張圖片都非常大,所以它們重疊的區(qū)域也非常多,于是它們就應(yīng)該代表一個(gè)正樣本
- 但總之就是兩個(gè) crop,SwAV的作者就想:用這么大的crop明顯抓住的是整個(gè)場(chǎng)景的特征,如果更想學(xué)習(xí)這些局部物體的特征,最好能多個(gè) crop,去圖片里crop一些區(qū)域,這樣就能關(guān)注到一些局部的物體了
- 但是增加crop,也就是說(shuō)增加view,會(huì)增加模型的計(jì)算復(fù)雜度,因?yàn)橄喈?dāng)于使用了更多的正樣本
- 那如何能同時(shí)使用更多的正樣本,而又不增加太多的這個(gè)計(jì)算成本呢?作者就想到了另外一個(gè)辦法,就是說(shuō)做點(diǎn)取舍,原來(lái)是取了兩個(gè)224*224的crop,現(xiàn)在把這個(gè)crop變得小一點(diǎn),變成160 ,也就是說(shuō)取2個(gè)160的crop去爭(zhēng)取學(xué)全局的特征,然后為了增加正樣本的數(shù)量,為了學(xué)一些局部的特征,再去隨機(jī)選4個(gè)小一點(diǎn)crop,然而這4個(gè)crop的大小是96*96,這樣的話,就意味著現(xiàn)在有6個(gè)視角了,而不是像原來(lái)一樣只有2個(gè)視角,所以正樣本的數(shù)量增多了,但是通過(guò)這么一種取舍,整體的計(jì)算代價(jià)還是差不多的
- 別看這個(gè)想法很簡(jiǎn)單,這個(gè)multi crop的技術(shù)真的很有用而且它不光是對(duì)SwAV有用,對(duì)其它的對(duì)比學(xué)習(xí)的方法也有用
作者在下圖圖3中就做了一些實(shí)驗(yàn)

- 基線模型就是2*224,它用了 multi crop 的這個(gè)技術(shù),就是2*160加上4*96
- 如果現(xiàn)在把multi crop的技術(shù)用到SimCLR上會(huì)發(fā)現(xiàn)它漲了2.4個(gè)點(diǎn),這個(gè)漲幅還是非常明顯,所以說(shuō)其實(shí)如果把 multi crop這個(gè)技術(shù)用到 BYOL 上有可能BYOL會(huì)比SwAV的效果高
- 接下來(lái)作者又對(duì)比了一些聚類的方法,對(duì)于聚類的這些方法用multi crop的方式提點(diǎn)就更多了,對(duì)于這幾個(gè)方式來(lái)說(shuō)都提了四個(gè)多點(diǎn),更是非常顯著
- 所以我們可以看到,如果沒(méi)有這個(gè)multi crop的這個(gè)技術(shù),把這四個(gè)點(diǎn)拿掉,其實(shí)SwAV的性能也就跟MoCo v2是差不多的,也就是說(shuō)一個(gè)純聚類的方法,或者說(shuō)聚類和對(duì)比學(xué)習(xí)結(jié)合的方法其實(shí)也并沒(méi)有什么優(yōu)勢(shì),真正提點(diǎn)的是multi crop的技術(shù)
- multi crop這個(gè)技術(shù)其實(shí)非常樸實(shí)了,它其實(shí)就是一種思想,就是說(shuō)全局的和這個(gè)局部的特征都要關(guān)注,所以說(shuō)接下來(lái)的很多工作,也都借鑒是multi crop的這個(gè)技術(shù),而不是 SwAV 這篇工作本身
這里簡(jiǎn)單提一下:
cpc v2其實(shí)也是融合了很多的技巧,它用了更大的模型、用了更大的圖像塊、做了更多方向上的預(yù)測(cè)任務(wù),把batch norm 換成了 layer norm,而使用了更多的數(shù)據(jù)增強(qiáng),所以這一系列操作下來(lái),cpc v2直接就把cpc v1之前在 ImageNet 上40多的準(zhǔn)確率一下就拔到70多
informing其實(shí)是 cmc 的作者做的一個(gè)分析型的延伸性工作,它論文本身的名字叫 What Makes for Good Views for Contrastive Learning(我們到底選什么樣的視角才能對(duì)對(duì)比學(xué)習(xí)最好?)
- 它主要是提出了一個(gè)InfoMin的原則,就是最小化互信息minimi mutual information,那乍一聽(tīng)覺(jué)得可能有點(diǎn)奇怪,因?yàn)橹按蠹易龅亩际?maximize mutual information,都是想要兩個(gè)視角之間的互信息達(dá)到最大,為什么作者這里就想讓它達(dá)到最小呢?
- 其實(shí)這里也不是嚴(yán)格意義上的最小,作者其實(shí)想說(shuō)的是,他想要不多不少的互信息,如果最大化互信息以后比所需要的互信息要多,也是一種浪費(fèi),而且有可能泛化做的不好,但如果互信息比所需求的這個(gè)互信息要少,有可能達(dá)不到最優(yōu)的性能,所以這個(gè)才是作者的本意,就是不能一味的最大化這個(gè)互信息,而是要不多不少剛剛好
- 然后按照Info Min的原則選擇合適的數(shù)據(jù)增強(qiáng),然后拿到合適的對(duì)比學(xué)習(xí)的視角以后,作者發(fā)現(xiàn)對(duì)于很多的方法都有提升,它們最后在 ImageNet 上也有73,也是相當(dāng)不錯(cuò)的
總結(jié):
其實(shí)到了第二階段很多細(xì)節(jié)都處于統(tǒng)一了,比如說(shuō)
- 目標(biāo)函數(shù)都是用infoNCE或者infoNCE類似的目標(biāo)函數(shù)去算的
- 模型最后也都?xì)w一到用一個(gè)編碼器后面加一個(gè)projection head
- 都采用了更強(qiáng)的數(shù)據(jù)增強(qiáng)
- 都想用這個(gè)動(dòng)量編碼器
- 都嘗試著訓(xùn)練的更久
- 最后在ImageNet上的準(zhǔn)確度也逐漸逼近于有監(jiān)督的基線模型
----to be continued----