[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/ )
相關文章
- 神經網路中常用的函式神經網路函式
- 人工智慧---神經網路啟用函式恆等函式、sigmoid函式、softmax函式詳解人工智慧神經網路函式Sigmoid
- 神經網路和機器學習、強人工智慧神經網路機器學習人工智慧
- 卷積神經網路-啟用函式卷積神經網路函式
- 深度神經網路(DNN)損失函式和啟用函式的選擇神經網路DNN函式
- 【深度學習篇】--神經網路中的調優二,防止過擬合深度學習神經網路
- 理解神經網路的不同損失函式神經網路函式
- 神經網路的啟用函式總結神經網路函式
- 神經網路中使用的啟用函式神經網路函式
- 理解神經網路中的目標函式神經網路函式
- 模糊神經網路工具箱函式使用神經網路函式
- 人工智慧 (11) 神經網路人工智慧神經網路
- 理解神經元和函式函式
- 《神經網路和深度學習》系列文章二十五:過擬合與正則化(2)神經網路深度學習
- 神經網路啟用函式=生物轉換器?神經網路函式
- Tensorflow中神經網路的啟用函式神經網路函式
- 深度神經網路的壓縮與加速神經網路
- Filecoin激勵機制:通過Slashing保障網路穩定性
- [Python人工智慧] 四.神經網路和深度學習入門知識Python人工智慧神經網路深度學習
- 深度學習筆記——常用的啟用(激勵)函式深度學習筆記函式
- 《神經網路和深度學習》系列文章七:實現我們的神經網路來分類數字神經網路深度學習
- 神經網路簡介--啟用函式、網路架構、生物模型解釋神經網路函式架構模型
- 讀人工智慧全傳09神經網路人工智慧神經網路
- [Python人工智慧] 二.theano實現迴歸神經網路分析Python人工智慧神經網路
- 神經網路:numpy實現神經網路框架神經網路框架
- 如何通過 JavaScript 實現機器學習和神經學網路?JavaScript機器學習
- 在邊緣裝置上擬合大型神經網路的方法總結神經網路
- 神經網路神經網路
- 神經網路和深度學習神經網路深度學習
- 如何用Python和深度神經網路識別影象?Python神經網路
- 什麼是人工智慧領域的過擬合和欠擬合人工智慧
- 深度學習和神經網路的七大顯著趨勢深度學習神經網路
- 人工智慧教程 - 1.1.1 什麼是神經網路人工智慧神經網路
- 基於負相關誤差函式的4整合BP神經網路matlab建模與模擬函式神經網路Matlab
- 開放式神經網路交換-ONNX(上)神經網路
- [譯] 使用 Python 和 Keras 實現卷積神經網路PythonKeras卷積神經網路
- python對BP神經網路實現Python神經網路
- 【Python】keras神經網路識別mnistPythonKeras神經網路