深度學習是很強大,幾乎可以通過足夠的數據訓練出各種各樣復雜函數。但缺點是,難以訓練出滿意的結果。
與許多游戲中的強力角色一樣,雖然成長值高,練級卻困難。花好半天,練個半死,才見經驗條緩緩爬到頭。然而,此時電腦突然一黑,罷工了,又忘了存檔。在怒砸鍵盤,對天大喊三聲 “搞Billy!”,悔恨的淚水流了一嘴后,你放棄作為一名合格玩家的尊嚴,默默掏出了修改器。
這種設定,是游戲制作者為了游戲平衡性而設置的,給你一個強大的角色,但同時也讓他難于成長。于是,我估計我們這個世界的游戲制作者也是這樣想的。所謂天將降大任于斯人也,先多給你些磨煉,現在是天將降大任與斯網了。
于是這篇便稍稍提提深度學習訓練的問題,最后再小結一下。
深度學習的問題是訓練起來比較難。這里的難,主要可以從兩方面來說。
一個是優化起來難,也就是說難找到比較好的解,獲得滿意的訓練好的神經網絡,這種問題叫做欠擬合 (Underfitting); 還有一個是由于深層網絡結構復雜,對當前數據學習過好,但當出現新的沒見過的數據時,表現卻很差,稱作過擬合(Overfitting)。
說如何解決深度學習中這兩方面問題前,便于理解,先來提提什么是欠擬合和過擬合吧。
欠擬合 (學不夠) 與過擬合 (學過頭)
欠擬合和過擬合,以及它們涉及的Variance和Bias,可以說是機器學習訓練中最重要的概念了。
因為所有機器學習工程師訓練模型的最終目的就是,不要讓模型欠擬合 (能力過弱),也不要讓它過擬合 (能力過強),而要讓模型剛剛好。所以說機器學習訓練中也得遵循中庸之道,缺不好,過也不好,剛剛好最好。
打個比方的話,小明要考試了,他有一套來自無數勇者前輩們,冒著生命危險從考場帶出的往年考題集。之后出現兩種情況。
第一種情況,小明這家伙非常不爭氣,守著一座金山卻不當一回事。考試前幾天,還天天窩在寢室和一群小伙伴打游戲,早就忘了還有考試這事。等回過神,考題集也沒怎么看。于是,結果可想而知,考的一塌糊涂。這個可以叫做欠擬合吧。
另外一種情況,平行世界中小明是一位非常勤奮的同學,但腦瓜比較笨,不怎么轉得過彎來。拿了考題集,從開學起就每天做一遍,等到考試前,已經可以倒寫如流。你翻開一頁,他可以把答案轉個一百八十度寫出來,還工工整整,像剛從打印機打出來。
但到了考試那天,題目一出來,傻眼了。居然換了出卷老師,考的題型和之前不一樣,亦或是題目改了些條件,小明不會了。于是小明做完幾道基礎題,就憤憤然離開了考場。這個算是叫做過擬合吧。
這里面,把小明當做是我們的神經網絡。那么,來自前輩的考題集就是訓練數據集了。最后,考試題目就是測試數據集,來測試我們的神經網絡性能。
小明在考題集上做練習,可以看做是神經網絡在訓練數據集上進行訓練。
于是類比而來,給神經網絡一個訓練數據集,如果連這個數據集都學不好的話,那就更別提那些測試數據、新數據了,這就欠擬合了;而如果把這個訓練數據集學得太好,記得分毫不差,以至于當出現新的數據時,都反應不過來,那就過擬合了。
深度學習中的欠擬合
在當前各種充足的計算硬件條件下,深度學習的欠擬合問題,往往并不是訓練時間不夠導致,可能更主要的是一些內部問題比如梯度消失問題,或是飽和單元阻止梯度的傳播導致。
在之前訓練一篇有說到,反向傳播主要傳播的是梯度,而梯度是用來更新神經網絡,讓神經網絡變得更符合我們期望的。而這上述兩個問題,一個是梯度消失了,而另一個是梯度被飽和單元擋住,傳播不過去。也就是說,兩種情況網絡都無法獲得想要的梯度來更新自己,那么自然而然也就會導致學習不足,導致欠擬合。
其實欠擬合的解決方法比較簡單,無非就是訓練不夠嘛。
那就用更好的訓練優化方法,來解決上面提到的兩個問題,比如說梯度消失問題的話,可以用比如殘差網絡 (Residual Network) 或是 定時反向傳播 (BPTT) 算法等等更好的算法、框架。
再如神經單元飽和,主要是因為sigmoid或tanh這兩個激活函數特性導致的,可以換成ReLu激活函數,或是利用適當的正規化 (Normalization)避免飽和情況的發生。
除了更好的訓練優化方法,還可以加上GPU這樣的大殺器,加速訓練,在短時間內對網絡進行更多訓練。
深度學習中的過擬合
而深度學習的過擬合問題,因為深層網絡結構復雜,可以模擬出來的函數非常復雜,容易對當前數據訓練過度。我們需要提高我們模型的泛化性。
怎么解決呢?理論上能提高泛化性的技巧都可以,這里提兩個。
第一個方法,使用預訓練 (Pre-training) 網絡。還記得之前提到,人腦的視覺系統可以提取出各種視覺低級特征、中級特征、還有高級特征嗎。那么我們何不利用,在大量圖片上已學習到具有普遍性特征的網絡,來進行當前任務的學習。
于是就可以用之前在很大的數據集上面,比如說有名的ImageNet,訓練過的網絡。然后直接把我們當前的網絡,底層捕捉特征的部分,換成已經訓練過的網絡,之后再進行訓練。
拿小明考試的例子來打比方的話,既然光看考題不行,那該怎么辦。我們首先想到的當然會是,為什么不看書呢。于是,道理也是一樣。假如小明在做考題前,有把教科書還有老師發的資料都好好看了一遍,心里有個底,那么就可以把此時的小明當做預訓練過的網絡。之后,小明再練習完往年考題集的話,即使在考試中出現了往年考題以外的題,他也一定程度上能從容應對了。
第二個方法,就是用隨機漏失 (Dropout) 技巧,指的是在網路某些層內,傳遞參數時,隨機丟失一些參數來訓練。這樣訓練出來的好處是,網絡不會偷懶只看重幾個重要的特征而忽視影響較小的特征。重要特征的丟失,逼得網絡不得不想辦法利用其他次要特征。網絡就會有很強的穩健性,遇到新的沒見過的數據,也能夠很好處理。
如果再拿小明考試來打比較的話,既然真考試的時候,有些題目會變參數變條件。那何不自己在練習題集的時候,先改改條件,變變參數呢。這樣到了考試的時候,也能隨機應變。
關于訓練的補充
當然,這里說到的這幾個技巧,也只是很多技巧中的一些。現在,對這個方面的研究,深度學習社群也都還在如火如荼地進行著,說不定之后會有更好更有效的方法呢。
有某位中二大牛把機器學習訓練比作修真煉丹,需要謹慎選擇各種各樣的條件,材料、時間、火候... 稍有不慎就是一爐廢丹。
但我更樂意比作魔法師吧。里面一大堆有著各種各樣名字的技巧,像咒語一樣,看你怎么組合使用它們取得最好效果。
這些小技巧包括有,正則化 (Regularization)、正規化 (Normalization)、初始化 (Initialization)、模型選擇 (包括網格搜索和隨機搜索來選各種參數)、什么時候停止訓練 (停止法 Early Stopping)、 動量 (Momentum)、各種優化器(Adagrad, RMSProp, Adam)等等等等。
雖然這么多,但以上方法的目的,無非兩個,第一,使得訓練出來的網絡處理新數據時有更好的準確率,高泛化性(很好地處理新數據),解決過擬合;第二,讓訓練速度更加快,解決欠擬合。
小結
到這里,差不多關于神經網絡還有深度學習的一些大體概念也就講完了。
可能看到這里,大部分人還是云里霧里,本來我自己也就是小菜鳥一只。這里寫的大多也是拾各位大牛的牙慧,加上一些自己理解。
雖然是這樣說,但是至少至少還是希望大家對這個話題有了些熟悉感,某天遇到,也會會心一笑,這個我知道,貌似在某個號主天天更新亂七八糟東西的公眾號上看到過。
吳教授說了,深度學習之于現在的我們,就相當于二十世紀初電力之于當時的人們。誕生之后,對各行各業產生巨大沖擊,帶來巨大變革。
那之后就來看看現在有哪些行業正在受到沖擊,進行變革吧。還有在這些變革中,哪些公司或者人在領導著這些。