最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MoCo 論文逐段精讀【論文精讀】

2021-12-29 17:52 作者:如果我是泡橘子  | 我要投稿

MoCo


Momentum Contrast for Unsupervised Visual Representation Learning


MoCo是CVPR2020的最佳論文提名,算是視覺領(lǐng)域中使用對(duì)比學(xué)習(xí)的一個(gè)里程碑式的工作

  • 對(duì)比學(xué)習(xí)作為從19年開始一直到現(xiàn)在,視覺領(lǐng)域乃至整個(gè)機(jī)器學(xué)習(xí)領(lǐng)域最炙手可熱的方向之一,它簡(jiǎn)單、好用、強(qiáng)大,以一己之力盤活了從2017年開始就卷的非常厲害的機(jī)器視覺領(lǐng)域,涌現(xiàn)了一大批優(yōu)秀的工作,MoCo就是其中之一
  • MoCo作為一個(gè)無監(jiān)督的表征學(xué)習(xí)的工作,不僅在分類任務(wù)上逼近了有監(jiān)督的基線模型,而且在很多主流的視覺任務(wù)(比如檢測(cè)、分割、人體關(guān)鍵點(diǎn)檢測(cè))上,都超越了有監(jiān)督預(yù)訓(xùn)練的模型,也就是ImageNet上預(yù)訓(xùn)練的模型,在有的數(shù)據(jù)集上甚至是大幅度超越
  • 所以說MoCo的出現(xiàn)從某種意義上來說,是給視覺領(lǐng)域吃了一個(gè)定心丸:無監(jiān)督學(xué)習(xí)是真的可以的,有可能真的不需要大規(guī)模的標(biāo)好的數(shù)據(jù)去做預(yù)訓(xùn)練。這個(gè)結(jié)論也從側(cè)面上證明了之前Yannn LeCun在NeurlPS 2016做演講的時(shí)候用的一張圖,如下圖所示
  • 它的意思是說如果將機(jī)器學(xué)習(xí)比做一個(gè)蛋糕的話,那強(qiáng)化學(xué)習(xí)只能算是這個(gè)蛋糕上的一個(gè)小櫻桃,有監(jiān)督學(xué)習(xí)最多就算這個(gè)蛋糕上的那層糖霜,只有無監(jiān)督學(xué)習(xí)才是這塊蛋糕的本質(zhì),才是我們真正想要的
  • 而現(xiàn)在也確實(shí)是這樣,不光是在自然語言處理里很多我們耳熟能詳?shù)拇竽P投际怯米员O(jiān)督的預(yù)訓(xùn)練得到的,那么在視覺里也快了





1、標(biāo)題 + 作者


Momentum Contrast for Unsupervised Visual Representation Learning


MoCo的名字來源于前兩個(gè)單詞的前兩個(gè)字母


用動(dòng)量對(duì)比的方法去做無監(jiān)督的表征學(xué)習(xí)

  • 動(dòng)量從數(shù)學(xué)上可以理解成一種加權(quán)移動(dòng)平均:
  • yt = m * y( t - 1 )+( 1 - m )* xt
  • m就是動(dòng)量的超參數(shù)
  • y( t - 1 )是上一個(gè)時(shí)刻的輸出
  • yt是這一時(shí)刻想要改變的輸出
  • xt是當(dāng)前時(shí)刻的輸入
  • 簡(jiǎn)單來說,就是不想讓當(dāng)前時(shí)刻的輸出完全依賴于當(dāng)前時(shí)刻的輸入,所以這里引入了之前的輸出,并且給了他一個(gè)權(quán)重
  • 因?yàn)檫@里動(dòng)量的超參數(shù)m是介于0和1之間的數(shù),如果m很大(趨近于1)的時(shí)候,yt的改變是非常緩慢的,因?yàn)楹竺娴?-m基本就趨近于0,也即是說不怎么依賴當(dāng)前的輸入;反過來說,如果m很小的話,那就是說當(dāng)前的輸出更多地依賴于當(dāng)前的輸入
  • MoCo利用了動(dòng)量的這種特性,從而緩慢地更新一個(gè)編碼器,讓中間學(xué)習(xí)的字典中的特征盡可能地保持一致



作者團(tuán)隊(duì)來自FAIR,他們5個(gè)人在google scholar上的引用加起來已經(jīng)超過50萬了,在各個(gè)視覺會(huì)議上也是拿獎(jiǎng)拿到手軟





2、摘要


本文提出了MoCo去做無監(jiān)督的表征學(xué)習(xí),雖然是基于對(duì)比學(xué)習(xí)的,但是本文是從另外一個(gè)角度來看對(duì)比學(xué)習(xí),也就是說把對(duì)比學(xué)習(xí)看作是一個(gè)字典查詢的任務(wù)


具體來說,就是做一個(gè)動(dòng)態(tài)的字典,這個(gè)動(dòng)態(tài)的字典由兩個(gè)部分組成

  • 第一個(gè)部分是一個(gè)隊(duì)列,因?yàn)殛?duì)列中的樣本不需要做梯度回傳,所以就可以往隊(duì)列中放很多負(fù)樣本,從而使得這個(gè)字典變得很大
  • 第二個(gè)部分是一個(gè)移動(dòng)平均的編碼器,使用這個(gè)移動(dòng)平均的編碼器的目的是想讓字典中的特征盡量的保持一致。作者發(fā)現(xiàn)在訓(xùn)練的過程中,如果能有一個(gè)很大而且比較一致的字典,會(huì)對(duì)無監(jiān)督的對(duì)比學(xué)習(xí)非常有好處


這篇論文主要的亮點(diǎn)在于它的結(jié)果,所以剩下大篇幅的摘要留給了結(jié)果:

分類:

  • 在ImageNet數(shù)據(jù)集上,如果使用大家普遍采用的linear protocol去做測(cè)試的話,MoCo能夠取得跟之前最好的無監(jiān)督學(xué)習(xí)方式差不多或者更好一點(diǎn)的結(jié)果
  • linear protocol:如果先預(yù)訓(xùn)練好一個(gè)骨干網(wǎng)絡(luò),當(dāng)把它用到不同的數(shù)據(jù)集上的時(shí)候,將它的骨干網(wǎng)絡(luò)凍?。╞ackbone freeze),然后只去學(xué)習(xí)最后的那個(gè)全連接層,也就是分類頭,這樣就相當(dāng)于把提前訓(xùn)練好的預(yù)訓(xùn)練模型當(dāng)成了一個(gè)特征提取器,只用它來抽取特征,這樣就可以間接證明之前預(yù)訓(xùn)練好的那個(gè)模型的特征到底好不好

更重要的是MoCo學(xué)習(xí)到的特征能夠很好地遷移到下游的任務(wù),這才是整篇文章的精髓

  • 之所以想做大規(guī)模的無監(jiān)督預(yù)訓(xùn)練,就是想去學(xué)到一個(gè)很好的特征,然后這個(gè)特征擁有很好的遷移性,就可以在沒有那么多標(biāo)注數(shù)據(jù)的下游任務(wù)里獲得很好的結(jié)果


MoCo作為一個(gè)無監(jiān)督的預(yù)訓(xùn)練模型,能夠在7個(gè)下游任務(wù)(分割、檢測(cè)等)上,而且比如說在VOC、COCO這些數(shù)據(jù)集上超越之前的有監(jiān)督的預(yù)訓(xùn)練模型,有時(shí)候甚至是大幅度超越

  • 這里的counterpart是說模型使用的是一樣的,比如說都是Res50,只是訓(xùn)練的方式不一樣,一個(gè)是用有監(jiān)督的帶標(biāo)簽的數(shù)據(jù)去訓(xùn)練,一個(gè)是用無監(jiān)督不帶標(biāo)簽的數(shù)據(jù)去訓(xùn)練



最后作者總結(jié)說,這就意味著對(duì)于很多視覺任務(wù)來說,無監(jiān)督和有監(jiān)督的表征學(xué)習(xí)中間的鴻溝已經(jīng)填上了

  • 之前雖然有一些無監(jiān)督的工作能夠在某個(gè)數(shù)據(jù)集或者是某個(gè)任務(wù)上能夠比它對(duì)應(yīng)的有監(jiān)督預(yù)訓(xùn)練模型好一點(diǎn),但是MoCo是第一個(gè)能夠在這么多主流視覺任務(wù)上,全面地讓無監(jiān)督訓(xùn)練的模型比有監(jiān)督訓(xùn)練的模型表現(xiàn)要好





3、引言


見《MoCo----引言》





4、結(jié)論


MoCo的最后一部分不光是結(jié)論,主要的內(nèi)容都圍繞在了討論上面,結(jié)論其實(shí)就是一句話,MoCo在一系列的方法和數(shù)據(jù)集上都取得了比較好的效果


接下來就是討論了兩個(gè)比較有趣的問題


1、通過實(shí)驗(yàn),作者發(fā)現(xiàn)當(dāng)預(yù)訓(xùn)練的數(shù)據(jù)集從ImageNet換到Instagram的時(shí)候,提升雖然是有的,但是都相對(duì)來說比較小,只有零點(diǎn)幾個(gè)點(diǎn)或者一個(gè)點(diǎn),但是數(shù)據(jù)集是從一百萬增加到10億了,擴(kuò)大了一千倍,這樣的提升著實(shí)是有點(diǎn)小,所以作者覺得是因?yàn)榇笠?guī)模的數(shù)據(jù)集沒有被很好地利用起來,可能一個(gè)更好的代理任務(wù)有可能解決這個(gè)問題


2、除了這個(gè)簡(jiǎn)單的個(gè)體判別任務(wù),有沒有可能把MoCo和另外一個(gè)代理任務(wù)(Masked auto-encoding)結(jié)合起來用,就像NLP中的BERT一樣,用masked language modeling完形填空去自監(jiān)督地訓(xùn)練模型(MAE)


最后作者希望MoCo能夠?qū)ζ渌切┦褂脤?duì)比學(xué)習(xí)的代理任務(wù)有幫助,之所以強(qiáng)調(diào)對(duì)比學(xué)習(xí)是因?yàn)镸oCo設(shè)計(jì)的初衷就是去構(gòu)造一個(gè)大的字典,從而讓正負(fù)樣本能夠更有效地進(jìn)行對(duì)比,提供一個(gè)穩(wěn)定地自監(jiān)督信號(hào),最后去訓(xùn)練模型





5、相關(guān)工作


見《MoCo----相關(guān)工作》





6、MoCo方法


之前的對(duì)比學(xué)習(xí)以及最新的一些效果比較好的變體,它們都可以想象成是訓(xùn)練一個(gè)編碼器,從而去做一個(gè)字典查找的任務(wù)


假設(shè)有一個(gè)編碼好的query q,也就是特征,還有一系列已經(jīng)編碼好的樣本,也就是k0、k1、k2等,這些可以看作是字典中的那些key

  • 這里做了一個(gè)假設(shè):在這個(gè)字典中只有一個(gè)key是跟query是配對(duì)的,也就是說它們兩個(gè)互為正樣本對(duì),這個(gè)key叫做key positive
  • 之所以有這個(gè)假設(shè),前面在講個(gè)體判別任務(wù)的時(shí)候也提到過,這個(gè)代理任務(wù)就是從一個(gè)圖片經(jīng)過兩種變換得到兩種圖片,其中一個(gè)作為基準(zhǔn)圖片,另外一個(gè)作為正樣本,所以就是只有一個(gè)正樣本對(duì)。當(dāng)然理論上是可以使用多個(gè)正樣本對(duì),之后也有工作證明使用多個(gè)正樣本對(duì)有可能會(huì)提升任務(wù)的性能

一旦定義好了正樣本和負(fù)樣本,接下來就需要一個(gè)對(duì)比學(xué)習(xí)的目標(biāo)函數(shù),這個(gè)對(duì)比學(xué)習(xí)的目標(biāo)函數(shù)最好能滿足以下要求

  • 當(dāng)query q和唯一的正樣本k plus相似的時(shí)候,它的loss值應(yīng)該比較低
  • 當(dāng)query q和其他所有的key都不相似的時(shí)候,這個(gè)loss的值也應(yīng)該比較低

這個(gè)也是訓(xùn)練模型的目標(biāo),如果已經(jīng)能夠達(dá)到這么一種狀態(tài),就說明模型差不多訓(xùn)練好了,當(dāng)然希望目標(biāo)函數(shù)的loss值盡可能的低,就不要再去更新模型了;反之,如果q和正樣本key plus不相似,或者說query q和本來應(yīng)該是負(fù)樣本的那些key相似,那么這個(gè)目標(biāo)函數(shù)的loss值就應(yīng)該盡可能的大,從而去懲罰這個(gè)模型,讓模型加速更新它的參數(shù)



在本文中,采取了一個(gè)叫做InfoNCE的對(duì)比學(xué)習(xí)函數(shù)來訓(xùn)練整個(gè)模型

  • InfoNCE:先看下圖中右邊手寫的式子,它是softmax的操作,那如果是在有監(jiān)督學(xué)習(xí)的范式下,也就是有一個(gè)one-hot向量來當(dāng)作ground truth
  • 其實(shí)在前面加上一個(gè)-log,整個(gè)其實(shí)就是cross entry loss,也就是交叉熵目標(biāo)函數(shù),但是需要注意的是紅色圓圈圈出來的k在有監(jiān)督學(xué)習(xí)中指的是這個(gè)數(shù)據(jù)集有多少個(gè)類別(比如說ImageNet就是1000類,k就是1000,是一個(gè)固定的數(shù))
  • 回到對(duì)比學(xué)習(xí),其實(shí)對(duì)比學(xué)習(xí)理論上來說是可以用上面這個(gè)公式去計(jì)算loss的,但是實(shí)際上行不通。如果說像大部分對(duì)比學(xué)習(xí)的工作一樣,就使用instance discrimination這個(gè)代理任務(wù)去當(dāng)自監(jiān)督信號(hào)的話,那這里的類別數(shù)k將會(huì)是一個(gè)非常巨大的數(shù)字,就拿ImageNet數(shù)據(jù)集來舉例,這里的k就不再是1000了,而是128萬,就是有多少圖片就有多少類
  • softmax在有這么多類別的時(shí)候,它其實(shí)是工作不了的,同時(shí)因?yàn)檫@里還有exponential操作,當(dāng)向量的維度是幾百萬的時(shí)候,計(jì)算復(fù)雜度是相當(dāng)高的,如果每個(gè)訓(xùn)練的iteration都要這樣去計(jì)算loss,那么訓(xùn)練的時(shí)間將會(huì)大大延長(zhǎng)

所以就有了NCE loss(noise contrastive estimation的縮寫),之前因?yàn)轭悇e太多所以沒辦法計(jì)算softmax,從而沒辦法計(jì)算目標(biāo)函數(shù),NCE的做法是:將這么多的類簡(jiǎn)化成一個(gè)二分類問題,現(xiàn)在只有兩個(gè)類別了

  • 一個(gè)是數(shù)據(jù)類別data sample
  • 一個(gè)是噪聲類別noisy sample

那么每次只需要拿數(shù)據(jù)樣本和噪聲樣本做對(duì)比就可以了,也就是文中所說的noise contrastive。但是如果還是將整個(gè)數(shù)據(jù)集剩下的圖片都當(dāng)做負(fù)樣本,那么其實(shí)noise contrastive estimatation解決了類別多的問題,但是計(jì)算復(fù)雜度還是沒有降下來,那么該如何讓loss計(jì)算的更快一點(diǎn)呢?沒有別的辦法,只有取近似了

  • 意思就是說,與其在整個(gè)數(shù)據(jù)集上算loss,不如就從這個(gè)數(shù)據(jù)集中選一些負(fù)樣本來算loss就可以了,這也是這里estimation的含義,它只是估計(jì)、近似
  • 但是按照一般的規(guī)律,如果選取的樣本很少,就沒有那么近似了,結(jié)果自然就會(huì)比較差。選的樣本越多,自然就跟使用整個(gè)數(shù)據(jù)集的圖片的結(jié)果更加近似,效果自然也會(huì)更好,所以這也是MoCo一直強(qiáng)調(diào)的希望字典足夠大,因?yàn)樵酱蟮淖值?,越能夠提供更好的近?/li>

總的來說,NCE這個(gè)loss就是把一個(gè)超級(jí)多類分類的問題變成了一系列的二分類的問題,從而讓大家還是可以使用softmax操作


這里說的InfoNCE其實(shí)就是NCE的一個(gè)簡(jiǎn)單的變體,作者認(rèn)為如果只把問題看作是一個(gè)二分類(只有數(shù)據(jù)樣本和噪聲樣本)的話,可能對(duì)模型學(xué)習(xí)不是很友好,畢竟在那么多的噪聲樣本中,大家很有可能不是一個(gè)類,所以還是把它看成一個(gè)多分類的問題比較合理,于是NCE就變成了InfoNCE,公式如下圖所示

  • 公式中的q * k,其實(shí)就相當(dāng)于是logit,也可以類比為上面softmax中的z,也是模型出來的logit
  • 公式中的τ是一個(gè)溫度的超參數(shù),這個(gè)溫度一般是用來控制分布的形狀的,τ的值越大,1/τ就越小,就相當(dāng)于將分布中的數(shù)值都變小了,尤其是經(jīng)過exponential之后就變得更小了,最后就會(huì)導(dǎo)致這個(gè)分布變得更平滑;相反,如果τ取得值越小,也就是1/τ越大,那么分布里的值也就相應(yīng)的變大,經(jīng)過exponential之后,原來大的值變得更大了,就使得這個(gè)分布更集中,也就變得更加peak了。
  • 所以說溫度這個(gè)超參數(shù)的選擇也是很有講究的,如果溫度設(shè)的越大,那么對(duì)比損失對(duì)所有的負(fù)樣本都一視同仁,導(dǎo)致學(xué)習(xí)的模型沒有輕重;如果溫度的值設(shè)的過小,又會(huì)讓模型只關(guān)注那些特別困難的樣本,其實(shí)那些負(fù)樣本很有可能是潛在的正樣本,如果模型過度地關(guān)注這些特別困難的負(fù)樣本,會(huì)導(dǎo)致模型很難收斂,或者學(xué)好的特征不好去泛化。
  • 但是溫度這個(gè)超參數(shù)終究只是一個(gè)標(biāo)量,如果忽略掉它,就會(huì)發(fā)現(xiàn),其實(shí)這個(gè)InfoNCE loss就是cross entropy loss,唯一的區(qū)別就在于在cross entropy loss中k指代的是數(shù)據(jù)集里類別的多少,但是在對(duì)比學(xué)習(xí)的InfoNCE loss中,k指的是負(fù)樣本的數(shù)量
  • 公式下面分母中的求和其實(shí)是在一個(gè)正樣本和k個(gè)負(fù)樣本上做的,因?yàn)槭菑?到k,所以是k+1個(gè)樣本,也就指的是字典里所有的key
  • 如果直觀地想一下,InfoNCE loss就是一個(gè)cross entropy loss,它做的就是一個(gè)k+1類的分類任務(wù),它的目的就是想把q這個(gè)圖片分成k plus這個(gè)類。所以到這里可以發(fā)現(xiàn),InfoNCE也不是那么難理解,和之前常用的cross entropy loss是有很大聯(lián)系的
  • 如果直接跳到后面MoCo的偽代碼的話,也會(huì)發(fā)現(xiàn)MoCo這個(gè)loss的實(shí)現(xiàn)就是基于cross entropy loss實(shí)現(xiàn)的



既然已經(jīng)有了這個(gè)代理任務(wù)提供的正負(fù)樣本,也有了可以用來訓(xùn)練模型的目標(biāo)函數(shù)輸入和模型大概是什么?(這里作者還是從一個(gè)自頂向下的方式去寫的)


普遍來說,query q是一個(gè)輸入xq通過一個(gè)編碼器fq得到的,同理所有的k的表示也都是key的輸入通過了一個(gè)key的編碼器,輸入和模型具體的實(shí)現(xiàn)是由具體的代理任務(wù)決定

  • 在代理任務(wù)不一樣的時(shí)候,輸入xq和xk既可以是圖片,也可以是圖片塊,或者是含有上下文的一系列的圖片塊

對(duì)于模型,query的編碼器和key的編碼器既可以是相等的(就是說模型的架構(gòu)一樣,參數(shù)也是完全共享的),或者說它們的參數(shù)是部分共享的,也可以是徹底不一樣的兩個(gè)網(wǎng)絡(luò)



(整個(gè)論文,每一段和每一段之間最好都有承上啟下的段落,每當(dāng)開始講一個(gè)新的東西的時(shí)候最好先講一下為什么需要它,一旦有了這個(gè)承上啟下的段落,也就是因?yàn)樗缘倪壿嬯P(guān)系之后,論文讀起來就會(huì)更加順暢。否則論文上來每一段都是直接講方法的話,很容易讓人看得一頭霧水,無論自己覺得寫的有多清晰,讀者可能從一開始就沒明白為什么要這么做)



作者說從以上角度,對(duì)比學(xué)習(xí)是一種在高維的連續(xù)的輸入信號(hào)上去構(gòu)建字典的一種方式

  • 這里的高維和連續(xù)其實(shí)指的就是圖片

這個(gè)字典是動(dòng)態(tài)的

  • 之所以是動(dòng)態(tài)的是因?yàn)檫@個(gè)字典中的key都是隨機(jī)取樣的,而且給這些key做編碼的編碼器在訓(xùn)練的過程中也是在不停的改變
  • 這和之前所講的無論是在有監(jiān)督還是無監(jiān)督的方法都不太一樣,因?yàn)橹暗哪切┕ぷ髯詈髮W(xué)習(xí)的target都是一個(gè)固定的目標(biāo),所以作者認(rèn)為,如果想學(xué)一個(gè)好的特征,這個(gè)字典就必須擁有兩個(gè)特性(大,大的字典能夠包含很多語義豐富的負(fù)樣本,從而有助于學(xué)到更有判別性的特征;一致性主要是為了模型的訓(xùn)練,能夠便面學(xué)到一些trivial solution,也就是一些捷徑解)

所以基于以上的研究動(dòng)機(jī),作者就提出了momentum contrast



文章的第一個(gè)貢獻(xiàn):如何把一個(gè)字典看成隊(duì)列

作者說,方法的核心其實(shí)就是把一個(gè)字典用隊(duì)列的形式表現(xiàn)出來

  • 隊(duì)列其實(shí)就是一種數(shù)據(jù)結(jié)構(gòu),如果有一個(gè)隊(duì)列,里面有很多元素,假如新來的元素從下面進(jìn)來,為了維持這個(gè)隊(duì)列的大小,最老的數(shù)據(jù)會(huì)從隊(duì)列中出去,所以說隊(duì)列一般被稱作是一個(gè)fifo(first in first out,先進(jìn)先出)的數(shù)據(jù)結(jié)構(gòu)
  • 作者在這里是用一個(gè)隊(duì)列去代表一個(gè)字典,也就是說整個(gè)的隊(duì)列就是一個(gè)字典,里面的元素就是放進(jìn)去的key
  • 在模型訓(xùn)練的過程中,每一個(gè)mini-batch就會(huì)有新的一批key被送進(jìn)來,同時(shí)也會(huì)有一批老的key移出去,所以用隊(duì)列的好處是可以重復(fù)使用那些已經(jīng)編碼好的key,而這些key是從之前的那些mini-batch中得到的,比如說隊(duì)尾指的是當(dāng)前mini-batch送進(jìn)來的新key,那么緊挨著它上面的那些key就是在它之前的那些mini-batch編碼好送進(jìn)來的
  • 這樣使用了隊(duì)列之后,就可以把字典的大小和mini-batch的大小徹底剝離開了,就可以在模型的訓(xùn)練過程中使用一個(gè)比較標(biāo)準(zhǔn)的mini-batch size,一般是128或者是256,但是字典的大小可以變得非常大,它的大小非常靈活,而且可以當(dāng)作一個(gè)超參數(shù)一樣單獨(dú)設(shè)置

這個(gè)字典一直都是所有數(shù)據(jù)的一個(gè)子集

  • 在算對(duì)比學(xué)習(xí)目標(biāo)函數(shù)的時(shí)候只是取一個(gè)近似,而不是在整個(gè)數(shù)據(jù)集上算loss

使用隊(duì)列的數(shù)據(jù)結(jié)構(gòu),可以讓維護(hù)這個(gè)字典的計(jì)算開銷非常小

  • 事實(shí)也是如此,如果把字典的大小從幾百變到幾千或者上萬,整體的訓(xùn)練時(shí)間基本是不變的

最后作者又強(qiáng)調(diào)了為什么要使用隊(duì)列這個(gè)數(shù)據(jù)結(jié)構(gòu):因?yàn)殛?duì)列有先進(jìn)先出的特性,這樣每次移出隊(duì)列的都是最老的那些mini-batch,也就是最早計(jì)算的那些mini-batch,這樣對(duì)于對(duì)比學(xué)習(xí)來說是很有利的,因?yàn)閺囊恢滦缘慕嵌葋碚f,最早計(jì)算的那些mini-batch的key是最過時(shí)的,也就是說跟最新的這個(gè)mini-batch算的key是最不一致的



文章的第二個(gè)貢獻(xiàn):如何使用動(dòng)量的思想去更新編碼器


用隊(duì)列的形式當(dāng)然可以使這個(gè)字典變得更大,但是也因?yàn)槭褂昧朔浅4蟮淖值?,也就是非常長(zhǎng)的隊(duì)列,就導(dǎo)致沒辦法給隊(duì)列中所有的元素進(jìn)行梯度回傳了,也就是說,key的編碼器無法通過反向傳播的方式去更新它的參數(shù)

  • 如果想更新這個(gè)key的編碼器,其實(shí)有一個(gè)非常簡(jiǎn)單的方法:就是每個(gè)訓(xùn)練iteration結(jié)束之后,將更新好的編碼器參數(shù)fq直接復(fù)制過來給key的編碼器fk就可以了
  • 這個(gè)想法簡(jiǎn)單確實(shí)是簡(jiǎn)單,但是作者緊接著說這種方式的結(jié)果并不好,原因是一個(gè)快速改變的編碼器降低了這個(gè)隊(duì)列中所有key的特征的一致性
  • 假如現(xiàn)在有一個(gè)隊(duì)列如上圖所示,新的元素從左邊進(jìn)來,舊的元素從右邊出去,假設(shè)mini-batch size就是1,也就是說每次只更新一個(gè)key,k1、k2等這些所有的key都是由不同的編碼器產(chǎn)生的,這樣的話這些快速改變的編碼器就會(huì)降低所有key之間的一致性

所以作者提出了動(dòng)量更新的方式來解決這個(gè)問題

  • 如果將key編碼器fk參數(shù)設(shè)為θk,query編碼器的參數(shù)fq設(shè)為θq,那θk就是以以下公式所示的動(dòng)量改變方式進(jìn)行更新的
  • 上式中m是動(dòng)量參數(shù),它是一個(gè)0到1之間的數(shù)
  • θq,也就是query編碼器,是通過梯度反向回傳來更新它的模型參數(shù)的
  • θk除了剛開始是用θq初始化以外,后面的更新大部分主要是靠自己,因?yàn)槿绻麆?dòng)量參數(shù)m設(shè)的很大,那么θk更新就非常緩慢,所以作者接下來說,因?yàn)槭褂昧诉@種動(dòng)量更新的方式,隨意雖然在隊(duì)列里的key都是由不同的編碼器產(chǎn)生得到的,但是因?yàn)檫@些編碼器之間的區(qū)別極小,所以產(chǎn)生的key的一致性都很強(qiáng)
  • 為了強(qiáng)調(diào)這一觀點(diǎn),作者說,他們?cè)趯?shí)驗(yàn)中使用了一個(gè)相對(duì)比較大的動(dòng)量0.999,意思就是每次θk更新的時(shí)候,99.9%都是來自原來的編碼器參數(shù),只有0.1%是從更新好的θq中借鑒過來的,自然而然的,θk的更新就非常緩慢了
  • 作者還做了對(duì)比實(shí)驗(yàn),當(dāng)他把這個(gè)動(dòng)量變小一點(diǎn),變成0.9的時(shí)候(其實(shí)0.9也不算小了),作者說使用一個(gè)相對(duì)較大的動(dòng)量0.999比0.9效果要好得多,所以就意味著,如果想充分利用好隊(duì)列,一個(gè)緩慢更新的key編碼器是至關(guān)重要的,因?yàn)樗梢员WC這個(gè)隊(duì)列里所有的key是相對(duì)一致的



到這里,其實(shí)MoCo的主要貢獻(xiàn)舊已經(jīng)講完了,但是如果對(duì)對(duì)比學(xué)習(xí)不是很熟的人來說可能還是不太理解MoCo的前向過程到底是什么樣子的,可惜的是這篇論文并沒有提供一個(gè)很直觀、形象的模型總覽圖,取而代之的是偽代碼,寫得相當(dāng)簡(jiǎn)潔明了,理解和復(fù)現(xiàn)都比較容易


作者在引言中提到過,之前的那些對(duì)比學(xué)習(xí)方法都可以看作是字典查找,但是它們都或多或少受限于字典的大小和字典的一致性的問題,這里作者將之前的方法總結(jié)了一下,歸納成了兩種架構(gòu)

1、第一種就是比較直接的端到端學(xué)習(xí)的方式

  • 端到端學(xué)習(xí),顧名思義就是編碼器都是可以通過梯度回傳來更新模型參數(shù)的
  • 下圖的標(biāo)題中也寫道編碼器q和k可以是不同的網(wǎng)絡(luò),但是之前很多工作都用的是同樣的網(wǎng)絡(luò),為了簡(jiǎn)單起見,MoCo實(shí)驗(yàn)中編碼器q和k是同一個(gè)模型,也就是一個(gè)Res50
  • 這里為什么可以使用同一個(gè)模型?因?yàn)槟P偷恼?fù)樣本都是從同一個(gè)mini-batch里來的,也就是xq和xk都是從同一個(gè)batch中來的,它做一次forward就能得到所有樣本的特征,而且這些樣本是高度一致的,因?yàn)槎际莵碜砸粋€(gè)編碼器
  • 聽起來確實(shí)很美好,編碼器都能用反向回傳學(xué)習(xí)了,特征也高度一致了,但是它的局限性就在于字典的大小,因?yàn)樵诙说蕉说膶W(xué)習(xí)框架中,字典的大小和mini-batch size的大小是等價(jià)的,如果想要一個(gè)很大的字典,里面有成千上萬個(gè)key的話,也就意味著mini-batch size的大小必須也是成千上萬的,這個(gè)難度就比較高了。因?yàn)楝F(xiàn)在的GPU是塞不下這么大的batch-size的,而且就算有內(nèi)存夠大的硬件,能塞下這么大的batch-size,但是大的batch-size的優(yōu)化也是一個(gè)難點(diǎn),如果處理不得當(dāng),模型是很難收斂的
  • 所以作者說這種端到端學(xué)習(xí)的方式受限于字典的大小,之所以選擇讀MoCo這篇論文而不是SimCLR,是因?yàn)镾imCLR就是這種端到端的學(xué)習(xí)方式,它還用了更多的數(shù)據(jù)增強(qiáng),而且提出了在編碼器之后再用一個(gè)projector,會(huì)讓學(xué)到的特征大大變好,但是總體來說SimCLR就是端到端的學(xué)習(xí)方式,之所以這么做,是因?yàn)間oogle有TPU,TPU內(nèi)存大,所以可以無腦上batch-size,SimCLR中選用了8192當(dāng)作batch-size,這樣最后就會(huì)有10000多個(gè)負(fù)樣本,這個(gè)負(fù)樣本的規(guī)模就足夠?qū)Ρ葘W(xué)習(xí)了,所以SimCLR就可以用這么簡(jiǎn)單的方式直接去做端到端的學(xué)習(xí)
  • 端到端學(xué)習(xí)的優(yōu)點(diǎn)在于編碼器是可以實(shí)時(shí)更新的,所以導(dǎo)致它字典里的那些key的一致性是非常高的,但是它的缺點(diǎn)在于因?yàn)樗淖值浯笮。ň褪莃atch-size的大小),導(dǎo)致這個(gè)字典不能設(shè)置的過大,否則硬件內(nèi)存吃不消


2、memory bank(更關(guān)注字典的大小,而犧牲一些一致性)

  • 在memory bank中其實(shí)就只有一個(gè)編碼,也就是query的編碼器是可以通過梯度回傳來進(jìn)行更新學(xué)習(xí)的
  • 但是對(duì)于字典中的key是沒有一個(gè)單獨(dú)的編碼器的
  • memory bank把整個(gè)數(shù)據(jù)集的特征都存到了一起,對(duì)于ImageNet來說,memory bank中就有128萬個(gè)特征(看上去好像很大,但是memory bank的作者在論文中說,因?yàn)槊恳粋€(gè)特征只有128維,所以即使整個(gè)memory bank中有128萬個(gè)key,最后也只需要600M的空間就能把所有的這些key存下來了,即使是對(duì)整個(gè)數(shù)據(jù)集的特征做一遍最近鄰查詢,在泰坦XGPU上也只需要20毫秒,所以是非常高效的)
  • 一旦有了這個(gè)memory bank,在每次模型做訓(xùn)練的時(shí)候,只需要從memory bank中隨機(jī)抽樣很多的key出來當(dāng)作字典就可以了,就相當(dāng)于下圖中紅色圓圈圈出來的整個(gè)右邊的那些操作都是在線下執(zhí)行的,所以完全不用擔(dān)心硬件內(nèi)存的問題,也就是字典可以抽樣抽的很大,但是有得必有舍,memory bank的做法在特征一致性上就處理的不是很好
  • 假如說有一個(gè)memory bank如下圖所示,里面有128萬個(gè)key,它在訓(xùn)練的時(shí)候是隨機(jī)抽樣很多樣本出來當(dāng)作字典,這里為了方便講解,將它簡(jiǎn)化為順序抽樣而且字典的大小就是3,也就是說當(dāng)在做對(duì)比學(xué)習(xí)的時(shí)候,當(dāng)前用的mini-batch可以先把k1、k2、k3這三個(gè)key抽出來當(dāng)作負(fù)樣本,然后去和query計(jì)算loss
  • 算完這個(gè)loss,回傳的梯度更新了左邊的編碼器encoder之后,memory bank的做法就是會(huì)用新的編碼器在原來對(duì)應(yīng)的位置上,也就是k1、k2、k3的位置上的那些樣本去生成新的特征,也就是下圖中藍(lán)色的新的k1、k2、k3,然后把新的key放回到memory bank中就把memory bank更新了
  • 依此類推,下一次假如是將4、5、6這三個(gè)key抽出來做一次模型更新,然后再把新的key4、5、6放回去,那么4、5、6也就被更新了
  • 這里也就有一個(gè)問題:因?yàn)檫@里的特征都是在不同時(shí)刻的編碼器得到的,而且這些編碼器都是通過梯度回傳來進(jìn)行快速更新的,這也就意味著這里得到的特征都缺乏一致性
  • 而且memory bank還有另外一個(gè)問題,因?yàn)閙emory bank中存儲(chǔ)了所有的圖片,也就意味著模型訓(xùn)練了整整一個(gè)epoch才能把整個(gè)memory bank更新一遍,那也就意味著,當(dāng)開始下一個(gè)epoch訓(xùn)練的時(shí)候,假如選了三個(gè)key,那這三個(gè)key的特征都是上一個(gè)epoch不知道哪個(gè)時(shí)間點(diǎn)算出來的特征了,這也就導(dǎo)致query的特征和key的特征差的特別遠(yuǎn)
  • 所以總結(jié)一下,就是memory bank的做法就是犧牲了特征的一致性,從而獲得了可以構(gòu)造很大的字典的特權(quán)


顯然,無論是端到端的學(xué)習(xí)還是memory bank的方法,都和作者說的一樣,受限于字典大小和特征一致性這兩方面中的至少一個(gè),所以為了解決之前這兩種做法的局限性,作者就提出了MoCo

  • MoCo采用隊(duì)列的形式去實(shí)現(xiàn)字典,從而使得它不像端到端的學(xué)習(xí)一樣受限于batch-size的大小
  • 同時(shí)為了提高字典中特征的一致性,MoCo使用了動(dòng)量編碼器
  • 其實(shí)從整體上來看,MoCo跟Memory bank的方法是更加接近的,它們都只有一個(gè)編碼器(query的編碼器,它是通過梯度回傳來更新模型參數(shù)的),它們的字典都是采取了額外的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)從而和batch-size剝離開了,memory bank中使用了memory bank,而MoCo中使用了隊(duì)列
  • memory bank這篇論文(文獻(xiàn)61)也意識(shí)到了特征不一致性所帶來的壞處了,所以作者當(dāng)時(shí)還加了另外一個(gè)loss(proximal optimization),目的就是為了讓訓(xùn)練變得更加平滑,這其實(shí)和MoCo中的動(dòng)量更新是有異曲同工之效的
  • MoCo的作者也提到memory bank這篇論文中也提到了動(dòng)量更新,只不過它的動(dòng)量更新的是特征,而MoCo中動(dòng)量更新的是編碼器,而且MoCo的作者還補(bǔ)充說MoCo的擴(kuò)展性很好,他可以在上億級(jí)別的圖像庫(kù)上進(jìn)行訓(xùn)練
  • 但是對(duì)于特別大的數(shù)據(jù)集memory bank的方法就捉襟見肘了,因?yàn)樗枰獙⑺械奶卣鞫即娴揭粋€(gè)memory bank中,對(duì)于ImageNet這種百萬規(guī)模的數(shù)據(jù)集來說,存下的特征只需要600兆的空間,但是對(duì)于一個(gè)擁有億級(jí)圖片規(guī)模的數(shù)據(jù),存儲(chǔ)所有的特征就需要幾十G甚至上百G的內(nèi)存了,所以memory bank的擴(kuò)展性不如MoCo好


總之,MoCo既簡(jiǎn)單又高效,而且擴(kuò)展性還好,它能同時(shí)提供一個(gè)又大而且又一致的字典,從而進(jìn)行對(duì)比學(xué)習(xí)



代理任務(wù)


作者為了簡(jiǎn)單起見,使用了個(gè)體判別的任務(wù),個(gè)體判別任務(wù)的定義如下圖所示



MoCo論文中的小trick:Shuffling BN


(這個(gè)操作在接下來很多論文里,甚至包括作者團(tuán)隊(duì)接下來的工作,比如SimSiam也沒有再用Shuffling NB這個(gè)操作了)


因?yàn)橛昧薆N以后,很有可能造成當(dāng)前batch里的樣本中間的信息的泄露,因?yàn)锽N要計(jì)算這些樣本的running mean和running variance,也就是說,它能通過這些泄露信息很容易地找到正樣本,而不需要真正地去學(xué)一個(gè)好的模型(也就是作者所說的模型會(huì)走一條捷徑)


如何解決這個(gè)問題?

因?yàn)锽N這個(gè)操作大部分時(shí)候都是在當(dāng)前GPU上計(jì)算的,所以作者在做多卡訓(xùn)練之前,先把樣本的順序打亂再送到所有的GPU上去,算完了特征之后再回復(fù)順序去算最后的loss,這樣的話對(duì)loss是沒有任何影響的,但是每個(gè)GPU上的BN計(jì)算就不一樣了,就不會(huì)再存在信息泄露的問題了


類似的BN操作還在后續(xù)BYOL那篇論文中引起了一段很有意思的烏龍事件,總之,BN操作讓人又愛又恨,用的好威力無窮,但是90%的情況都是屬于用的不好的,會(huì)帶來各種莫名其妙的問題,而且很難去debug,所以現(xiàn)在換成transformer也好,這樣直接就用layer norm,就能暫時(shí)不用理會(huì)BN了





7、實(shí)驗(yàn)


數(shù)據(jù)集的使用


  • 在做無監(jiān)督的預(yù)訓(xùn)練的時(shí)候,使用了標(biāo)準(zhǔn)的ImageNet數(shù)據(jù)集
  • 為了驗(yàn)證MoCo的擴(kuò)展性好,還使用了facebook自己的Instagram 1Billion的數(shù)據(jù)集
  • ImageNet一般都叫做ImageNet 1k,因?yàn)樗?000個(gè)類別,但是作者這里叫ImageNet 1 million,在MoCo的論文中使用的是個(gè)體判別的任務(wù),所以類別數(shù)不再是1000,而是整個(gè)數(shù)據(jù)集圖片的數(shù)量,也就是1 million
  • Instagram這個(gè)數(shù)據(jù)集作者在之前的引言中也提到過?,他和ImageNet有一些不一樣的特性:它展示了真實(shí)的世界中數(shù)據(jù)的分布(長(zhǎng)尾的、不均衡的);同時(shí)他的圖片既有那種只有一兩個(gè)物體的,也有有很多物體或者是場(chǎng)景層面的圖片


訓(xùn)練的情況


  • 因?yàn)檫€是CNN時(shí)代,所以還是使用的SGD當(dāng)成優(yōu)化器
  • 對(duì)于ImageNet數(shù)據(jù)集來說,作者用的是標(biāo)準(zhǔn)的batch-size 256在一臺(tái)8卡機(jī)上進(jìn)行訓(xùn)練
  • 如果是使用Res50網(wǎng)絡(luò)結(jié)構(gòu)的話,訓(xùn)練200個(gè)epoch大概需要53個(gè)小時(shí)
  • 相對(duì)于SimCLR、SwAV或者BYOL這些工作,MoCo不論是從硬件本身還是從訓(xùn)練時(shí)長(zhǎng)上,都已經(jīng)是最affordable的方法了,其實(shí)后面還可以了解到,MoCo或者M(jìn)oCoV2這一系列的方法,它們的泛化性能非常好,在做下游任務(wù)的時(shí)候,學(xué)到的特征依舊非常強(qiáng)大,所以看起來SimCLR的引用會(huì)比MoCo稍微高一些,但是其實(shí)真正在視覺領(lǐng)域里,大家在別的任務(wù)上使用對(duì)比學(xué)習(xí)的時(shí)候,絕大多數(shù)工作都是沿用的MoCo的這套框架


結(jié)果


作者分成了兩大部分進(jìn)行了結(jié)果的展示

1、Linear Classification Protocol:將訓(xùn)練好的模型當(dāng)作一個(gè)特征提取器

  • 在完成了無監(jiān)督學(xué)習(xí)的預(yù)訓(xùn)練之后,將模型的backbone凍住,只將它作為一個(gè)特征提取器,然后在上面訓(xùn)練一個(gè)全連接層去充當(dāng)分類頭,訓(xùn)練這個(gè)分類頭用了100個(gè)epoch
  • 結(jié)果的衡量是在ImageNet的測(cè)試集上,包括了1-crop、top-crop的準(zhǔn)確度
  • 作者做了一個(gè)grid search,然后發(fā)現(xiàn)最佳的學(xué)習(xí)率是30.這個(gè)其實(shí)是很不可思議的,因?yàn)槌嗽谏窠?jīng)網(wǎng)絡(luò)搜索(NAS)的那些工作里可能會(huì)搜到一些比較夸張的學(xué)習(xí)率之外,過去幾十年里用神經(jīng)網(wǎng)絡(luò)的工作,都沒有用超過1的學(xué)習(xí)率,因?yàn)橐呀?jīng)預(yù)訓(xùn)練好了一個(gè)網(wǎng)絡(luò),所以只需要做微調(diào)就可以了,所以學(xué)習(xí)率最大可能也就是設(shè)個(gè)0.1,然后0.01、0.001這樣往下降,很少有人會(huì)設(shè)一個(gè)比1大的學(xué)習(xí)率,但是在這里竟然是30.所以說做無監(jiān)督學(xué)習(xí)或者說是做對(duì)比學(xué)習(xí)可以看一下學(xué)習(xí)率,如果結(jié)果不好,很有可能是學(xué)習(xí)率沒有設(shè)置對(duì)
  • 基于這個(gè)現(xiàn)象,作者也做了總結(jié),這個(gè)學(xué)習(xí)率確實(shí)比較詭異,它暗示了這種無監(jiān)督對(duì)比學(xué)習(xí)學(xué)到的特征分布跟有監(jiān)督學(xué)習(xí)學(xué)到的特征的分布是非常不同的



第一個(gè)消融實(shí)驗(yàn)

  • 這個(gè)消融實(shí)驗(yàn)主要是用來對(duì)比三種對(duì)比學(xué)習(xí)的流派:端到端學(xué)習(xí)、memory bank和本文提到的MoCo
  • 橫坐標(biāo)用k表示,指的是用了多少個(gè)負(fù)樣本,也可以粗略地理解為字典的大小
  • 縱坐標(biāo)指的是在ImageNet數(shù)據(jù)集上的top one的準(zhǔn)確率,也就是Linear Classification Protocol下的準(zhǔn)確率
  • 黑色的線表示的是端到端的學(xué)習(xí),它的結(jié)果只有三個(gè)點(diǎn),因?yàn)槭芟抻陲@卡內(nèi)存(用一臺(tái)8卡v100內(nèi)存32g的機(jī)器能塞下的最大的batch-size只有1024)
  • 藍(lán)色的線表示的是memory bank的形式,它可以用很大的字典,所以它可以走得很遠(yuǎn),但是它的效果整體上要比端到端學(xué)習(xí)和MoCo的結(jié)果都要差一截。作者說這是因?yàn)樘卣鞯牟灰恢滦詫?dǎo)致的
  • 橙色的線表示MoCo,MoCo確實(shí)可以有很大的字典,之所以停在65536這個(gè)數(shù)字,從圖中可以看到,從16384到65536性能也已經(jīng)比較飽和了,所以再大也可能不會(huì)帶來更多的性能提升了。如果拿MoCo和端到端學(xué)習(xí)的方法做比較,可以發(fā)現(xiàn),它們的曲線在剛開始的時(shí)候的重合度還是比較高的,但是作者說,因?yàn)闆]有實(shí)驗(yàn)的支撐,不知道黑線是否能繼續(xù)按照現(xiàn)有的趨勢(shì)繼續(xù)增長(zhǎng)下去,有可能結(jié)果會(huì)更高,也有可能結(jié)果會(huì)更低,但是因?yàn)樽霾涣藢?shí)驗(yàn),所以無從得知

所以基于圖3,MoCo是性能最好,對(duì)硬件要求最低,而且擴(kuò)展性也比較好的方法



第二個(gè)消融實(shí)驗(yàn)


這個(gè)消融實(shí)驗(yàn)是為了證實(shí)本文的第二個(gè)貢獻(xiàn),也就是動(dòng)量更新帶來的好處,如下圖所示(在寫論文的時(shí)候,如果是自己提出了有幾點(diǎn)貢獻(xiàn),那就一定得做針對(duì)這幾點(diǎn)貢獻(xiàn)的消融實(shí)驗(yàn),這樣才能證明提出的貢獻(xiàn)是有效的,否則口說無憑

  • 動(dòng)量使用一個(gè)相對(duì)較大的值0.999或者0.9999的時(shí)候性能是最好的,差不多都是59,這就說明了一個(gè)變化非常緩慢的編碼器是對(duì)對(duì)比學(xué)習(xí)有好處的,因?yàn)樗軌蛱峁┮粋€(gè)一致性的特征
  • 但是當(dāng)把動(dòng)量逐漸變小,變到0.99或者是0.9的時(shí)候,性能的下降就比較明顯了,尤其是當(dāng)直接去掉動(dòng)量,直接將快速更新的query編碼器拿過來當(dāng)key編碼器用的時(shí)候,就會(huì)發(fā)現(xiàn)不光是性能下降的問題,整個(gè)模型甚至都不能收斂,loss一直在震蕩,從而導(dǎo)致訓(xùn)練失敗
  • 這個(gè)table非常有力地證明了作者的論點(diǎn),就是要建立一個(gè)一致性的字典



ImageNet數(shù)據(jù)集上效果的比較


下圖中所有的方法都是在Linear Classification Protocol下面進(jìn)行的,也就是說都是把這個(gè)網(wǎng)絡(luò)當(dāng)成一個(gè)特征提取器,抽出特征再去訓(xùn)練一個(gè)全連接層當(dāng)作分類頭,最后得到結(jié)果,所有的結(jié)果都沒有更新backbone

  • 表格中上半部分都不是使用的對(duì)比學(xué)習(xí),下半部分都是使用的對(duì)比學(xué)習(xí)
  • 首先可以發(fā)現(xiàn),對(duì)比學(xué)習(xí)的效果還是不錯(cuò)的,因?yàn)槊黠@準(zhǔn)確率要比沒有使用對(duì)比學(xué)習(xí)得到得結(jié)果要好
  • 作者還強(qiáng)調(diào):在無監(jiān)督學(xué)習(xí)中,模型的大小還是非常關(guān)鍵的(模型越大,一般效果就會(huì)越好),所以只是比較最后的準(zhǔn)確度,而不去關(guān)注模型大小的話,就不太公平了,所以作者在表格中列出了所使用的網(wǎng)絡(luò)結(jié)構(gòu)以及網(wǎng)絡(luò)的模型參數(shù)大小,這樣就可以做一個(gè)相對(duì)全面而且相對(duì)公平的比較了
  • 比如只看標(biāo)準(zhǔn)的Res50,它的模型參數(shù)都是24million,MoCo要比之前的結(jié)果高兩個(gè)點(diǎn),已經(jīng)算是很大的提升了,如果不對(duì)模型架構(gòu)做限制,MoCo只用375million就已經(jīng)能達(dá)到68.6了,還是比之前的方法都要高的
  • 作者在有的準(zhǔn)確度后面加了特殊標(biāo)記,有這些特殊標(biāo)記的方法都用了fast auto augment做了數(shù)據(jù)增強(qiáng),而這個(gè)數(shù)據(jù)增強(qiáng)的策略之前是在ImageNet用有監(jiān)督的訓(xùn)練方式訓(xùn)練得到的,這就有一點(diǎn)不太公平
  • 對(duì)于CMC來說,其實(shí)是用了兩個(gè)網(wǎng)絡(luò),而不是只是一個(gè)網(wǎng)絡(luò),所它其實(shí)是47M(兩個(gè)24)
  • 但是不論是用了更好的數(shù)據(jù)增強(qiáng),還是用了兩個(gè)甚至是更多的編碼器,總而言之,MoCo既能在小模型上得到最好的效果,也能在大模型的比較中得到最好的結(jié)果



2、遷移學(xué)習(xí)的效果


文章的最后一個(gè)章節(jié),也是全文的點(diǎn)睛之筆,作者就是想驗(yàn)證一下MoCo預(yù)訓(xùn)練模型得到的特征到底在下游任務(wù)上能不能有好的遷移學(xué)習(xí)效果


無監(jiān)督學(xué)習(xí)最主要的目標(biāo)就是學(xué)習(xí)一個(gè)可以遷移的特征

  • 用ImageNet做有監(jiān)督的預(yù)訓(xùn)練,它最有用、最有影響力的時(shí)候就是在當(dāng)在下游任務(wù)上做微調(diào),可以用這個(gè)預(yù)訓(xùn)練模型做模型的初始化,從而當(dāng)下游任務(wù)只有很少的標(biāo)注數(shù)據(jù)的時(shí)候也能獲得很好的效果


作者用視覺領(lǐng)域中最常見、應(yīng)用最廣的檢測(cè)任務(wù)來做無監(jiān)督的MoCo預(yù)訓(xùn)練模型和ImageNet的有監(jiān)督預(yù)訓(xùn)練模型之間的比較


歸一化

  • 如果拿MoCo學(xué)出來的模型直接當(dāng)一個(gè)特征提取器的話,那它在做微調(diào)的時(shí)候的最佳學(xué)習(xí)率是30,也就說明MoCo學(xué)到的特征跟有監(jiān)督學(xué)到的特征的分布是非常不一樣的,但是現(xiàn)在需要拿這個(gè)特征去做下游的任務(wù),不可能在每個(gè)下游任務(wù)上都去做一遍grid search找一下它最佳的學(xué)習(xí)率是多少,這個(gè)相對(duì)來講比較麻煩,也失去了無監(jiān)督預(yù)訓(xùn)練的意義,所以作者就想,如果可以拿之前有監(jiān)督的預(yù)訓(xùn)練已經(jīng)設(shè)置好的超參數(shù)來做微調(diào)的話,既可以做公平對(duì)比,而且也不用做grid search。
  • 一般來說,當(dāng)分布不一致的時(shí)候,最常想到的方法就是歸一化,所以作者這里使用了特征歸一化的方法,具體來說就是整個(gè)模型現(xiàn)在都在微調(diào),而且尤其是BN層(作者用的是sync BN,也就是synchronized batch norm,就是將多級(jí)訓(xùn)練的所有GPU上的batch norm的統(tǒng)計(jì)量都合起來,算完running mean、running variance之后再做BN層的更新,這樣就會(huì)讓特征的規(guī)劃做的更徹底一點(diǎn),也會(huì)讓模型的訓(xùn)練更穩(wěn)定一些)。
  • 在新加的層中,比如說在做檢測(cè)的時(shí)候都會(huì)用fbn的結(jié)構(gòu),作者在這里也用了BN,目的就是去調(diào)整一下值域的大小,從而便于做特征的歸一化
  • 一旦做完歸一化之后,作者發(fā)現(xiàn)就可以拿這些有監(jiān)督訓(xùn)練用的超參數(shù)來做微調(diào)了


schedule

  • 作者之前有一篇論文(文獻(xiàn)31)發(fā)現(xiàn):當(dāng)下游任務(wù)的數(shù)據(jù)集足夠大的時(shí)候,可以不需要預(yù)訓(xùn)練,直接從隨機(jī)初始化開始從頭訓(xùn)練,最后的效果一樣可以很好。有了這個(gè)結(jié)論,無論是有監(jiān)督的預(yù)訓(xùn)練還是無監(jiān)督的預(yù)訓(xùn)練就都無所謂了,反正已經(jīng)不需要預(yù)訓(xùn)練的模型去做初始化了,這樣就沒辦法體現(xiàn)MoCo的優(yōu)越性了
  • 但是在文獻(xiàn)31中說的是當(dāng)訓(xùn)練足夠長(zhǎng)的時(shí)候,也就是訓(xùn)練6*或者9*的學(xué)習(xí)時(shí)長(zhǎng)的時(shí)候,如果訓(xùn)練的短的話,預(yù)訓(xùn)練模型還是有用的,那么就在預(yù)訓(xùn)練時(shí)長(zhǎng)短的時(shí)候做比較就可以了
  • 所以在本文中,作者說只用1*或者2*的學(xué)習(xí)時(shí)長(zhǎng),這個(gè)時(shí)候預(yù)訓(xùn)練還是非常有用的,就可以比較到底是MoCo預(yù)訓(xùn)練的好還是有監(jiān)督的ImageNet的訓(xùn)練好了


總之,歸一化和學(xué)習(xí)時(shí)長(zhǎng)都是為了鋪墊:當(dāng)使用MoCo的預(yù)訓(xùn)練模型去做微調(diào)的時(shí)候,微調(diào)也是跟有監(jiān)督預(yù)訓(xùn)練模型在微調(diào)時(shí)候的方式是一樣的,這樣做的好處是當(dāng)在不同的數(shù)據(jù)集或者不同的任務(wù)上做微調(diào)的時(shí)候,就不用再去調(diào)參了,就用之前調(diào)好的參數(shù)就行了?

  • 作者補(bǔ)充說這么做可能對(duì)MoCo來說是不利的,因?yàn)槿绻槍?duì)提出的方法做超參搜索的話,有可能得到更好的結(jié)果
  • 但即使是這樣,MoCo的表現(xiàn)也都還是很好的
  • 在pascal VOC數(shù)據(jù)集上做檢測(cè)的結(jié)果如下圖所示
  • 表a和表b分別是用了兩種不同的網(wǎng)絡(luò)結(jié)構(gòu),每一個(gè)表格中都是四行
  • 第一行使用的是隨機(jī)初始化的模型再做微調(diào),所以它是一個(gè)基線網(wǎng)絡(luò),分?jǐn)?shù)比較低
  • 第二行使用的是有監(jiān)督的ImageNet的預(yù)訓(xùn)練的模型做初始化然后再做微調(diào),也就是一個(gè)比較強(qiáng)的極限結(jié)果
  • 最后兩行分別是MoCo在ImageNet上和在Instagram 1Billion上做無監(jiān)督預(yù)訓(xùn)練當(dāng)作模型的初始化,然后再做微調(diào)
  • 除了表a中的第三行的第一個(gè)結(jié)果MoCo是略微不如有監(jiān)督預(yù)訓(xùn)練的模型,在其他所有的衡量指標(biāo)下MoCo ImageNet就已經(jīng)超過了有監(jiān)督的預(yù)訓(xùn)練模型
  • 當(dāng)換成更大的數(shù)據(jù)集Instagram 1Billion的時(shí)候還會(huì)有進(jìn)一步的提升,其實(shí)Instagram 1Billion帶來的提升都不是很大,只有零點(diǎn)幾個(gè)點(diǎn)


接下來作者又再次比較了三種對(duì)比學(xué)習(xí)的方式:端到端學(xué)習(xí)、memory bank、MoCo,前一次對(duì)比是在ImageNet做Linear Classification Protocol下面做測(cè)試,現(xiàn)在是在下游任務(wù)上再做一次對(duì)比,如果還是MoCo最好的話,說服力就比較強(qiáng)了,如下圖說示

  • MoCo和前面兩種方式比起來確實(shí)是好了很多,而且最主要的是之前的兩種方法都沒有超越有監(jiān)督預(yù)訓(xùn)練模型的結(jié)果,只有MoCo是真的超越了


在COCO數(shù)據(jù)集上作者比較了四個(gè)設(shè)置

  • 前兩個(gè)用的都是Res50 fbn,但是學(xué)習(xí)時(shí)長(zhǎng)不一樣,一個(gè)是1*,一個(gè)是2*
  • 后面兩行用的是res50 c4的結(jié)構(gòu),一個(gè)是1*,一個(gè)是2*
  • 除了在設(shè)置a里面MoCo的模型稍顯遜色,在剩下的三個(gè)設(shè)置下,MoCo預(yù)訓(xùn)練的模型都比ImageNet有監(jiān)督預(yù)訓(xùn)練模型得到的效果要好


作者又測(cè)試了別的不同的任務(wù)

  • keypoint detection人體關(guān)鍵點(diǎn)檢測(cè)
  • pose estimation姿態(tài)檢測(cè)
  • 實(shí)例分割
  • 語義分割

基本的結(jié)論還是MoCo預(yù)訓(xùn)練的模型在大部分時(shí)候都比ImageNet的預(yù)訓(xùn)練模型要好,即使偶爾比不過也是稍顯遜色


作者最后總結(jié):MoCo在很多的下游任務(wù)上都超越了ImageNet的有監(jiān)督預(yù)訓(xùn)練模型,但是在零零星星的幾個(gè)任務(wù)上,MoCo稍微差了一點(diǎn),主要是集中在實(shí)例分割和語義分割的任務(wù)上,所以接下來大家也都懷疑對(duì)比學(xué)習(xí)的方式是不是不太適合做dence prediction的task,就是這種每個(gè)像素點(diǎn)都要去預(yù)測(cè)的任務(wù),所以后續(xù)也涌現(xiàn)了很多基于這個(gè)出發(fā)點(diǎn)的工作,比如dence contrast或者是pixel contrast之類


文章最后的結(jié)論:

MoCo在很多的視覺任務(wù)上,已經(jīng)大幅度的把無監(jiān)督和有監(jiān)督之間的坑給填上了


最后作者強(qiáng)調(diào)MoCo在Instagram數(shù)據(jù)集中是要比ImageNet訓(xùn)練出來的模型要好的,而且是在所有任務(wù)上普遍表現(xiàn)的都很好,這說明了MoCo的擴(kuò)展習(xí)慣很好,也就是說如果有更多的數(shù)據(jù),MoCo有可能就能學(xué)到更好的模型,這和NLP中得到的結(jié)論是一樣的,這也符合了無監(jiān)督學(xué)習(xí)的終極目標(biāo)





8、總結(jié)


MoCo這篇論文以及它高效的實(shí)現(xiàn),能讓大多數(shù)人有機(jī)會(huì)用普通的GPU就能跑對(duì)比學(xué)習(xí)的實(shí)驗(yàn),做研究


因?yàn)镸oCo在各個(gè)視覺任務(wù)上取得了更好的性能,也激發(fā)了很多后續(xù)分析性的工作,去研究MoCo學(xué)出來的特征到底和有監(jiān)督學(xué)出來的特征有什么不同,還能從別的什么方向去提高對(duì)比學(xué)習(xí)





----end----

MoCo 論文逐段精讀【論文精讀】的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
丁青县| 绍兴县| 重庆市| 阿坝县| 博湖县| 习水县| 景德镇市| 双峰县| 泗阳县| 凌海市| 长寿区| 县级市| 保山市| 湘乡市| 皋兰县| 惠来县| 探索| 文成县| 方城县| 南漳县| 南安市| 尖扎县| 南陵县| 宁海县| 台南市| 天气| 寻乌县| 杂多县| 区。| 浦北县| 高雄县| 长寿区| 双柏县| 兴宁市| 绩溪县| 德兴市| 化隆| 遵义市| 林周县| 朝阳县| 张北县|