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

