吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

遷移學習(Transfer Learning)

如果你要做一個計算機視覺的應用,相比於從頭訓練權重,或者說從隨機初始化權重開始,如果你下載別人已經訓練好網絡結構的權重,你通常能夠進展的相當快,用這個作為預訓練,然後轉換到你感興趣的任務上。

計算機視覺的研究社區非常喜歡把許多數據集上傳到網上,如果你聽說過,比如ImageNet,或者MS_COCO,或者Pascal類型的數據集,這些都是不同數據集的名字,它們都是由大家上傳到網絡的,並且有大量的計算機視覺研究者已經用這些數據集訓練過他們的算法了。

有時候這些訓練過程需要花費好幾周,並且需要很多的GPU,其它人已經做過了,並且經歷了非常痛苦的尋最優過程,這就意味著你可以下載花費了別人好幾周甚至幾個月而做出來的開源的權重參數,把它當作一個很好的初始化用在你自己的神經網絡上。用遷移學習把公共的數據集的知識遷移到你自己的問題上,讓我們看一下怎麼做。

來個栗子

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

舉個例子,假如說你要建立一個貓咪檢測器,用來檢測你自己的寵物貓。

比如網絡上的Tigger,是一個常見的貓的名字,Misty也是比較常見的貓名字。

假如你的兩隻貓叫Tigger和Misty,還有一種情況是,兩者都不是。所以你現在有一個三分類問題,圖片裡是Tigger還是Misty,或者都不是,我們忽略兩隻貓同時出現在一張圖片裡的情況。現在你可能沒有Tigger或者Misty的大量的圖片,所以你的訓練集會很小,你該怎麼辦呢?

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

我建議你從網上下載一些神經網絡開源的實現,不僅把代碼下載下來,也把權重下載下來

有許多訓練好的網絡,你都可以下載。舉個例子,ImageNet數據集,它有1000個不同的類別,因此這個網絡會有一個Softmax單元,它可以輸出1000個可能類別之一。

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

你可以去掉上圖中的這個Softmax層,創建你自己的Softmax單元,用來輸出Tigger、Misty和neither三個類別

就網絡而言,我建議你把所有的層看作是凍結的,你凍結網絡中所有層的參數,你只需要訓練和你的Softmax層有關的參數。這個Softmax層有三種可能的輸出,Tigger、Misty或者都不是。

通過使用其他人預訓練的權重,你很可能得到很好的性能,即使只有一個小的數據集。幸運的是,大多數深度學習框架都支持這種操作,事實上,取決於用的框架,它也許會有trainableParameter=0這樣的參數,對於這些前面的層,你可能會設置這個參數。

為了不訓練這些權重,有時也會有freeze=1這樣的參數。不同的深度學習編程框架有不同的方式,允許你指定是否訓練特定層的權重。在這個例子中,你只需要訓練softmax層的權重,把前面這些層的權重都凍結。

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

另一個技巧,也許對一些情況有用,由於前面的層都凍結了,相當於一個固定的函數,不需要改變。因為你不需要改變它,也不訓練它,取輸入圖像X,然後把它映射到這層(softmax的前一層)的激活函數

所以這個能加速訓練的技巧就是,如果我們先計算這一層(紫色箭頭標記),計算特徵或者激活值,然後把它們存到硬盤裡。你所做的就是用這個固定的函數,在這個神經網絡的前半部分(softmax層之前的所有層視為一個固定映射),取任意輸入圖像X,然後計算它的某個特徵向量,這樣你訓練的就是一個很淺的softmax模型,用這個特徵向量來做預測。

對你的計算有用的一步就是對你的訓練集中所有樣本的這一層的激活值進行預計算,然後存儲到硬盤裡,然後在此之上訓練softmax分類器。所以,存儲到硬盤或者說預計算方法的優點就是,你不需要每次遍歷訓練集再重新計算這個激活值了。

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

因此如果你的任務只有一個很小的數據集,你可以這樣做。

要有一個更大的訓練集怎麼辦呢?

根據經驗,如果你有一個更大的標定的數據集,也許你有大量的Tigger和Misty的照片,還有兩者都不是的,這種情況,你應該凍結更少的層,比如只把上圖中前面括起來的這些層凍結,然後訓練後面的層。如果你的輸出層的類別不同,那麼你需要構建自己的輸出單元,Tigger、Misty或者兩者都不是三個類別。有很多方式可以實現,你可以取後面幾層的權重,用作初始化,然後從這裡開始梯度下降。

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

或者你可以直接去掉這幾層,換成你自己的隱藏單元和你自己的softmax輸出層,這些方法值得一試。但是有一個規律,如果你有越來越多的數據,你需要凍結的層數越少,你能夠訓練的層數就越多。這個理念就是,如果你有一個更大的數據集,也許有足夠多的數據,那麼不要單單訓練一個softmax單元,而是考慮訓練中等大小的網絡,包含你最終要用的網絡的後面幾層。

吳恩達深度學習筆記(89)-遷移學習(Transfer Learning)

最後,如果你有大量數據,你應該做的就是用開源的網絡和它的權重,把這、所有的權重當作初始化,然後訓練整個網絡。再次注意,如果這是一個1000節點的softmax,而你只有三個輸出,你需要你自己的softmax輸出層來輸出你要的標籤。

如果你有越多的標定的數據,或者越多的Tigger、Misty或者兩者都不是的圖片,你可以訓練越多的層。極端情況下,你可以用下載的權重只作為初始化,用它們來代替隨機初始化,接著你可以用梯度下降訓練,更新網絡所有層的所有權重。

這就是卷積網絡訓練中的遷移學習,事實上,網上的公開數據集非常龐大,並且你下載的其他人已經訓練好幾周的權重,已經從數據中學習了很多了,你會發現,對於很多計算機視覺的應用,如果你下載其他人的開源的權重,並用作你問題的初始化,你會做的更好。

在所有不同學科中,在所有深度學習不同的應用中,我認為計算機視覺是一個你經常用到遷移學習的領域,除非你有非常非常大的數據集,你可以從頭開始訓練所有的東西。總之,遷移學習是非常值得你考慮的,除非你有一個極其大的數據集和非常大的計算量預算來從頭訓練你的網絡。


分享到:


相關文章: