遷移學習(Transfer Learning)
如果你要做一個計算機視覺的應用,相比于從頭訓練權重,或者說從隨機初始化權重開始蓝角,如果你下載別人已經(jīng)訓練好網(wǎng)絡結構的權重,你通常能夠進展的相當快,用這個作為預訓練使鹅,然后轉換到你感興趣的任務上颇象。
計算機視覺的研究社區(qū)非常喜歡把許多數(shù)據(jù)集上傳到網(wǎng)上,如果你聽說過并徘,比如ImageNet,或者MS_COCO扰魂,或者Pascal類型的數(shù)據(jù)集麦乞,這些都是不同數(shù)據(jù)集的名字,它們都是由大家上傳到網(wǎng)絡的劝评,并且有大量的計算機視覺研究者已經(jīng)用這些數(shù)據(jù)集訓練過他們的算法了姐直。
有時候這些訓練過程需要花費好幾周,并且需要很多的GPU蒋畜,其它人已經(jīng)做過了声畏,并且經(jīng)歷了非常痛苦的尋最優(yōu)過程,這就意味著你可以下載花費了別人好幾周甚至幾個月而做出來的開源的權重參數(shù)姻成,把它當作一個很好的初始化用在你自己的神經(jīng)網(wǎng)絡上插龄。用遷移學習把公共的數(shù)據(jù)集的知識遷移到你自己的問題上,讓我們看一下怎么做科展。
來個栗子
舉個例子均牢,假如說你要建立一個貓咪檢測器,用來檢測你自己的寵物貓才睹。
比如網(wǎng)絡上的Tigger徘跪,是一個常見的貓的名字,Misty也是比較常見的貓名字琅攘。
假如你的兩只貓叫Tigger和Misty垮庐,還有一種情況是,兩者都不是坞琴。所以你現(xiàn)在有一個三分類問題哨查,圖片里是Tigger還是Misty,或者都不是置济,我們忽略兩只貓同時出現(xiàn)在一張圖片里的情況〗馇。現(xiàn)在你可能沒有Tigger或者Misty的大量的圖片,所以你的訓練集會很小浙于,你該怎么辦呢护盈?
我建議你從網(wǎng)上下載一些神經(jīng)網(wǎng)絡開源的實現(xiàn),不僅把代碼下載下來羞酗,也把權重下載下來腐宋。
有許多訓練好的網(wǎng)絡,你都可以下載。舉個例子胸竞,ImageNet數(shù)據(jù)集欺嗤,它有1000個不同的類別,因此這個網(wǎng)絡會有一個Softmax單元卫枝,它可以輸出1000個可能類別之一煎饼。
你可以去掉上圖中的這個Softmax層,創(chuàng)建你自己的Softmax單元校赤,用來輸出Tigger吆玖、Misty和neither三個類別。
就網(wǎng)絡而言马篮,我建議你把所有的層看作是凍結的沾乘,你凍結網(wǎng)絡中所有層的參數(shù),你只需要訓練和你的Softmax層有關的參數(shù)浑测。這個Softmax層有三種可能的輸出翅阵,Tigger、Misty或者都不是迁央。
通過使用其他人預訓練的權重掷匠,你很可能得到很好的性能,即使只有一個小的數(shù)據(jù)集漱贱。幸運的是槐雾,大多數(shù)深度學習框架都支持這種操作,事實上幅狮,取決于用的框架募强,它也許會有trainableParameter=0這樣的參數(shù),對于這些前面的層崇摄,你可能會設置這個參數(shù)擎值。
為了不訓練這些權重,有時也會有freeze=1這樣的參數(shù)逐抑。不同的深度學習編程框架有不同的方式鸠儿,允許你指定是否訓練特定層的權重。在這個例子中厕氨,你只需要訓練softmax層的權重进每,把前面這些層的權重都凍結。
另一個技巧命斧,也許對一些情況有用田晚,由于前面的層都凍結了,相當于一個固定的函數(shù)国葬,不需要改變贤徒。因為你不需要改變它芹壕,也不訓練它,取輸入圖像X接奈,然后把它映射到這層(softmax的前一層)的激活函數(shù)踢涌。
所以這個能加速訓練的技巧就是,如果我們先計算這一層(紫色箭頭標記)序宦,計算特征或者激活值睁壁,然后把它們存到硬盤里。你所做的就是用這個固定的函數(shù)互捌,在這個神經(jīng)網(wǎng)絡的前半部分(softmax層之前的所有層視為一個固定映射)堡僻,取任意輸入圖像X,然后計算它的某個特征向量疫剃,這樣你訓練的就是一個很淺的softmax模型,用這個特征向量來做預測硼讽。
對你的計算有用的一步就是對你的訓練集中所有樣本的這一層的激活值進行預計算巢价,然后存儲到硬盤里,然后在此之上訓練softmax分類器固阁。所以壤躲,存儲到硬盤或者說預計算方法的優(yōu)點就是,你不需要每次遍歷訓練集再重新計算這個激活值了备燃。
因此如果你的任務只有一個很小的數(shù)據(jù)集碉克,你可以這樣做。
要有一個更大的訓練集怎么辦呢并齐?
根據(jù)經(jīng)驗漏麦,如果你有一個更大的標定的數(shù)據(jù)集,也許你有大量的Tigger和Misty的照片况褪,還有兩者都不是的撕贞,這種情況,你應該凍結更少的層测垛,比如只把上圖中前面括起來的這些層凍結捏膨,然后訓練后面的層。如果你的輸出層的類別不同食侮,那么你需要構建自己的輸出單元号涯,Tigger、Misty或者兩者都不是三個類別锯七。有很多方式可以實現(xiàn)链快,你可以取后面幾層的權重,用作初始化起胰,然后從這里開始梯度下降久又。
或者你可以直接去掉這幾層巫延,換成你自己的隱藏單元和你自己的softmax輸出層,這些方法值得一試地消。但是有一個規(guī)律炉峰,如果你有越來越多的數(shù)據(jù),你需要凍結的層數(shù)越少脉执,你能夠訓練的層數(shù)就越多疼阔。這個理念就是,如果你有一個更大的數(shù)據(jù)集半夷,也許有足夠多的數(shù)據(jù)婆廊,那么不要單單訓練一個softmax單元,而是考慮訓練中等大小的網(wǎng)絡巫橄,包含你最終要用的網(wǎng)絡的后面幾層淘邻。
最后,如果你有大量數(shù)據(jù)湘换,你應該做的就是用開源的網(wǎng)絡和它的權重宾舅,把這、所有的權重當作初始化彩倚,然后訓練整個網(wǎng)絡筹我。再次注意,如果這是一個1000節(jié)點的softmax帆离,而你只有三個輸出蔬蕊,你需要你自己的softmax輸出層來輸出你要的標簽。
如果你有越多的標定的數(shù)據(jù)哥谷,或者越多的Tigger岸夯、Misty或者兩者都不是的圖片,你可以訓練越多的層们妥。極端情況下囱修,你可以用下載的權重只作為初始化,用它們來代替隨機初始化王悍,接著你可以用梯度下降訓練破镰,更新網(wǎng)絡所有層的所有權重。
這就是卷積網(wǎng)絡訓練中的遷移學習压储,事實上鲜漩,網(wǎng)上的公開數(shù)據(jù)集非常龐大,并且你下載的其他人已經(jīng)訓練好幾周的權重集惋,已經(jīng)從數(shù)據(jù)中學習了很多了孕似,你會發(fā)現(xiàn),對于很多計算機視覺的應用刮刑,如果你下載其他人的開源的權重喉祭,并用作你問題的初始化养渴,你會做的更好。
在所有不同學科中泛烙,在所有深度學習不同的應用中理卑,我認為計算機視覺是一個你經(jīng)常用到遷移學習的領域,除非你有非常非常大的數(shù)據(jù)集蔽氨,你可以從頭開始訓練所有的東西藐唠。總之鹉究,遷移學習是非常值得你考慮的宇立,除非你有一個極其大的數(shù)據(jù)集和非常大的計算量預算來從頭訓練你的網(wǎng)絡。