[Python人工智慧] 七.加速神經網路、激勵函式和過擬合

Eastmount發表於2018-06-25

從本系列文章開始,作者正式開始研究Python深度學習、神經網路及人工智慧相關知識。前六篇文章講解了神經網路基礎概念、Theano庫的安裝過程及基礎用法、theano實現迴歸神經網路、theano實現分類神經網路、theano正規化處理,這篇文章講解加速神經網路訓練的方法,為什麼有激勵函式以及過擬合,均是基礎性知識。主要是學習"莫煩大神" 網易雲視訊的線上筆記,後面隨著深入會講解具體的專案及應用。基礎性文章和線上筆記,希望對您有所幫助,本系列作者採用一篇基礎一篇程式碼的形式講解,也建議大家一步步跟著學習,同時文章中存在錯誤或不足之處,還請海涵~

"莫煩大神" 網易雲視訊地址:http://study.163.com/provider/1111519/course.html

同時推薦前面作者另外三個Python系列文章。

從2014年開始,作者主要寫了三個Python系列文章,分別是基礎知識、網路爬蟲和資料分析。

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述

前文參考:
[Python人工智慧] 一.神經網路入門及theano基礎程式碼講解
[Python人工智慧] 二.theano實現迴歸神經網路分析
[Python人工智慧] 三.theano實現分類神經網路及機器學習基礎
[Python人工智慧] 四.神經網路和深度學習入門知識
[Python人工智慧] 五.theano實現神經網路正規化Regularization處理
[Python人工智慧] 六.神經網路的評價指標、特徵標準化和特徵選擇

 

PSS:最近參加CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index


五年來寫了314篇部落格,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、資料探勘、網路爬蟲、影象處理、C#、Android等。現在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點程式碼,學點技術,"師者,傳到授業解惑也",提前祝大家新年快樂。2019我們攜手共進,為愛而生。

 

一. 為什麼需要激勵函式

首先,為什麼需要激勵函式(Activation Function)呢?

因為現實並沒有我們想象的美好,激勵函式是為了解決我們日常生活中不能用線性概括的問題而提出,如二分類問題。假設女生越漂亮,喜歡的男生人數越多,這是一個線性方程(Linear)問題,但假設場景發生在校園裡,校園裡男生人數有限,這就變成了一個非線性問題,並且女生不可能是無線漂亮的。
 


神經網路中的每個節點接受輸入值,並將輸入值傳遞給下一層,輸入節點會將輸入屬性值直接傳遞給下一層(隱層或輸出層)。在神經網路中,隱層和輸出層節點的輸入和輸出之間具有函式關係,這個函式稱為激勵函式。

 


首先把整個神經網路簡化為一個式子:y = W · x
其中,y稱為預測值、W是引數、x稱為輸入值。那麼,非線性方程如何描述這個問題呢?我們增加一個AF()函式,如下所示。
 

 

非線性方程:y = AF( W · x )
其中,AF就是所謂的激勵函式。如下所示,常見的激勵函式包括relu(x為-1時值為0,x為1時值為1)、sigmoid、tanh等。這些激勵函式能夠強行將原有線性結構弄彎,使輸出結果具有非線性特徵。
Sigmoid函式:是連續、可導、有界,關於原點對稱的增函式,呈S形,具體可用反正切函式arctan或指數函式exp來實現,如f(x)=arctan(x)/(pi/2), f(x)=1/(1+e-x)。
 


我們甚至可以創造自己的激勵函式,但需要保證它們是可以微分的,因為誤差反向傳遞時,只有這些可微分的激勵函式才能把誤差傳遞回去(不太理解)。
 


當使用AF激勵函式,如果神經層只有2-3層時,對於隱藏層使用任意激勵函式都能掰彎直線,而當存在多層神經層時,隨意選擇AF會造成梯度爆炸、梯度消失等問題。
激勵函式選擇:
  1.少量神經層,多種選擇;
  2.卷積神經網路,使用Relu;
  3.迴圈神經網路,使用Relu、Tanh。
 

  

 

 

 

二. 什麼是過擬合

實際生活中,機器學習過於自信,甚至自負,在自己的小圈子裡非凡,但在大圈子裡卻處處碰壁。機器學習中的自負表現在哪些方面呢?
 

  

 

 

 

這條直線是希望機器學習學到的直線。假設藍色直線與所有黃色點的總誤差為10,有時機器過於追求誤差小,它學到的可能是紅色這條虛曲線,它經過了所有的資料點,誤差為1。
 

 

可是,誤差小真的好嗎?當我們拿這個模型預測實際值時,如下圖所示“+”號;這時,藍色誤差幾乎不變,而紅色誤差突然升高,而紅線不能表達除訓練資料以外的資料,這就叫做過擬合。
 


同樣,分類中的過擬合如下圖所示,有黃色兩個“+”號沒有很好的被分隔,這就是過擬合在作怪。

 

 

那麼,怎麼解決過擬合呢?
方法一:增加資料量
大多數過擬合的原因是資料量太小,如果有成千上萬資料,紅線也會被拉直,沒有這麼扭曲,所以增加資料量能在一定程度上解決過擬合問題。

方法二:L1, L2 Regularization
正規化是處理過擬合的常見方法,該方法適合大多數機器學習。
機器學習:y = W · x
其中,W是引數。過擬閤中W往往變化太大,為了讓變化不會太大,我們在計算誤差時需要做些手腳。
     L1:cost = (Wx - real y)^2 + abs(W)
=>L1正規化是預測值與真實值平方,加上W的絕對值

     L2:cost = (Wx - real y)^2 + (W)^2

=>L2正規化是預測值與真實值平方,加上W的平方
     L3:加立方,L4:加四次方

由於過度依賴的W會很大,我們在上述L1和L2公式中懲罰了這些大的引數。如果W變化太大,我們讓cost也跟著變大,變成一種懲罰機制,把W自己也考慮進來,從而解決過擬合。

 



方法三:Droput Regularization
該方法是訓練時,隨機忽略一些神經元和連線,神經網路會變得不完整,用不完整的神經網路訓練一次,緊接著第二次再隨機訓練,忽略另一部分的神經元和連線,讓每次結果不依賴特定的神經元,Droput從根本上解決過擬合。

 

  

 

 

 

 

 

三. 加速神經網路

Speed Up neural network training process
如何加速神經網路訓練呢?

越複雜的神經網路,越多的資料,我們需要花費在神經網路上的時間就越多,其原因是計算量太大了,可是往往為了解決複雜的問題、複雜的結構和大資料,又是不可避免的。所以我們需要找一些方法,讓神經網路變得聰明起來、快起來。

 

  


最簡單方法:SGD(Stochastic Gradient Descent)

 

假設紅色方塊是我們要訓練的資料Data,如果使用普通的訓練方法,需要重複的將整套資料放入神經網路NN中訓練,這樣消耗的計算資源會很大。我們需要換一種思路,將資料拆分成小批小批的,然後再分批不斷放入NN中計算,這就是SGD的正確開啟方式。

 

SGD每次使用批量資料,雖然不能反映整體資料的情況,但在很大程度上加速神經網路的訓練過程,而且不會丟失太多準確率。

 

  

 

如果還是嫌SGD訓練速度太慢,怎麼辦呢?
事實證明,SGD並不是訓練最快的方法,圖中紅線是SGD的訓練過程,時間相對較長,其他途徑可以加速訓練。
 

 

 


方法二:Momentum
大多數其他方法是在更新神經網路引數時動手腳,如下所示:

 

 

W += - Learning rate * dx

引數W的更新,是將原始W累加上一個負的學習效率(Learning rate)乘以校正值(dx),這種方法可能會讓學習過程曲折無比,看起來就像一個喝醉酒的人回家時搖搖晃晃走了很多彎路,所以我們把這個人從平地上放到斜坡上,只要他往下坡的方向走一點點,由於向下的慣性,他走的彎路也會不自覺的變小 ,稱為Momentum的方法,它的數學形式如下所示。

 

m = b1*m - Learning rate * dx

W += m

 

 

方法三:AdaGrad
該方法是在學習率上動手腳,使得每一個引數的更新都有與眾不同的學習效率,它的作用和Momentum類似,不過不是給喝醉的人安排一個斜坡,而是給喝醉酒的人一雙不好走的鞋子,使得他搖晃走路時,發現腳疼,鞋子變成了走彎路的阻力,逼著他往前直著走,它的數學形式如下。

 

v += dx^2

W += -Learning rate * dx / √v
 

 


方法四:RMSProp
如果把下坡和不好走的鞋子結合起來,是不是就更好呢?我們這就有了RMSProp方法,通過Momentum的慣性原則,加上AdaGrad對錯誤發生了阻力,就合併成如下所示的RMSProp,同時具有兩則優點。

 

 



不過細心的同學可能發現了RMSProp中少了些什麼?原來我們是沒有完全合併Momentum,少了Momentum中的“-Learning rate * dx”部分,所以我們會在Adam中補上這種想法。
計算m時有Momentum的下坡屬性,計算v時有AdaGrad的阻力屬性 ,然後再更新引數時,把m和v都考慮進去。實驗證明,大多數使用Adam都能又快又好的達到目標,迅速收斂,所以在加速神經網路訓練時,一個下坡,一雙破鞋,就能實現。

 





基礎性文章,希望對您有所幫助,推薦大家閱讀莫煩大神的學習視訊,也建議大家一步步跟著學習,同時文章中存在錯誤或不足之處,還請海涵~真是太忙了,有時候擠點時間出來寫文章,才能讓自己放平心態,誰又能寫一輩子部落格呢?又有幾個人能做自己喜歡的事情,哎。看到學生也開始寫文章,還是高興的。
(By:Eastmount 2018-06-25 晚上12點
  http://blog.csdn.net/eastmount/ )

 

相關文章