導(dǎo)讀
本文主要介紹了CV領(lǐng)域內(nèi)的無監(jiān)督學(xué)習(xí),內(nèi)容主要包括Moco、Simclr、BYOL、SimSiam、SwAV、MAE、IPT,詳細(xì)介紹了這些經(jīng)典工作的亮點(diǎn),并附有自己實(shí)際工作中復(fù)現(xiàn)的心得體會(huì),希望能夠幫助大家更深刻的了解無監(jiān)督學(xué)習(xí)
前言
由于工作原因搞了相當(dāng)一段時(shí)間的無監(jiān)督學(xué)習(xí),包括cv單模態(tài)的無監(jiān)督,以及多模態(tài)的無監(jiān)督學(xué)習(xí),這里將自己重點(diǎn)關(guān)注的論文介紹一下,并且會(huì)附上自己在實(shí)驗(yàn)過程中的一點(diǎn)心得體會(huì)。這篇文章主要介紹圖像(CV)領(lǐng)域內(nèi)的無監(jiān)督學(xué)習(xí)。
無監(jiān)督學(xué)習(xí)的概念其實(shí)很早就有了,從最初的auto-encoder,到對(duì)圖像進(jìn)行不同的預(yù)處理然后進(jìn)行預(yù)測的無監(jiān)督學(xué)習(xí)(比如旋轉(zhuǎn)后預(yù)測旋轉(zhuǎn)角度、mask一部分進(jìn)行復(fù)原),以及到如今對(duì)比學(xué)習(xí)(simclr、moco)、特征重構(gòu)(byol,simsiam)、像素重構(gòu)MAE、甚至low-level的無監(jiān)督預(yù)訓(xùn)練(IPT),可以說圖像的無監(jiān)督學(xué)習(xí)獲得了長足的發(fā)展,而且無監(jiān)督的效果已經(jīng)在逐步逼近有監(jiān)督的效果。
當(dāng)然,截止到目前我仍然不認(rèn)為無監(jiān)督學(xué)習(xí)的效果能打敗有監(jiān)督學(xué)習(xí),但是在大量沒有標(biāo)注的數(shù)據(jù)上進(jìn)行無監(jiān)督訓(xùn)練,然后再在自己的特定任務(wù)上的少量標(biāo)注數(shù)據(jù)上進(jìn)行finetune,那效果確實(shí)是會(huì)好很多的,但是如果是大量的無監(jiān)督訓(xùn)練的數(shù)據(jù)也是有標(biāo)注的情況,那么效果肯定不如直接有監(jiān)督訓(xùn)練,而且經(jīng)過自己的實(shí)驗(yàn),即便是先無監(jiān)督再有監(jiān)督、有監(jiān)督無監(jiān)督一起訓(xùn)練也不會(huì)有太大收益,所以說目前為止還是數(shù)據(jù)為王。
但是目前無論是單模態(tài)(CV、NLP)還是多模態(tài)下,都會(huì)有超大規(guī)模的預(yù)訓(xùn)練數(shù)據(jù)甚至能到億級(jí)別,在這種數(shù)據(jù)量下預(yù)訓(xùn)練出來的模型當(dāng)然會(huì)很好,但是收集整理如此量數(shù)據(jù)以及在億級(jí)別訓(xùn)練數(shù)據(jù)上進(jìn)行訓(xùn)練都是極其消耗資源的,一般的研究員都是load開源的模型參數(shù)再進(jìn)一步pretrain或者finetune。
對(duì)比學(xué)習(xí)
最初做無監(jiān)督的想法很簡單,類似auto-encoder,重構(gòu)像素、或者對(duì)圖像做一些變換(比如旋轉(zhuǎn))然后進(jìn)行預(yù)測,但是如此做并沒有得到特別好的效果。自己個(gè)人感覺對(duì)比學(xué)習(xí)(simclr和moco)的出現(xiàn)算是無監(jiān)督學(xué)習(xí)的一次質(zhì)的飛躍,而且這些經(jīng)典論文的一些思路以及結(jié)論,對(duì)其他工作都有借鑒意義,自己有關(guān)的實(shí)驗(yàn)也會(huì)一一介紹。
先簡單介紹下對(duì)比學(xué)習(xí)的概念。我們的輸入圖像??,經(jīng)過兩種不同的預(yù)處理(變換)之后可以得到兩張圖像?和??,那么經(jīng)過特征提取器(encoder)之后兩者的特征應(yīng)該是比較相近的。但是如果直接最大化兩張圖像特征的距離,模型很容易陷入坍塌,即特征都映射成固定特征,那么loss為0。因此對(duì)比學(xué)習(xí)引入負(fù)樣本的概念,對(duì)于來自同一張圖像的特征,其特征距離盡可能近,而來自不同圖像的特征,其特征距離要盡可能遠(yuǎn),用學(xué)術(shù)上的話說就是最小化正樣本距離,最大化負(fù)樣本距離,也就是對(duì)比學(xué)習(xí)的損失函數(shù)。
這里對(duì)損失函數(shù)簡單解釋下,對(duì)比學(xué)習(xí)的輸入是對(duì)每一張圖像進(jìn)行兩種不同的變換,經(jīng)過特征提取之后會(huì)得到兩種特征,對(duì)任意特征??來說,總會(huì)有一個(gè)特征??是其正樣本(同一張?jiān)紙D像的兩種不同的數(shù)據(jù)增強(qiáng)得到的特征),而一個(gè)batch中的其他圖像提取到的特征就是負(fù)樣本。從原理上來說(其實(shí)是各種論文的實(shí)驗(yàn)結(jié)果),提高對(duì)比學(xué)習(xí)的效果就是提供足夠大的batch size、研究更加有效的不同預(yù)處理方式(使得經(jīng)過變換后的兩張圖像既能保留圖像最本質(zhì)的信息,又盡可能不一致)以及增加模型(encoder)表達(dá)能力。下面重點(diǎn)講一下對(duì)比學(xué)習(xí)領(lǐng)域內(nèi)Moco和Simclr兩個(gè)最具代表性以及影響力的文章。
MoCo: Momentum Contrast for Unsupervised Visual Representation Learning
首先是Moco,Moco研究的重點(diǎn)是如何增加計(jì)算loss時(shí)的負(fù)樣本數(shù)據(jù),因?yàn)榭傦@存是有限的。Moco設(shè)計(jì)了一種巧妙的方式,在訓(xùn)練的過程中維護(hù)一個(gè)隊(duì)列,將歷史batch 中的特征(這里的特征由于沒有梯度,所以占顯存很?。┐嫒氲疥?duì)列中,這樣一個(gè)新的batch 在計(jì)算的時(shí)候,可以在隊(duì)列中找到足夠多的負(fù)樣本進(jìn)行迭代優(yōu)化。但是這樣有一個(gè)問題是,不同batch提取特征時(shí)的模型參數(shù)是在一直更新的,所以作者設(shè)計(jì)了一個(gè)momentum-encoder,其結(jié)構(gòu)與encoder完全相同,每次更新的時(shí)候以較小的步長從encoder中copy 參數(shù),這樣momentum-encoder參數(shù)不是通過loss 來進(jìn)行學(xué)習(xí)的,所以提取的特征無需梯度,占用顯存就比較小,同時(shí)momentum-encoder 參數(shù)變化很緩慢,所以隊(duì)列中維護(hù)負(fù)樣本特征就保證了足量且相對(duì)一致(來自同一個(gè)模型參數(shù)),以保證對(duì)比學(xué)習(xí)的效果。
A Simple Framework for Contrastive Learning of Visual Representations
接下來介紹的就是Simclr這篇文章。Simclr可以說有錢任性,直接暴力加足夠的機(jī)器以保證4096的batch size,這樣一來損失函數(shù)就可以直接計(jì)算。Simclr主要研究了對(duì)圖像的不同變換以及特征表達(dá)的影響,Simclr做了大量不同的嘗試,最后發(fā)現(xiàn)在對(duì)比學(xué)習(xí)中,預(yù)處理效果最好。
除此之外,Cimclr還在encoder之外加了mlp結(jié)構(gòu),進(jìn)一步提升了效果(其實(shí)不知道這個(gè)為什么會(huì)有效)。其模型結(jié)構(gòu)為:
Moco 在借鑒的Simclr的數(shù)據(jù)增強(qiáng)方式以及mlp結(jié)構(gòu)之后形成了moco-v2,效果也有很大的提升,說明simclr本身的實(shí)驗(yàn)結(jié)論十分solid。
最初在看到Moco這篇文章的時(shí)候確實(shí)覺得這個(gè)思路很巧妙,而且很明顯作者將其做work了,因?yàn)檎撐闹械闹笜?biāo)完全可復(fù)現(xiàn)。不過當(dāng)我復(fù)現(xiàn)simclr的時(shí)候設(shè)計(jì)了另外一種在一定量顯存的前提下模擬大batch size的實(shí)現(xiàn)方式,簡單講就是小batch 先不帶梯度推理保存結(jié)果,再帶梯度推理計(jì)算loss,但是需要重復(fù)推理,浪費(fèi)了訓(xùn)練時(shí)間。
我們看論文的目的除了直接用論文的方法之外,還可以借鑒論文中的部分思路。比如說Simclr中的數(shù)據(jù)增強(qiáng)以及mlp結(jié)構(gòu),可以說是類似文章的標(biāo)配了,而Moco論文利用momentum-encoder以及隊(duì)列來實(shí)現(xiàn)在小batch size情況下得到足夠量的負(fù)樣本也很值得借鑒,在我訓(xùn)練CLIP(多模態(tài)對(duì)比學(xué)習(xí))的時(shí)候采用的就是Moco的思路,比如ALBEF這篇文章也是用了類似的思路(當(dāng)然人家還有別的優(yōu)化點(diǎn),所以能發(fā)表論文)。
同時(shí)自己在做目標(biāo)檢測的時(shí)候發(fā)現(xiàn)了一篇DetCo,其實(shí)就是將Moco適配到了目標(biāo)檢測領(lǐng)域,設(shè)計(jì)了多尺度的對(duì)比以及增加了局部VS全局的對(duì)比,自己實(shí)驗(yàn)下來,目標(biāo)檢測的任務(wù)下,DetCo確實(shí)比Moco好一些。在視頻領(lǐng)域也有由Moco改進(jìn)而來的VideoMoco,不過這篇文章沒實(shí)驗(yàn)過。
最后寫一些是自己應(yīng)用中的一些思考。首先是在自己的業(yè)務(wù)數(shù)據(jù)上訓(xùn)練類似Moco或者Simclr的時(shí)候,由于對(duì)比損失函數(shù)的特點(diǎn),如果數(shù)據(jù)中相似數(shù)據(jù)占比較高的話最好做一下去重;其次是在多機(jī)多卡訓(xùn)練的過程中,正樣本都是在同一機(jī)器同一張卡上計(jì)算,但是負(fù)樣本會(huì)來自不同的機(jī)器,所以當(dāng)encoder 選用ResNet等CNN結(jié)構(gòu)時(shí),BN層會(huì)有一定的信息泄漏,Moco中采用的是shuffle bn,而Simclr采用的是sync bn。
特征重構(gòu)
剛剛有提到,如果直接最大化兩張圖像特征的距離,模型很容易陷入坍塌。但是也有一些文章進(jìn)行直接進(jìn)行特征重構(gòu)但是卻能收斂(其實(shí)從原理上并不是很清楚收斂原因)。這里主要是介紹BYOL和SimSiam。
BYOL可以說是我在嘗試的論文中效果最好的一個(gè),其最顯著的特點(diǎn)是訓(xùn)練的時(shí)候不需要負(fù)樣本,只需要正樣本就好。
BYOL在Simclr的mlp(projection)之后額外加了新的mlp結(jié)構(gòu)(predition),利用predition的結(jié)果和另一種增強(qiáng)方式得到的projection直接構(gòu)建l2 loss。BYOL中target emcoder其實(shí)就是Moco中的momentum-encoder,其參數(shù)更新來自于online-encoder,而不是由loss計(jì)算??梢哉fBYOL在Moco-v2的基礎(chǔ)上直接去掉了負(fù)樣本的對(duì)比,而是在正樣本projection之后再進(jìn)行predition來預(yù)測圖像特征。
SimSiam就更簡單了,SimSiam 相當(dāng)于在BYOL的基礎(chǔ)上進(jìn)一步去掉了momentum-encoder,僅用一個(gè)encoder,而且作者研究發(fā)現(xiàn)保證模型不坍塌的原因是target 數(shù)據(jù)的梯度不回傳。
BYOL和Simsiam我自己也有有過嘗試,開源的代碼也并不復(fù)雜,確實(shí)能復(fù)現(xiàn)論文的效果,但是目前仍然不是很理解為何target 網(wǎng)絡(luò) stop gradient就能使得無監(jiān)督訓(xùn)練不坍塌,對(duì)我而言仍然是有一點(diǎn)點(diǎn)玄學(xué)。
其他思路
接下來的幾篇文章,是我個(gè)人覺得思路比較值得借鑒的文章,這里一并介紹下。
首先是SwAV這篇文章。這篇文章比較有意思的點(diǎn)是雖然loss采用的仍然是類似對(duì)比學(xué)習(xí),但是其無需負(fù)樣本計(jì)算loss。具體實(shí)現(xiàn)方式為其中一個(gè)增強(qiáng)結(jié)果所提的特征會(huì)進(jìn)行聚類,得到一個(gè)one-hot編碼,我個(gè)人理解為就是為這張圖像打了一個(gè)label,然后對(duì)另一個(gè)增強(qiáng)結(jié)果進(jìn)行分類(特征與聚類中心點(diǎn)乘)。還有一個(gè)值得借鑒的點(diǎn)是其數(shù)據(jù)增強(qiáng)引入了低分辨率(小size),一張圖像經(jīng)過數(shù)據(jù)增強(qiáng)之后可以得到8個(gè)不同的view,其中兩個(gè)是高分辨率,其余六個(gè)是低分辨率,view1(利用distributed_sinkhorn 計(jì)算q)與其余7個(gè)view計(jì)算loss,view2(利用distributed_sinkhorn 計(jì)算q)與其余7個(gè)view計(jì)算loss。其loss 表達(dá)式和模型結(jié)構(gòu)為:
?
其次是MAE這篇文章,是凱明大神繼Moco系列之后的又一力作,其實(shí)自從BERT、GPT在NLP領(lǐng)域內(nèi)被成功應(yīng)用之后,在圖像領(lǐng)域也有相當(dāng)一部分研究集中在對(duì)圖像進(jìn)行一定mask然后重建的工作上,IGPT,BEiT是其中的代表作。其實(shí)自己也跑過類似IGPT的代碼,結(jié)果當(dāng)然是有點(diǎn)慘不忍睹。凱明大神一貫作風(fēng)是思路簡單,效果拔群,然而能將簡單的思路實(shí)現(xiàn),并最終work,才真是硬實(shí)力。MAE 選用的模型是VIT結(jié)構(gòu),首先對(duì)原圖進(jìn)行patch劃分,mask 的粒度也是在patch上完成。AutoEncoder 的結(jié)構(gòu)其實(shí)比較簡單,一個(gè)encoder,一個(gè)decoder,配合上VIT以及patch 劃分,整體模型結(jié)構(gòu)便呼之欲出。
MAE之所以能成功,個(gè)人認(rèn)為有兩個(gè)比較重要的關(guān)鍵點(diǎn)。
1. 75% mask 比例,與文本不同的是,一張圖像信息是非常冗余的,如果類似于BERT 采用隨機(jī)15%的mask比例的話,重建任務(wù)非常簡單,模型很容易就從mask部分的鄰域?qū)W到信息完成重建任務(wù)。
2. 非對(duì)稱的encoder、decoder結(jié)構(gòu)。在論文中指出,因?yàn)橛?xùn)練的目的是拿到比較好的encoder模型,所以encoder模型相對(duì)重一些(參數(shù)多),而輕量級(jí)(參數(shù)少)decoder已經(jīng)能很好的完成重建任務(wù),與此同時(shí),Mask token 不參與encoder計(jì)算,僅參與decoder計(jì)算,這樣一來,參數(shù)多的encoder只輸入25%的圖像數(shù)據(jù),而輸入100%圖像數(shù)據(jù)的decoder參數(shù)又比較少,能夠加速計(jì)算。
最后是IPT這篇文章。IPT與之前文章最大的不同點(diǎn)在于IPT模型更加關(guān)注細(xì)粒度信息,當(dāng)然其負(fù)責(zé)的任務(wù)也主要是降噪、去雨、超分等low level 的任務(wù),其模型以及任務(wù)的設(shè)計(jì)也比較巧妙,為每個(gè)任務(wù)設(shè)計(jì)獨(dú)立的head和tail模塊,中間層則是共享參數(shù)的transformer結(jié)構(gòu),預(yù)訓(xùn)練任務(wù)就是人為對(duì)原始數(shù)據(jù)加噪聲、縮小等各種操作進(jìn)行復(fù)原,這篇文章感覺在low level 的任務(wù)上有很好的啟發(fā)意義。
總結(jié)
以上提到的大多數(shù)文章自己都有相關(guān)的實(shí)驗(yàn),但是做無監(jiān)督有一點(diǎn)點(diǎn)心塞的是隨著自己業(yè)務(wù)上的標(biāo)注數(shù)據(jù)越來越多,無監(jiān)督預(yù)訓(xùn)練帶來的收益會(huì)越來越少,所以無監(jiān)督預(yù)訓(xùn)練在業(yè)務(wù)上應(yīng)用一般是啟動(dòng)的時(shí)候第一版本,手中只有少量的數(shù)據(jù),這個(gè)時(shí)候加上無監(jiān)督預(yù)訓(xùn)練,而后隨著數(shù)據(jù)回流與標(biāo)注,有監(jiān)督訓(xùn)練的效果會(huì)越來越好。同時(shí)這里介紹的這么多篇文章,自己實(shí)驗(yàn)下來在業(yè)務(wù)數(shù)據(jù)上效果其實(shí)并沒有差很多,同時(shí)無監(jiān)督預(yù)訓(xùn)練也需要大量的數(shù)據(jù),而且epoch也要更長(其實(shí)也比較消耗資源),最好是先load 各家在imagenet上預(yù)訓(xùn)練好的開源模型。
編輯:黃飛
評(píng)論
查看更多