遷移學習全面指南:概念、應用、優勢、挑戰
作者:Dipanjan (DJ) Sarkar
編譯:weakish
導言
人類具備在任務間遷移知識的內在能力。我們在學習一件任務時獲取的知識,可以用來解決相關任務。任務越是相關,我們遷移(交叉應用我們的知識)起來就越容易。一些簡單的例子:
- 知道如何騎自行車,學習如何開車。
- 知道如何彈奏古典鋼琴,學習如何彈奏爵士鋼琴。
- 知道數學和統計學,學習機器學習。

在上面每個場景中,我們試圖學習新的方面和新的主題時都不用一切從頭學起。我們遷移和利用過去學到的知識!
目前而言,傳統機器學習和深度學習演算法傳統上是設計用於獨立工作的。這些演算法被訓練來解決特定任務。一旦特徵空間分佈改變,模型需要從頭開始。遷移學習的想法是超越這一孤立學習正規化,利用從一項任務中獲取的知識解決相關的任務。在這篇文章中,我們將全面介紹這些概念以及遷移學習的真實世界應用,甚至還將展示一些可以上手的例子。具體而言,我們將介紹以下內容:
- 遷移學習的動機
- 理解遷移學習
- 遷移學習策略
- 用於深度學習的遷移學習
- 深度遷移學習策略
- 深度遷移學習型別
- 遷移學習應用
- 案例研究一:資料可用性限制下的影象分類
- 案例研究二:大量分類、少量可用資料情況下的多類細粒度影象分類
- 遷移學習優勢
- 遷移學習挑戰
- 結語和後續預告
我們將介紹一般高層概念意義上的遷移學習(機器學習和統計建模的時代就有這一概念),不過,本文將重點介紹深度學習。
注意:這裡的案例研究將包括逐步的細節(程式碼和輸出),這些都是基於實際的試驗得到。我們在編寫Hands on Transfer Learning with Python一書(詳見文末)的過程中實現並測試了這些模型。
網上關於遷移學習的資訊極多,本文的目標是在介紹理論概念的同時演示可供實際上手的深度學習應用的例子。所有的例子均基於keras框架(tensorflow後端),這個框架既適合老手,也適合剛開始深度學習的人!對PyTorch感興趣?歡迎轉換這些例子,並聯系我,我會在這裡和GitHub上列出你的工作。
遷移學習的動機
我們已經簡單討論了人類並不從頭學習每件事情,而能遷移之前領域所學至新領域和任務。由於真通用人工智慧的一時狂熱,資料科學家和研究人員相信遷移學習可以進一步推動AGI。事實上,著名教授和資料科學家吳恩達(涉及Google Brain、百度、斯坦福、Coursera)在NIPS 2016上給過一個超棒的演講,Nuts and bolts of building AI applications using Deep Learning,其中他提到:
監督學習之後——遷移學習將是ML商業成功的下一個驅動者。
我推薦感興趣的讀者觀看他在NIPS 2016上講的有趣教程:
ofollow,noindex"> https:// youtu.be/wjqaz6m42wU
如訪問YouTube遇到問題,可在論智公眾號(ID: jqr_AI)留言AndrewNg獲取下載地址。
事實上,遷移學習不是21世紀10年代才出現的概念。NIPS 1995工作坊Learning to Learn: Knowledge Consolidation and Transfer in Inductive Systems被認為提供了這一領域研究的初始動機。至此以後,Learining to Learn(元學習)、Knowledge Consolidation(知識鞏固)、Inductive Transfer(推導遷移)和遷移學習(transfer searning)可以互換使用。一如既往,不同的研究人員和學術文字基於不同的上下文給出了不同的定義。Goodfellow等所著知名的《Deep Learning》(深度學習)一書,在討論概括性的上下文環境中提到了遷移學習。他們的定義如下:
利用一種設定下已經學到的情況,以提升另一設定的概括性。
因此,遷移學習的關鍵動機,特別是考慮深度學習這一上下文,在於大多數解決複雜問題的模型需要大量資料,然而,考慮到標註資料點所需的時間和精力,監督模型獲取大量標註資料可能真的很困難。一個簡單的例子是ImageNet資料集,其中包括幾百萬張預訓練為不同類別的影象,感謝斯坦福多年來的艱辛努力!

然而,在每個領域中獲得這樣的資料集很難。此外,大多數深度學習模型為一個具體領域甚至一項特定任務專門化,儘管這些也許是當前最佳模型,精確性非常高,戰勝了一切基準,但僅僅是在一些特定資料集上如此。用於新任務時,這些模型的表現會有顯著下降,而新任務也許仍和訓練模型的任務相似。這形成了遷移學習的動機,超越特定任務和領域,試圖找到一種方法,利用從預訓練模型中取得的知識解決新問題!
理解遷移學習
首先,遷移學習並不是一個深度學習特定的新概念。它在構建、訓練機器模型的傳統方法,和使用遵循遷移學習原則的方法論之間,有著鮮明的不同。

傳統方法是孤立的,純粹基於特定任務、資料集訓練孤立模型。沒有保留可以從一個模型遷移到另一個模型的任何知識。在遷移學習中,你可以利用之前訓練的模型中得到知識(特徵、權重等),訓練新模型,甚至可以應對新任務資料較少的問題。
讓我們通過一個例子更好地理解前面的解釋。假定我們的任務是識別影象中的物體(領域限定為餐館)。我們將這一任務記為T1。給定這一任務的資料集,我們訓練一個模型,並加以除錯,使其在相同領域(餐館)的未見資料點上表現良好(推廣)。當我們不具備給定領域任務所需的足夠訓練樣本時,傳統的監督ML演算法無法工作。假定我們現在需要檢測公園或咖啡館影象中的物體(記為T2)。理想情況下,我們應該能夠應用為T1訓練的模型,但在現實中,我們會面臨表現退化和模型概括性不好的問題。這背後有多種原因,大多數情況下可以歸納為模型在訓練資料和領域上的偏差。
遷移學習應該讓我們可以利用之前學習任務所得的知識,並應用於新的相關任務。如果我們在任務T1上明顯有更多資料,我們可以利用其所學,並推廣這一知識(特徵、權重)至任務T2(明顯資料更少)。在計算機視覺領域,邊緣、形狀、角落、亮度之類特定的低層特徵可以在任務間分享,從而使得任務間的知識遷移成為可能!同樣,如同之前圖中所示,在學習新的目標任務時,現有任務中的知識可以作為額外輸入。
形式化定義
現在讓我們看下遷移學習的形式化定義,再用它來理解不同的策略。Pan和Yang的論文A Survey on Transfer Learning(遷移學習調研)使用領域、任務、邊緣概率表示用來理解遷移學習的框架。該框架定義如下:
領域 D 定義為由特徵空間 和邊緣概率 P(X) 組成的雙元素元組,其中 X 是樣本資料點。因此,在數學上,我們可以將該領域表示為 D = { , P(X)} 。 xi 表示 內的一個特徵向量。
另一方面,任務T可以定義為由標籤空間 γ 和目標函式 η 組成的雙元素元組。就概率學的角度而言,目標函式也可記為 P(γ|X) 。
基於以上定義和表示,我們可以如此定義遷移學習:
給定源領域 DS 、相應的源任務 TS ,及目標領域 DT 和目標任務 TT ,遷移學習的目標是讓我們基於 DS 和 TS 中所得的資訊學習 DT 中的目標條件概率分佈 P(YT|XT) ,且 DS ≠ DT 或 TS ≠ TT 。在大多數情形下,我們假定可以得到的標註目標樣本的數目有限,比標註源樣本要指數級地少。
以上定義摘自Sebastian Ruder的文章: http:// ruder.io/transfer-learn ing/
場景
根據之前的定義,現在讓我們看下遷移學習的典型場景:
- S ≠ ** T** 源領域和目標領域的特徵空間不一樣,例如,用兩種語言書寫的文件。
- P(XS) ≠ P(XT) 源領域和目標領域的邊緣概率分佈不一樣,例如,討論不同主題的文件。
- S ≠ T 兩個任務的標籤空間不一樣,例如,目標任務中給文件分配另一套不同於源任務的標籤。在實踐中,這個場景往往和下一個場景同時發生,這是因為,兩個不同的任務有不同的標籤空間,卻有完全一致的條件概率分佈,這種情況極為罕見。
- P(YS|XS) ≠ P(YT|XT) 源任務和目標任務的條件概率分佈不一樣,例如,源文件和目標文件的分類不均衡。實踐中這一場景相當常見,過取樣、欠取樣、SMOTE之類的方法在該場景下應用廣泛。

關鍵點
在遷移學習的過程中,必須回答下面三個重要的問題:
- 遷移什麼: 這是整個過程的第一步,也是最重要的一步。我們需要分清哪部分知識是來源特定的,哪部分是來源和目標之間共享的。
- 何時遷移: 可能有些場景下遷移知識並不會改善表現,反而會使事情更糟(也稱為負遷移)。遷移學習的目標是改善目標任務的表現/結果,而不是劣化。我們需要小心什麼時候遷移,什麼時候不遷移。
- 如何遷移: 當我們搞明白遷移什麼還有何時遷移後,我們就可以進一步確定在領域/任務間實際遷移知識的方式了。本文後面的部分會詳細介紹這部分內容。
遷移學習策略
根據領域、任務、資料可用性,我們可以選擇不同的遷移策略和技術,詳見下圖(摘自我們之前提到的論文A Survey on Transfer Learning)。

我們可以從這張示意圖看到,遷移學習可以歸為三類:
- 歸納遷移學習 : 源領域和目標領域一致,而源任務和目標任務不同。取決於源領域是否包含標註資料,可以進一步劃分為兩個子類別:多工學習和自行學習。
- 無監督遷移學習 : 和歸納遷移學習一樣,領域一致,任務不同。只不過源領域和目標領域都沒有標註資料。
- 直推式遷移學習 : 源任務和目標任務相似,但相應的領域不同。源任務有大量標註資料,而目標領域沒有標註資料。這一類別可以進一步分為特徵空間不同和邊緣概率分佈不同兩種子類別。
下表總結了上面三個類別的不同點:

從遷移什麼的角度,遷移學習可以分為以下類別:
- 例項遷移 在目標任務中複用源領域的知識通常屬於理想場景。在大多數情形下,源領域資料無法直接複用。相反,源領域中的一些具體例項可以用來改進目標任務的結果。比如,Dai等提出AdaBoost擴充套件TrAdaBoost就屬於這一類。
- 特徵表示遷移 通過識別可以用於目標領域的良好特徵表示,最小化領域散度並降低誤差率。取決於標註資料的可用性,可以應用監督或無監督方法進行特徵表示遷移。
- 引數遷移 相關任務的模型可能共享一些引數或者超引數的先驗分佈。這和多工學習不同,多工學習同時學習源任務和目標任務,而在引數遷移中,我們可以對目標領域的損失函式應用額外的權重,以改善總體表現。
- 關係知識遷移 和上面三類不同,關係知識遷移試圖處理非IID(非獨立同分布)資料。例如,社交網路資料可以利用關係知識遷移技術。
下表總結了上述兩種分類系統之間的關係:

下面,我們將這些對遷移學習的理解應用於深度學習背景。
用於深度學習的遷移學習
DL下的深度學習
流言: 除非你的問題有一百萬標註資料,你無法進行深度學習。
現實
- 你可以從未標註資料學習有用的表示。
- 你可以基於易於生成標籤的相鄰的代理目標訓練。
- 你可以從相關任務遷移學習到的表示。
深度學習模型屬於歸納學習的代表。歸納學習演算法的目標是從一組訓練樣本中推斷出對映關係。例如,在分類情形下,模型學習輸入特徵到分類標籤之間的對映。這樣的學習器要想很好地推廣到未見資料上,它的演算法需要遵循和訓練資料分佈相關的一些假定。這些假定稱為歸納偏差。歸納偏差或假定可以通過多種因素體現,例如受限的假設空間,還有在假設空間中的搜尋過程。因此,這些偏差會影響給定任務和領域上的模型如何學習和學習什麼。
遷移學習:思路
不必為你的任務從頭訓練一個深度網路,相反,你可以:
- 選取一個在不同領域為不同的源任務訓練的網路
- 使其適應目標領域和目標任務。
變體:
- 領域相同,任務不同
- 領域不同,任務相同

歸納遷移學習利用源任務的偏差幫助完成目標任務。這可以通過不同方式實現,例如調整目標任務的歸納偏差,限制模型空間,收緊假設空間,調整搜尋過程本身。

歸納遷移之外,歸納學習演算法同樣利用貝葉斯和層次化遷移技術,幫助改善目標任務的學習和表現。
深度遷移學習策略
近年來,深度學習取得了顯著的進展,讓我們可以處理複雜問題,得到驚人結果。然而,深度學習系統所需的訓練時間和資料量比傳統ML系統要多得多。人們在計算機視覺和自然語言處理(NLP)等領域開發、測試了各種取得當前最優表現(有時和人類表現相當甚至超過人類表現)的深度學習網路。大多數情況下,開發者會分享這些網路的細節,供他人使用。這些預訓練網路/模型形成了深度學習環境中遷移學習(深度遷移學習)的基礎。讓我們看下深度遷移學習的兩種最流行的策略。
作為特徵提取器的現成預訓練模型
深度學習系統和模型屬於層疊架構,在不同層學習不同的特徵。接著這些層最後連線最終層(在監督學習情形下通常是一個全連線層)以得到最終輸出。這樣的層疊架構讓我們可以利用Inception V3或VGG之類的預訓練網路,去其最終層,將其作為固定的特徵提取器,用於其他任務。

這一想法的關鍵在於只使用預訓練模型的權重層提取特徵,在為新任務訓練新資料的時候不更新這些預訓練層。
例如,如果我們使用不帶最終分類層的AlexNet,它會基於其隱藏狀態幫助我們將新領域任務中的影象轉換為4096維的向量,從而讓我們可以利用源領域任務的知識,提取新領域任務的特徵。基於深度神經網路進行遷移學習時,這是使用最廣泛的方法之一。
現在你可能會產生一個疑問,在實踐中,這些預訓練的現成特徵提取器在不同任務上的表現如何?

毫無疑問,在現實世界任務中,這種做法效果真的很好。如果嫌上面的圖不夠清楚,那麼我們放大一下上圖右側的比較:

可以看到,在不同的計算機視覺任務中,預訓練模型的表現都非常出色。
微調現成預訓練模型
這裡我們並不僅僅替換最終的分類/迴歸層,同時還選擇性地重新訓練之前的一些層。深度神經網路是高度可配置架構,有各種超引數。如前所述,前面的層捕捉通用特徵,後面的層更關注手頭的特定任務。比如,在下圖的人臉識別問題中,前面的低層學習很通用的特徵,而高層則學習任務特定的特徵。

基於這一洞見,我們在重新訓練時可以凍結(固定權重)特定層,微調剩餘層以匹配我們的需求。在這一情形下,我們利用了網路總體架構的知識,並將其狀態作為重訓步驟的開始。這有助我們在更短的時間內取得更好的表現。

凍結還是微調?
這就帶來一個問題,我們應該凍結網路層將它們作為特徵提取器呢,還是應該同時微調網路層呢?
這取決於目標任務。如果目標任務的標籤匱乏,而且我們希望避免過擬合,那就凍結。相反,如果目標任務的標籤更豐富,那就微調。一般而言,我們可以通過給不同層設定不同的學習率找到凍結和微調之間的折衷。

預訓練模型
遷移學習的基礎需求之一是有在源任務上表現良好的模型。幸運的是,深度學習世界相信分享。許多不同領域的當前最先進的深度學習架構被相關團隊開放分享,例如計算機視覺和NLP,深度學習應用最流行的兩個領域。預訓練模型通常以百萬引數/權重的形式分享,這些引數/權重是模型訓練至穩定狀態後取得的。每個人都可以通過不同方式使用預訓練模型。著名的深度學習Python庫keras,提供了下載一些流行的模型的介面。你也可以通過網路獲取預訓練模型,因為大多數模型是開源的。
計算機視覺的一些流行模型:
- VGG-16
- VGG-19
- Inception V3
- Xception
- ResNet-50
自然語言處理任務的一些詞嵌入模型:
- Word2Vec
- GloVe
- FastText
最近,NLP遷移學習方面有一些非常優秀的進展,其中最著名的是Google的普適句編碼器和BERT。
這兩個進展很有潛力,我非常確定真實世界應用很快就會廣泛採用。
深度遷移學習型別
遷移學習方面的文獻經過了多次迭代,如前所述,相關的術語比較隨意,經常可以互相替換。因此,有時候要區分遷移學習、領域自適應、多工學習挺讓人迷惑的。放輕鬆,這些都是相關的術語,試圖解決類似的問題。一般來說,你應該總是將遷移學習看成一般概念或原則,試圖使用源任務-領域的知識解決目標任務。
領域自適應
通常,領域自適應指源領域和目標領域的邊緣概率不同的場景。源領域和目標領域資料分佈的內在偏移,意味著我們需要進行一些調整才能遷移學習。例如,標記為正面、負面的影評語料庫和產品評論的情緒分析語料庫是不一樣的。在影評上訓練的分類器在分類產品評論時會見到不同的分佈。因此,這些場景下的遷移學習將使用領域自適應技術。
領域混淆
之前我們瞭解了不同的遷移學習策略,甚至討論了從源領域/任務到目標領域/任務遷移什麼,何時遷移,如何遷移。特別是,我們討論了特徵表示遷移如何有用。值得再次強調的是,深度學習網路的不同層捕捉了不同的特徵。我們可以利用這一事實學習領域不變的特徵,並提升它們在不同領域間的可遷移性。我們並不讓模型學習任何表示,而是使兩個領域的表示儘可能地接近。這可以通過直接對錶示本身應用特定的預處理步驟達成。Baochen Sun、Jiashi Feng、Kate Saenko的論文Return of Frustratingly Easy Domain Adaptation(容易得要死的領域自適應的迴歸)討論了其中一些技術,Ganin等的論文Domain-Adversarial Training of Neural Networks(神經網路的領域對抗訓練)也討論了這種提高表示相似性的技術。這一技術背後的基本思路是在源模型中加入另一個目標,通過混淆領域自身鼓勵相似性。領域混淆正是由此得名。
多工學習
在遷移學習的世界中,多工學習的調調有點不一樣。在遷移學習情形下,同時學習多個任務,不區分源任務和目標任務。在這一情形下,學習器一下子從多個任務中接收資訊,而在遷移學習中,學習器剛開始對目標任務一無所知。

單樣本學習
深度學習系統對資料有著天然的飢渴,因為它們需要許多訓練樣本才能學習權重。這是深度神經網路的限制因素之一,儘管人類學習不存在這一問題。例如,一旦小孩知道了蘋果是什麼樣的,他可以很容易地識別另一品種的蘋果(只需一個或少量訓練樣本);而ML和深度學習演算法就沒有這個能力。單樣本學習是遷移學習的一個變體,我們根據單個或少量訓練樣本嘗試推理所需輸出。在不可能為每個可能分類(假設這是一個分類任務)獲取標註資料的真實世界場景下,以及經常加入新分類的場景下,單樣本學習尤為有用。一般認為,李飛飛及其協作者的里程碑論文One Shot Learning of Object Categories(目標類別的單樣本學習)創造了單樣本學習這一術語,開啟了單樣本學習這一子領域的研究。該論文提出了一個貝葉斯框架的變體,用於目標類別的表示學習。後來人們改進了這一方法,並應用了深度學習系統。
零樣本學習
零樣本學習是遷移學習的又一極端變體,基於未標註資料學習一項任務。這也許聽起來難以置信,如果這一方法真的有效,那將置大多數監督學習演算法於何地?零資料學習或零樣本學習方法在其訓練階段做了巧妙的調整,利用額外的資訊來理解未見資料。Goodfellow等的《深度學習》一書是這樣講述零樣本學習的:在這一場景下學習了三個變數,傳統的輸入變數x,傳統的輸出變數y,和一個描述任務的隨機變數T。訓練模型學習條件概率分佈P(y|x,T)。在機器翻譯這類的場景下,零樣本學習很方便,因為我們可能甚至都沒有目標語言中的標籤。
遷移學習應用
毫無疑問,深度學習是從遷移學習中受益良多的演算法類別。下面是一些例子:
- NLP中的遷移學習: 對ML和深度學習而言,文字資料提出了各種各樣的挑戰。通常,我們使用不同的向量化技術轉換文字。基於不同的訓練資料集,我們得到了Word2Vec和FastText之類的嵌入。通過從源任務遷移知識,它們可以用於不同的任務,例如情緒分析和文件分類。除此之外,普適句編碼器和BERT這類較新的模型毫無疑問地展現了未來的無窮可能。
- 音訊/語言中的遷移學習: 類似NLP和計算機視覺,深度學習也在基於音訊資料的任務中得到了廣泛應用。例如,針對英語的自動語音識別(ASR)模型成功用於提升德語等其他語言的識別表現。自動識別說話人則是遷移學習大有助益的另一個例子。
- 計算機視覺中的遷移學習: 基於不同的CNN架構,深度學習在多種計算機視覺任務上的應用取得了相當大的成功。Yosinski及其協作者的論文How transferable are features in deep neural networks(深度神經網路中特徵的遷移性如何)揭示了低層如何提取邊緣等計算機視覺特徵,最終層如何作用於任務特定的特徵。因此,這些發現幫助我們在風格遷移和人臉識別等目標任務中利用VGG、AlexNet、Inception等現有的當前最先進模型,目標任務和這些模型原本訓練的任務不同。
因字數限制,想看實踐案例的讀者請移步 遷移學習全面指南:概念、應用、優勢、挑戰
遷移學習挑戰
遷移學習具有巨大的潛力,常常也能增強現有學習演算法。然而,和遷移學習相關的一些問題尚有待更多研究和探索。除了要回答遷移什麼、何時遷移、如何遷移還很難之外,負遷移和遷移界限是遷移學習面臨的主要挑戰。
- 負遷移: 我們目前討論過的情形都是通過從源任務遷移知識改進目標任務的表現。但有些情形下,遷移學習可能導致表現下降。負遷移指從源領域/任務遷移知識到目標領域/任務沒有帶來任何改善,反而導致目標任務的總體表現下降的場景。可能有各種各樣的原因會導致負遷移,比如源任務和目標任務並不足夠相關,再比如遷移方法不能很好地利用源任務和目標任務之間的關係。避免負遷移十分重要,這需要仔細的調查。Rosenstien及其協作者的工作從實踐經驗的角度展示了在太不相關的源任務和目標任務上,暴力遷移會降低目標任務的表現。Bakker及其協作者則通過貝葉斯方法和其他一些技術探索基於聚類識別相關性的方案,以避免負遷移。
- 遷移界限: 量化遷移學習中影響遷移質量和可行性的遷移量也很重要。Hassan Mahmud及其協作者使用Kolmogorov複雜度證明了用來分析遷移學習和測量任務相關性的特定理論界限,從而估計遷移量。Eaton及其協作者提出了一種基於圖的方法以測量知識遷移。本文不會討論這些技術的細節,我們鼓勵讀者自行探索這些主題!
結語和後續預告
這也許是我寫過的最長的部落格文章,全面介紹了遷移學習的概念、策略,重點關注深度遷移學習,及其挑戰和優勢。我們也通過兩個真實世界案例研究讓你對如何實現這些技術有所瞭解。如果你正在閱讀這段話,我要為你讀完這麼長一篇文章而點贊!
毫無疑問,遷移學習將成為機器學習和深度學習成功應用於業界主流的關鍵驅動因素之一。我絕對希望能看到更多預訓練模型,還有更多使用這一概念和方法論的創新案例研究。你也可以期待我後續的文章:
- 用於NLP的遷移學習
- 音訊資料的遷移學習
- 生成式深度學習的遷移學習
- 影象說明等更復雜的計算機視覺問題
我們希望能看到更多遷移學習和深度學習的成功例子,讓我們可以建立更智慧的系統,讓世界更美好,同時達成我們的個人目標!