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