看了朱毅老師在B站講的對比學習論文綜述,這里稍微總結一下。視頻,筆記
第一階段:百花齊放
InstDisc(Unsupervised Feature Learning via Non-Parametric Instance Discrimination)
引入個體判別代理任務,正樣本就是這個圖片本身(可能經過一些數據增強),是batch中的圖片,負樣本就是數據集里所有其它的圖片,是從memory bank 里隨機地抽取出來的,使用NCE loss,在網絡得到新特征之后,將memory bank里對應batch中圖片的特征更換成新的特征 ,反復這個過程,不停的更新這個 memory bank,最后學到這個特征盡可能的有區分性。不過由於要把所有圖片的特征全都存到memory bank 里,也就是一個字典,也就意味着如果圖片很多的話,則每個特征的維度不能太高,否則存儲代價太大了
Inva Spread(Unsupervised Embedding Learning via Invariant and Spreading Instance Feature)
它可以被理解成是 SimCLR 的前身,它沒有使用額外的數據結構去存儲大量的負樣本,它的正負樣本就是來自於同一個 minibach,而且它只用一個編碼器進行端到端的學習。代理任務也是選取了個體判別這個任務,正樣本是batch中圖片數據增強后的圖片,負樣本是所有剩下的這些圖片(包括原始的圖片以及經過數據增強后的圖片)
CPC(Representation Learning with Contrastive Predictive Coding)
預測型任務,屬於生成式代理任務,正樣本其實就是未來的輸入通過編碼器以后得到的未來時刻的特征輸出,這相當於做的預測是 query,而真正未來時刻的輸出是由輸入決定的,也就是說它們相對於預測來說是正樣本;負樣本的定義其實很廣泛,比如可以任意選取輸入通過這個編碼器得到輸出,它都應該跟預測是不相似的,這就是cpc定義正負樣本的方式
CMC(Contrastive Multiview Coding)
預測型代理任務,一張圖片的多個視角互為正樣本,這里包括四個視角:原始圖像、圖像對應的深度信息(每個物體離觀察者到底有多遠)、SwAV ace normal、這個物體的分割圖像。其他不配對的視角作為負樣本
第二階段:CV雙雄
MoCov1(Momentum Contrast for Unsupervised Visual Representation Learning)
MoCo類似InstDisc的改進版本,用隊列去解決大字典的問題,用動量編碼器解決字典特征不一致的問題
SimCLRv1(A Simple Framework for Contrastive Learning of Visual Representations)
與Inva Spread十分類似,如果有一個mini-batch的圖片,假如說是x,對這個mini-batch里的所有圖片做不同的數據增強就會得到xi和xj,同一個圖片延伸得到的兩個圖片就是正樣本,也就是說如果batch size是n的話,正樣本個數就是n,負樣本的個數就是這個 batch size 剩下所有的樣本以及它們數據增強過后的樣本,也就和invariant spread里講的一樣,是兩倍的 n 減1,然后當有了正負樣本之后通過編碼器f對它進行編碼,兩個f共享權重,也就說其實只有一個編碼器,如果把它想象成一個 res50的話,得到的h(特征表示)是2048維了
SimCLR的重大創新點其實是在特征之后又加了一個projector,它就是一個mlp層(只有一個全連接層,后面跟一個 relu 的激活函數)。
本文其實整體的這個思路和結構跟SimCLR是基本一致的,SimCLR跟Inva Spread的區別其實都寫在SimCLR的貢獻列表里了
首先第一個就是它用了更多的數據增強,它發現對比學習真的是需要很強的數據增強的技術
第二就是它加了一個g函數(一個可以學習的分線性的變換,就是一個 mlp層)
第三就是它們用了更大的batch size ,而且訓練的時間更久,它發現這兩個策略都能讓網絡學到的特征變得更好
MoCov2(Improved Baselines With Momentum Contrastive Learning)
作者發現SimCLR里的技術都是即插即用型的,所以作者直接把這些技術加到MoCo里,具體改動包括四個方面:1.加了一個 mlp 層。2.加了更多的數據增強。3.訓練的時候用了cosine的learning rate schedule。4.訓練更長的 epoch,從200變到了800
SimCLRv2(Big Self-Supervised Models are Strong Semi-Supervised Learners)
這篇論文主要內容是介紹如何用非常大的自監督訓練出來的模型去做半監督學習,如何將SimCLR從V1變到V2是占了很少的篇幅,主要改動包括三個部分:1.換了一個更大的模型,換了一個152層的殘差網絡,同時用了這個selective kernels,也就是SK net。2.將MLP層從一層fc變成兩層fc,原來是 fc + relu,現在是 fc + relu fc + relu。3.引入了動量編碼器。
SWaV(Unsupervised Learning of Visual Features by Contrasting Cluster Assignment)
給定同樣一張圖片,如果生成不同的視角,不同的 views 的話,希望可以用一個視角得到的特征去預測另外一個視角得到的特征,具體的做法就是把對比學習和聚類的方法合在了一起,在通過編碼器得到z1,z2之后,並不是直接在這個特征上去做對比學習的loss,而是說先通過clustering讓特征z和prototype c生成一個目標,也就是q1,q 2。
q1,q2就相當於ground truth,那它真正要做的這個代理任務是什么呢?它的意思是說如果x1、x2是正樣本的話,那z1 和 z 2的特征就應該很相似,也就跟之前對比學習一樣,z1和z2要盡可能的相似。
那如果兩個特征非常相似,或者說含有等量的信息的時候,按道理來說應該是可以互相去做預測的,也就是說,如果拿z1這個特征去跟c去做點乘,按道理來說也是可以去預測q2;反之亦然,z2和這個c去做點乘也可以預測q1,所以說點乘之后的結果就是預測,而ground truth就是之前按照clustering分類而得到的q1和q2。
所以通過這種Swapped prediction,也就是換位預測的方法,SwAV可以對模型進行訓練。使用聚類中心的好處在於如果要跟很多的負樣本去做類比,可能就需要成千上萬的負樣本,而且即使如此也只是一個近似,而如果只是跟聚類中心做對比,則可以用幾百或者最多3,000個聚類中心,就足以表示了,此外這些聚類中心是有明確的語意含義的,如果之前只是隨機抽樣抽取負樣本去做對比的話,那些負樣本有的可能還是正樣的,而且有的時候抽出來的負樣本類別也不均衡,所以不如使用聚類中心有效。
除此之外,論文中另一個性能提升點在於使用了一個trick,也就是multi crop。其實在沒加multi crop時,SWaV的性能和MoCo v2是差不多的,也就是說一個純聚類的方法,或者說聚類和對比學習結合的方法其實也並沒有什么優勢,真正提點的是multi crop的技術,所以說接下來的很多工作,也都借鑒是multi crop的這個技術,而不是 SwAV 這篇工作本身。
CPCV2
用了更大的模型,用了更大的圖像塊、做了更多方向上的預測任務,把batch norm 換成了 layer norm,使用了更多的數據增強。
informing(What Makes for Good Views for Contrastive Learning)
cmc 的作者做的一個分析型的延伸性工作,它主要是提出了一個InfoMin的原則,就是最小化互信息minimi mutual information,其實這里也不是嚴格意義上的最小,作者其實想說的是,他想要不多不少的互信息,如果最大化互信息以后比所需要的互信息要多,也是一種浪費,而且有可能泛化做的不好,但如果互信息比所需求的這個互信息要少,有可能達不到最優的性能,所以這個才是作者的本意,就是不能一味的最大化這個互信息,而是要不多不少剛剛好
總結
其實到了第二階段很多細節都處於統一了,比如說
- 目標函數都是用infoNCE或者infoNCE類似的目標函數去算的
- 模型最后也都歸一到用一個編碼器后面加一個projection head
- 都采用了更強的數據增強
- 都想用這個動量編碼器
- 都嘗試着訓練的更久
- 最后在ImageNet上的准確度也逐漸逼近於有監督的基線模型
第三階段:不用負樣本
BYOL(Bootstrap Your Own Latent A New Approach to Self-Supervised Learning)
對比學習中負樣本就相當於一個約束,因為如果只有正樣本,正樣本之間要求相似,這時模型會有一個捷徑解,就是所有的樣本的輸出結果相同,這樣loss就永遠是0,這種模型什么都沒學到,顯然不行,很多論文中也把這叫做model collapse或者learning collapse,模型坍塌或者學習坍塌。所以需要加上負樣本這個約束,使得不相似的物體之間有不相似的特征,這樣模型才有動力進行學習。但是BYOL中沒有使用負樣本,模型前半部分與之前類似,將x經過兩次數據增強得到v和v',v通過fθ編碼器得到特征yθ,v'通過fξ編碼器得到特征y'ξ,這兩個編碼器使用同樣的網絡架構,但是參數是不同的,fθ是隨着梯度更新而更新的,fξ是通過moving average的方式進行更新,其實就是使用了動量編碼器,接下來與SimCLR類似使用了一個投影層,文中叫projector,也就是yθ通過gθ得到zθ,y'ξ通過gξ得到z'ξ,兩個投層的區別於前面一樣。
接下來就是主要創新的地方,之前的工作中是要使得zθ與zξ盡可能的接近,但是BYOL中在gθ投影層后面又加了一層predictor,也就是qθ,與投影層網絡結構一致,也就是一個MLP,得到一個新的特征,也就是預測,然后期望這個預測與z'ξ盡可能一致,也就是把原來一個匹配的問題換成了一個預測的問題,這與SwAV有點像,但是SwAV是借助了聚類中心去做預測任務,而BYOL什么都沒有,相當於是用自己一個視角的特征去預測另外一個視角的特征。目標函數用的是MSE loss。
但是為什么模型沒有坍塌呢?作者也提供了一些解釋,但是比較中規中矩。
針對BYOL的博客和他們的回應
博客作者在復現BYOL時遺漏了一個小細節,結果就出現了模型坍塌的現象,這個細節跟batch norm有關,BYOL的projector是Linear+BN+ReLU+Linear,而博客作者在復現時參照的是MoCoV2,其中是沒有用BN的,所以博客作者也沒有用BN,就導致了坍塌,后來作者經過實驗發現,只要在投影層或者預測層中放一個BN,結果就還行,作者在嘗試將BN換成Layer Norm之后依舊出現了坍塌,所以作者任務BYOL沒有坍塌肯定與BN有關。作者分析認為,BN在計算的時候是用一個batch中所有樣本計算均值方差,然后再用均值方差進行歸一化,所以在算某個樣本的loss的時候其實也看到了其他樣本的特征,也就是說其中是存在信息泄露的,所以作者認為可以把一個batch中的其他樣本視作隱式的負樣本,作者認為經過歸一化的每張圖片可以看成平均圖片,與SwAV中的聚類中心類似,作者稱之為mode,就是中值的意思。
如果博客作者的觀點正確,則BYOL的創新性會降低很多,因為沒有脫離對比的范疇,BYOL的作者很快就寫了一篇新的論文(BYOL works even without batch statisties)作為回應,作者進行了很多消融實驗,發現大部分情況下博客中的內容都是正確的,但是作者發現了幾個特例,即使Projector有BN,但是BYOL還是訓練失敗了,還有當編碼器和Projector都沒有BN時,SimCLR也失敗了,所以論文作者和博客作者達成一致,也就是BN能幫助模型穩定訓練,能提高模型的訓練穩健性,從而不會出現坍塌,但是論文作者認為如果一開始就能讓模型初始化的比較好,那么后面的訓練沒有BN也可以,后續作者進行了進一步的實驗,發現在使用Group Norm和Weight standardization進行初始化時也能有很高的准確率
SimSiam
對比學習雖然有了很多進展,但是好像是被一個個的創新點堆起來的,這不利於分析,所以作者試圖將整個過程化繁為簡,提出了SimSiam,結構十分簡單,與BYOL類似,不需要負樣本,且不需要大的batch size和動量編碼器,兩邊共享參數,整體架構與BYOL十分相似,x分為x1,x2經過兩個編碼器,x1分支經過一個predictor,得到的結果去預測特征,與BYOL唯一的區別在於沒有使用動量編碼器,用MSE loss。
最后作者得到的一個結論就是之所以SimSiam沒有模型坍塌,就是因為有stop gradient這個操作存在。作者還提出一個假設,因為有stop gradient這個操作存在,SimSiam的結構可以想象成一個EM算法,因為有stop gradient這個操作之后,一個訓練過程,或者一套模型參數就被認為分成了兩份,就相當於在同時解決兩個子問題,模型的更新也是在交替進行,作者經過一系列推導,認為到最后可以理解為一個K-means聚類問題,K-means其實也是分兩步,先把所有的點分配給一些聚類中心,然后更新聚類中心,然后周而復始
第四階段:基於Transformer
MoCov3
這篇論文的大部分篇幅都在介紹自監督訓練的ViT有多不穩定和發現的問題,以及如何通過改進使得訓練更穩定且效果更好,如何將MoCo從V2變到V3只有1頁,從架構上看,MoCoV3其實就是MoCoV2和SimSiam的合體,仍然有兩個網絡,一個是query編碼器,一個是key編碼器,key編碼器是動量編碼器,loss采用的是對比學習的loss,從這個角度看是MoCoV2,但是query編碼器除了backbone之外,還有projection head和prediction head,這其實是BYOL或者SimSiam,而且目標函數也用的是對稱項,就是既計算query1到key2的,也算query2到key1的,從這個角度看是SimSiam,由於ViT的出現,所以作者想把卷積網絡給換掉,也就是把backbone從殘差網絡換成了ViT,作者發現當batch size較大時,訓練時准確率會波動,作者通過觀察回傳的梯度發現,每次loss有大幅震動時,梯度也會有一個波峰,而這個波峰出現在第一層,就是在做patcn projection的時候,也就是ViT中將圖片轉為patch的那一層,其實就是一個可以訓練的全連接層,作者認為既然這一層訓練有問題,不如不進行訓練,直接凍住,結果發現問題解決了,這個trick能獲得更平滑的訓練曲線。
DINO
這篇文章的主要賣點是ViT在自監督訓練的情況下會有一些非常有趣的特性,作者發現如果把自注意力圖拿出來做可視化,能發現它能非常准確地抓住每個物體的輪廓,甚至能媲美直接做分割,在對比學習方面,其實就是延續了BYOL,x分為x1,x2經過兩個編碼器得到兩個特征,編碼器有projection head和prediction head,為了避免模型坍塌,提高訓練穩定性,作者對teacher網絡做了一個centering的操作, 就是把整個batch的樣本都算一個均值,然后減掉這個均值,然后一邊stop gradient,用另一邊進行預測。