重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》
MoCo 論文逐段精讀【論文精讀】
這次論文精讀李沐博士繼續邀請了亞馬遜計算機視覺專家朱毅博士來精讀 Momentum Contrast(MoCo),強烈推薦大家去看本次的論文精讀視頻。朱毅博士和上次一樣講解地非常詳細,幾乎是逐詞逐句地講解,在講解時把 MoCo 相關領域的研究也都介紹了,聽完之后收獲滿滿。
MoCo 獲得了 CVPR2020 最佳論文提名,是視覺領域使用對比學習的一個里程碑工作。對比學習目前也是機器學習領域最炙手可熱的一個研究方向,由于其簡單、有用、強大,以一己之力盤活了從2017年開始就卷的非常厲害的計算機視覺領域。MoCo 是一個無監督表征學習的工作,其不僅在分類任務,在檢測、分割和人體關鍵點檢測任務上都逼近或超越了有監督學習模型;MoCo 的出現證明我們可能并不需要大量標注好的數據去預訓練。下圖中 Yann LeCun 將機器學習比作一塊蛋糕,強化學習是蛋糕上的櫻桃、有監督學習是蛋糕上的奶油、無監督學習才是那塊大蛋糕,才是問題的本質,目前很多的大模型都是通過自監督學習得到的。
MoCo 論文鏈接:https://arxiv.org/abs/1911.05722
0. 對比學習介紹
在開始精讀論文之前,朱毅博士首先介紹了什么是對比學習。如下圖所示,有三張圖片,圖1、2為同一個人不同的表情,圖3為dog,在訓練時不會為這三種圖片去標注。將三種圖片輸入到模型中,模型會得到三張圖片各自特征。由于圖1、2為同一個人、對比學習就是讓特征 f1、f2f_1、f_2f1?、f2? 比較接近,而特征 f3f_3f3? 與另外兩個特征在特征空間相距較遠,這就是對比學習需要達到的目的。
雖然在對比學習中并不需要為圖片進行標注,但是仍然需要知道哪些圖片是相似的,哪些圖片是不相似的,在計算機視覺中通常使用代理任務來完成。舉一個具體的例子 instance discrimination,假設有 nnn 張圖片,選取一張圖片 xix_ixi? ,經過裁剪和數據增強后得到兩張新的圖片 xi1x_i^1xi1? 和 xi2x_i^2xi2?,則這兩張圖片和原來的圖片就是相似的,也被稱為正樣本,其余圖片即 j≠ij \neq ij?=i,則為負樣本。對比學習的靈活之處就在于正負樣本的劃分,例如同一張圖片不同視角可看作為正樣本,視頻中同一段視頻任意兩幀可以看為正樣本,RGB和深度圖也可看作為正樣本等等。正是由于其靈活性,對比學習的應用才如此之廣。
1. 標題、摘要、引言、結論
先是論文標題,論文標題的意思是:使用動量對比去做無監督視覺表征學習,MoCo 就來自于論文前兩個單詞前兩個字幕。簡單介紹什么是動量,動量在數學上就是加權移動平均。例如 yt=m×yt?1+(1?m)×xty_t=m \times y_{t-1}+(1-m) \times x_tyt?=m×yt?1?+(1?m)×xt?,yt?1y_{t-1}yt?1? 為上一時刻的輸出,xtx_txt? 為當前輸入, mmm 為動量參數;當 mmm 很大時,yty_tyt? 就取決于上一時刻輸出,其更新就很緩慢;當 mmm 很小時,yty_tyt? 就取決于當前時刻輸入。
作者團隊來自于 FAIR,就不過多介紹了,五個人谷歌學術引用數達到了50萬+。
下面是論文摘要,摘要寫的很簡潔,總共只有7句話。
- 第1句話直接介紹主題,我們提出了 MoCo 用于無監督視覺表征學習。第2句話意思是我們把對比學習看作是字典查詢,我們建立了一個動態字典,使用到了對列和移動平均編碼器。
- 第3句話意思是使用隊列和移動平均編碼器,我們可以建立一個很大且一致的字典,有助于對比無監督學習。
- 第4-6句話是模型效果,MoCo 在 ImageNet 分類上取得了很有競爭力的結果,其中 linear protocol 的意思是說將主干網凍結,只訓練分類頭。更重要的,將 MoCo 學到的特征遷移到下流任務時,在7個檢測和分割任務上,MoCo 都超過它的有監督預訓練對手,counterpart 的意思是有監督和無監督訓練都使用同一個網絡,例如ResNet-50。
- 最后一句話的意思是,在許多視覺任務上,無監督和有監督特征學習之間的鴻溝被大幅度的填上了。
下面是論文引言部分,總共有6段。
- 第1段說無監督學習在自然語言處理任務中取得了很大的成功,但是在計算機視覺中,仍然是有監督預訓練占統治定位。原因可能是各自信號空間的不同。語言任務有著離散的信號空間(單詞、詞根、詞綴等);但是計算機視覺,原始信號往往是連續、高維的,在構建字典時會有很多問題。
- 第2段說最近的無監督學習研究都使用了對比學習。這些方法可以看作是構建動態字典。使用編碼器網絡將圖像或圖像塊表示成 key。無監督學習訓練編碼器時是這樣進行字典查詢:一個編碼后的 query 應該和它匹配的 key 相似,而和其它 key 不相似。這樣一個學習就變成了最小化對比損失的問題。
- 第3段說我們想構建這樣的一個字典:(1)大(2)在訓練時保持一致。大的字典可以讓我們采樣到想要的連續、高維視覺空間;字典中的 key 應該盡可能使用相同或相似的編碼器來表示,這樣它們和 quary 的比較才能一致。如何讓字典又大又一致,作者在后面會詳細介紹。
第4段說我們提出了 MoCo 模型,如下圖所示,通過比較 query 和 key 地相似性來訓練編碼器。我們用隊列來存儲字典數據,當前時刻數據編碼后新的特征入隊,最老的數據特征出隊,這樣字典大小和mini-batch大小就解耦了,就能保證構建一個大的字典;同時使用動量去更新編碼器參數,能保證字典中的特征盡可能地一致。使用數學公式表達的話就是:θk=mθk?1+(1?m)θq\theta_k=m \theta_{k-1}+(1-m) \theta_qθk?=mθk?1?+(1?m)θq? 。
第5段介紹了代理任務,作者使用個體判別作為代理任務,即同一張圖片不同視角的 query 和 key 看作是相似的。在 ImageNet 數據線性分類問題上 MoCo 顯示出了很有競爭力的結果。第6段作者說無監督學習最主要的目的是將預訓練好的特征遷移到下游任務中。在7個檢測和分割任務上,MoCO 都有著很好的效果。無論是百萬張圖片還是10億張圖片,MoCO 都工作地很好。意味著無監督學習和有監督學習之間的差距越來越小了,在許多應用中逐漸可以替代有監督預訓練模型。
下面是結論和討論部分,結論就1句話,我們的無監督學習方法在許多計算機視覺數據和任務上都有著很好的結果。MoCO 從百萬數據到十億數據性能提升是有的,但是很小,可能是這些大規模數據未充分利用,希望有更高級的代理任務來提高模型性能;有可能將 MoCo 調整到像 masked auto-encoding 這樣的代理任務上(最近作者就提出了大火的 MAE)。最后作者希望 MoCo 能在其它對比學習研究中有幫助。
2. 相關工作
下面是論文相關工作部分,無監督學習通常包含兩方面:代理任務和損失函數。代理任務通常不是大家實際感興趣的任務 (如檢測、分類、分割),而是為了學習一個好的數據特征表示;損失函數可以和代理任務分開研究,MoCo 關注的就是損失函數研究。
損失函數是為了衡量模型的預測輸出和固定目標之間的差異,如通過 L1、L2 損失重構像素或通過交叉熵對輸入進行分類。對比學習的損失測量的是樣本對在特征空間的相似性,在訓練過程中,目標通常是不固定的。對抗學習的損失衡量的是概率分布的差異,經常用在無監督數據生成。
各種各樣的代理任務被提出來,如重構整張圖、重構某個 patch、給圖片繪上顏色。不同的代理任務可以和對比學習損失函數結合使用,如 CPC、CMC。
3. MoCo方法、實驗
下面是論文方法部分,對比學習以及最新它的一些最新進展,都可以看作成是訓練一個編碼器,從而去做一個字典查詢的任務。假設有一個編碼好的查詢 q,以及一系列已經編碼好的樣本,也就是 {k0、k1、k2}k_0、k_1、k_2\}k0?、k1?、k2?} 等,這些可以看作是字典中的 key。
這里存在一個假設:在字典中只有一個 key是跟 query 匹配的,兩個互為正樣本對,這個 key 叫做 key positive(k+k_{+}k+?)。定義好了正樣本和負樣本,接下來就需要一個對比學習的目標函數,這個對比學習的目標函數最好能滿足以下要求:(1)當 q 和唯一的正樣本 k+k_{+}k+? 相似的時候,它的loss 值應該比較低;(2)當 q 和其他所有的 key 都不相似的時候,這個loss的值也應該比較低。通過點積計算相似性,我們使用 InfoNCE 當作對比學習損失函數,形式為:
Lq=?log?exp?(q?k+/τ)∑i=0Kexp?(q?ki/τ)\mathcal{L}_{q}=-\log \frac{\exp \left(q \cdot k_{+} / \tau\right)}{\sum_{i=0}^{K} \exp \left(q \cdot k_{i} / \tau\right)} Lq?=?log∑i=0K?exp(q?ki?/τ)exp(q?k+?/τ)?
公式中的 τ\tauτ 是一個溫度超參數,是一個標量,如果忽略掉它,就會發現,其實這個 InfoNCE 損失就是交叉熵損失,唯一的區別就在于在交叉熵損失中k指代的是數據集里類別的多少,但是在對比學習的 InfoNCE 損失中,kkk 指的是負樣本的數量。
通常來說,查詢 q 是一個輸入 xqx^{q}xq 通過一個編碼器 fqf_qfq? 得到的,同理所有的 kkk 的表示也都是輸入 xkx^{k}xk 通過一個編碼器 fkf_{k}fk? 得到,輸入和模型具體的實現是由具體的代理任務決定。既可以是圖片,也可以是圖片塊,或者是含有上下文的一系列的圖片塊;對于模型,q 的編碼器和 key 的編碼器既可以是一樣的、也可以是部分共享的,還可以是不一樣的。
下面介紹動量對比學習,對比學習是一種在高維的連續的輸入信號上去構建字典的一種方式。高維和連續指的是圖片,字典是動態的,之所以是動態的是因為這個字典中的 key 都是隨機選取的,而且 key 的編碼器在訓練的過程中也是在不停的變化。如果想學一個好的特征,這個字典就必須擁有兩個特性(大,大的字典能夠包含很多語義豐富的負樣本,從而有助于學到更有判別性的特征;一致性主要是為了模型的訓練方便)基于以上動機,作者就提出了動量對比學習。
-
首先就是把一個字典用隊列的形式表現出來。隊列其實就是一種數據結構,一般被稱作是一個fifo(先進先出)的數據結構。作者在這里是用一個隊列去代表一個字典,也就是說整個隊列就是一個字典,里面的元素就是放進去的 key。在模型訓練的過程中,每一個 mini-batch 就會有新的一批 key 被送進來,同時也會有一批老的 key 移出去,所以用隊列的好處是可以重復使用那些已經編碼好的 key,而這些 key 是從之前的那些 mini-batch 中得到的。這樣使用了隊列之后,就可以把字典的大小和mini-batch的大小徹底剝離開了,就可以在模型的訓練過程中使用一個比較標準的mini-batch size,一般是128或者是256,但是字典的大小可以變得非常大,它的大小非常靈活,而且可以當作一個超參數一樣單獨設置。同時在算對比學習目標函數的時候只是取一個近似,而不是在整個數據集上算loss,使用隊列的數據結構,可以讓維護這個字典的計算開銷非常小。
-
用隊列的形式可以使這個字典變得很大,但是也因為使用了非常大的字典,也就是非常長的隊列,導致沒辦法給隊列中所有的元素進行梯度回傳,也就是說,key 的編碼器無法通過反向傳播的方式去更新它的參數。如果想更新這個 key 的編碼器,其實有一個非常簡單的方法:就是每個訓練迭代結束后,將更新好的 fqf_qfq? 編碼器參數直接復制過來給 fkf_kfk? 編碼器就可以了。這個想法簡單確實是簡單,但是作者緊接著說這種方式的結果并不好,原因是一個快速改變的編碼器降低了這個隊列中所有 key 的特征的一致性。因此作者提出了動量更新的方法,如果將 key 編碼器參數設為 θkθ_kθk?,q 編碼器的參數設為 θqθ_qθq?,那 θkθ_kθk? 就是以下面公式進行更新:
θk←mθk+(1?m)θq\theta_{\mathrm{k}} \leftarrow m \theta_{\mathrm{k}}+(1-m) \theta_{\mathrm{q}} θk?←mθk?+(1?m)θq?上式中 mmm 是動量參數,它是一個0到1之間的數。q 的編碼器 ,是通過梯度反向回傳來更新模型參數,θk\theta_{k}θk? 除了剛開始是用 θqθ_qθq? 初始化以外,后面的更新大部分主要是靠自己。如果動量參數 mmm 設的很大,那么 θkθ_kθk? 更新就非常緩慢,所以作者接下來說,因為使用了這種動量更新的方式,雖然在隊列里的 key 都是由不同的編碼器產生得到的,但是因為這些編碼器之間的區別極小,所以產生的 key 的一致性都很強。
- 下面作者還介紹了 MoCo 和之前研究的對比。之前的對比學習研究都可以看作是字典查找,但是它們都或多或少受限于字典的大小和字典的一致性問題,這里作者將之前的方法總結了一下,歸納成了兩種結構。第一種就是比較直接的端到端學習,如下圖所示編碼器可以通過梯度回傳來更新模型參數。由于模型的正負樣本都是從同一個 mini-batch 里來的,也就是 xqx^{q}xq 和 xkx^{k}xk 都是從同一個 batch 中來的,它做一次前向傳播就能得到所有樣本的特征,而且這些樣本是高度一致的,因為都是來自一個編碼器。聽起來確實很美好,編碼器能用反向回傳學習,特征也高度一致了,但是它的局限性就在于字典的大小,因為在端到端的學習框架中,字典的大小和 mini-batch size 的大小是等價的,如果想要一個很大的字典,里面有成千上萬個 key 的話,也就意味著 mini-batch size 的大小必須也是成千上萬的,這個難度就比較高了。端到端學習的優點在于編碼器是可以實時更新的,所以導致它字典里的那些 key 的一致性是非常高的,但是它的缺點在于因為它的字典大小(就是batch-size的大小),導致這個字典不能設置的過大,否則硬件內存吃不消。
- 在 memory bank 中其實就只有一個編碼器,query 的編碼器是可以通過梯度回傳來進行更新學習。但是對于字典中的 key 是沒有一個單獨的編碼器,memory bank 把整個數據集的特征都存到了一起,對于 ImageNet 來說,memory bank 中就有128萬個特征(看上去好像很大,但是每一個特征只有128維,所以即使整個 memory bank 中有128萬個 key ,最后也只需要600M的空間就能把所有的這些key存下來了)。一旦有了這個 memory bank,在每次模型做訓練的時候,只需要從 memory bank 中隨機抽樣很多的 key 出來當作字典就可以了。這里也有一個問題:因為這里的特征都是在不同時刻的編碼器得到的,而且這些編碼器都是通過梯度回傳來進行快速更新的,這也就意味著這里得到的特征都缺乏一致性。
- 顯然,無論是端到端的學習還是 memory bank 的方法,都和作者說的一樣,受限于字典大小和特征一致性這兩方面中的至少一個,所以為了解決之前這兩種做法的局限性,作者就提出了 MoCo。MoCo 采用隊列的形式去實現字典,從而使得它不像端到端的學習一樣受限于 batch-size 的大小,同時為了提高字典中特征的一致性,MoCo使用了動量編碼器。
到這里,其實 MoCo 的主要貢獻舊已經講完了,但是如果對對比學習不是很熟的人來說可能還是不太理解 MoCo 的前向過程到底是什么樣子的,可惜的是這篇論文并沒有提供一個很直觀、形象的模型總覽圖,取而代之的是偽代碼,寫得相當簡潔明了,理解和復現都比較容易。
下面是論文實驗部分,作者分別在 ImageNet-1K 和 Instagram-1B 數據集上進行了模型訓練,使用的主干網是 ResNet-50。首先是線行分類結果的展示,在完成了無監督學習的預訓練之后,將模型的 backbone 凍住,只將它作為一個特征提取器,然后在上面訓練一個全連接層去充當分類器,是在 ImageNet 驗證集上測試,top-1 分類準確率。
-
如左圖所示,三種對比學習方法結果對比:黑色的線表示的是端到端的學習,它的結果只有三個點,因為受限于顯卡內存,藍色的線表示的是 memory bank 的形式,它可以用很大的字典,所以它可以隨著字典增大一直訓練,但是它的效果整體上要比端到端學習和 MoCo 的結果都要差一截。作者說這可能是因為特征的不一致性導致的。橙色的線表示 MoCo,MoCo 確實可以有很大的字典,之所以停在65536這個數字,從圖中可以看到,從16384到65536性能也已經比較飽和了,所以再大也可能不會帶來更多的性能提升了。如果拿 MoCo 和端到端學習的方法做比較,可以發現它們的曲線在剛開始的時候的重合度還是比較高的,但是作者說,因為沒有實驗的支撐,不知道黑線是否能繼續按照現有的趨勢繼續增長下去,有可能結果會更高,也有可能結果會更低,但是因為做不了實驗,所以無從得知。
-
如下圖表格所示,動量使用一個相對較大的值(0.999或者0.9999)的時候性能是最好的,差不多都是59,這就說明了一個變化非常緩慢的編碼器是對對比學習有好處的,因為它能夠提供一個一致性的特征。但是當把動量逐漸變小,變到0.99或者是0.9的時候,性能的下降就比較明顯了,尤其是當直接去掉動量,直接將 query 的編碼器拿過來當 key 編碼器用的時候,就會發現不光是性能下降的問題,整個模型甚至都不能收斂。
-
右下圖是和其它分類方法的比較,首先可以發現,對比學習的效果還是不錯的,因為準確率要比沒有使用對比學習得到得結果要好。作者還強調:在無監督學習中,模型的大小還是非常關鍵的(模型越大,一般效果就會越好),所以只是比較最后的準確率,而不去關注模型大小的話,就不太公平了,從圖中可以看到 MoCo 既能在小模型上得到最好的效果,也能在大模型的比較中得到最好的結果。
無監督學習最重要的目標是學習到可遷移的特征,作者用視覺領域中最常見、應用最廣的檢測任務來做無監督的MoCo 預訓練模型和 ImageNet 的有監督預訓練模型之間的比較。表2種第一行使用的是隨機初始化的模型再做微調,所以它是一個基線網絡,分數比較低;第二行使用的是 有監督ImageNet 的預訓練的模型做初始化然后再做微調,也就是一個比較強的基線結果;最后兩行分別是 MoCo 在 ImageNet-1M上和在 Instagram-1 上做無監督預訓練當作模型的初始化,然后再做微調。可以看到大多數結果顯示 MoCo在 ImageNet-1M 上的預訓練就已經超過了有監督的預訓練模型。當換成更大的數據集的時候還會有進一步的提升。
接下來作者又再次比較了三種對比學習的檢測結果,從表3可以看到 MoCo 和前面兩種方式比起來確實是好了很多,而且最主要的是之前的兩種方法都沒有超越有監督預訓練模型的結果,只有MoCo是真的超越了。
作者又在 COCO 數據上進行了對比。除了在設置a里面 MoCo 的模型稍顯遜色,在剩下的三個設置下,MoCo 預訓練的模型都比 ImageNet 有監督預訓練模型得到的效果要好。
最后簡單總結下,MoCo 在很多的視覺任務上,已經大幅度的把無監督和有監督之間的坑給填上了。MoCo 在Instagram 數據集中是要比 ImageNet 訓練出來的模型要好的,而且是在所有任務上普遍表現的都很好,這說明了MoCo 的可擴展性很好,也就是說如果有更多的數據,MoCo 有可能就能學到更好的模型,這和 NLP中得到的結論是一樣的,這也符合了無監督學習的終極目標。
MoCo 這篇論文以及它高效的實現,能讓大多數人有機會用普通的GPU就能跑對比學習的實驗、做研究。因為MoCo 在各個視覺任務上取得了更好的性能,也激發了很多后續分析性的工作,去研究 MoCo 學出來的特征到底和有監督學出來的特征有什么不同,還能從別的什么方向去提高對比學習。
總結
以上是生活随笔為你收集整理的重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jucheck.exe是什么进程 ju
- 下一篇: Hive安装与配置