編輯:鵬飛
【新智元導讀】自然的場景理解是一項艱巨的任務。任務複雜多樣,不同方法各有各的專用訓練代碼,難以結合、復用和改進。評價方案不統一,不同的方法難以在公平環境下對比;動輒百萬千萬的訓練數據量,訓練效率是個大問題。港中文MMLab開源自監督表徵學習代碼庫OpenSelfSup,號稱「一行命令跑評測」,並在各大Benchmark上驗證了復現結果。香港中文大學近年來在機器學習方面的成就,甚至蓋過了大部分的理工科院校,這一點厲害了。尤其是在自監督學習方面,不知不覺的就走在了學術研究的前排。
最近,港中文MMLab開源自監督表徵學習代碼庫OpenSelfSup,號稱「一行命令跑評測」,並在各大Benchmark上驗證了復現結果。
OpenSelfSup 使用 PyTorch 實現,支持基於分類、重建、聚類、memory bank、contrastive learning 的多種自監督學習框架。目前收錄了 Relative Location、Rotation Prediction、DeepCluster、OnlineDeepCluster、NPID、MoCo、SimCLR 等一系列表現較好的自監督表徵學習方法,後續還將陸續跟進學術界最新算法。
OpenSelfSup推出後受到不少人關注,但也有不少人對如何上手這個代碼庫表示有一些疑惑。新智元邀請香港中文大學多媒體實驗室的詹曉航博士,為我們解讀關於自監督學習的歸納、思考和展望。
自監督學習是指用於機器學習的標註(ground truth)源於數據本身,而非來自人工標註。如下圖,自監督學習首先屬於無監督學習,因此其學習的目標無需人工標註。其次,目前的自監督學習領域可大致分為兩個分支。
第一個是用於解決特定任務的自監督學習,例如上次討論的場景去遮擋,以及自監督的深度估計、光流估計、圖像關聯點匹配等。另一個分支則用於表徵學習。有監督的表徵學習,一個典型的例子是ImageNet分類。而無監督的表徵學習中,最主要的方法則是自監督學習。典型的方法包括:解決Jigsaw Puzzles、運動傳播、旋轉預測,以及最近很火的MoCo等等。
圖一,自監督學習和其他學習類型的關係
判斷一個工作是否屬於自監督學習,除了無需人工標註這個標準之外,還有一個重要標準,就是是否學到了新的知識。舉個簡單的例子,例如image inpainting是否屬於自監督學習?
如果一篇image inpainting的論文,其主要目的是提升inpainting的效果,那麼它就不屬於自監督學習,雖然它無需額外標註。但是如果它的目的是藉助inpainting這個任務來學習圖像的特徵表達,那麼它就是自監督學習(參考論文:Context Encoders)。
如下圖,以自監督表徵學習為例,我們通常需要設計一個自監督的proxy task,我們期望在解決這個proxy task的過程中,CNN能學到一些圖像高級的語義信息。然後我們將訓練好的CNN遷移到其他目標任務,例如圖像語義分割、物體檢測等等。
圖二,典型的自監督表徵學習流程
那麼,自監督的proxy task有哪些呢?如下圖,第一行中的思路是將圖像以某種方式破壞,然後用神經網絡來學習恢復原圖的過程。然而,將圖像破壞,可能帶來預訓練的domain和目標任務domain不一致的問題。而第二行中的proxy tasks則無需破壞原圖,因此避免了domain的問題。第三行中的方法是利用運動信息等多模態信息來學習圖像特徵。當然除了圖中這些例子之外,還有各種各樣其他有趣的自監督任務。
圖三,自監督proxy tasks的例子
1. 先驗
我們的世界是在嚴格的物理、生物規則下運行的,那麼對這個世界的觀測結果(圖像)也必然存在一些先驗規律。例如圖像上色任務,就是利用了物體類別和物體顏色分布之間的關聯;image inpainting,則是利用了物體類別和形狀紋理之間的關聯;旋轉預測任務,利用了物體類別和其朝向之間的關聯。通過挖掘更多的先驗,我們也能設計自己的自監督學習任務。
那麼什麼樣的先驗更有效呢?結論是,低熵的先驗。如下圖,左邊的運動預測任務(ICCV 2015: Dense Optical Flow Prediction From a Static Image) ,是從單張圖片中直接預測運動場,其利用的先驗是物體的運動傾向性。
而運動傾向性是比較歧義的,例如人在半蹲狀態,難以預測下一時刻會站起來還是繼續下蹲。因而,運動傾向性是一個高熵的先驗。而右圖的運動傳播任務(CVPR 2019: Self-Supervised Learning via Conditional Motion Propagation),從給定的稀疏運動來恢復完整運動場,利用的則是物體的運動學屬性先驗。
運動學屬性,例如頭部是剛體,四肢是鉸接體等,是較為確定的先驗,那麼這就是一個低熵的先驗。從實驗結果也可以發現,在transfer到分割任務上,運動傳播比運動預測更好。
圖四,運動預測和運動傳播的對比
2. 連貫性
圖片具有空間連貫性,視頻具有時空連貫性。那麼就可以利用這些特點來設計自監督任務。如下圖:
圖五,利用數據空間、時間連貫性的自監督任務
3. 數據內部結構
目前很火的基於contrastive learning的方法,我們可以將它們統一為instance discrimination任務。如下圖,這類任務通常對圖片做各種變換,然後優化目標是同一張圖片的不同變換在特徵空間中儘量接近,不同圖片在特徵空間中儘量遠離。
圖六,instance discrimination任務
對於這類任務,下圖提供了兩種可能的優化後的特徵空間。這兩種結果都是符合instance discrimination優化目標的,即同一張圖片的不同變換在特徵空間中儘量接近,不同圖片在特徵空間中儘量遠離。
然而,我們發現,實際的優化結果更偏向於第二種而非第一種,也就是說,雖然我們在解決instance discrimination的過程中並沒有用的物體的類別標籤,但是在優化後的特徵空間中,同類的物體還是相對能夠靠攏。這就證明了,數據之間是具有結構性和關聯性的。Instance discrimination則是巧妙地利用了這種結構性和關聯性。
圖七,instance discrimination的兩種可能的優化後的特徵空間
1.捷徑(shortcuts)
以jigsaw puzzles為例,如下圖,如果我們讓劃分的patch之間緊密挨著,那麼神經網絡只需要判斷patch的邊緣是否具有連續性,就可以判斷patch的相對位置,而不需要學到高級的物體語義信息。這就是一種捷徑,我們在設計任務的過程中需要避免這樣的捷徑。
圖八,解決jigsaw puzzles時,patch之間不能緊密挨著
避免的方式也很簡單,我們只需要讓patch之間產生一些隨機的間隔就行,如下圖。
圖9,讓patch之間產生隨機間隔
Solving jigsaw puzzles的其他捷徑還包括色差、彗差、畸變、暗角等可以指示patch在圖像中的相對位置的信息。解決方案除了想辦法消除這些畸變外,還可以讓patch儘量靠近圖像中心。
圖10,色差、彗差、畸變、暗角等可利用的捷徑
2.歧義性(Ambiguity)
大多數利用先驗來設計的自監督任務都會面臨歧義性問題。例如colorization中,一種物體的顏色可能是多種多樣的,那麼從灰度圖恢復顏色這個過程就具有ambiguity;再例如在rotation prediction中,有的物體並沒有一個通常的朝向(例如俯拍放在桌上的圓盤子)。有不少已有工作在專門解決特定任務的歧義性問題,例如CVPR 2019的Self-Supervised Representation Learning by Rotation Feature Decoupling。另外就是設計低熵的先驗,因為低熵的先驗也具有較低的歧義性。
3.任務難度
圖11,solving jigsaw puzzles中的不同難度
神經網絡就像一個小孩,如果給他太簡單的任務,他學不到有用的知識,如果給他太難的任務,他可能直接就放棄了。設計合理的難度也是一個需要考慮的方面。
如何上手?OpenSelfSup: 通用的自監督表徵學習代碼庫上手自監督學習是一件非常有難度的事情,主要體現在3個方面:
由於自監督學習任務複雜多樣,不同方法各有各的專用訓練代碼,難以結合、復用和改進
評價方案不統一,不同的方法難以在公平環境下對比
動輒百萬千萬的訓練數據量,訓練效率是個大問題
針對這些問題,香港中文大學多媒體實驗室和南洋理工大學開源了一套通用的自監督學習代碼庫,連結如下:
https://github.com/open-mmlab/OpenSelfSup
1.統一的框架
這套代碼庫設計了一個統一的代碼框架,支持基於分類、重建、聚類、memory bank、contrastive learning的多種自監督學習模式,目前收錄了Relative Location, Rotation Prediction, DeepCluster, OnlineDeepCluster, NPID, MoCo, SimCLR等一系列表現較好的自監督表徵學習方法。
2.標準化的評測方案
OpenSelfSup目前支持ImageNet/Place205 Linear Classification, ImageNet Semi-Supervised Classification, PASCAL VOC07 Linear SVM, PASCAL VOC / COCO Object Detection等多個標準的評測方案。
3.高效率的分布式訓練
OpenSelfSup中收錄的算法全部都實現了多機多卡的分布式訓練。
4.容易上手
環境配置,數據配置都有from scratch的腳本或者詳細的指導,簡單易行。訓練和測試現有算法,都只需要一行命令搞定。
5.模塊化設計:高度靈活性和可擴展性
OpenSelfSup用config文件來定義各種參數和模塊,方便參數調節和模塊修改。採用高度模塊化的設計,使得開發自己的自監督學習算法變得非常方便。
config中還支持一些較複雜的調整,比如data augmentation的組合、learning rate schedule、獨立調整某些網絡參數的優化參數等。例如,你希望單獨調整head中fully-connected layer的momentum和learning rate,或者backbone中某幾層的weight decay等等,可以在config中optimizer: paramwise_option下用正則表達式篩選出對應網絡參數然後指定這些值,而不需要改動代碼。如下是DeepCluster中指定head (fc layer)的momentum為0的設置。
具體介紹,可參考:
https://zhuanlan.zhihu.com/p/148782886
這個總結主要基於自己的思考,也許不一定非常到位,權當拋磚引玉。最後,希望大家都能夠設計出有趣又有用的自監督學習任務,為這個領域添磚加瓦。
本文的作者詹曉航,本科畢業於清華大學,目前是香港中文大學多媒體實驗室三年級博士生,指導老師是Chen Change Loy、林達華和湯曉鷗教授。
曾在CVPR、ECCV等計算機視覺頂級會議上發表論文十餘篇,包括五篇第一作者論文。另外曾獲國家獎學金、清華大學本科優秀畢業生、Hong Kong PhD Fellowship、Facebook自監督學習挑戰賽冠軍等榮譽。
他的博士期間主要研究方向為無監督學習,具體工作涵蓋人臉聚類、自監督場景理解、無監督表徵學習等。
個人主頁:
https://xiaohangzhan.github.io/