神經網絡架構

神經網絡模型

神經網絡分爲輸入層、隱藏層、輸出層;以一個四層的神經網絡爲例(包含兩個隱藏層),輸入層x1,x2,x3經過第一組權重參數W1後,得到了第一個隱藏層的數據。然後再經過W2、W3後,得到最後的輸出層數據。

那麼,既然如此,可以直接用一個WX來進行表示就可以,爲什麼要加那麼多的隱藏層?

因爲還得考慮到非線性的情況,WX是不能表現出非線性的情況的。

激活函數

如上圖所示,特徵值x經過W1後,還要和0做一個對比,取較大者。這裏其實相當於在隱藏層1之後,經過了一個ReLu類型的激活函數。ReLu激活函數如下:

隱藏層1的參數如果小於0,輸出值直接等於0。隱藏層1的參數如果大於0,那麼輸出值等於它本身。

經過了激活函數,線性方程就會變成非線性方程,可以更好地取擬合真實值。

常見的激活函數如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JZjg502g-1577169211786)(https://raw.githubusercontent.com/yumening7/image_lib/master/1576747069(1)].jpg)

有了激活函數,可以在某些隱藏層添加激活函數,把原本的線性方程變成非線性的方程。

sigmoid激活函數與梯度消失問題

之前已經說過誤差反向傳播,如上圖所示,假設一個神經網絡經過W0-W4之後得到一個loss值,現在我們想知道W0-W4對loss的貢獻值。

W4對loss的貢獻值c4 = 對W4求偏導

W3對loss的貢獻值c3 = (對W3求偏導)* c4

W2對loss的貢獻值c2 = (對W2求偏導)* c3 * c4

W1對loss的貢獻值c1 = (對W1求偏導)* c2 * c3 * c4

W0對loss的貢獻值c0 = (對W0求偏導)* c1 * c2 * c3 * c4

其實這裏就相當於一個梯度累乘的操作。

最開始,神經網絡都是拿sigmoid當激活函數的。但是它有個致命的缺陷:

假設這裏的W3是一個sigmoid激活函數,W3這一個隱藏層的作用是把經過W2的數據作爲x傳入sigmoid函數,得出一個0到1區間的參數,再傳遞給W4對應的隱藏層。

如果經過W2的數據比較大或者比較小(例如大於10或小於-10,這裏取10方便舉例),10作爲x傳入sigmoid函數,求x=10時,W3的偏導。由下圖sigmoid函數圖像可以看出,當x=10時,此時W3的偏導(斜率)已經很接近0。

W3對loss的貢獻值c3 = (對W3求偏導)* c4

可以看得出,除非c4的值非常大,否則W3對loss的貢獻值c3也會是一個接近0的數。

由於W3對loss的貢獻值小,通過誤差反向傳播,對W3的調整也會很小。而且由於W2、W1、W0對loss的貢獻值計算,都要乘上c3,而c3又十分接近0,導致W2、W1、W0對loss的貢獻值都非常小,誤差反向傳播時,對它們的調整也會非常小,幾乎無法進行更新。

這還是隻考慮到W3是sigmoid函數且對應的x值偏大或偏小的情況。若是W2或W1也是一個sigmoid函數,且對應的x值也存在偏大或偏小的情況,那整個梯度計算中,會出現多個接近0的值相乘,梯度會在累乘中逐漸消失(約等於0)。

這樣就產生了所謂的梯度消失的問題,在神經網絡層次比較多的時候,梯度消失問題非常容易發生,所以sigmoid函數被逐漸淘汰。

ReLu激活函數:

Relu激活函數一方面可以解決梯度消失的問題,另一方面求導也比較簡單。ReLu激活函數已經幾乎取代了sigmoid函數,成爲神經網絡的首選激活函數。

神經元

神經元的個數是會影響最終分類的效果,神經元的個數越多,通常情況下,神經網絡模型的效果越好。

https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html

上面的鏈接是一個神經網絡分類的模型,點開鏈接

如上圖所示,在紅色方框中,把中間兩個隱藏層的神經元個數都改爲1,再去執行腳本,可以看到此時只有一條決策邊界去做分類,分類效果並不好。

如上圖,我們把兩個隱藏層的神經元個數都改爲2,再次執行腳本,可以看到此時有兩條決策邊界去做分類,效果比只有1個神經元的時候會好一些。

如上圖,我們把隱藏層的神經元個數都改爲3,再次執行腳本,可以看到此時的分類效果已經很好了,綠色的點和紅色的點被完全分開。

當遇到更復雜的分類問題的時候,想要有比較好的分類效果,需要再增加神經元的個數。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rzTF6X8c-1577169211790)(68CFAE4AF8F9431FACB8B22473FB43B7)]

如上圖,螺旋形的數據,當隱藏層的神經元個數都爲5的時候,才能勉強把紅色的點和綠色的點分開。

雖然神經元的個數越多,通常情況下,神經網絡模型的效果越好。但是神經元的個數越多,也越容易發生過擬合的現象。

正則化在神經網絡中的重要作用:

L2正則化的表達式爲:Σ λ*w^2

如上圖,可以看到正則項係數λ取值越小時,在損失函數中施加的正則化懲罰項力度就越小,雖然訓練時的分類效果很好,但是泛化能力差,容易出現過擬合現象。

當正則項係數λ的值增大時,在損失函數中施加的正則化懲罰項力度也隨值增大,決策邊界逐漸變得平滑,訓練時的分類效果可能沒有特別好,但是泛化能力強,不容易出現過擬合現象。

從上圖也可以看出,越多的神經元,就越能夠表達複雜的模型。但是神經元越多也越容易發生過擬合現象。

權重初始化:

如果W的初始化值都爲0,那隱藏層都爲0,輸出層也爲0,反向傳播也是0。這樣就沒有意義。而如果W是1或者任意常數,都會導致反向傳播回來都是從一個方向去迭代,這樣會導致神經網絡迭代太慢。

一般的權重初始化都是進行高斯初始化或者隨機初始化。

而wx + b中的b,一般都是用零值來進行初始化的,當然,用其他常值來進行初始化也沒有問題。

DROP-OUT:

如上圖,在神經網絡中,每一層的和其他層之間是一個全連接的操作。既每一個特徵或神經元都與下一層的每個w進行連接。這樣的連接方式過於複雜,很容易就出現過擬合的現象。

這樣的情況就可以使用DROP-OUT來消除過擬合。

DROP-OUT的原理是在訓練的過程,每次只取部分的神經元進行更新,例如指定一個保留率爲60%,每次只留下60%的神經元進行前向傳播和反向傳播,其他神經元不進行更新。如上圖中的B,第一次訓練迭代的時候,不更新w1、w3、w4。可能在第二次訓練迭代的時候,又會不更新W2和W5。反正每次只會隨機選出60%的神經元。

使用DROP-OUT就能降低一些過擬合的風險,而且還能減小計算量。對於DROP-OUT減小的部分精度,可以用更多的迭代次數來進行彌補。

發佈了23 篇原創文章 · 獲贊 14 · 訪問量 2743
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章