MoCo自用筆記
Momentum Contrast for Unsupervised Visual Representation Learning
"用動量對比學(xué)習(xí)去做無監(jiān)督的表征學(xué)習(xí)"
對比學(xué)習(xí)的通俗理解:以圖片分類為例,對于沒有標(biāo)簽的一群圖片,好的對比學(xué)習(xí)的模型,能使得其中類似的圖片,在通過模型后得到的特征空間中對應(yīng)的點 盡可能地接近。而如何達(dá)到這一目標(biāo),或者說怎么去訓(xùn)練這樣一個無監(jiān)督任務(wù)的模型,這就是對比學(xué)習(xí)在做的一件事情。
視覺領(lǐng)域,可以人為的制定一些規(guī)則(pretext task),用來定義哪些圖片應(yīng)該是類似的···從而提供一個監(jiān)督信號,來完成一個自監(jiān)督訓(xùn)練。
涉及到的零散的知識點。
instance discrimination:一種比較典型的對比學(xué)習(xí)的代理任務(wù),把一張圖片做隨機(jī)裁剪與數(shù)據(jù)增廣得到的的一些樣本視為正樣本,其他的所有圖片都是為負(fù)樣本。即每個圖片在最開始都屬于自己的一個類。
重點:規(guī)則可以是多樣的靈活的,例如在simCSE中同一個句子在模型中做兩次forward,得到的兩個特征視為正樣本,其他的都作負(fù)樣本;CMC中將一個物體的不同view,包括 不同的觀察角度,側(cè)面背面,深度圖,rgb圖,分割圖···作為不同形式的正樣本。
contrastive loss
????為了更好的達(dá)到:相近的樣本之間的距離越小越好;相遠(yuǎn)的樣本之間的距離越大越好,這兩個目的而設(shè)計出的一種損失函數(shù),這個思維方式可以學(xué)習(xí)。大致思想是將不同類的樣本的差異設(shè)置上限,以減少過度的將兩個類別“推遠(yuǎn)”,同時還能大幅減少計算量。詳情可以自己找點文章看。

NCE?loss (noise contrastive estimation)??
????知道softmax吧,這個就是把softmax所有的類,分為兩類,因為對于對比學(xué)習(xí)來說,有多少圖片就有多少類,做softmax操作不現(xiàn)實,于是把除了自己類(data sample)外所有其他類視作一個大類(noisy sample),而對該大類做負(fù)樣本采樣,做估計,也正是NCE的E——estimation的意思,從而達(dá)到降低計算量的目的。
InfoNCE?loss?
????和一般的NCE相比,更像一個能提升模型性能的小trick,可以在其它任務(wù)里嘗試。加入了一個超參數(shù),也稱為溫度系數(shù)。與NCE的操作不同,這里用做完點積后除以tau,達(dá)到控制logits分布平滑度的效果。

文章大致思路:
以前的對比學(xué)習(xí),一個正樣本和一個batchsize的負(fù)樣本,去做訓(xùn)練,一個batzhsize如果是256那就是1比256的訓(xùn)練,但是對于現(xiàn)在隨意一個數(shù)據(jù)集都是幾百萬張圖片,幾千類,batchsize顯得很小,這樣子模型能"看"到的就很少,學(xué)的少。怎么辦呢,比較自然的想法就是去擴(kuò)充batchsize的大小,但訓(xùn)練中使用一個幾萬張的batchsize是不現(xiàn)實的,這里就引入一個字典"查詢"的概念,在這里使用一個在看(編碼)圖片時,先不進(jìn)行反向傳播去更新自己的Momentum Encoder,這樣對隊列里的元素只做一個forward操作的計算簡化,使得模型能在一個step看完幾萬個樣本,也就達(dá)成了多看些負(fù)樣本的目的。
然而還有一個最重要的問題,那就是負(fù)樣本的忘了Momentum Encoder如何進(jìn)行更新呢,前面說了,如果需要達(dá)成“多看”這個目的,那么就不可以在訓(xùn)練的時候反向傳播更新模型。MoCo在原文中嘗試過直接使用共享Xq和Xk兩個網(wǎng)絡(luò)模型參數(shù)的方法,效果很差,所以這里就采用了一個 動量更新 的方。原文先討論了,為什么和曾經(jīng)一些的對比學(xué)習(xí)模型一樣,在這里使用同一個模型去編碼Xq和Xk的操作行不通了,這里解釋為?caused by the rapidly changing encoder that reduces the key representations’ consistency。這里怎么理解呢,可以看下面的圖,首先我們明白,網(wǎng)絡(luò)是一個batchsize更新一次參數(shù),就算queue再長,反向傳播的時候也只是看著一個batch傳播的,但如果使用一個不停在更新的模型去解讀一個這么長的隊列,那么Momentum Encoder 在一個step里得到的k0,k1,k2,k3那就不具備“一致性”,而這可能是導(dǎo)致結(jié)果變差得原因。所以MoCo就用了一個動量更新的方法(這里兩個Encoder的初始參數(shù)相同),下式子意思是在每個batchsize中保留自己原來99.9%的參數(shù)。

“A na¨?ve solution is to copy the key encoder fk from the query encoder fq, ignoring this gradient. But this solution yields poor results in experiments (Sec. 4.1). We hypothesize that such failure is?caused by the rapidly changing encoder that reduces the key representations’ consistency.?We propose a momentum update to address this issue.”

?論文鏈接:https://arxiv.org/pdf/1911.05722.pdf