MoCo----引言
GPT和BERT已經(jīng)證明了無監(jiān)督的表征學(xué)習(xí)在NLP領(lǐng)域是非常成功的,但是在視覺領(lǐng)域有監(jiān)督的預(yù)訓(xùn)練還是占主導(dǎo)地位
雖然也有很多出色的無監(jiān)督工作,但是它們往往要比這些有監(jiān)督的模型在效果上要差很多
作者認(rèn)為原因有可能來源于原始的信號空間不同,對于自然語言處理的任務(wù)來說,它的信號空間是離散的(也就是說它原始的信號空間是由單詞或者是詞根詞綴去表示的),從而可以很容易地建立一些Tokenize(Tokenize就是把某一個詞對應(yīng)成某一個特征)的字典,一旦有了這個字典,無監(jiān)督學(xué)習(xí)也就可以基于它很容易地展開,因?yàn)榭梢院唵蔚匕堰@個字典里所有的key(就是所有的條目)想象成一個類別,這就變成了一個有監(jiān)督學(xué)習(xí)的范式,還是有一個類似于標(biāo)簽一樣的東西去輔助學(xué)習(xí),所以在NLP中,無監(jiān)督學(xué)習(xí)很容易建模,而且建好的模型相對比較容易優(yōu)化
但是對于視覺來講就完全不一樣了,因?yàn)橐曈X的原始信號是在一個連續(xù)的而且高維的空間里,它并不像單詞那樣有很強(qiáng)的語義信息而且濃縮的非常好,沒有那么簡潔,所以導(dǎo)致它并不適合去建立一個這樣的字典。但是如果沒有這個字典,無監(jiān)督學(xué)習(xí)就很難去建模,所以導(dǎo)致在視覺中無監(jiān)督學(xué)習(xí)遠(yuǎn)不如有監(jiān)督學(xué)習(xí)
最近有一些基于對比學(xué)習(xí)的無監(jiān)督表征學(xué)習(xí)的方式取得了非常不錯的效果,雖然這些方式的出發(fā)點(diǎn)或者具體的做法都不一樣,但是它們都可以被歸納成一種方法:再構(gòu)造一個動態(tài)的字典
一個數(shù)據(jù)集中有n張圖片,隨機(jī)選擇一張圖片x1,在這張圖片上經(jīng)過不同的變換以后得到x11和x12,這兩張圖片就組成了一個正樣本對,一般將x11叫做anchor也就是錨點(diǎn)(基準(zhǔn)點(diǎn)),將x12叫做positive(也就是相對于基準(zhǔn)點(diǎn)來說,x12是x1的一個正樣本),剩下的所有的圖片,從x2到xn全都是負(fù)樣本(negative)

有了正負(fù)樣本這些概念,接下來將這些樣本丟給編碼器得到一些特征輸出,比如說x11進(jìn)入到編碼器E11之后就會得到一個特征f11,x12進(jìn)入到編碼器E12之后就會得到一個特征f12,這兩個編碼器既可以是同一個模型,也可以是不同的模型,因?yàn)樵贛oCo這篇論文中選用的是不同的模型,所以這里就分開畫了
至于剩下的負(fù)樣本,其實(shí)應(yīng)該使用E12這個編碼器,因?yàn)樗械呢?fù)樣本和正樣本f12都是相對于原來的錨點(diǎn)f11來說的,所以說這些負(fù)樣本也應(yīng)該和這個正樣本使用同樣的編碼器,從而讓它們的特征保持一致性,于是這些負(fù)樣本也通過這個編碼器從而得到了f2到fN的特征
對比學(xué)習(xí)的作用就是讓這一個正樣本對的特征在特征空間中盡可能相近,而讓那些負(fù)樣特征盡可能地遠(yuǎn)離f11(也就是錨點(diǎn))
為什么本文的作者認(rèn)為之前的對比學(xué)習(xí)都可以被歸納成在做一個動態(tài)的字典呢?
如果將f12、f2、f3一直到fN的這些特征當(dāng)成字典,字典中的條目(key)是從數(shù)據(jù)中抽樣出來的,然后用一個編碼器去表示,也就是說這里的key其實(shí)對應(yīng)的是特征而不是原來的圖像。
如果將f1當(dāng)成是一個query,所有這些字典中的其它特征都當(dāng)成是key,那對比學(xué)習(xí)就轉(zhuǎn)化成為了一個字典查詢的問題了
具體來說,就是對比學(xué)習(xí)要去訓(xùn)練一些編碼器,從而去進(jìn)行一個字典的查找,查找的目的就是讓一個已經(jīng)編碼好的query(特征f11)盡可能和它匹配的那個key的特征(也就是f12這個正樣本特征)相似,然后和其他的key(也就是其他負(fù)樣本的特征)遠(yuǎn)離,那么整個學(xué)習(xí)的過程就變成了一個對比學(xué)習(xí)的框架,從而只需要去最小化一個對比學(xué)習(xí)的目標(biāo)函數(shù)就可以了
在MoCo這篇論文當(dāng)中,因?yàn)樽髡咭呀?jīng)把所有的對比學(xué)習(xí)的方法歸納成為了一個動態(tài)字典的問題,所以很少使用anchor或者正負(fù)樣本這些詞,用的都是query和key,所以x1一般用xq表示,x2一般用xk表示,也就是xquery和xkey,同樣地,特征f11用的是q,代表query,剩下的特征用k0、k1等來進(jìn)行表示
MoCo的作者是以一個自頂向下的方式來寫這篇論文的,他假設(shè)讀者已經(jīng)對對比學(xué)習(xí)的前人的工作已經(jīng)了如指掌了,假設(shè)讀者能跟上他的節(jié)奏
從這個角度(把對比學(xué)習(xí)當(dāng)成動態(tài)字典)來看,最后要有好的結(jié)果,這個字典應(yīng)該具有兩個特性
第一是必須要大。字典越大,就能更好地從這個連續(xù)的高維的視覺空間做抽樣(字典里的key越多,所能表示的視覺信息、視覺特征就越豐富,當(dāng)拿一個query去跟后面的key做對比的時候,就真的有可能學(xué)到那些把物體區(qū)分開的特征,也就是更本質(zhì)的特征。如果字典很小,模型很有可能就學(xué)到了一個捷徑shortcut solution,從而導(dǎo)致預(yù)訓(xùn)練好的模型不能很好地做泛化)
第二就是在訓(xùn)練的時候要盡可能地保持一致性。字典里的key都應(yīng)該用相同或者說相似的編碼器去產(chǎn)生得到,也就是說從k0一直到kN的這些key應(yīng)該是用相同或者說相似的編碼器抽取得到的,這樣當(dāng)和query做對比的時候,才能保證對比盡可能的一致,否則如果這些特征是由不同編碼器得到的話,很有可能query就找到了和它使用相同或者相似編碼器的key,而不是真的和它含有相同語義信息的key(這樣其實(shí)也就是變相地引入了一個shortcut solution,也就是說引入了一條捷徑從而讓模型學(xué)不好)
作者說,現(xiàn)在已有的這些使用對比學(xué)習(xí)的方法,都至少被上述所說的兩個方面中的一個所限制(其實(shí)這里說明一下現(xiàn)在已有的方法是怎么受限的會更有助于讀者去理解,但是受限于篇幅,作者只能說接下來在該談的時候會做介紹)
介紹完了研究動機(jī)、之前工作的局限性以及想要達(dá)到的目標(biāo),接下來就是作者提出自己的方法
提出MoCo是為了給無監(jiān)督的對比學(xué)習(xí)構(gòu)造一個大而且一致的字典,具體的模型總覽圖如下圖所示

這個圖和之前所畫的對比學(xué)習(xí)的一般框架很相似
有query的圖片,還有key的圖片,這些圖片通過一些編碼器得到最后的特征,然后query的特征去跟所有的key的特征做類比,最后用對比學(xué)習(xí)的loss去訓(xùn)練整個模型
它和之前的那個框架有什么不同?queue和momentum encoder,這也是MoCo這篇論文的貢獻(xiàn)所在
為什么要用一個隊(duì)列去表示字典?主要還是受限于顯卡的內(nèi)存,如果字典太大,也就意味著要輸入很多很多的圖片,如果字典的大小是幾千甚至上萬的話,顯卡的內(nèi)存肯定是吃不消的,所以需要想一個辦法,能讓字典的大小跟每次模型去做前向過程時的batch size大小剝離開,于是作者想到了一個巧妙的辦法:用隊(duì)列的數(shù)據(jù)結(jié)構(gòu)來完成這項(xiàng)任務(wù)。具體來說,就是這個隊(duì)列可以很大,但是每次更新這個隊(duì)列是一點(diǎn)一點(diǎn)進(jìn)行的,也就是說當(dāng)用一個很小的batch size的時候,現(xiàn)在這個batch抽得的特征進(jìn)入隊(duì)列,然后把最老的也就是最早的那個mini-batch移除隊(duì)列,這樣一下就把訓(xùn)練時用的mini batch的大小和隊(duì)列的大小直接分開了,最后這個隊(duì)列的大小,也就是字典的大小可以設(shè)的非常大,因?yàn)樗蟛糠值脑囟疾皇敲總€iteration都需要更新的,這樣只用普通的GPU也能訓(xùn)練一個很好的模型
但是這個字典中的key最好要保持一致性,也就是說他們最好是用同一個或者說相似的編碼器差生得到的。如果只有一小部分(也就是當(dāng)前的batch)是從當(dāng)前的編碼器得到的,而之前的key都是用不同時刻的編碼去抽取特征,就不一致了,所以作者又提出了一個改進(jìn):momentum(動量編碼器)。
如果用上面的動量的概念來寫一下數(shù)學(xué)表達(dá)式,如果現(xiàn)在的編碼器用θq(θquery)代替,momentum encoder用θk(θkey)表示,那么θk的更新就可以表示為θk = m * θ(k-1) + ( 1 - m ) * θq ,也就是說,雖然動量編碼器剛開始是由旁邊的編碼器θq初始化而來的,但是模型的訓(xùn)練中選擇了一個很大的動量,那么這個動量編碼器θk其實(shí)是更新的非常緩慢的,而不會跟著θq快速地改變,從而保證了字典中所有的key都是由相似的編碼器抽取得到的,盡最大可能地保持了他們的一致性
所以基于這兩點(diǎn)貢獻(xiàn),MoCo可以構(gòu)建一個又大又一致的字典,從而去無監(jiān)督地學(xué)習(xí)一個視覺的表征
選用什么代理任務(wù)去充當(dāng)這個自監(jiān)督信號,從而進(jìn)行模型的訓(xùn)練?
因?yàn)镸oCo只是建立中間模型的方式,它只是為對比學(xué)習(xí)提供了一個動態(tài)的字典,那么具體選擇什么樣的代理任務(wù)去做自監(jiān)督學(xué)習(xí)?其實(shí)MoCo是非常靈活的,它可以跟很多代理任務(wù)合起來使用
在這篇論文中,作者選擇了一個比較簡單的instance discrimination任務(wù)(個體判別任務(wù)),選擇它的原因不僅僅是因?yàn)樗唵?,也是因?yàn)樗男Ч_實(shí)非常好。
這個任務(wù)簡單來說就是如果一個query和一個key是同一個圖片不同的視角(比如說不同的隨即裁剪得到的),那么就說這個query和這個key能配對,也就是說能在這個字典中查找到query對應(yīng)的key,用了這個代理任務(wù),MoCo在ImageNet數(shù)據(jù)集上做Linear Classification的時候,能跟之前最好的方法打個平手或者是有更好的表現(xiàn)
結(jié)果
無監(jiān)督的表征學(xué)習(xí)最主要的目的就是當(dāng)在一個沒有標(biāo)注的數(shù)據(jù)集上做完預(yù)訓(xùn)練之后,預(yù)訓(xùn)練好的特征是能夠直接遷移到下游任務(wù)的,MoCo就做到了這一點(diǎn):
在七個下游任務(wù)(既有檢測也有分割)上,MoCo這種無監(jiān)督的預(yù)訓(xùn)練方式都能超越用ImageNet去做有監(jiān)督的預(yù)訓(xùn)練方式,有的時候甚至還是大幅度的超越。因此重要性不言而喻,MoCo是第一個做到這么好結(jié)果的
大家對無監(jiān)督學(xué)習(xí)還有另外一個期待:就像在NLP中,如果用更多的數(shù)據(jù),用更大的模型,希望這個模型的提升是永無止境的,最好不要有性能飽和的現(xiàn)象。所以作者這里為了實(shí)驗(yàn)的完整性又做了另外一組實(shí)驗(yàn),作者除了把MoCo在ImageNet做預(yù)訓(xùn)練之外,還在facebook自己的10億的Instagram數(shù)據(jù)集上也做了預(yù)訓(xùn)練,最后的結(jié)果還能提升,所以這也就證明了MoCo是可以在一個更偏向于真實(shí)世界而且有億級規(guī)模圖片的數(shù)據(jù)集上工作的很好

relatively uncurated scenario:因?yàn)檫@個數(shù)據(jù)集并不是像ImageNet一樣是精心挑選過、而且大部分圖片都是只有一個物體在中間的,Instagram的圖片的場景是相當(dāng)豐富的,而且也會展示出真實(shí)世界中數(shù)據(jù)有的一些特性(比如說數(shù)據(jù)分類不均衡*******,或者說一張圖片可能含有多個物體),所以和ImageNet比起來,可能從數(shù)據(jù)的挑選和標(biāo)注上都沒有那么嚴(yán)格
因?yàn)镸oCo不論是在中型數(shù)據(jù)集上做預(yù)訓(xùn)練還是在大型數(shù)據(jù)集上做預(yù)訓(xùn)練都能取得很好的結(jié)果,所以作者最后說,這些結(jié)果證實(shí)了MoCo可以在很多視覺任務(wù)上把無監(jiān)督學(xué)習(xí)和有監(jiān)督學(xué)習(xí)的坑填平,而且甚至可以在一些真實(shí)的任務(wù)上去取代之前大家一直使用的在ImageNet預(yù)訓(xùn)練的模型
MoCo的影響力就在于幾乎所有的應(yīng)用都可以換成使用MoCo無監(jiān)督的訓(xùn)練方式訓(xùn)練好的模型,說不定效果還會更好
----end----