對比學(xué)習(xí)論文綜述 第四階段----transformer + 總結(jié)
第四階段主要是講Transformer是怎么和對比學(xué)習(xí)有機(jī)結(jié)合起來的,在這個階段主要就是簡單的講一下MoCo ?v3和DINO這兩篇工作
An Empirical Study of Training Self-Supervised Vision Transformers
moco v3這篇論文雖然題目說的是自監(jiān)督的Vision Transformer ,但其實(shí)MoCo ?v3只是一種架構(gòu),所以說卷積神經(jīng)網(wǎng)絡(luò)也可以用,Vision Transformer也可以用
事實(shí)上MoCo v3怎么從v1、v 2變到v3,作者只用了一頁去講,大部分的篇幅都在講自監(jiān)督的訓(xùn)練、ViT有多不穩(wěn)定、發(fā)現(xiàn)了一個什么樣的問題以
及怎樣用一個小小的改進(jìn)就能讓這個訓(xùn)練變得更穩(wěn)定、效果也更好,這個寫法就跟SimCLR ?v2有點(diǎn)像
SimCLR ?v1變到 v2,其實(shí)只用了半頁的篇幅去寫,剩下大部分的東西都是在講這怎么做半監(jiān)督學(xué)習(xí)
而MoCo v3大部分的篇幅都是在講怎么樣去提高ViT訓(xùn)練的穩(wěn)定性,所以就是為什么這篇論文的題目叫做一個實(shí)驗(yàn)性的study
摘要還是一貫的直白,上來就寫這篇論文并沒有描述一個新的方法,接下來作者就說其實(shí)這篇論文就是做了一個很直接、很小的一個改動,讓自監(jiān)督的ViT訓(xùn)練的變得更穩(wěn)定了,但是不得不寫一篇論文來把這個發(fā)現(xiàn)告訴大家,因?yàn)樽员O(jiān)督的訓(xùn)練Vision Transformer已經(jīng)是大勢所趨了,這里有很多有趣的發(fā)現(xiàn),所以我們分享給大家看,所以這篇論文的影響力依舊很大,它是ICCV 21的一篇口頭報告論文
在講訓(xùn)練穩(wěn)定性之前,先看一下MoCo ?v3的架構(gòu),因?yàn)闆]有模型總覽圖,所以直接看偽代碼如下圖所示

MoCo v3其實(shí)就相當(dāng)于是MoCo v2和SimSiam 的一個合體
整體的框架來說,它還是有兩個網(wǎng)絡(luò),一個是query編碼器,一個是key編碼器,而且key的編碼器是動量編碼器,最后的目標(biāo)函數(shù)用的是對比學(xué)習(xí)的loss,所以說從這個角度講,它是個MoCo v2
但是如果仔細(xì)看細(xì)節(jié)就會發(fā)現(xiàn),query編碼器現(xiàn)在除了這個骨干網(wǎng)絡(luò)之外,它還有projection head,還有prediction head,這個其實(shí)就是BYOL,或者說是SimSiam
而且它現(xiàn)在這個目標(biāo)函數(shù)也用的是一個對稱項(xiàng),就是說它既算query1到 key2的,也算這個從query2到 key1的,從這個角度講它又是SimSiam
所以說,MoCo v3就是MoCo v2和SimSiam一個很自然的一個延伸工作
因?yàn)閂ision Transformer的出現(xiàn),所以說作者就很想把卷積神經(jīng)網(wǎng)絡(luò)換掉換成 Vision Transformer ,看看結(jié)果到底會變得如何,是不是自監(jiān)督學(xué)習(xí)加上Vision Transformer就能取得像nlp那邊的成功,然后就迅速試了一下,把骨干網(wǎng)絡(luò)從一個殘差網(wǎng)絡(luò)換成了ViT,下圖展示的是一個vit自監(jiān)督訓(xùn)練的一個訓(xùn)練曲線

作者發(fā)現(xiàn)當(dāng)batch size比較小的時候其實(shí)還好,這個曲線比較平滑,比如說圖中的橘黃線和藍(lán)線在當(dāng)batch size比較小的時候就比較平滑,不會出什么問題,這個效果也還行
但是當(dāng)batch size變大了以后,作者就發(fā)現(xiàn)這個曲線會莫名出現(xiàn)這種情況:訓(xùn)練的時候突然準(zhǔn)確度就掉下來一下,再訓(xùn)練一段時間后又掉下來一下,雖然說它每次還能很快的恢復(fù)上去,但是恢復(fù)上去就不如原來的那個準(zhǔn)確度高了,最后這個準(zhǔn)確度也會差很多
按道理來說,一般大batch size會得到更好的結(jié)果,但是在這里大batch size反而得到了更差的結(jié)果,作者就覺得這是一個問題,這個問題得解決,如果能解決訓(xùn)練的這個問題,很有可能就能用更大的batch size去訓(xùn)練一個更大的Vision Transformer從而得到更好的結(jié)果
那其實(shí)這樣類似的問題我之前遇到過,在訓(xùn)練與分割的網(wǎng)絡(luò)時候也會有這種情況發(fā)生,但我之前就沒有深究,知乎上還有很多小伙伴在看到MoCo v3這篇論文以后也說,之前在訓(xùn)練別的任務(wù)的時候也遇到過類似的問題,有人也采用類似的方式解決了這個問題,有人也就沒有管,所以說有的時候很小的一個問題,也可以是一個問題的很好的出發(fā)點(diǎn)
針對這個問題,MoCo v3 的作者就提出來一個小trick,他是怎么想到這個解決方式的呢?他觀察了一下訓(xùn)練的時候每一層回傳梯度的情況,這個是比較常見的操作,一般如果網(wǎng)絡(luò)訓(xùn)練的不好,而且不知道為什么的時候,一般首先就是要去查一下梯度,然后作者就發(fā)現(xiàn),當(dāng)每次loss有這種大幅的震動導(dǎo)致這個準(zhǔn)確度大幅下降的時候,梯度也會有一個波峰,而這個波峰其實(shí)是發(fā)生在第一層,就是在做patch projection時候
這個patch projection是什么呢?如果讀過Vision Transformer的論文就知道,這個其實(shí)是屬于模型的第一步,屬于tokenization的那個階段----就是如何把一個圖片把打成 patch,然后給它一個特征。
這一步是怎么做的呢?其實(shí)就是一個可以訓(xùn)練的全連接層,能訓(xùn)練當(dāng)然是好事,但是如果每次梯度都不正常,那還不如不訓(xùn)練,所以說作者就簡單的嘗試一下,如果不訓(xùn)練,直接凍住結(jié)果會怎樣,所以就隨機(jī)初始化了一個patch projection層,然后把它凍住,就是整個訓(xùn)練過程中都不變,結(jié)果發(fā)現(xiàn)問題就解決了,而且很神奇的是這個trick不光是對MoCo v3有用,它對BYOL也有用,如果用BYOL那套框架,把殘差網(wǎng)絡(luò)換成Vision Transformer,剛開始就把patch projection層凍住,一樣能獲得更平滑的訓(xùn)練曲線,獲得更好的訓(xùn)練結(jié)果
在這篇論文之后也有很多研究者意識到了第一步tokenization階段的重要性,所以也有很多后續(xù)的工作去改進(jìn)
第一階段說白了,如果不想改Transformer這個模型本身,因?yàn)樗趾唵螖U(kuò)展性越好,所以說如果中間這一塊我們不動,那能改的除了開始就是結(jié)尾,那開始就是tokenization階段,結(jié)尾就是改目標(biāo)函數(shù)
Emerging Properties in Self-Supervised Vision Transformers
DINO這篇論文也說的是一種自監(jiān)督訓(xùn)練Vision Transformer的方式,但這篇文章主要的賣點(diǎn)是:Vision Transformer在自監(jiān)督訓(xùn)練的情況下會有一些非常有趣的特性,它把它效果最炸裂的這些圖片放到了圖一如下圖所示,放到了文章開頭

這個圖的意思就是說一個完全不用任何標(biāo)簽信息訓(xùn)練出來的Vision Transformer ,如果把它的自注意力圖拿出來進(jìn)行可視化的話,會發(fā)現(xiàn)它能非常準(zhǔn)確的抓住每個物體的輪廓,這個效果甚至能直接媲美對這物體做分割,比如說圖中像牙刷還有長頸鹿,這些物體的邊界摳的非常的精準(zhǔn),甚至比很多做無監(jiān)督分割的工作都要做的好
DINO具體操作如下圖所示

其實(shí)它的方法倒不是說多新,跟之前的一系列對比學(xué)習(xí)的工作都非常的相似,就是換了個方式來講故事,至于DINO這個名字,來自于它的題目self distillation with no labels,就是distillation和no label
整個框架叫一個蒸餾的框架,至于為什么是自蒸餾,其實(shí)就跟BYOL一樣,因?yàn)樽约焊约簩W(xué)或者自己預(yù)測自己,所以就是自蒸瘤
對于 MoCo 來說,左邊的網(wǎng)絡(luò)叫做 query 編碼器,右邊叫做key編碼器,對于BYOL 來說,左邊叫做online network,右邊叫做target network,DINO其實(shí)就是延續(xù)的BYOL,它只不過是換了個名字,把左邊叫成student網(wǎng)絡(luò),右邊叫成teacher網(wǎng)絡(luò)
因?yàn)閟tudent要預(yù)測teacher,所以可以把teacher網(wǎng)絡(luò)的輸出想成是ground truth
至于具體的前向過程,跟BYOL或者跟SimSiam都是非常類似的,同樣就是當(dāng)有同一個圖片的兩個視角以后,用x1、x2通過編碼器得到了兩個特征,這個編碼器自然也是有projection head、prediction head
為了避免模型坍塌,DINO做了另外一個額外的操作,叫做centering,這個操作就是把整個batch里的樣本都算一個均值,然后減掉這個均值,其實(shí)就算是centering,這個就很像是 BYOL對于 batch norm 的討論,因?yàn)閎atch norm也是對整個batch里的樣本做了一個均值和方差
最后有一個stop gradient的操作然后用p1去預(yù)測p2
再看偽代碼如下圖所示

它真的跟 MoCo?v 3實(shí)在是太像了,尤其是前像過程不就是一模一樣嗎,就只有目標(biāo)函數(shù)稍微有點(diǎn)不一樣,這里多了一個centering的操作,防止模型坍塌
總結(jié)
MoCo?v3和DINO這兩篇工作,從方法和模型角度上來說,其實(shí)它們跟第三階段基本是一模一樣的,主要就是融合了Vision Transformer
到這里就把過去兩三年比較有代表性的對比學(xué)習(xí)的工作都串了一遍,這里我們就再畫一張大圖如下圖所示,整體再快速的把這些工作再過一遍,看一下它們之間的聯(lián)系與不同

從最開始的Inst Disc開始,它提出了個體判別的任務(wù),而且它提出用一個 memory bank的外部數(shù)據(jù)結(jié)構(gòu)去存儲負(fù)樣本,從而能達(dá)到一個又大又一致的字典去做對比學(xué)習(xí)
如果不用外部結(jié)構(gòu)的話,另外一條路就是端到端的學(xué)習(xí),也就是Inva Spread這篇論文做的,它就只用了一個編碼器,從而可以端到端的學(xué)習(xí),但因?yàn)槭芟抻赽atch size 太小,所以說它的性能不夠好
CPC v1這篇論文提出了infoNCE這個loss,而且CPC v1是一個預(yù)測型的代理任務(wù),不僅可以做圖像,還可以去做音頻、視頻、文字和加強(qiáng)學(xué)習(xí),是一個非常全能的結(jié)構(gòu)
最后還有CMC這個工作,它就把兩個視角的任務(wù)擴(kuò)展到了多個視角,從而給接下來多視角或者多模態(tài)的這個對比學(xué)習(xí)打下了鋪墊
另外還有一篇論文deep cluster并沒有講,它是基于聚類學(xué)習(xí)的,當(dāng)時還沒有用對比學(xué)習(xí)
接下來就進(jìn)入了第二階段,第二階段主要是MoCo v1開始,它算是Inst Disc的一個延伸性工作,它把memory bank變成了一個隊列,然后把動量更新特征,變成了動量更新編碼器,從而能預(yù)訓(xùn)練一個很好的模型
MoCo也是第一個能在很多視覺的下游任務(wù)上,讓一個無監(jiān)督預(yù)訓(xùn)練的模型比有監(jiān)督預(yù)訓(xùn)練模型表現(xiàn)好的方法,它屬于使用外部數(shù)據(jù)結(jié)構(gòu)的
自然端到端的學(xué)習(xí)肯定也有延伸性的工作,也就是SimCLR v1,SimCLR v1跟Inva Spread方法是很像的,但是它用了很多的技術(shù),比如說加大了batch size,用了更多的數(shù)據(jù)增強(qiáng),加了一個projection head,訓(xùn)練的更長時間,總之所有的這些技術(shù)堆起來讓SimCLR在ImageNet取得了非常好的的結(jié)果
然后CPC v1把這些技術(shù)也全都拿來用了一遍,CPC v2就直接比CPC v1在ImageNet 上高了30多個點(diǎn)
最后CMC把這些都分析一下,提出了一個info Min的這個原則,它說兩個樣本或者兩個視角之間的互信息,要不多不少才是最好的
然后MoCo的作者看到SimCLR用的這些技術(shù)確實(shí)都很管用,所以就把這些即插即用的技術(shù)拿過來用在MoCo上,就有了MoCo v2,MoCo v2的效果就比MoCo v1和SimCLR v1都要好
然后SimCLR的作者也對模型進(jìn)行了一些改動,得到了SimCLR v2,但SimCLR v2主要是去做半監(jiān)督學(xué)習(xí)的
之前提deep cluster主要就是為了引出SwAV,SwAV就是把聚類學(xué)習(xí)和對比學(xué)習(xí)結(jié)合起來的一個工作,也取得了不錯的結(jié)果,但它這個不錯的結(jié)果主要是來自于它提出的multi crop的技術(shù),如果沒有這個技術(shù),它其實(shí)跟SimCLR或者M(jìn)oCo v2的結(jié)果都是差不多的
第三階段就來到了BYOL這個方法,因?yàn)樘幚碡?fù)樣本實(shí)在是太過麻煩,所以BYOL就說能不能不要負(fù)樣本,能不能不去跟負(fù)樣本做對比,結(jié)果它們發(fā)現(xiàn)還真行,就自己跟自己學(xué),把一個對比任務(wù)變成一個預(yù)測任務(wù)就可以了,而且目標(biāo)函數(shù)也很簡單,不再使用info NCE,而是用一個簡單的mse loss就可以訓(xùn)練出來
但是大家都覺得很不可思議,所以立馬就有一篇這個博文出來,它們就假設(shè)說BYOL能夠工作主要是因?yàn)橛衎atch norm,這個batch norm提供了一種隱式的負(fù)樣本,所以BYOL 能夠正常訓(xùn)練而不會模型坍塌
但是?BYOL?的作者很快就又發(fā)了另外一篇論文叫BYOL v2,通過做了一系列實(shí)驗(yàn)以后,最后說batch norm只是幫助了模型的訓(xùn)練,如果能用另外一種方式能提供一個更好的模型初始化,BYOL不需要batch norm提供的那些batch的統(tǒng)計量照樣能工作,就把之前博客里提出來假設(shè)給打破了,但它們提出的其實(shí)也只是另外一個新的假設(shè)
緊跟著BYOL,SimSiam 就出來了,SimSiam就把之前的工作都總結(jié)了一下,因?yàn)樗X得之前的這些論文都在一點(diǎn)一點(diǎn)往上堆技術(shù),那如果堆的太多了就不好分析了,這個領(lǐng)域也就不好再推進(jìn)下去了,所以SimSiam就化繁為簡,又提出來一個很簡單的孿生網(wǎng)絡(luò)的學(xué)習(xí)方法,它既不需要用大的batch size,也不需要用動量編碼器,也不需要負(fù)樣本,然后照樣能取得不錯的結(jié)果,SimSiam提出的假設(shè)就是說stop gradient這個操作是至關(guān)重要的,因?yàn)橛羞@個操作的存在,所以SimSiam可以看成是一種EM算法,通過逐步更新的方式避免模型坍塌
另外還有一篇工作叫barlow twins,它主要就是更換了一個目標(biāo)函數(shù),把之前大家做的這種對比或者預(yù)測變成了兩個矩陣之間去比相似性,因?yàn)樗呀?jīng)是21年3月提出來的,所以很快就淹沒在了Vision Transformer這波洪流之中
最后第四階段就來到了Vision Transformer,主要講的兩個工作就是MoCo?v3和DINO,其實(shí)都是把骨干網(wǎng)絡(luò)從殘差換成了ViT,主要學(xué)習(xí)的方法其實(shí)是沒有改變的
但是換成Vision Transformer以后,面臨的問題都是訓(xùn)練不穩(wěn)定或者不好訓(xùn)練,所以他們就提出了各自的方法:MoCo v3提出來把patch projection layer凍住,DINO就提出把teacher網(wǎng)絡(luò)的輸出先做一下歸一化,做一下centering。這2種方式都能有效的提高模型訓(xùn)練的穩(wěn)健性,防止模型坍塌,讓Vision Transformer用自監(jiān)督的方式也能訓(xùn)練的很好
到此,又把所有的這些工作快速的串了一遍,現(xiàn)在對比學(xué)習(xí)還是一個很火的方向,雖然說可能沒有Vision Transformer那么火,而且尤其是MAE火爆了以后,大家都去嘗試掩碼學(xué)習(xí),而不是去嘗試對比學(xué)習(xí)了,所以說對比學(xué)習(xí)又從一個火爆發(fā)展期變成了一個發(fā)展?jié)摲?/p>
但是我對它的前途還是非??春玫?,畢竟多模態(tài)的對比學(xué)習(xí)還是一個主流,CLIP的效果就很好,下次也會講到CLIP這篇工作,而且在多模態(tài)里面,圖像和文本對之間的對比學(xué)習(xí)loss還是一個標(biāo)準(zhǔn)的目標(biāo)函數(shù),基本上所有的工作都有在用,而且對比學(xué)習(xí)它屬于一個想法而不是具體的一個工作,它在幾十年之前就已經(jīng)提出來了,所以接下來我們應(yīng)該還是會看到很多對比學(xué)習(xí)的工作的,我很期待對比學(xué)習(xí)跟其它方法的結(jié)合
----end----