近兩年對比學習是機器學習中研究的一個熱點,作為我知識版圖中的一塊,對近期的學習做個總結。
常見的機器學習分類方法把機器學習分為監督學習、無監督學習、半監督學習,主要區別是訓練數據有無標籤。
無監督學習即訓練數據沒有標籤,這裡的無標籤指的是不需要人為地加標籤,不管是手動還是其他方法標註,典型算法如聚類算法。自監督學習本質屬於無監督學習,訓練數據不需要標註,直接用來訓練,只不過訓練過程中使用數據自身的內容作為學習目標,也可以說是從自身找標籤。
根據不同的學習目標,自監督學習可分為三類:
基於上下文的方法:NLP中的word2vec模型,通過句子中兩邊的詞預測中間的詞,這個中間詞就是學習的標籤,不需要人工標註,同樣通過中間詞預測兩邊的詞也一樣。還有著名的BERT模型,隨機遮住一些詞,然後預測遮住的內容,均屬於基於上下文的自監督方法。
基於時序的方法:主要指音頻或者視頻這類有時間先後順序的場景,相鄰時刻的內容具有相似關係,可以學習這種相似關係,也不需要人工標註。
基於對比的方法:從無標註數據中選擇數據做變換或增強,源數據和變換或增強後的數據互為正例,和其他數據互為負例,訓練過程中對比正例和負例,讓正例之間距離靠近並拉開負例之間的距離。
上面說了這麼多自監督的內容,是因為本文的主角對比學習屬於自監督學習的一種。那麼一般如何使用自監督學習呢,或者說用自監督學習來解決什麼實際問題呢?目前大部分場景是用自監督學習從海量的無標註數據中學習數據的特徵表示,常叫representation或者embedding,對於給定的數據,有了特徵表示就可以用來訓練各種下遊任務,比如分類問題、序列標註問題等,總之所有能用到向量來進行訓練的問題!
NLP中使用BERT在大規模無標籤數據上進行預訓練,同時使用Transformer結構,可以說是具有裡程碑式的意義,並且在工業界各個領域內實實在在地落地應用,取得了相當的成功。自然地,CV中能否用類似的思路來解決圖像相關的問題成了大家研究的重要方向,這是近年來對比學習火熱的主要原因。
對於文本數據,有典型的上下文關係或者時序關係,容易構建模型來學習這種上下文或者時序關係。但對於圖片,上下文關係不明顯,也無時序關係,於是大家想到了對圖片進行增強,常見的增強方法包括旋轉、放大縮小、變色等,增強後的圖片和源圖片相似,互為正例,源圖片和其他圖片不相似,互為負例,然後構建模型通過學習這種相似性和不相似性,讓模型有從數據中提取特徵的能力。
要做好對比學習,主要要解決以下問題:
如何構建正例和負例數據,使得數據更多樣化、更合理。
模型結構設計,讓模型更好地提取到數據的特徵。
損失函數設計,讓正例間距離越近、負例間距離越遠,並避免模型坍塌(Collapse),即避免不同輸入通過模型計算後映射到了同一個值。
距離函數,上述損失函數中用到的距離計算,使用什麼函數更合理。
各種層出不窮的對比學習模型主要是在想辦法改進上面四個問題。文章剩餘部分先介紹最經典的兩個基礎對比學習模型,然後介紹NLP領域近兩年對比學習相關的主要論文,有了這些知識,在實際工作中就可以根據需要進一步研究,選擇恰當的模型使用、擴展。
對比學習開始火熱,主要始於兩個模型,何凱明團隊的MoCo模型和Hinton團隊的SimCLR模型,兩個模型又分別進化了多個版本,下面分別介紹。
MoCo(https://arxiv.org/pdf/1911.05722.pdf)是Momentum Contrast首字母的縮寫,即動量對比,核心是動量更新key encoder網絡的參數值,下面我們具體解釋。
MoCo或者說很多對比學習模型的目的就是構造一個字典,模型訓練好後字典就構造好了,對於任何一個輸入,從字典中查詢的結果就是我們需要提取的特徵。這個和NLP的embedding類似,如果以word為單位,對每個word就可以從word embedding中查詢到特徵表示。只不過對圖像來說,不像NLP中的word那樣可以窮舉,需要想別的辦法。
先直接看MoCo的結構:
再結合對應的Pytorch偽代碼理解:
有兩個分別針對query和key的encoder網絡f_q和f_k,通過網絡後的結果就相當於從字典查詢到的結果。
對輸入x,分別做不同的增強得到x_q和x_k,通過f_q和f_k後得到的q和k互為正例,可以得到正例的loss。
維護一個負例的queue,當前的q和queue中所有數據互為負例,可計算得到當前batch負例的loss。聯合已經得到的正例loss就是當前batch的整體loss。
每次得到整體loss後還有兩件事情要做:
所以MoCo的特色就是維護了一個不斷更新的負例queue,同時key encoder不斷通過query encoder平滑動量更新。
了解MoCo核心後再挑幾個重點說說:
1)和其他模型結構的比較
論文比較了MoCo和end-to-end以及memory bank結構,唯一區別就是key encoder部分。
end-to-end結構兩個encoder通過反向傳播單獨更新,二者的參數可以相同也可以不同,重點是每次字典就是通過當前batch數據查詢,所以字典大小受限於當前batch數據大小,一般來講,大的字典比小的字典好,MoCo使用多個batch數據,字典更大。
Memory bank維護一個包含所有數據的memory bank,每個mini-batch隨機從中採樣負例數據,比MoCo需要更多內存開銷,並且memroy bank中內容更新沒有MoCo更新得及時和平滑。
2)encoder網絡結構
使用ResNet。
3)損失函數
使用對比學習常用的InfoNCE損失函數:
q是f_q查詢的結果,ki是f_k查詢的結果,k+是f_k中唯一一個和q匹配的正例,T是溫度超參數。分子表示q和k+的距離,距離越近,值越大,loss越小,分母表示負例間距離,距離越遠,值越小,loss越小。達到了拉近正例、拉開負例間距離的目標。
4)動量更新公式
f_k參數通過f_q的動量更新公式:
m是一個權重係數,實驗證明大點的m,比如0.999,比小點的值,比如0.9的效果更好,m越大,參數更新越平緩。
SimCLR(https://arxiv.org/pdf/2002.05709.pdf)提出比MoCo稍晚,結構更簡單明了:
邏輯上和之前描述的對比學習思路相同,包括以下幾步:
其中,即cosine相似度。
更直觀點的圖如下(源自知乎張俊林):
算法描述如下:
論文重點對batch size大小、模型大小、數據增強方法、projection非線性層、損失函數對模型影響做了實驗對比和分析。
MoCo和SimCLR各自出了第一個版本後,分別又出了新的版本改進,互相借鑑,各個版本的主要變化如下(源自知乎張俊林):
除了上述兩個經典的模型,常見的模型還有引入聚類的SwAV模型,只使用正例的BYOL、Barlow Twins模型等。
本文開頭提到, 由於NLP領域自監督學習的成功,CV領域開始研究,帶火了對比學習。隨著CV領域對比學習的火熱,NLP領域也開始嘗試如何使用對比學習,所謂我中有你,你中有我,互相學習,不斷向前發展。
我平時的工作更多在於NLP方面,所以整理下NLP中部分對比學習論文:
1)CERT
https://arxiv.org/pdf/2005.12766.pdf
解決BERT類預訓練模型定義於token級別,不能很好第捕捉句子級別語義的問題,在句子級別使用對比學習,用回傳方式做數據增強。
2)CLEAR
https://arxiv.org/pdf/2012.15466.pdf
也是基於句子級別的對比學習,數據增強的方法使用字或者文本段(span)的刪除、重排序或者替換。loss聯合了MLM loss和對比學習的loss。
3)SimCSE
https://arxiv.org/pdf/2104.08821.pdf
先使用了無監督學習,對比學習部分只使用dropout作為數據增強方法就取得了不錯的效果,負例在batch內取。然後進行了有監督學習及比較。
4)SCL
https://arxiv.org/pdf/2011.01403.pdf
監督的對比學習,在預訓練模型微調階段聯合交叉熵和自定義的SCL loss,具體loss如下:
實驗結果顯示在測試集上好於RoBERTa-Large模型的基線模型性能。
5)DeCLUTR
https://arxiv.org/pdf/2006.03659.pdf
數據增強方法從每個文檔中取A個anchor文本段 (anchor span),
訓練時每個anchor有一個正例span,其餘span之間互為負例。不同span的長度用Beta分布決定。loss聯合MLM loss和對比學習loss。
最後,談點自己的感悟。學術界雖然按照研究對象和解決問題的不同分了不同的領域,其實在理論層面的本質都是相通的。一個理論在一個領域碰出了點火花,會迅速在其他領域燎原起來,最近我們在ASR中也在調查看能否用對比學習解決一些問題。相關論文層出不窮,對工業界來說,怎麼把已有的理論聯繫實際問題,並落地解決問題最重要。
參考文章:
對比學習研究進展精要,張俊林
https://zhuanlan.zhihu.com/p/367290573
對比學習在CV與NLP領域中的研究進展,對白
https://zhuanlan.zhihu.com/p/389064413
對比學習在CV,NLP,MM的應用,胡安文
https://zhuanlan.zhihu.com/p/378456417