簡單聊一下什麼是遷移學習

什麼是遷移學習?

  • 通常對於同一類型的事業,我們不用自己完全從頭做, 可以借鑑別人的經驗, 往往能節省很多時間. 有這樣的思路, 機器學習也能偷偷懶, 不用花時間重新訓練一個無比龐大的神經網絡, 借鑑借鑑一個已經訓練好的神經網絡就行.這就叫遷移學習。
  • 比如這樣的一個神經網絡, 我花了兩天訓練完之後, 它已經能正確區分圖片中具體描述的是男人, 女人還是眼鏡. 說明這個神經網絡已經具備對圖片信息一定的理解能力. 這些理解能力就以參數的形式存放在每一個神經節點中. 不巧, 領導下達了一個緊急任務,要求今天之內訓練出來一個預測圖片裡實物價值的模型. 我想這可完蛋了, 上一個圖片模型都要花兩天, 如果要再搭個模型重新訓練, 今天肯定出不來呀. #這時, 遷移學習來拯救我了. 因為這個訓練好的模型中已經有了一些對圖片的理解能力, 而模型最後輸出層的作用是分類之前的圖片, 對於現在計算價值的任務是用不到的, #所以我將最後一層替換掉, 變為服務於現在這個任務的輸出層. #接著只訓練新加的輸出層, 讓理解力保持始終不變. 前面的神經層龐大的參數不用再訓練, 節省了我很多時間, 我也在一天時間內, 將這個任務順利完成。

如何做遷移學習?

  • 在實踐中,我們通常不會完全從頭開始隨機初始化訓練 DCNN,這是因為有能滿足深度網絡需求的足夠大小的數據集相當的少見。作為代替,常見的是在一個大型數據集上預訓練一個 DCNN,然後使用這一訓練的 DCNN 的權重作為初始設置或作為相關任務的固定的特徵提取器。 舉個例子,我們知道Imagnet是目前最大的圖像識別數據庫,目前已經有很多基於imagenet數據訓練的網絡模型,如inceptionv3、v4等,假如現在給你一個任務,希望你能做一個車系識別,你有兩個選擇:
  • 一是蒐集大量的車系數據,對這些車系數據進行模型訓練;
  • 二是基於imagenet訓練好的網絡模型,然後把蒐集好的車系數據加到基於之前訓練好的模型繼續訓練,進行fine-tuning(微調)。
  • 傳統的做法都是第一種,但是這就會遇到一個問題,一是車系的圖片夠不夠多,體量夠不夠大?如果數據量不夠,最後訓練的效果會不會很不好?其實我們可以通過 把ImageNet 或其他大型數據集學習到的網絡特徵運用於一個圖片分類或其他基於圖片特徵的任務,這就是遷移學習的思想。其實可以這樣理解,如果從零開始訓練,那麼初始化權重一般情況下要麼是都為0,要麼隨機設置,當我們導入了在大規模數據集上訓練好的模型後,相當於在以這個模型現有的參數作為初始化的權重,不過至於在具體的任務上的泛化能力如何,還是得看具體的場景。

遷移學習為什麼能work?

  • 通常我們在做深度學習的時候,網絡的每一個layer分別提取訓練集上的不同特徵,假如我們要用NN去做大象識別,可能第一層的NN的作用是判斷圖片上的動物是否有腿,第二層判斷是否有尾巴….然後剩下的每一層都分別提取圖片上的不同特徵,當所有的特徵都滿足時則判斷為大象,如果有特徵不滿足的話,則判斷為不是大象,如下圖所示:
簡單聊一下什麼是遷移學習

  • 所以當我們要重新訓練一個網絡去識別其它動物的時候,例如識別貓與狗,我們就可以不用重新訓練這個網絡,可以把大象的那個NN前面幾層拿過來,貓與狗他們有某些相同的特徵,例如都有腿、都有尾巴、都有耳朵,因此我們把識別相同特徵的layer直接拿過來用,相當於借鑑前人已有的經驗,借鑑過來的網絡不用訓練,因為參數在之前已經訓練好了,我們只需要訓練新加的layer就好了,這樣可以大量的節省網絡訓練的時間,而且就算我們的訓練數據不足也能取得很好的性能。

遷移學習的限制

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

--------------------------------------------

PS:碼字不容易,如果對您有幫助的話,幫忙轉發一下,謝謝啦~

會定期分享一些實用工具學習筆記~

簡單聊一下什麼是遷移學習


分享到:


相關文章: