Micheal Nielsen s神經網路學習之二

2021-09-12 05:18:41 字數 3414 閱讀 6628

依然是跟著michael nielsen的神經網路學習,基於前一篇的學習,已經大概明白了神經網路的基本結構和bp演算法,也能通過神經網路訓練數字識別功能,之後我試驗了一下使用神經網路訓練之前的文字分類,只是簡單的使用了詞頻來作為詞向量處理過程,沒有任何的其他調參過程,對於八分類,其正確率到了84%,相比於之前各種調參才能勉強達到72%的svm分類方法而言,神經網路有無可比擬的簡單和高正確率。好了,安利了這麼久的神經網路,現在是時候回歸正題了

這一篇以及後面的文章涉及到神經網路的調優問題,有人會說「看,神經網路也需要調參」,其實我想表達的是神經網路在不調參的時候準確度已經非常好了,調參只是為了更上一層樓,而且神經網路調參絕對比支援向量機(svm)簡單的多,這是我喜歡神經網路的原因。

神經網路調參包括三個方面:

**1. 損失函式的選取loss function 

2. 正則化 

3. 初始引數w和b的選取**

本文主要是就第乙個方面來進行優化,也就是選取新的損失函式來加快學習過程。

簡要回憶一下前一篇文章michael nielsen』s神經網路學習之一上面的損失函式,也就是二次損失函式:quadratic cost 。其基本形式是:

這個損失函式有什麼問題呢,其實二次損失函式有很多的有點,比如容易求導,也能基本表徵」損失「這一詞的意思。現在讓我們看下對於乙個具體的神經元,這個損失函式的表現過程。

首先對於下圖的單個神經元,我們假設初始化的權重w=0.6,以及偏移量b=0.9以及步長n=0.15,然後我們假設這個神經元的應該輸出的結果是0.0,按照以往的神經元計算方法,我們計算出來的結果是0.82,初始的誤差較大,然後我們觀察在這個神經元使用梯度下降法的過程中的引數變化過程:

從圖中可以看到結果還是很給力的,300次迭代之後結果為0.09,和結果相差也不算大,恩,這是其中乙個例子。

我們再來看另乙個例子,同樣使用二次損失函式,但是我們把最初的權重w和b都設計為2,步長為0.15不變,應該輸出的結果為0也不變,按照這個引數第一次計算的結果是0.98,相差比第一次大,同樣我們看一下其引數在梯度下降過程中的變化過程: 

經過30次迭代之後,其輸出的結果是0.2,誤差較第一次變大了不少。

通過這兩次的例子,我們可以發現什麼,在第二個例子中,其初始引數偏差非常發,因此初始的誤差非常大,但是從其變化圖可以看出,其學習過程相當緩慢(曲線比較平滑),從人的角度考慮,如果給定初始的引數,乙個人發現這個引數的偏差非常大,通常這個人會將引數調整的幅度變大而不是變小,但是從第二個例子來看,二次損失函式恰恰相反,這乙個特性無疑降低了學習的速度。

回顧前面的神經網路,我們在最開始選取w和b的時候是使用隨機的數產生,在二次損失函式的情況下,這就產生了嚴重的問題,如果我們隨機生成的數稍微正常一點,如上面的例一,我們可以收斂的快一點,但是如果我們生成的數開始偏差就非常大,這非常容易導致最後的收斂過程過度緩慢的問題。

現在我們從數學的角度,想象為什麼二次損失函式會在引數誤差很大的情況下學習速度反而放緩。 

為了簡要起見,我們以單個的神經元為例。 

首先損失函式: 

對應的其求導方法:

因為使用了sigmoid函式,那麼a的取值在(0,1)之間,由上面的求導公式可以看出,當a和y相差很大的情況下,該求導值反而低,也就是說這個值得輸出和誤差值的大小並不是呈直接線性相關的,這也就是為什麼二次損失函式容易出現學習過慢的問題

鑑於二次損失函式的上面所說的確定,這就引入了」互熵「損失函式(corss-entropy cost function),或者叫交叉熵。 

還是以單個的神經元為例: 

我們來看一下互熵的表示形式: 

其實這個和一般的熵的形式也沒什麼區別,下面來說一下為什麼」互熵「能夠起到損失函式的作用。總結起來有一下幾點好處:

其值為正

和輸出資料之間有依賴關係

對w和b求分導的結果和誤差值呈正相關

下面具體來說說具體的方面。 

對於第一點:這是顯然的

對於第二點:我們可以看到,假如應該輸出的結果是1的話,當我們通過神經元得到的輸出也接近為1的時候其值為0,當我們通過神經元得到的輸出為0的時候,其值是1,也就是基本上滿足損失函式所要求的功能

對於第三點:我們容易得到:

其中a為神經元的輸出值 

由上面的求導公式很容易得到結論:當誤差值較大的時候,w和b的下降梯度也會變大,這和我們想要的功能是一樣的。 

例一:初始權重w為0.6,偏移b=0.9,需要的輸出是0,步長為0.15. 

例二:w和b都為2,需要輸出是0,步長為0.15 

可以看出如果誤差越大,其下降的梯度也就越大,也就是說學習過程加快了,達到了我們要的效果。

拓展到多層多個神經元,其求導方式是一樣的,只不過多了一些引數罷了

在使用了互熵作為損失函式之後,之前的神經網路**就需要改變了,不過只是需要改變一下在bp步驟裡面的求導值即可

delta = (self.cost).delta(zs[-1], activations[-1], y) #(1)

nabla_b[-1] = delta #(2)

nabla_w[-1] = np.dot(delta, activations[-2].transpose()) #(3)

其中在第一步中

delta計算值為:activations[-1]-y 

這個和我們上面的求導結果是一樣的。

end!

參考文獻:《improving the way neural networks learn》michael nielsen's 神經網路與深度學習

Micheal Nielsen s神經網路學習之二

依然是跟著michael nielsen的神經網路學習,基於前一篇的學習,已經大概明白了神經網路的基本結構和bp演算法,也能通過神經網路訓練數字識別功能,之後我試驗了一下使用神經網路訓練之前的文字分類,只是簡單的使用了詞頻來作為詞向量處理過程,沒有任何的其他調參過程,對於八分類,其正確率到了84 相...

神經網路學習之 Hopfield神經網路

1982年,美國加州理工學院的優秀物理學家hopfield提出了hopfield神經網路。hopfield神經網路引用了物理力學的分析方法,把網路作為一種動態系統並研究這種網路動態系統的穩定性。dhnn 離散型hopfield神經網路 這是一種單層全反饋網路,共有n個神經元。其特點是任一神經元的輸出...

神經網路學習之導數

在神經網路中,有乙個常用的啟用函式sigmoid函式,這個函式在高等數學中應該是有的,只是當時沒有理會。函式影象如下,本文主要主要梳理下相應的數學知識,具體的應用在後續的文章中會涉及。本文涉及到數學公式,基本都是大學課本或者高中課本裡的,有興趣的一起來回憶下。傳說乙個公式能少乙個粉絲,但是那也沒有辦...