你們那種對比學習是辣雞,我SwAV今天就要開啟新局面!

語言: CN / TW / HK

theme: Chinese-red

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第15天,點選檢視活動詳情


本文共計1945字,閱讀大概需要花費4分鐘


image.png

論文地址:Unsupervised Learning of Visual Features by Contrasting Cluster Assignments

程式碼地址:http://github.com/facebookresearch/swav

如果你不懂什麼是對比學習,直接看這篇文章會很吃力。建議閱讀本文之前先看看兩篇前饋文章:

  1. 諸神黃昏時代的對比學習 - 掘金 (juejin.cn)

  2. “軍備競賽”時期的對比學習

如果你不想看這兩篇文章也沒有關係。我會盡力盡力,說得通俗易懂。畢竟我也是初學者,所以我感覺我理解的肯定容易讓小白也理解。如果有什麼漏誤歡迎各位大佬批評指正。我們稱這篇論文為SwAV

對比學習簡單來說就需要找出正樣本和負樣本互相對比。在前面的這個學習的工作中,大家提出了各式各樣的政府樣本的選取方式,比如:

  • 將整個imagenet做成字典,從中抽取一個mini batch作為正樣本。再從中隨機抽取4096條作為負樣本。
  • 從資料集中抽取一個mini batch對其增廣,使用一個孿生網路,將原圖放進一個網路,將增強之後的圖放進另一個網路,二者同時進行訓練,對二者使用一個NCE loss或者infoNCE loss。一張圖片和它的增廣作為正樣本,剩餘的圖片及其增廣作為負樣本。
  • 從資料集中抽取一個mini batch對其進行兩次增廣,使用一個孿生網路,將一組圖片增強放進一個網路,將另一組圖片增強放進另一個網路,二者同時進行訓練,對二者使用一個NCE loss或者infoNCE loss。

乍一看上面的做法好像都沒有什麼問題,做出來的最後效果也挺好的,但是這個時候一個做聚類的大佬跳了出來。他說不管你們對比學習的負樣本怎麼選擇,你們的整個mini match都是從imagenet中隨機抽取的,所以你們的負樣本具有隨機性。 - 它可能會重複的抽取到同一資料。雖然你資料集有很多圖片,但是你從中抽可能會抽到相同的圖片。極端的情況下,如果你抽到一組圖片作為正樣本,然後你又抽到同樣重複的一組圖片作為負樣本。那這樣就會對訓練造成影響。 - 也可能不具有整個資料集的代表性。比如這個資料其實有很多很多種動物,但是你抽到的都是狗,這樣資料就是沒有代表性的。 - 當然這樣的選取的越全面效果越好,但是如果你選取的過多的負樣本又會造成計算資源的浪費。

所以我提出用聚類。

image.png

看一下上邊影象。

左側是常規的對比學習。將資料進行不同內強的增強,然後將增強後的兩份資料分別放入不同的模型當中獲得對應的表示,最後進行對比。

右側是作者提出的網路。也是將輸入進行不同的增強,增強之後的資料也會進入到一個網路之中,獲得相應的表示之後不會直接拿去做對比。中間加了一個C模組,這個模組是一個聚類模組。你得到的資料需要去跟聚類的中心比。

聚類中心就是右圖裡的c,也就是個prototype,它其實就是個矩陣,它的維度是d 乘以 k,d是特徵的維度,這裡的d和特徵的d 是一樣的,比如說就是之前說的128維,這個k就是有多少個聚類中心。在這篇文章中它選的是3,000,ImageNet資料集上常用的一個引數聚類引數。

通過clustering讓特徵z和prototype c生成一個目標,也就是上圖的q1、q2。

x1、x2是正樣本的話,那z1 和 z2的特徵就應該很相似,也就跟之前對比學習一樣,z1和z2要儘可能的相似。那如果兩個特徵非常相似,按道理來說應該是可以互相去做預測的,也就是說,如果拿z1這個特徵去跟c去做點乘,按道理來說也是可以去預測q2;反之亦然,z2和這個c去做點乘也可以預測q1,所以說點乘之後的結果就是預測。通過這種換位預測(Swapped prediction)的方法,SwAV可以對模型進行訓練。

最後的目標函式是這一個: $$ -\frac{1}{N} \sum_{n=1}^{N} \sum_{s, t \sim \mathcal{T}}\left[\frac{1}{\tau} \mathbf{z}{n t}^{\top} \mathbf{C} \mathbf{q}{n s}+\frac{1}{\tau} \mathbf{z}{n s}^{\top} \mathbf{C} \mathbf{q}{n t}-\log \sum_{k=1}^{K} \exp \left(\frac{\mathbf{z}{n t}^{\top} \mathbf{c}{k}}{\tau}\right)-\log \sum_{k=1}^{K} \exp \left(\frac{\mathbf{z}{n s}^{\top} \mathbf{c}{k}}{\tau}\right)\right] $$

ImageNet才1000類,因此這裡聚類聚成3000個是非常足夠的。那我們來看一下使用聚類能解決什麼問題。 - 先說重複問題:因為你使用的是聚類中心進行比較。雖然是不同的聚類中心,那麼他肯定不可能出現重複的情況。 - 再說一下沒有代表性的問題:聚類就是將眾多的圖片聚成不同的類別。與每一個類別的中心進行對比,是絕對具有代表性的。 - 再說一下過去有過多負樣本造成資源浪費的問題。如果要跟很多的負樣本去做類比,可能就需要成千上萬的負樣本,而且即使如此也只是一個近似,而如果只是跟聚類中心做對比,則可以用幾百或者最多3,000個聚類中心,就足以表示了。大大減少了計算資源消耗。

除了聚類,SwAV還提出了一個muti crop的方法,感興趣的可以自己去看一下。

最後我們來看一下它的效果。 image.png

因為這篇文章是在BYOL之前出來的,所以它只和前面的模型做了一下對比,我們可以明顯的看到。他比我們之前提到的無監督對比學習方法效果都要好,效果直逼有監督的方法。其實它甚至比身後的BYOL 和 SimSiam效果也要好。

而且當使用更大的模型的時候,也就是像圖裡說的一樣,把一個Res50變寬,而且就是這裡的2倍、4倍、5倍這麼寬的時候,SwAV的結果還能不停地漲。當用最大的模型(5倍的模型)的時候,SwAV已經跟有監督的模型,差距非常的小,而且SwAV也是要比SimCLR*2、SimCLR *4要高的。這篇文章還是非常值得一讀的,並且作者也從另一個角度給我們提出了一個改進方法,就是要讓樣本更具有代表性。這篇文章非常推薦大家看一看。