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

歡迎光臨散文網 會員登陸 & 注冊

對比學習論文綜述 第三階段----不用負樣本

2022-01-08 23:07 作者:如果我是泡橘子  | 我要投稿

其實第二階段里講的SwAV就已經有不用負樣本的對比學習這個趨勢了,它可以算是一個承上啟下的工作,因為它也沒有用負樣本,它用的是聚類中心,但它畢竟還是有一個明確的對比的對象


接下來要講的BYOL和SimSiam其實就是正樣本自己在玩,已經沒有負樣本或者聚類中心這樣明確的一個對比的東西去做對比了


Boostrap Your Own Latent:A New approach to Self-Supervised Learning


BYOL其實就是這句話的頭幾個字母

  • Bootstrap就是說如果已經有什么東西了,然后在它之上進行改造

  • latent就是特征的意思(latent、hidden、feature、embedding其實都是特征的意思,就是各種花里胡哨的用法而已)


BYOL 的意思就是自己跟自己學,左腳踩右腳就上天了,所以說是一篇很有意思的論文


為什么作者很有自信說是a new approach to self supervised learning,因為它完全沒有用任何形式的負樣本


為什么不用負樣本就這么新奇、這么吸引人注意?

  • 因為在對比學習中,負樣本是一個約束,如果在算目標函數的時候只有正樣本,其實目的就只有一個,那就是讓所有相似的物體的特征也盡可能的相似,那這個時候就有一個很明顯的捷徑:如果一個模型不論給它什么輸入,它都返回同樣的輸出,這樣的話,它出來的所有的特征都是一模一樣的,那拿這個去算對比學習的loss就都是零,意思就是模型直接就躺平了,它直接用這個捷徑解就能完美解決問題loss永遠是0模型根本都不用學

  • 只有加上負樣本這個約束,就是說不光相似的物體要有相似的特征,然后不相似的物體也要有不相似的特征。這樣模型才有動力去繼續(xù)學,因為如果輸出的所有特征都一樣,那負樣本的loss就無窮大,所以它必須想辦法讓正樣本和負樣本的loss都往下降,達到一個最優(yōu)解

  • 所以說,負樣本在對比學習里是個必須的東西,它能防止模型學到捷徑,很多論文里也管這個叫model collapse或者learning collapse ,就是模型坍塌或者學習坍塌,說白了就是什么也沒學到,負樣本就是為了限制這種情況的發(fā)生

  • 但BYOL之所以神奇就是它沒有用負樣本,正樣本自己跟自己學最后在ImageNet上也達到了74.3的top-1準確率,也是相當高了


因為BYOL是20年6月份出來的,跟SwAV是同期的工作,所以它不用跟SwAV去比,那在這之前74.3就是最高的


BYOL為什么能夠做到不需要負樣本?

下圖圖 2是模型總覽圖

模型總覽圖

BYOL的前向過程:

  • 一個mini-batch的輸入x經過兩次數據增強以后,就得到了v和v',然后圖片通過編碼器得到特征

  • 上面這一支通過的編碼器叫fθ,下面這個通過的編碼器呢叫fε,兩個編碼器使用是同樣的網絡架構,但是它們的參數不同

  • fθ是隨著梯度更新而更新的,而這個fε跟MoCo一樣是用moving average的形式去更新的,其實就是使用了動量編碼器

  • 這里得到的特征,如果是res 50的話就是2048維的一個特征

  • 接下來跟SimCLR一樣用了一個projection head,這里叫 projector,就是通過gθ這個函數得到zθ的特征,zθ在這里是256維,比之前的128大了一點,發(fā)現這個效果好一點

  • 同樣地,gε其實跟gθ是一樣的網絡結構,但是參數不一樣,也是通過動量的方式去更新的

  • 之前對比學習的方法,當得到這兩個特征zθ和zε以后,就像SimCLR一樣需要讓它們盡可能接近,需要達到maximum agreement,但是BYOL沒有這么做,它又加了新一層的一個叫predictor的東西qθ,qθ跟gθ的網絡結構是完全一樣的,也是一個mlp,然后就得到了一個新的特征q(zθ),為了讓這個預測跟下面的zε盡可能一致,就把原來的匹配問題換成了現在的預測問題

  • 這個跟SwAV也有點像,因為SwAV也是把配對問題換成了預測問題,但是SwAV還是借助了一個聚類中心來幫助做這個預測任務的,但是BYOL真的是什么都沒有,就是自己去預測自己,然后這個模型就學起來了

  • sg就是stop gradient,這里是沒有梯度的,跟MoCo就很像,上面一支相當于是個query編碼器,下面一支相當于是key的編碼器,key的編碼器都是query編碼器的動量更新,但不一樣的是它的代理任務不一樣,它相當于是用自己一個視角的特征去預測另外一個視角的特征,通過這種預測型的任務完成模型的訓練


這就是 BYOL 的訓練過程,看起來相當簡單,而且作者說跟別的工作一樣,當訓練完成以后只有這個編碼器留下了,剩下所有的東西都被拿掉了,最后yθ,也就是這個2048維的特征去做下游任務


它訓練網絡的時候用的目標函數直接用的是mean square erro(mse los)

  • 因為現在是兩個向量,一個是預測的qθ(zθ),一個是target zε,現在是想讓它們盡可能的接近,所以算一個mse loss就可以了

  • 這個跟之前對比學習用的那些目標函數全都不一樣,所以說BYOL雖然看起來有SimCLR的影子,也有MoCo的影子,比如說SimCLR的projection head、MoCo的動量編碼器,但是它用的目標函數不一樣,而且也沒有用負樣本,就用這種自己預測自己的方式學到了很好的特征表示

  • 所以說在它放到arxiv之后,reddit、twitter、知乎全都引起了劇烈的討論,因為大家都覺得很不可思議,不用負樣本,模型的學習怎么能不坍塌,其實作者也覺得很神奇,所以它后面也提供了一些解釋,但是它的解釋比較中規(guī)中矩沒有什么意思

understanding self-supervised and contrasive learning with "Boostrap Your Own Latent"(BYOL)


“如何去理解 BYOL”


這篇博客的作者其實也是看到BYOL之后覺得非常有意思,所以就嘗試復現了一下,結果在復現的時候遺漏了一個小細節(jié),從而導致它的模型訓練不動,出現了這個模型坍塌的現象


作者覺得畢竟這是在 DeepMind 的工作,可信度還是非常高的,應該不是論文的問題,肯定是它們自己復現的問題,所以自己就去仔細檢查了

  • 檢查結果發(fā)現確實是遺漏了一個很小的細節(jié),這個細節(jié)跟batch norm有關


在講這個發(fā)現之前,先來看一下batch norm帶來了什么麻煩,因為之前沒有好好說projection head 里面具體的結構,所以先來復習一下

下圖所示是SimCLR的結構圖

SimCLR結構圖

SimCLR就是說一個圖片進了編碼器以后就得到了這個embedding,就是特征y(2048 維),然后把它扔給gθ,就是一個projection head,也就是圖中右側的mlp

  • 這個mlp由一個全連接層、一個batch norm、一個ReLU 激活函數、一個全連接層、一個batch norm的結構組成

  • 第一個全連接層的維度是2048*2048

  • 第二個全連接層的維度是2048*128,就把維度降下去了,這個128的特征就是最后用來做對比學習的特征

  • 注意:這里面有兩個batch norm 操作

接下來再看一下MoCo v2(MoCo v1沒有用projection head),MoCo v2的模型結構如下圖所示

MoCo v2結構圖
  • MoCo v2確實是用了projection head,就是gθ,但是它的 gθ 里面是沒有batch norm的,就是直接全連接層、ReLU然后又全連接層

  • 第一個全連接層還是2048*2048

  • 第二個全連接層還是128

再來看BYOL,模型結構如下圖所示

BYOL結構圖
  • gθ、gε都是projection head

  • qθ是prediction head

  • 這三個東西用的都是同樣的結構,如圖右側紫色的mlp結構所示,這個結構里面是全連接層+batch norm+ReLU+全連接層 ,第二個全連接層后面沒有 batch norm,但是第一個后面是有 batch norm

  • 也就是因為這點小小的差別造成了這個發(fā)現

  • 為什么呢?因為像MoCo v2的代碼寫的實在是太好了,而且又是基于 pytorch ,所以這篇博客的作者就是借鑒MoCo v2來復現的 BYOL ,但是因為MoCo v2里projection head沒有batch norm,所以他們在復現BYOL的時候,這里也沒有用batch norm,所以它的mlp就是全連接層+relu+全連接層,然后模型的學習就坍塌了,然后這篇博客的作者就覺得實在是太奇怪了,所以趕緊又做了一些額外的實驗,如下表所示

實驗結果
  • 第二列指的是projector里到底用不用batch norm,還是是用別的歸一化方式

  • 第三列指的是prediction里到底用不用batch norm,還是是用別的歸一化方式

  • 目標函數:對于對比學習的方式來說用的是交叉熵函數,對于 BYOL ?來說都用的是 L2,也就是MSE loss

  • performance性能其實是在一個STL-10的數據集上做的,不是 ImageNet,但是衡量標準還是準確度

上表做了哪些實驗

  • 最后一行random是說有一個隨機初始化的殘差網絡,然后拿這個殘差網絡去抽特征,然后在這個特征上訓練一個全連接層,最后的結果是28.8,這個就是隨機結果,就是根本沒有學習的結果

  • 第二行表示如果做的是正確的 BYOL,就是說在projection head和prediction head 里頭都用了batch norm ,最后的結果是57.7,這個就是最高,也就是正確的結果

  • 但其實剛開始做的實驗做的是倒數第三行(no normalization),就是沒有歸一化,既沒有在projection head的里頭用batch norm ,也沒有在predictor用batch norm ,最后的結果只有28.3,跟隨機的結果一模一樣,也就是說模型坍塌了什么都沒有學到

  • 然后作者就嘗試了幾種變體,做了消融實驗:要么在projection head里用batch norm ,不在prediction里用,要么就是在projection里不用,在prediction里用,最后發(fā)現,只要哪塊放一個batch norm,最后的結果就還行,就算48有點低,但至少說明模型在學習沒有坍塌

  • 作者這時候就強烈懷疑,肯定是batch norm惹的事了,正常的想法很自然,下一步就說換一個歸一化式行不行,就換成layer norm,作者就在projection head和prediction head里面都用了layer norm,然后發(fā)現性能確實就又掉下去了,又變成29.4,就跟隨機一樣了,也就是說模型又坍塌了,又什么都沒學到

  • 所以,作者最后總結說BYOL訓練的時候不坍塌,肯定是跟batch norm有一點關系

  • 那有什么關系呢?作者說現在有一個簡單的結論:batch norm這個操作是把一個batch里所有樣本的特征拿過來算一下它們的均值方差,也就是running mean running variance,然后用整個batch算來的均值和方差做歸一化,這也就意味著,當在算某個正樣本的loss時,其實也看到了其它樣本的特征,也就是說這里面是有信息泄露的,MoCo里有一個操作叫做 Shuffling BN ,也就是為了防止這種信息泄露的,博客的作者就說,因為有這種信息泄漏的存在,所以可以把這個batch里的其它樣本想成是一種隱式的負樣本

  • 換句話說,當有了batch norm的時候,BYOL其實并不光是正樣本在自己跟自己學,它其實也在做對比,它做的對比任務就是說當前的正樣本這個圖片跟平均圖片有什么差別,而這個平均圖片就是batch norm產生的,還有之前很多圖片的總結量,這就跟SwAV很像了,因為 SwAV 就是沒有跟負樣本去比,而是找了個聚類中心去比,而這里batch norm生成的平均圖片,其實就相當是一種聚類中心的意思,也就這篇作者說的mode(眾數),就是中值的意思


所以說,這篇博客的作者認為batch norm是BYOL能夠成功的關鍵,其實是做了一種隱式的對比學習,這個觀點很快就被大家所接受了,因為聽起來確實很合理,而且它后面做了很多實驗,也全都驗證了它的觀點,batch norm確實至關重要,拿掉batch norm以后模型就是不好訓練,對超參數的設置非常的敏感,稍有不慎它就啥也不學了


但是BYOL的作者看到這個以后就急了就覺得說如果真是這樣的話,如果真的要用這種方式去解釋的話,BYOL的創(chuàng)新性就大大降低了,因為它還是沒有逃脫出對比學習的范疇,它還是找了一個東西去做對比,所以趕緊做實驗看看能不能找到另外一種解釋,為什么BYOL 能夠不模型坍塌


BYOL的作者很快就找到了另外一種方式去解釋這個現象,迅速寫了一篇論文(BYOL works even without batch statistics)來做回應,它的題目上來就說BYOL即使在沒有batch norm的時候照樣能工作,而且它甚至把這個even斜體了,真的就是用來回應上面提到的那篇博客。因為BYOL 的作者不想讓大家覺得BYOL 的成功是依賴于 batch norm,然后BYOL 的作者做了一系列非常詳細的實驗看看問題到底出在哪,實驗結果如下表所示

實驗結果
  • 這個實驗就是說在encoder編碼器,就是Res50里到底用batch norm、layer norm,還是什么都不用,還有在projector里到底用batch norm、layer norm,還是什么都不用,或者說在predictor里到底用batch norm、layer norm,還是什么都不用

  • 雖然就這么一個小小的表格,但其實里面的跑的實驗是相當多的,做了一個非常完整的消融實驗,而且這里還和SimCLR去比了,因為其實BYOL就是基于SimCLR做的,它跟SimCLR非常像

作者發(fā)現了幾個現象

  • batch norm確實是比較關鍵,因為只要是沒有batch norm的地方,SimCLR都工作的很好,可能有一些性能下降,但是都還在學,BYOL全都沒有再學了,模型坍塌了

  • 通過這個完整的消融實驗,作者還發(fā)現了幾個特例,正是這些特例幫助作者找到了另外一個可以解釋的理由:即使當projector有 bn的時候,BYOL 還是訓練失敗了,這個就不能解釋batch norm很關鍵了,因為如果batch norm真的很關鍵,如果真的能在這個隱式負樣本提供對比學習的話,訓練就不應該失敗

  • 還有就是當編碼器和project都沒有用batch norm的時候,SimCLR也失敗了,因為SimCLR沒有predictor,所以說這里predictor就無所謂了,意思就是說當什么歸一化都不用的時候,不光是BYOL,SimCLR 也不行,它即使用了負樣本也訓練不出來,所以這就再次證明了,batch norm不是提供了一個隱式的負樣本,因為這里即使給它顯式的負樣本了,它還是訓練不出來

  • 所以這時BYOL 的作者和原來博客的作者后來就達成了一個比較一致的結論,就是說batch norm跟它原來的設計初衷一樣,它主要的作用就是能幫助這個模型穩(wěn)定訓練,它能提高模型的訓練穩(wěn)健性,從而不會導致模型坍塌,BYOL的作者又把這個結論進一步延伸,然后給出來了一個可以解釋的理由,如果一開始就能讓模型初始化的比較好,后面的訓練即使離開了batch norm也沒有問題

  • 于是作者就做了另外一個實驗,就是用group norm和weight standardization,group norm就是一種歸一化的方式,而weight standardization就是一種模型初始化的方式,這一套方法其實是vit的原班作者在他們之前的論文 BEiT 里提出來了,也就是現在很多人說的ResNet v2就是用這種方式做訓練,然后換上這種初始化方式以后,BYOL 的作者發(fā)現又能訓練74左右的top-1準確率了,跟原來論文里用batch norm的那個74.3的結果非常接近

  • 所以作者最后再次強調說group norm或者weight standardization都沒有計算批統(tǒng)計量,所以說這個版本的 BYOL,也就是說這個73.9的 BYOL 是沒有跟mini ?batch里其它的樣本做對比的,意思就是說沒有隱式的對比,也就意味著說BYOL 還是一個全新的方式,它就是很厲害,就是能自己跟自己學,模型就能學的很好,不需要這種假設batch norm提供的一個隱式的這個對比學習的項,就是說大家不要被那篇博客帶跑偏了,趕緊來follow BYOL這個套路,這個套路沒問題,別再去管負樣本的事了


其實這篇論文也只有4頁,因為它就是用來回應那個博客,也沒想著說真的發(fā)論文,目的達到了就行


Exploring Simple Siamese Representation Learning

就是simple Siamese network,其實在BYOL放到 arxiv 上之后,就已經有很多研究者在做對對比學習的分析性工作了,因為大家發(fā)現,對比學習的成功好像是被很多很小的點堆起來的性能,比如說我們一路走來可以看到用了新的projection head、訓練的時間更長、用了更多的數據增強或者用動量編碼器、用更大的 batch size,總之好像都缺一不可,對比學習的性能好像是一點一點被這么堆上去的


這樣就不是很好,不方便分析,因為有太多點了,所以不知道從哪分析起,也不知道每個點到底帶來了哪些貢獻,所以凱明團隊又再次出手,把整個過程化繁為簡了一下,最后提出了SimSiam


這個結構有多簡單,就是說不需要用負樣本(因為它基本上是跟 BYOL是非常像的,所以說它不需要負樣本)、不需要大的batch size,不需要動量編碼器,然后即使在這種情況下,這個SimSiam不僅不模型坍塌

而且還能取得很好的結果


具體的模型總覽圖如下圖所示

SimSiam模型總覽圖
  • 之所以叫siamese network(孿生網絡)是因為一般會有兩個編碼器,這兩個編碼器一般網絡結構是一樣的,而且一般是要共享參數的,所以才叫孿生網絡

  • 整體架構是跟BYOL 非常一樣的:一個圖片變成 x1、x2,然后經過過兩個編碼器,有一個predictor,其實predictor出來的就是要去預測另外一個編碼器出來的特征

  • 這里跟BYOL唯一的不一樣就是它沒有用動量編碼器


如果我們簡單看一下偽代碼,如下圖所示,就會發(fā)現是真的簡單,整個前向過程其實就這么幾行

SimSiam偽代碼
  • D函數就是怎么去算loss,算的是一個 negative cosine similarities loss,說白了就是一個MSE losss

  • 至于前向過程也跟上圖中的一樣,得到兩個視角x1、x2以后,先過編碼器去得到特征z1、z2,然后再通過predictor得到p1、p2的預測,因為有兩個預測,所以這里也是一個對稱性的loss,就是說,既可以做從p1預測z2,也可以做用p2預測z1的任務,但因為加了兩次,所以說這里也要除以2

  • l就是最后的loss

  • 梯度回傳更新網絡

作者還做了很多實驗,比如說batch size對模型訓練的影響、還有 ?batch norm對模型訓練的影響,而這些都跟BYOL非常像,這里就不一一展開了,最后作者得到一個結論:之所以SimSiam能夠成功訓練,不會有模型坍塌,主要是因為有stop gradient這個操作的存在


作者還提出了一個假設,而且在第五節(jié)里做了一個 hypothesis:因為有了stop gradient這個操作的存在,所以SimSiam這個結構是可以把它想象成

一個EM的算法

  • EM 算法真是無所不在,感覺很多事情最后都可以歸結到 EM 算法去解釋,都有點量子力學那個意思

這里作者的意思是說因為有了stop gradient這個操作之后,這一個訓練過程或者說這一套模型參數其實就被人為劈成了兩份,就相當于在解決兩個

子問題一樣,模型的更新其實也是在交替進行的,作者接下來又做了一些推導,寫的非常好,推薦大家可以去看一下,其實到最后應該可以把它理解成是一個k-means這個聚類問題

  • k-means其實就是分兩步走的,每次先要把所有的點分配給一些聚類中心,一旦分配好了以后,再去更新這個聚類中心,然后再周而復始地去做這個操作

從這個角度來說SimSiam又跟SwAV有點關系了,于是作者其實在最后還畫了這么一張圖如下圖所示,這張圖真的畫的非常好,它把所有孿生網絡的做法都歸納到在這里,然后做一下總結和對比

  • SimCLR:SimCLR因為是端到端的學習,所以說兩邊都有梯度回傳,但是它還是做的一個對比任務

  • SwAV:做的也是一個對比任務,但它并沒有跟負樣本去比,而是跟聚類中心去比的,那聚類中心是通過SK算法得到的

  • BYOL:BYOL就有一個新的貢獻(就是predictor,圖中已經單獨畫出來了),它就不是一個對比任務,變成一個預測任務了,要用左邊去預測右邊,同時還使用了動量編碼器

  • SimSiam: 整體跟BYOL非常像,左邊其實就是一模一樣,只不過右邊沒有用動量編碼器,所以這個對比還是比較簡潔明了的



最后再看一下結果如下表所示,之前BYOL也沒有看結果,鑒于SimSiam是一個總結性的工作,它跟之前里程碑式的工作都有對比,所以看這個表格就足夠了

在 ImageNet 上linear classification的結果:這里比較的都是重量級工作,比如SimCLR、MoCo v2、BYOL?

  • 從batch size來說,只有MoCo v2和SimSiam是可以用256的,其它工作都要用更大的batch size,所以說凱明大佬的工作真的是好follow

  • 前兩項工作SimCLR和MoCo v2要用負樣本,但是對于BYOL來說就完全沒有用,SwAV用的是聚類中心

  • 對于動量編碼器來說,SimCLR沒有用,SimCLR v2用了,但是v1沒有用,MoCo v2和 BYOL用了,SwAV沒有用

  • 總的來說,SimSiam就是這些都沒有用

  • 看結果的話發(fā)現在訓練100個epochs的時候,SimSiam的結果是最好的,所以說明它學的非常快,但是隨著訓練的推進慢慢就不行了,漲幅比較慢,到最后也是有71.3,但是這個時候BYOL已經有74.3這么高了(其實我之前也有做過很多實驗,發(fā)現動量編碼器真的是很好用,也非常能提點的一個東西,所以可能這也是為什么BYOL能夠訓練的這么好)

  • 當然作者在SimSiam這篇論文里,它只是想說把這些trick全拿掉照樣能訓練,所以說它沒有用動量編碼器

  • 再來看SwAV,SwAV只有71.8,這個應該是沒有用multi crop的技術,所以這就跟之前講SwAV的時候說的一樣,就是如果不用multi crop,SwAV 就跟MoCo v2差不多,還不如MoCo v2,所以說只從分類來說,最強的方法就是BYO

下游任務如下表所示

下游任務對比
  • 前面幾個做的是物體檢測,最后做的是一個實例分割,就是cv人必做的兩個下游任務

  • 這里可以看到有一個比較有趣的現象,就是說針對下游任務的transfer來說,MoCo v2和SimSiam其實是表現最好的,BYOL和SwAV也不錯,但是跟MoCo v2和SimSiam比還都差了一到兩個點,差距還是比較明顯,所以說直到現在,如果想去嘗試一些idea,或者說嘗試去做一些對比學習的工作時,還是會用MoCo v2當基線模型,因為真的是訓練快、訓練的穩(wěn),而且下游任務遷移的好

當然還有一篇論文叫Barlow Twins,是Yann LeCun組的一篇論文,因為宣傳的很厲害,所以說很多人也都知道,那篇論文就是把目標函數給換掉了,它既不是在做對比也不是在做預測,它是生成了一個關聯矩陣叫 cross correlation matrix,然后它希望這個矩陣能跟一個identity matrix(就是對角線是1,其它部分都是0的矩陣)盡量相似,其實說白了也是一樣的意思,就是它希望正樣本相似性盡量都逼近于1,然后跟別的樣本盡量的不相似,相似性盡可能是0,所以說就是換了個目標函數,其它的網絡結構、訓練方式都大同小異,而且他們放arxiv的時間也比較晚,已經是 21年的3月份了,這個時候對于 cv 來說,早都已經是Vision Transformer的時代了,所以很快呢就被淹沒了





----end----

對比學習論文綜述 第三階段----不用負樣本的評論 (共 條)

分享到微博請遵守國家法律
滨海县| 白城市| 阳原县| 呼和浩特市| 阜新| 东至县| 安阳市| 犍为县| 社旗县| 务川| 定安县| 朔州市| 常德市| 东辽县| 安陆市| 南投县| 高邑县| 安丘市| 雷波县| 西乡县| 南宫市| 额济纳旗| 凤山县| 乌审旗| 广河县| 炉霍县| 武夷山市| 安远县| 金寨县| 长丰县| 梨树县| 福贡县| 苗栗县| 古交市| 曲松县| 浏阳市| 教育| 博爱县| 新密市| 嘉峪关市| 灌阳县|