1. 程式人生 > 其它 >Self-Supervised Learning

Self-Supervised Learning

Self-Supervised Learning

參考知乎文章:https://zhuanlan.zhihu.com/p/108906502(Self-supervised Learning 再次入門)

自監督學習主要是利用輔助任務(pretext)從大規模的無監督資料中挖掘自身的監督資訊,通過這種構造的監督資訊對網路進行訓練,從而可以學習到對下游任務有價值的表徵。首先從大量的無標籤資料中通過 pretext 來訓練網路,得到預訓練的模型,然後對於新的下游任務,和監督學習一樣,遷移學習到的引數後微調即可。

自監督學習是一種表徵學習。

自監督學習的方法主要可以分為 3 類:1. 基於上下文(Context based) 2. 基於時序(Temporal Based)3. 基於對比(Contrastive Based)

一、基於上下文(Context Based)

(一)Unsupervised Visual Representation Learning by Context Prediction【ICCV_2015】

利用預測圖片不同部分的位置關係,這一基於上下文(context based)的輔助任務,來學習得到可以提取目標語義特徵的網路。

具體來說,首先把一張圖片分割成幾個patch,然後從中選擇一對patch(相鄰的兩個),輸入網路,輸出為第二個patch相對於第一個patch的位置,如圖中所示。網路如下面第二張圖所示,我們的目的是獲得關於輸入圖片的特徵,而不是當前網路的預測結果(這只是一個輔助任務)訓練完網路後,f6層就可以得到輸入圖片的語義特徵,我們去除掉最後合併的層以及輸出層,剩下的兩個stack從中選擇一個(兩個是一樣的),將它作為預訓練模型,可以應用到影象分類、目標檢測等許多的任務中。

(二)Context Encoders: Feature Learning by Inpainting【CVPR 2016】

通常人們可以通過理解一整幅影象的語義並聯系影象中圖案的結構來補全一個詮釋的影象,本文利用填充圖片中缺失部分這一輔助任務來訓練模型,旨在讓模型理解影象的語義和結構,來獲取能夠提取圖片特徵的網路。

本文的模型結構上仿照了Autoencoder的結構,由encoder和decoder兩部分,如下圖所示。encoder部分輸入一張有殘缺的圖片(殘缺的方式有很多種,如下面第二幅圖所示,論文中都有分別做嘗試),通過encoder提取特徵得到feature map,通過通道內部的全連線操作接入到decoder裡面,預測輸出殘缺的部分影象。PS:文中用mask遮罩的方式來處理圖片,區分是否是殘缺部分。

二、基於時序(Temporal Based)

多在自然語言處理和視訊領域使用。

三、基於對比(Contrastive Based)

(一)Momentum Contrast for Unsupervised Visual Representation Learning(CVPR 2020)

參考文章:https://zhuanlan.zhihu.com/p/364446773(何凱明新作MoCo V3!!!探討一下它的前世與今生)

文章介紹瞭如何用對比學習去無監督地學習視覺的表徵,並提出一種通用的基於對比學習的增量學習方法。

先考慮一個任務,現在有兩個圖片,圖片1和圖片2。先在圖片1中隨機截出兩個patch,記作A,B,在圖片2中截出一個patch記作C,現在把B和C放到樣本庫裡面,樣本庫圖片的位置隨機打亂,然後以A作為查詢的物件,讓你從樣本庫中找到與A對應的圖片。如下圖所示。

A通過encoder1編碼為向量q,接著B、C經過encoder2編碼為k1和k2,如下圖所示。q和k1算相似度得到S1,q和k2算相似度得到S2。我們的目的是想要讓機器學出來A和B是一類(關聯性強),而其它不是(關聯性弱)。

我們知道A和B是同一張圖截出來的,而C不是,因此我們希望S1(A和B的相似度)儘可能高而S2(A和C的相似度)儘可能低。為了做到這一點我們需要把B打上是正類的標籤,把C打上是負類的標籤,概括性講就是同一張圖片截出來的patch彼此為正類,不同的圖片截出來的記為負類。這種方式只需要設定一個規則,然後讓機器自動去打上標籤,然後基於這些自動打上的標籤去學習,無需人工標註。簡單來說這篇論文就是通過這種方式,不需要藉助手工標註去學習視覺表徵

文中提到的MoCo是通過構建一個動態的負類佇列來進行對比學習,依舊通過上面的例子來說,一般要學到好的表徵需要比較多的負類樣本,而不像是上面只有C一個負類樣本,但是由於計算資源限制又不能加入太多的負類樣本,並且我們也不希望負類樣本是一成不變的,因此就有了“dynamic dictionary with a queue”。下面是論文中的結構示意圖:

xquery就是要查詢的物件。xkey是被查詢的物件(包含正樣本和負樣本)。encoder是一個任意的神經網路,論文中使用的是ResNet,encoder部分的引數是通過反向傳播來計算的。momentum encoder論文中提到可以與encoder完全相同、部分相同、不相同都可以,momentum encoder的引數更新是論文的一個創新點,不直接通過反向傳播來訓練的,而是動量更新,更新的表示式如下:

θk是右邊encoder的引數,m預設設為0.999,θq是左邊編碼query的encoder,θq通過反向傳播來更新,θk則是通過θq動量更新。為什麼採用這樣的方式來更新?論文給出的解釋是θk直接通過反向傳播來更新的效果並不好,因為θk快速的變化會導致key的表徵不穩定,但是動量更新很好地解決了這個問題。

contrastive loss的計算有很多不同的形式,論文中的損失函式如下:

下面是整個的演算法流程: