遷移學習:該做的和不該做的事
導讀
遷移學習的好處不用多說,那麼,什麼時候用,什麼時候不該用,為什麼有用?看看就知道。
如果你最近工作在深度學習領域,特別是影像識別,你可能看到過大量的部落格,承諾教會你如何建立一個世界級的影像分類器,只需在一個GPU上用十幾行或更少的程式碼跑上幾分鐘。令人震驚的不是這個承諾,而是在這些教程中,大多數最終都實現了。這怎麼可能呢?對於那些接受過“傳統”機器學習技術培訓的人來說,為一個資料集開發的模型可以簡單地應用於另一個資料集的想法聽起來很荒謬。
答案當然是“遷移學習”,這是深度神經網路最吸引人的特性之一。在這篇文章中,我們將首先看看什麼是遷移學習,什麼時候可行,什麼時候不可行,為什麼在某些情況下行不通,最後總結一些關於遷移學習的最佳實踐的建議。
遷移學習是什麼?
Pan and Yang(2010)對遷移學習給出了一個優雅的數學定義(見第2.2小節)。然而,對於我們的目的,一個簡單得多的定義就足夠了:遷移學習 使用針對特定任務 (有時稱為源任務)的所學知識 來解決另一個任務 (目標任務)。當然,假設源任務和目標任務非常相似。這種假設是轉移學習的核心。因此,我們必須首先理解為什麼轉移學習是有效的。
你可能還記得,典型的當代神經網路—例如,多層卷積深度神經網路(cDNN)—由多層神經元組成,每層神經元根據訓練結果計算出的網路權重和偏差將結果前饋。這一結構是根據人類大腦中與之相當相似的特定過程—Ventral Visual Stream——而設計的。
Ventral Visual Stream的輪廓。視神經(深紫色)將來自視網膜兩側的資訊傳輸到視交叉(OX),視交叉的位置取決於它們來自視野的左側還是右側。外側膝狀核(LGN)分離輸入型別。從LGN每邊的投影進入對應的主視覺區域(V1)。 從那裡 ,它穿越了Ventral Visual Stream,增加了複雜性和語義。
ventral stream開始於初級視覺皮質或V1,枕葉的一部分。V1從外側膝狀體核接收視覺資訊,丘腦的一部分將光資訊傳送到枕葉而細分成兩種型別的資訊——這樣的輸入對於決定你看的是什麼更有用而且對於你確定東西在哪裡也更有用。它們都位於初級視覺皮層,但ventral visual stream由LGN的單細胞層的“是什麼”資訊提供:有關物體的緩慢但持續的詳細資訊,來自視網膜神經節細胞P細胞。
然後,P細胞的輸出(有時稱為投影)經過ventral visual stream(從V1到V2, V4,最終到顳下葉)時被處理。透過 激發實驗 發現,V1中的細胞對相當簡單的圖案(主要是邊緣、它們的方向、顏色和空間頻率)有反應,而V2對更復雜的概念有反應,包括某些格式塔現象,如“主觀輪廓”。最終,逐漸進入下顳葉,神經元對越來越複雜的模式做出反應。
CaffeNet的貓識別器,反向工程由DeconvNet實現。注意,隨著層數的增加,語義的增加,從卷積層(CL) 1中的簡單幾何圖形到上下文中的幾何圖形(CL 2)、複合幾何圖形(CL 3和4)到對物體類別有語義意義的特定濾波器(CL 5)。
我們看到這在深層神經網路中的重複。Zeiler-Fergus反摺積網路允許我們看到對於特定的層會對哪些模式有反應。也就是說,這些結構會引起這些特定的神經元的興奮。隨著層數的增加,形狀的複雜性也隨之增加。當我們在第一層看到簡單的邊緣甚至是顏色塊時,後面的層會顯示更復雜的圖案,最後一層的啟用通常可以被識別為目標類。它們也變得越來越語義化——線條的組合被加權在一起,就像一個能識別三角形的過濾器,三角形過濾器的組合能識別兩隻耳朵,再加上其它過濾器,它開始識別狗的臉與貓的臉是不同的。
遷移學習的概念是與生俱來的,因為神經網路是分層自包含的——也就是說,你可以在一個特定的層之後移除所有的層,將一個全連線的層與不同數量的神經元和隨機權重連線起來,得到一個可以工作神經網路。這是遷移學習的基礎。 在轉移學習中,我們使用訓練有素、構造良好的網路在大集合上所學到的知識,並將它們應用於在較小的 (通常是幾個數量級!) 資料集 上提高檢測器的效能。
遷移或者不遷移
從上面看來,一些關於遷移學習的作用(和負作用)的事實浮出水面。遷移學習的最大好處體現在目標資料集相對較小的時候。在許多這樣的情況下,模型可能容易過擬合,而資料增強可能並不總是能解決整個問題。因此,遷移學習最適用於源任務的模型在比目標任務獲得的訓練集大得多的訓練集上訓練的情況。這可能是因為對一個特定例項的事情很難遇得到,或者標註過的樣本很難獲得(例如在診斷放射學,對圖片做標記往往很難,尤其是罕見的條件)。
如果存在過擬合的風險,那麼每個任務的資料量大致相同的模型 仍然可能受益於遷移學習,因為目標任務通常是高度領域特定的 。事實上,在訓練大型特定領域的dCNN時可能會適得其反,因為它可能會過度適合特定領域。因此,有時建議在源任務和目標任務的訓練集大小相同的情況下使用遷移學習。
在實踐中,在計算機視覺中,使用標準網路是非常普遍的,它訓練了大量的影像資料集——比如ImageNet的超過1000個類別的120萬幅影像——作為起點,甚至可以完成特定領域的任務,比如評估胸片。許多機器學習框架,特別是像Caffe、fastai和keras這樣的高階軟體包,都自帶了model zoo,可以方便地訪問預先訓練好的dCNN。因此,只需要刪除最頂層,新增一個或多個新層並對模型進行再訓練(finetuen)。新模型將不用再為了構建像ResNet50,NASNet或Inceptionv3這樣的模型而進行的數週艱苦訓練了。總的來說,如果使用得當, 遷移學習將給你帶來三重好處:更高的起始精度、更快的收斂速度和更高的逼近精度 (訓練收斂的精度水平)。最近,一些很有前途的網站出現了,它們列出了各種各樣的預培訓模型——我最喜歡的是ModelDepot和ModelZoo,後者有一個龐大的資料庫,可以透過框架和解決方案進行過濾,包括許多預先訓練的GANs。
一些最佳的實踐經驗
- 大多數深度學習框架允許你“選擇性地解凍”深度神經網路的最後n層,而將其餘部分學習到的權重凍結。總的來說,這個特性並不像它最初聽起來那麼有用。經驗表明,花時間進行徹底的模型內省,並試圖確定在哪裡切斷解凍幾乎是不值得的。 一個例外是,如果你訓練的是一個非常大的網路,它可能在你的GPU記憶體裡放不下 ——在這種情況下,資源限制將決定你能解凍多少。
- 與其解凍特定的層,使用 不同的學習率 可能是更好的主意,其中學習率是根據每一層來確定的。底層的學習速度將非常低,因為這些泛化得非常好,主要對邊緣、水滴和其他瑣碎的幾何圖形作出響應,而對更復雜的特性作出響應的層將具有更大的學習速度。在過去,2:4:6規則(10-4)對我非常有用——對最下面的幾層使用10-6的學習率,對其他傳輸層使用10-4的學習率,對我們新增的任何額外層使用10-2的學習率。我也聽到其他人在不同的架構中使用2:3:4:5:6或2:3:4。對於ResNet及其衍生品,我總是覺得2:4:6比2:3:4更合適,但我絕對沒有經驗證據支援這一點。、
- 透過重新訓練所有層來遷移學習並不總是一個好主意。如果目標任務是一個小資料集,而且非常類似(如識別一個新不包括在ImageNet的動物類別或車輛),把權重凍結,在頂端放一個線性分類器來輸出機率可能是更有用的,能夠得到類似的結果也不用擔心過擬合。
- 當遷移到具有較大資料集的任務時,你可能希望從零開始訓練網路(完全不需要遷移學習)。同時,考慮到這樣一個網路將隨機初始化, 你使用預先訓練的權重來初始化也沒有什麼損失 !解除整個網路的凍結,刪除輸出層,並用一個匹配目標任務類數量的輸出層替換它,並對整個網路進行finetune。
- 最後: 知道你正在重用什麼 。這不僅是一個很好的練習,要知道你是從哪個網路轉過來的——這是深入學習商業技巧的關鍵。雖然普遍信任的主要網路如ResNet一次又一次被證明是健壯,可靠的網路,選擇適合你的任務一個網路和可能是最有效的幾種替代網路,如果存在的話,正是給深度學習專業人士付這麼多錢的價值所在。如果使用非標準網路——任何沒有數百個經過同行評審的應用程式的網路都被認為是非標準的——請確保網路體系結構是健全的,並且確實是最佳選擇。Tensorboard和Netscope等工具可以幫助你得到一個神經網路的很好的洞察,而且可以幫助你評估網路結構。當使用一個不熟悉的網路時,我發現內省,包括反摺積網路或其他逆向工程解決方案來檢視層和神經元水平的啟用最大值可以帶來很大的好處。
英文原文:https://medium.com/starschema-blog/transfer-learning-the-dos-and-donts-165729d666253
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2646819/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 成為前端,你不該學的東西,以及不該做的事兒!前端
- Web設計過程中該做和不該做的Web
- Linux:該做的事和該支援的人Linux
- 安全密碼儲存,該怎麼做,不該怎麼做?密碼
- 6 件你應該用 Emacs 做的事Mac
- 應該做技術還是應該做管理?
- 如何用 Python 和深度遷移學習做文字分類?Python遷移學習文字分類
- 轉行做Java開發應該怎樣學習?Java
- Oracle表移動後應該做哪些事情?Oracle
- 如何用最強模型BERT做NLP遷移學習?模型遷移學習
- 不應該做程式設計師的各種跡象程式設計師
- 面試前您該做的事情 薦面試
- 開發完 iOS 應用,接下去你該做的事iOS
- 程式設計師每天每週每月每年應該做的事程式設計師
- 你不該做自由網頁設計師的10個理由網頁
- 10大你不該做自由網頁設計師的理由網頁
- 0基礎該不該學習Python?適合學習嗎?Python
- 寫程式碼之前應該做的幾件事
- 程式設計師每週該做的事情!程式設計師
- 小公司的前端應該怎麼做?前端
- 面試前最應該做的準備工作面試
- [歪談]我們該怎麼學習?做一個學者還是習者?
- 獨立開發該做什麼,該不做什麼
- 關於MySQL應該學習的6件事MySql
- 秒殺系統流量削峰這事應該怎麼做?
- 疫情下的遠端辦公該做什麼?
- 收益最大化的微商模式該怎麼做?模式
- 程式碼審查:大家都應該做的事情
- 企業的資料分析應該如何做
- 程式設計師35歲不焦慮,該怎麼做?程式設計師
- 為什麼不斷做遷移,那是在還技術債
- 遷移學習系列---基於例項方法的遷移學習遷移學習
- 想轉行做IT!0基礎應該要學習哪個技術啊?
- 做程式猿的老婆應該注意的一些事情
- Yann LeCun:未來的AI晶片應該這樣做Yann LeCunAI晶片
- 遊戲設計的作品集到底該怎麼做?遊戲設計
- [譯]react的setState如何知道該做什麼 --Dan AbramovReact
- 不懂技術的產品經理該怎麼做?