1、多任務學習導引
多任務學習是機器學習中的一個分支,按1997年綜述論文Multi-task Learning一文的定義:Multitask Learning (MTL) is an inductive transfer mechanism whose principle goal is to improve generalization performance. MTL improves generalization by leveraging the domain-specific information contained in the training signals of related tasks. It does this by training tasks in parallel while using a shared representation。翻譯成中文:多任務學習是一種歸納遷移機制,基本目標是提高泛化性能。多任務學習通過相關任務訓練信號中的領域特定信息來提高泛化能力,利用共享表示采用並行訓練的方法學習多個任務。
顧名思義,多任務學習是一種同時學習多個任務的機器學習方法,如圖1所示,多任務學習同時學習了人類和狗的分類器以及男性和女性的性別分類器。
進一步的,圖2所示為單任務學習和多任務學習的對比。在單任務學習中,每個任務采用單獨的數據源,分別學習每個任務單獨的模型。而多任務學習中,多個數據源采用共享表示同時學習多個子任務模型。
多任務學習的基本假設是多個任務之間具有相關性,因此能夠利用任務之間的相關性互相促進。例如,屬性分類中,抹口紅和戴耳環有一定的相關性,單獨訓練的時候是無法利用這些信息,多任務學習則可以利用任務相關性聯合提高多個屬性分類的精度,詳情可參考文章Maryland大學Hand等人的論文Attributes for Improved Attributes: A Multi-Task Network for Attribute Classification。
2、多任務深度學習
近年來,在深度學習技術的推動下計算機視覺領域取得了突飛猛進的進展。本質上說,深度學習是多層的神經網絡,對輸入進行了層級的非線性表示,來自網絡可視化的證據表明,深度網絡的層級表示從語義上從底層到高層不斷遞進。深度網絡強大的表示能力,使得多任務深度學習有了施展的空間。圖3所示為多任務深度網絡結構示意圖。Input x表示不同任務的輸入數據,綠色部分表示不同任務之間共享的層,紫色表示每個任務特定的層,Task x表示不同任務對應的損失函數層。在多任務深度網絡中,低層次語義信息的共享有助於減少計算量,同時共享表示層可以使得幾個有共性的任務更好的結合相關性信息,任務特定層則可以單獨建模任務特定的信息,實現共享信息和任務特定信息的統一。
在深度網絡中,多任務的語義信息還可以從不同的層次輸出,例如GoogLeNet中的兩個輔助損失層。另外一個例子比如衣服圖像檢索系統,顏色這類的信息可以從較淺層的時候就進行輸出判斷,而衣服的樣式風格這類的信息,更接近高層語義,需要從更高的層次進行輸出,這里的輸出指的是每個任務對應的損失層的前一層。
3、多任務深度學習應用案例
目前,多任務深度學習已經廣泛應用於人臉識別、細粒度車輛分類、面部關鍵點定位與屬性分類等多個領域,以下講介紹其中的代表性論文。
3.1人臉識別網絡 DeepID2
香港中文大學湯曉鷗組發表在NIPS14的論文Deep Learning Face Representation by Joint Identification-Verification,提出了一種聯合訓練人臉確認損失和人臉分類損失的多任務人臉識別網絡DeepID2,網絡結構如下圖所示:
DeepID2中共有兩個損失函數,分別為人臉分類損失函數,對應於Caffe中的SoftmaxLoss:
另外一個是人臉確認損失函數,對應於Caffe中的Contrastive Loss:
3.2細粒度車輛分類網絡
這里介紹一個比較有趣的將SoftmaxLoss和TripletLoss結合在一個網絡中進行多任務訓練的方法Embedding Label Structures for Fine-Grained Feature Representation,目前文章發表於arXiv。作者將這個網絡用於細粒度車輛分類上,提醒注意的是為了計算Tiplet Loss,特征進行了L2范數歸一操作,網絡結構如下圖所示:
3.3物體檢測網絡Faster R-CNN
在物體檢測網絡Faster R-CNN中也有多任務學習的應用。Faster R-CNN的網絡結構如下圖6所示,包含兩個任務,分別為窗口回歸和窗口分類,其中RPN模塊的卷積層在兩個任務之間共享。Faster R-CNN的最新版本支持整體端到端訓練,可以同時檢測多類物體,是目前最具代表性的目標檢測框架,同時也是多任務深度學習的一個典型應用。
3.4面部關鍵點定位與屬性分類網絡TCDCN
面部關鍵點估計和頭部姿態以及人臉屬性(是否戴眼鏡、是否微笑和性別)之間有着緊密的聯系,香港中文大學湯曉鷗組發表於ECCV14的工作Facial Landmark Detection by Deep Multi-task Learning利用多任務學習方法聯合進行人臉面部關鍵點定位和屬性預測,網絡結構如下圖7所示。
4、基於Caffe實現多任務學習的小樣例
本節在目前廣泛使用的深度學習開源框架Caffe的基礎上實現多任務深度學習算法所需的多維標簽輸入。默認的,Caffe中的Data層只支持單維標簽,為了支持多維標簽,首先修改Caffe中的convert_imageset.cpp以支持多標簽:
這樣我們就有了多任務的深度學習的基礎部分數據輸入。為了向上兼容Caffe框架,本文摒棄了部分開源實現增加Data層標簽維度選項並修改Data層代碼的做法,直接使用兩個Data層將數據讀入,即分別讀入數據和多維標簽,接下來介紹對應的網絡結構文件prototxt的修改,注意紅色的注釋部分。
特別的,slice層對多維的標簽進行了切分,為每個任務輸出了單獨的標簽。
另外一個值得討論的是每個任務的權重設置,在本文實踐中五個任務設置為等權重loss_weight:0.2。一般的,建議所有任務的權重值相加為1,如果這個數值不設置,可能會導致網絡收斂不穩定,這是因為多任務學習中對不同任務的梯度進行累加,導致梯度過大,甚至可能引發參數溢出錯誤導致網絡訓練失敗。
本文的完整代碼可在作者個人的github主頁下載:
CodeSnap/convert_multilabel.cpp at master · HolidayXue/CodeSnap · GitHub
多任務損失函數層的網絡結構示意圖如下圖所示:
5. 總結
本文回顧了多任務學習的基本概念,並討論了多任務深度學習的基本思想和應用案例。最后以開源深度學習平台Caffe為例討論了多任務深度學習的實現,並給出了開源代碼。
致謝
本文在投稿之后經歷了三輪修改,其中一輪公眾號編輯部初審,一輪雙盲評審大改和一輪單盲評審小修,兩名審稿專家對原文進行了全面仔細的閱讀,幫助作者修正了文章的若干理論表述,給出了建設性的提高可讀性的修改意見。在此本文作者對全體審稿人表示感謝,並對深度學習大講堂公眾號編輯部耐心細致的審稿服務表示感謝。
作者:薛雲峰,(https://github.com/HolidayXue),主要從事視頻圖像算法的研究,就職於浙江捷尚視覺科技股份有限公司擔任深度學習算法研究員。捷尚致力於視頻大數據和視頻監控智能化,現誠招業內算法和工程技術人才,招聘主頁http://www.icarevision.cn/job.php,聯系郵箱:hr@icarevision.cn