【深度學習系列】遷移學習Transfer Learning

【深度學習系列】遷移學習Transfer Learning

來自專欄 Python程序員

在前面的文章中,我們通常是拿到一個任務,譬如圖像分類、識別等,搜集好數據後就開始直接用模型進行訓練,但是現實情況中,由於設備的局限性、時間的緊迫性等導致我們無法從頭開始訓練,迭代一兩百萬次來收斂模型,所以這個時候遷移學習就派上用場了。


什麼是遷移學習?

  遷移學習通俗來講,就是運用已有的知識來學習新的知識,核心是找到已有知識和新知識之間的相似性,用成語來說就是舉一反三。由於直接對目標域從頭開始學習成本太高,我們故而轉向運用已有的相關知識來輔助儘快地學習新知識。比如,已經會下中國象棋,就可以類比著來學習國際象棋;已經會編寫Java程序,就可以類比著來學習C#;已經學會英語,就可以類比著來學習法語;等等。世間萬事萬物皆有共性,如何合理地找尋它們之間的相似性,進而利用這個橋樑來幫助學習新知識,是遷移學習的核心問題。


為什麼需要遷移學習?

  • 滿足深度學習訓練數據量的數據太少。對於一個機器學習的任務,譬如分類,如果數據量過小,我們是否一定要上深度學習呢?其實不必然。如果在實際的生產過程中,能夠用規則就能得到好的效果的就用規則,能夠用簡單的模型就用簡單的模型,我們常聽到的「奧卡姆剃刀」其實就是這個意思,減少模型的複雜度,能夠從某種程度上避免過擬合的情況。那麼對於小量數據集,沒有必要一定需要用深度學習的方法來做。同樣,如果要對一個新任務分類,或者識別,搜集不了大量的正負樣本,怎麼訓練呢?
  • 新數據集相比於原數據集更小但內容很不相同。由於數據較小,只訓練一個線性分類器可能更好。因為數據集不同,從網路頂部就開始訓練分類器可能不是最好的選擇,這包含更多的數據集特定特徵。另外,從網路前部的激活函數開始訓練分類器可能更好一點。
  • 新數據集相比於原數據集較大,但內容非常不同。由於數據集很大,我們可能會期望從頭開始訓練一個 DCNN。然而,在實踐中從一個預訓練模型開始初始化權重仍然是一種有益的方法。在這種情況下,我們會有足夠的數據和信心對整個網路進行微調。

如何做遷移學習?

  在實踐中,我們通常不會完全從頭開始隨機初始化訓練 DCNN,這是因為有能滿足深度網路需求的足夠大小的數據集相當的少見。作為代替,常見的是在一個大型數據集上預訓練一個 DCNN,然後使用這一訓練的 DCNN 的權重作為初始設置或作為相關任務的固定的特徵提取器。 舉個例子,我們知道Imagnet是目前最大的圖像識別資料庫,目前已經有很多基於imagenet數據訓練的網路模型,如inceptionv3、v4等,假如現在給你一個任務,希望你能做一個車系識別,你有兩個選擇:

  一是搜集大量的車係數據,對這些車係數據進行模型訓練;

  二是基於imagenet訓練好的網路模型,然後把搜集好的車係數據加到基於之前訓練好的模型繼續訓練,進行fine-tuning。

  傳統的做法都是第一種,但是這就會遇到一個問題,一是車系的圖片夠不夠多,體量夠不夠大?如果數據量不夠,最後訓練的效果會不會很不好?其實我們可以通過 把ImageNet 或其他大型數據集學習到的網路特徵運用於一個圖片分類或其他基於圖片特徵的任務,這就是遷移學習的思想。其實可以這樣理解,如果從零開始訓練,那麼初始化權重一般情況下要麼是都為0,要麼隨機設置,當我們導入了在大規模數據集上訓練好的模型後,相當於在以這個模型現有的參數作為初始化的權重,不過至於在具體的任務上的泛化能力如何,還是得看具體的場景。


遷移學習的限制

  上文提到我們在遷移學習中會使用預訓練的網路,所以我們在模型架構方面受到了一點點限制。比如說,我們不能隨意移除預訓練網路中的卷積層。但由於參數共享的關係,我們可以很輕鬆地在不同空間尺寸的圖像上運行一個預訓練網路。這在卷積層和池化層和情況下是顯而易見的,因為它們的前向函數(forward function)獨立於輸入內容的空間尺寸。在全連接層(FC)的情形中,這仍然成立,因為全連接層可被轉化成一個卷積層。所以當我們導入一個預訓練的模型時,網路結構需要與預訓練的網路結構相同,然後再針對特定的場景和任務進行訓練。


遷移學習的相關資料

對遷移學習感興趣的同學,可以關注這個github repo:transferlearning,以及王晉東寫的系列文章:

《小王愛遷移》系列之零:遷移學習領域著名學者和研究機構

《小王愛遷移》系列之一:遷移成分分析(TCA)方法簡介

《小王愛遷移》系列之二:聯合分布適配(JDA)方法簡介

《小王愛遷移》系列之三:深度神經網路的可遷移性

《小王愛遷移》系列之四:深度適配網路(DAN)

《小王愛遷移》系列之五:測地線流式核方法(GFK)

《小王愛遷移》系列之六:學習遷移(Learning To Transfer)

《小王愛遷移》系列之七:負遷移(Negative Transfer)

《小王愛遷移》系列之八:深度遷移學習文章解讀

《小王愛遷移》系列之九:開放集遷移學習(Open Set Domain Adaptation)

《小王愛遷移》系列之十:張量遷移學習(tensor unsupervised domain adaptation)

《小王愛遷移》系列之十一:選擇性對抗遷移學習(Selective Adversarial Network)

《小王愛遷移》系列之十二:新年新氣象-重新整理的遷移學習資源倉庫

參考資料:

zhuanlan.zhihu.com/p/33

blog.csdn.net/maweifei/

作者:胡曉曼 Python愛好者社區專欄作者,請勿轉載,謝謝。

博客專欄:CharlotteDataMining的博客專欄

配套視頻教程:三個月教你從零入門深度學習!| 深度學習精華實踐課程

公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。

推薦閱讀:

神經網路告訴我,誰是世界上最「美」的人?
每周一個機器學習小項目002-卷積網路實現與圖片
Michael Nielsen對交叉熵的解釋(三)
ML + System = ?

TAG:遷移學習TransferLearning | 深度學習DeepLearning | 神經網路 | 機器學習 |