深度神經網絡有著強大的表征能力
一張輸入圖片經過層層變換表達為一個特征向量
如果是監(jiān)督學習级野,特征的預測結果可以和標簽比對作為損失函數(shù);那如果是無監(jiān)督學習粹胯,沒有l(wèi)abel,損失函數(shù)該如何構建蓖柔?該如何判斷一個好的表征?
Contrastive Learning給出的答案很簡單风纠,同類圖像最后得到的特征向量應該在特征空間是相似的,而不同類之間應該盡可能的遠况鸣,這就是對比學習。但是沒有l(wèi)abel竹观,還是不知道哪些類別是同一個镐捧,解決方法就是潜索, 每個實例當作同一類,用數(shù)據(jù)增廣創(chuàng)造出該類別的其他實例懂酱。
contrastive learning基本思想可以被理解為一個查字典的過程竹习,輸入是query,用于對比的是key玩焰, 但是這個字典的大小限制于用于訓練的GPU內存由驹,那么對于圖象這樣的高維數(shù)據(jù),如果字典不夠大昔园,用于對比的數(shù)據(jù)不夠多,可能就達不到訓練效果并炮。
然后就可以使用Softmax得到兩張圖片相似的概率默刚,
然后再轉化為對數(shù)似然代價函數(shù)。溫度系數(shù)設置 為0.07逃魄。
Loss 是一個關于q和k的函數(shù)荤西,這樣,原圖和變形之后的圖片的特征相似度越高伍俘,不同的圖片特征相似度越低邪锌, 整體的loss就越低, 就越接近我們的理想模型癌瘾。
MoCo作者認為觅丰,字典一要大,二key之間應該保持一致性妨退。但是用圖二左端對端的方法妇萄,字典大小限制于顯存。
MoCo用于解決字典大小限制的方法咬荷,來源于下面這篇論文冠句。
memory bank, 儲存的是所有key的編碼,初始值是隨機歸一化的幸乒,不存在梯度回傳懦底,所以這個空間不受限于GPU的內存。每次產生Loss的時候只要在這個空間采樣一部分就好了罕扎,memory bank的編碼在每次經過查詢后聚唐, 得到的q的值才會更新到相應的k上面,所以存儲的編碼實際上來自該epoch 的每個step(一次epoch訓練所有數(shù)據(jù)壳影,每個step迭代一次拱层,訓練一個batch)。
這個方法使得用來對比的負樣本可以足夠多宴咧,但是又出現(xiàn)了新的問題:因為 memory bank中的 k更新得很慢根灯,產生k的encoder來自于不同的step,這樣就打破了k之間的一致性。
那可能比較的想法是,直接把最新的q的encoder直接作為k的encoder搏明, 而k 這一路不更新鼠锈。MoCo中做過這樣的實驗,也就是這個式子m=0的情況星著,但是發(fā)現(xiàn)不能收斂购笆。作者給出的猜想是因為encoder的迭代更新很快,那么同樣的 隊列中的k又會是產生于不同參數(shù)虚循,遭遇和memory bank一樣的問題同欠, 雖然每一組k 的編碼參數(shù)是一致的,組和組之間卻相差太大横缔。但是用一個比較大的慣性參數(shù)就能比較好的解決這個問題铺遂。
在具體實現(xiàn)的方案上西土,MoCo使用了shuffling BN泉沾,因為BN會打破minibatch里樣本的獨立性捞蚂,可以參考我的另一篇關于NFNet的博客。
總結一下跷究,端對端方法字典大小受限于顯存姓迅,memory bank 方法將 k 存儲起來,碰到相應的q更新一次俊马,字典大小不受限制丁存,但是key之間是不一致的。MoCo用緩慢更新 k的編碼器的方式 保證了隊列中k 的一致性柴我。
MoCoV2
https://arxiv.org/abs/2003.04297
用兩層MLP檢測頭代替一層全連接解寝。
使用模糊圖像增廣。