1. 程式人生 > 其它 >對比學習(Contrastive Learning)綜述——無監督學習+特徵抽象,損失函式:同類儘可能近,不同類儘可能遠,思想和聚類類似

對比學習(Contrastive Learning)綜述——無監督學習+特徵抽象,損失函式:同類儘可能近,不同類儘可能遠,思想和聚類類似

寫在前面

由於最近開始在看對比學習的一些相關工作,想把學到的東西記錄一下。本文前半部分基於Ankesh Anand關於Contrastive Learning的blog中的內容,想看原文的可以移步下面連結:

Contrastive Self-Supervised Learning​ankeshanand.com/blog/2020/01/26/contrative-self-supervised-learning.html

在學習的過程中也參考了下面兩篇文章:

小謝:一文詳解最近異常火熱的self-supervised learning84 贊同 · 1 評論文章 OUC信院科研狗:Contrastive self-supervised learning​zhuanlan.zhihu.com/p/104384194?utm_source=zhihu

好的,下面正式開始~

自監督學習

要說到對比學習,首先要從自監督學習開始講起。自監督學習屬於無監督學習正規化的一種,特點是不需要人工標註的類別標籤資訊,直接利用資料本身作為監督資訊,來學習樣本資料的特徵表達,並用於下游任務。

那麼,自監督學習有什麼優勢呢?

目前機器學習主流的方法大多是監督學習方法,這類方法依賴人工標註的標籤,這會帶來一些缺陷:

  • 資料本身提供的資訊遠比稀疏的標籤更加豐富,因此使用有監督學習方法訓練模型需要大量的標籤資料,並且得到的模型有時候是“脆弱”的
  • 有監督學習通過標籤訓練得到的模型往往只能學到一些任務特定的知識,而不能學習到一種通用的知識,因此有監督學習學到的特徵表示難以遷移到其他任務

而自監督學習能夠很好地避免上面的問題,因為自監督學習直接使用資料本身來提供監督資訊來指導學習。

自監督學習分類

當前自監督學習可以被大致分為兩類:

  1. Generative Methods
  2. 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

對比學習相關論文

更新中

對比學習(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. 聚類思想

在這裡,我們將之前的想法進行抽象,用空間考慮對比學習。

最終目標:

縮小與正樣本間的距離,擴大與負樣本間的距離,使正樣本與錨點的距離遠遠小於負樣本與錨點的距離,(或使正樣本與錨點的相似度遠遠大於負樣本與錨點的相似度),從而達到他們間原有空間分佈的真實距離。

  • 丈量二者距離:歐幾里得距離,餘弦相似度,馬氏距離(沒人試過,但原理是一樣的)
  • 目標:給定錨點,通過空間變換,使得錨點與正樣本間距離儘可能小,與負樣本距離儘可能大

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

論文連結:

程式碼連結:

很多時候,很多資料維度高、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個均是負樣本(噪聲樣本)來自於 ,即隨機選取的訊號片段。

損失函式定義如下:【 可自由定義,甚至為MLP】

我們用softmax的思路來理解這個損失函式,  越大,應該越接近於0(越接近最大值),而損失就越小。

回到對比學習的思想,W將做c到z的對映,  均經過歸一化,那麼,二者餘弦相似度為  ,這樣  ,即可看做softmax,將  正樣本的值加大,負樣本值縮小。

2. MoCo

論文標題:Momentum Contrast for Unsupervised Visual Representation Learning

論文來源:CVPR 2020

論文連結:

程式碼連結:

本文提出了高效的對比學習的結構。使用基於 MoCo 的無監督學習結構學習到的特徵用於 ImageNet 分類可以超過監督學習的效能。證明了無監督學習擁有巨大的潛力。

受NLP任務的啟發,MOCO將圖片資料分別編碼成查詢向量和鍵向量,即,查詢 q 與鍵佇列 ,佇列包含單個正樣本和多個負樣本。通過 對比損失來學習特徵表示。

主線依舊是不變的:在訓練過程中儘量提高每個查詢向量與自己相對應的鍵向量的相似度,同時降低與其他圖片的鍵向量的相似度。

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

論文連結:

程式碼連結: