[Python人工智能] 七.加速神经网络、激励函数和过拟合
從本系列文章開始,作者正式開始研究Python深度學習、神經網絡及人工智能相關知識。前六篇文章講解了神經網絡基礎概念、Theano庫的安裝過程及基礎用法、theano實現回歸神經網絡、theano實現分類神經網絡、theano正規化處理,這篇文章講解加速神經網絡訓練的方法,為什么有激勵函數以及過擬合,均是基礎性知識。主要是學習"莫煩大神" 網易云視頻的在線筆記,后面隨著深入會講解具體的項目及應用。基礎性文章和在線筆記,希望對您有所幫助,本系列作者采用一篇基礎一篇代碼的形式講解,也建議大家一步步跟著學習,同時文章中存在錯誤或不足之處,還請海涵~
"莫煩大神" 網易云視頻地址:http://study.163.com/provider/1111519/course.html
同時推薦前面作者另外三個Python系列文章。
從2014年開始,作者主要寫了三個Python系列文章,分別是基礎知識、網絡爬蟲和數據分析。
- Python基礎知識系列:Pythonj基礎知識學習與提升
- Python網絡爬蟲系列:Python爬蟲之Selenium+Phantomjs+CasperJS
- Python數據分析系列:知識圖譜、web數據挖掘及NLP
??
前文參考:
[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/?)
?
總結
以上是生活随笔為你收集整理的[Python人工智能] 七.加速神经网络、激励函数和过拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python人工智能] 五.thean
- 下一篇: 【python数据挖掘课程】二十四.KM