對比學習(Contrastive Learning)綜述
A.引入

A.引入

深度學習的成功往往依賴於海量數據的支持,其中對於數據的標記與否,可以分為監督學習和無監督學習。
1. 監督學習:技術相對成熟,但是對海量的數據進行標記需要花費大量的時間和資源。
2. 無監督學習:自主發現數據中潛在的結構,節省時間以及硬件資源。
2.1 主要思路:自主地從大量數據中學習同類數據的相同特性,並將其編碼為高級表征,再根據不同任務進行微調即可。
2.2 分類:
2.2.1生成式學習
生成式學習以自編碼器(例如GAN,VAE等等)這類方法為代表,由數據生成數據,使之在整體或者高級語義上與訓練數據相近。
2.2.2對比式學習
對比式學習着重於學習同類實例之間的共同特征,區分非同類實例之間的不同之處。
與生成式學習比較,對比式學習不需要關注實例上繁瑣的細節,只需要在抽象語義級別的特征空間上學會對數據的區分即可,因此模型以及其優化變得更加簡單,且泛化能力更強。

對比學習的目標是學習一個編碼器,此編碼器對同類數據進行相似的編碼,並使不同類的數據的編碼結果盡可能的不同。
3. 近況
最近深度學習兩巨頭 Bengio 和 LeCun 在 ICLR 2020 上點名 Self-Supervised Learning(SSL,自監督學習) 是 AI 的未來,另外,Hinton 和 Kaiming 兩位神仙也在這問題上隔空過招,MoCo、SimCLR、MoCo V2 打得火熱,這和 BERT 之后,各大公司出 XL-Net、RoBerta 刷榜的場景何其相似。
4.感謝
寫這篇綜述,花了大概一個多月時間整理【剛大二,有篇復旦的論文確實看不懂,這里就沒寫】,感謝各位大佬的博客,給了我莫大的幫助,還有學長
和同學 的鼓勵,才讓我有信心肝完這篇國內資料不那么完善的綜述。
本文對目前的對比學習相關,尤其是NLP方面的工作進行較為全面的介紹,希望能夠為感興趣的同學提供一些幫助。
B. 對比引入
【拿我的畫舉個例子】我們可以看到下面兩張圖的馬頭和精細程度都是不同的,但是我們顯然能判斷這兩張是類似的圖,這是為什么呢

對於某個固定錨點x來說,其位置是由與其他點相對位置決定的,而不是畫布的絕對位置。==》特征抽象
A中與 x 鄰近的點在B圖中相應點距 x' 距離小,A中與 x 相距較遠的點在B圖中相應點距 x' 距離大。
在一定誤差范圍內,二者近似相等。
可以這么認為,通過對比學習,忽略了細節,找到並確定所以關鍵點相對位置。

C. 聚類思想
在這里,我們將之前的想法進行抽象,用空間考慮對比學習。

最終目標:
縮小與正樣本間的距離,擴大與負樣本間的距離,使正樣本與錨點的距離遠遠小於負樣本與錨點的距離,(或使正樣本與錨點的相似度遠遠大於負樣本與錨點的相似度),從而達到他們間原有空間分布的真實距離。
- 丈量二者距離:歐幾里得距離,余弦相似度,馬氏距離(沒人試過,但原理是一樣的)
- 目標:給定錨點,通過空間變換,使得錨點與正樣本間距離盡可能小,與負樣本距離盡可能大==》抽象是如此做的!!!==》從這個實現看,對於圖像縮放可能有幫助,但是其他場景CNN做卷積池化效果不更好?==》用在流量分析里咋搞?
D.對比思想
動機:人類不僅能從積極的信號中學習,還能從糾正不良行為中獲益。
對比學習其實是無監督學習的一種范式。根據經典的SIMCLR,我在這里就直接提供了對比學習中模型的常見形式。

E. 對比損失【重要*數學警告】
本章的數學公式可以只看結論(NCE可以不看),如果想了解細節請仔細閱讀【附錄】,如果不懂可以評論私信,或者移步參考博客學習。
1. 歐幾里得距離
在線性空間中,上述相似度就可以表示為二者向量間的歐幾里得距離:
2. 對比損失定義
由Hadsell, R. , Chopra, S. , & Lecun, Y. . (2006)提出[1] ,原文只是作為一種降維方法:只需要訓練樣本空間的相對關系(對比平衡關系)即可在空間內表示向量。
損失定義如下:
為了下文方便解釋,這里的參數詳細解釋如下:
:網絡權重;
:標志符,
:是
與
在潛變量空間的歐幾里德距離。
:表示第i組向量對。
:研究中常常在這里做文章,定義合理的能夠完成最終目標的損失函數往往就成功了大半。
2.1 細節定義
只需滿足紅色虛線趨勢。
只需滿足藍線趨勢【都有趨於0的區域】。

2.2 過程/主流程
原文類比彈性勢能,將正負樣本分類討論。
正樣本:
當與錨點是正樣本時,由於對比思想,二者之間會逐漸靠近。原文將它假設成一個原長 的彈簧,那么就會將正樣本無限的拉近,從而完成聚類。
將錨點設為勢能零點:
那么 E 即可作為 ,且滿足定義要求:

負樣本
當與錨點是負樣本時,由於對比思想,二者之間會逐漸原理。原文將它假設成一個原長 的彈簧,那么就會將負樣本至少拉至m,從而完成划分。
將錨點設為勢能零點:

L原定義:
這樣我們就獲得了Loss函數最基本的定義:
當Y=0,調整參數最小化 。
當Y=1,設二者向量最大距離為m,
如果 , 則增大兩者距離到m;
如果 ,則不做優化。
空間角度:
空間內點間相互作用力動態平衡。

2.3 效果
我們可以看到,和4不那么像的9會被拉遠離4,和4相似的9會在交界面上十分接近地分布。這和我們的的對比想法是一致的。

同時,該論文還發現許多對比學習中有趣的現象。
不同光照下,不同角度下,像素間歐氏距離盡管很遠,但是能聚集在一個環上。

3. Triplet Loss
(簡化版原方法)
結論
我們將三元組重新描述為 。
那么三元組的總體距離可以表示為:【近年論文好像也有沿用的,比較經典】
相較定義來說,Triplet Loss認為,假如所有正樣本之間無限的拉近,會導致聚類過擬合,所以,就只要求
當然在比例尺上看來, 也會趨於0。
原文將所有三元組的狀態分為三類:
- hard triplets
正樣本離錨點的距離比負樣本還大 - semi-hard triplets
正樣本離錨點的距離比負樣本小,但未滿足 - easy triplets
滿足
前兩個狀態會通過loss逐漸變成第三個狀態。

4. NCE Loss
【注:后續研究並沒有怎么使用原始的NCELoss,而是只使用這里的結論,這里引入是為了說明應該多采用負樣本。】
之前從向量空間考慮,NCE從概率角度考慮【原證明為貝葉斯派的證法】,NCE是對於得分函數的估計,那也就是說,是對於你空間距離分配的合理性進行估計。
總之NCE通過對比噪聲樣本與含噪樣本,從而推斷真實分布。
【與對比學習思想一致,可以當做是另一角度】
結論
越大,約接近NCE 對於噪聲分布的依賴程度也就越小,越接近真實期望。
5. 互信息
在預測未來信息時,我們將目標x(預測)和上下文c(已知)編碼成一個緊湊的分布式向量表示(通過非線性學習映射),其方式最大限度地保留了定義為的原始信號x和c的互信息
通過最大化編碼之間互信息(它以輸入信號之間的MI為界),提取輸入中的隱變量。
互信息往往是算不出來的,但是我們這里將他進行估計,通過不同方法進行估計,從而衍生出自監督的兩種方式:生成式和對比式【詳見A 2.2.2】
互信息上界估計:減少互信息,即VAE的目標。
互信息下界估計:增加互信息,即對比學習(CL)的目標。【后來也有CLUB上界估計和下界估計一起使用的對比學習。】
6. InfoNCE Loss
具體詳見CPC論文1.3節。
通過二者互信息【詳見附錄】來衡量二者距離/相似度,可逼近其下界。
結論
后續研究
后續研究的核心往往就聚焦於的兩個方面:
- 如何定義目標函數?【詳見附錄】
- 簡單內積函數
- InfoNCE【近年火熱】
- triplet 【近年火熱】 【知乎的問題,后邊的s函數的負號上標可能消失】
- 如何構建正實例對和負實例對?
這個問題是目前很多 paper 關注的一個方向,設計出合理的正實例與負實例對,並且盡可能提升實例對,才能表現的更好。
F. 基礎論文
1. CPC
論文標題:Representation Learning with Contrastive Predictive Coding
論文鏈接:https://arxiv.org/abs/1807.03748
代碼鏈接:https://github.com/davidtellez/contrastive-predictive-coding
很多時候,很多數據維度高、label相對少,我們並不希望浪費掉沒有label的那部分data。所以在label少的時候,可以利用無監督學習幫助我們學到數據本身的高級信息,從而對下游任務有很大的幫助。
Contrastive Predictive Coding(CPC) 這篇文章就提出以下方法:
- 將高維數據壓縮到更緊湊的隱空間中,在其中條件預測更容易建模。
- 用自回歸模型在隱空間中預測未來步驟。
- 依靠NCE來計算損失函數(和學習詞嵌入方式類似),從而可以對整個模型進行端到端的訓練。
- 對於多模態的數據有可以學到高級信息。
可以利用一定窗口內的 和
作為正實例對,並從輸入序列之中隨機采樣一個輸入作為
負實例。
1.1 問題描述

給定聲音序列上下文 ,由此我們推斷預測
位置上的聲音信號。題目假設,聲音序列全程伴隨有噪音。為了將噪音序列與聲音序列盡可能的分離編碼,這里就隨機采樣獲得
代替
位置信號,作為負樣本進行對比學習。
1.2 CPC
下圖說明了 CPC 的工作過程:

首先我們在原信號上選取一些時間窗口,對每一個窗口,通過encoder ,得到表示向量
。
通過自回歸模型:
,從而生成上下文隱變量
。
然后通過Bi-linear:【采用 和
從而能夠壓縮高維數據,並且計算
和
的未來值是否符合】
1.3 InfoNCE Loss
CPC用到了NCE Loss, 並推廣為InfoNCE:(證明見【附錄】)
選取 ,這里面只有一個正樣本對
來自於
,即聲音原本的信號,其他N-1個均是負樣本(噪聲樣本)來自於
,即隨機選取的信號片段。
損失函數定義如下:【 f 可自由定義,甚至為MLP】
我們用softmax的思路來理解這個損失函數, 越大,
應該越接近於0(越接近最大值),而損失就越小。
回到對比學習的思想,W將做c到z的映射, 均經過歸一化,那么,二者余弦相似度為
,這樣
,即可看做softmax,將
正樣本的值加大,負樣本值縮小。

2. MoCo
論文標題:Momentum Contrast for Unsupervised Visual Representation Learning
論文來源:CVPR 2020
論文鏈接:https://arxiv.org/abs/1911.05722
代碼鏈接:https://github.com/facebookresearch/moco
本文提出了高效的對比學習的結構。使用基於 MoCo 的無監督學習結構學習到的特征用於 ImageNet 分類可以超過監督學習的性能。證明了無監督學習擁有巨大的潛力。

受NLP任務的啟發,MOCO將圖片數據分別編碼成查詢向量和鍵向量,即,查詢 q 與鍵隊列 k ,隊列包含單個正樣本和多個負樣本。通過 對比損失來學習特征表示。
主線依舊是不變的:在訓練過程中盡量提高每個查詢向量與自己相對應的鍵向量的相似度,同時降低與其他圖片的鍵向量的相似度。
MOCO使用兩個神經網絡對數據進行編碼:encoder和momentum encoder。
encoder負責編碼當前實例的抽象表示。
momentum encoder負責編碼多個實例(包括當前實例)的抽象表示。
對於當前實例,最大化其encoder與momentum encoder中自身的編碼結果,同時最小化與momentum encoder中其他實例的編碼結果。
2.1 InfoNCE Loss
這個Loss只能更新q向量的encoder。如果同時更新q和k沒有意義。
交叉熵損失:
交叉熵損失(Cross-entropy Loss) 是分類問題中默認使用的損失函數:
分類模型中,最后一層一般是linear layer+softmax。所以如果將之前的特征視為, linear layer的權重視為
,則有:
每個權重矩陣 事實上代表了每一類樣本其特征值的模板(根據向量乘法我們知道越相似的兩個向量其內積越大)。
實際上,現有的分類問題是通過一系列深度網絡提取特征,然后依據大量的樣本學習到一個有關每一類樣本特征的模板。在測試的階段則將這個學到的特征模板去做比對。
非參數樣本分類:
所謂非參數樣本分類,則是將每個計算出的樣本特征作為模板,即看做是計算所得的樣本特征模板。
對比損失:
我們最終的目標還是不變的:
這里與CPC類似地,我們使用cosine距離,假設已經歸一化特征值,則優化上式實際上等同於最大化下式中的softmax概率,
假設其中有一個正樣本 其余均是負樣本,則根據 InfoNCE Loss表示為:
其中 和
可以有多種構造方式,比如對圖像進行裁剪變色等隨機變化。
但是呢,實現上來說,將 看做一體為
,那么
,即為交叉熵損失。
2.2 Memory Bank
由於對比學習的特性,參與對比學習損失的實例數往往越多越好,但Memory Bank中存儲的都是 encoder 編碼的特征,容量很大,導致采樣的特征具有不一致性(是由不同的encoder產生的)。
所以,對所有參與過momentum encoder的實例建立動態字典(dynamic dictionary)作為Memory Bank,在之后訓練過程中每一個batch會淘汰掉字典中最早被編碼的數據。
2.3 Momentum 更新
在參數更新階段,MOCO只會對encoder中的參數進行更新。
由於Memory Bank,導致引入大量實例的同時,會使反向傳播十分困難,而momentum encoder參數更新就依賴於Momentum 更新法,使momentum encoder的參數逐步向encoder參數逼近:
其中 ,
指encoder部分的參數。
下圖形式化的表示了三種結構,end-to-end,memory-bank和MoCo的區別。MoCo的特點是:
(1)用於負采樣的隊列是動態的
(2)用於負樣本特征提取的編碼器與用於query提取的編碼器不一致,是一種Momentum更新的關系。
(3)與Memory Bank類似,NCE Loss只影響 Query ,不更新key。

2.4 代碼流程

3. SimCLR
論文標題:A Simple Framework for Contrastive Learning of Visual Representations
論文鏈接:https://arxiv.org/abs/2002.05709
代碼鏈接:https://github.com/google-research/simclr
寫在前面
由於最近開始在看對比學習的一些相關工作,想把學到的東西記錄一下。本文前半部分基於Ankesh Anand關於Contrastive Learning的blog中的內容,想看原文的可以移步下面鏈接:
在學習的過程中也參考了下面兩篇文章:
好的,下面正式開始~
自監督學習
要說到對比學習,首先要從自監督學習開始講起。自監督學習屬於無監督學習范式的一種,特點是不需要人工標注的類別標簽信息,直接利用數據本身作為監督信息,來學習樣本數據的特征表達,並用於下游任務。
那么,自監督學習有什么優勢呢?
目前機器學習主流的方法大多是監督學習方法,這類方法依賴人工標注的標簽,這會帶來一些缺陷:
- 數據本身提供的信息遠比稀疏的標簽更加豐富,因此使用有監督學習方法訓練模型需要大量的標簽數據,並且得到的模型有時候是“脆弱”的
- 有監督學習通過標簽訓練得到的模型往往只能學到一些任務特定的知識,而不能學習到一種通用的知識,因此有監督學習學到的特征表示難以遷移到其他任務
而自監督學習能夠很好地避免上面的問題,因為自監督學習直接使用數據本身來提供監督信息來指導學習。
自監督學習分類
當前自監督學習可以被大致分為兩類:
- Generative Methods
- Contrastive Methods
Generative Methods and Contrastive Methods
Generative Methods(生成式方法)這類方法以自編碼器為代表,主要關注pixel label的loss。舉例來說,在自編碼器中對數據樣本編碼成特征再解碼重構,這里認為重構的效果比較好則說明模型學到了比較好的特征表達,而重構的效果通過pixel label的loss來衡量。
Contrastive Methods(對比式方法)這類方法則是通過將數據分別與正例樣本和負例樣本在特征空間進行對比,來學習樣本的特征表示。Contrastive Methods主要的難點在於如何構造正負樣本。
那么,Contrastive Methods有什么優勢呢?
這里舉一個例子來說明,Epstein在2016年做了一個實驗:讓受試者畫出美元的圖像,越詳細越好,下圖是受試者畫出來的美元圖像。
左圖是受試者根據印象畫出來的美元,右圖則是讓受試者照着美元畫出來的。可以看到,左圖畫出來的美元圖雖然不夠詳細,但已經充分具備一張美元的判別性信息,因此我們可以把它識別成美元。事實上,我們並不需要見到一張美元所有詳細的信息,而僅僅通過一些關鍵的特征就可以識別出來。
同理,相比起Generative Methods需要對像素細節進行重構來學習到樣本特征,Contrastive Methods只需要在特征空間上學習到區分性。因此Contrastive Methods不會過分關注像素細節,而能夠關注抽象的語義信息,並且相比於像素級別的重構,優化也變得更加簡單。
對比學習一般泛式
對任意數據 ,對比學習的目標是學習一個編碼器
使得:
其中 是和
相似的正樣本,
是和
不相似的負樣本,score是一個度量函數來衡量樣本間的相似度。
如果用向量內積來計算兩個樣本的相似度,則對比學習的損失函數可以表示成:
其中對應樣本 有1個樣本和N-1個負樣本。可以發現,這個形式類似於交叉熵損失函數,學習的目標就是讓
的特征和正樣本的特征更相似,同時和N-1個負樣本的特征更不相似。在對比學習的相關文獻中把這一損失函數稱作InfoNCE損失。也有一些其他的工作把這一損失函數稱為multi-class n-pair loss或者ranking-based NCE。
對比學習相關論文
更新中