基於pytorch的簡易卷積神經網絡結構搭建-搭建神經網絡前


1)神經元模型

最簡單的MP模型,右圖是“與”邏輯的數學表達:

 

 

 

 

 

神經元模型

基函數表示“如何組合”

激活函數表示“是否到閾值”

“最后網絡表達的方式”

 

 

基函數類型1:線性函數

 

 

給定訓練集,權重wi以及閾值θ可通過學習得到。閾值可看做一個固定輸入為-1.0的“啞結點”所對應連接權重wn+1),這樣權重和閾值的學習就可以統一為權重的學習。感知機學習規則非常簡單,對訓練樣例(xy),若當前感知機的輸出為y’,則感知機權重將這樣調整:

 

 

其中,被稱為學習率,若感知機對訓練樣例(xy)預測正確,即y’=y,則感知機不會再發生變化,否則將根據錯誤的程度對權重進行調整。

關於線性可分問題:感知機只有輸出神經元進行F函數處理,學習能力十分有限,實際上,與、或、非問題等都是線性可分的,存在一個線性超平面能將他們划分(超平面將空間分成兩部分,一部分大於0,一部分小於0),對於該種線性超平面問題,感知機學習過程一定會收斂,否則感知機就會發生震盪,不能求得合適解。

 

 

要解決非線性可分問題,使用多層功能神經元:

我們知道神經網絡里面有很多的層,每一層又有很多的神經元。看起來就非常復雜,似乎輸入與輸出都很凌亂,對它的理解也很難。那么我們可以從單個神經元入手,考慮單個神經元的輸入與輸出之間的關系,再擴展到整個神經網絡。

 

 

從圖中可以得到:

hθ(x)=g(30+20x1+20x2)

hθ(x)=g(30+20x1+20x2)

 

假如x1x2的組合如下:

x1 x2 y

0 0 0

0 1 0

1 0 0

1 1 1

我們將x1x2輸入到假設函數,可以得到:

g(-30+20*0+20*0)=g(-30)0

g(-30+20*0+20*1)=g(-10)0

g(-30+20*1+20*0)=g(-10)0

g(-30+20*1+20*1)=g(10)1

事實上,這就像是一個“與”操作。

 

那么對於“或”操作也是類似的。“或”操作的θ可以如下選擇:

hθ(x)=g(10+20x1+20x2)

hθ(x)=g(10+20x1+20x2)

 

g(-10+20*0+20*0)=g(-10)0

g(-10+20*0+20*1)=g(10)1

g(-10+20*1+20*0)=g(10)1

g(-10+20*1+20*1)=g(30)1

可以看到,通過選擇不同的θ值,就可以變成“或”操作。

那么對於復雜一點的操作,比如“異或”操作呢?

 

 

“異或”操作使用兩層神經元。通過選擇如圖的參數,我們可以知道:

a(2)1a1(2)神經元是一個“與”操作。a(2)2a2(2)神經元是一個“非與”操作。a(3)1a1(3)神經元是一個“或”操作。這三者的結合就可以得到“異或”操作了。

所以,經過一個神經元,其實就是在做一種判斷,像“與”,“或”這種簡單的邏輯。單個神經元就可以做到了,但是對於復雜的判斷,就不是一個神經元就可以搞定的。隨着復雜程度的增加,神經網絡也就形成了。

其實這跟數字電路還有點像。以前學習數字電路的時候,也是從簡單的與非門,或門等簡單的邏輯電路學起,然后復雜的邏輯都是通過簡單邏輯的組合得到的。

另外還有“單隱層網絡”以及“多隱層前饋神經網絡”,此處不再多說。

 

2)誤差逆傳遞算法(BP算法)

誤差逆傳播算法是迄今最成功的神經網絡學習算法,現實任務中使用神經網絡時,大多使用BP算法進行訓練。

給定訓練集

 

即輸入示例由d個屬性描述,輸出l個結果。如圖所示,是一個典型的單隱層前饋網絡,它擁有d個輸入神經元、l個輸出神經元、q個隱層神經元,其中,θj表示第j個神經元的閾值,γh表示隱層第hh個神經元的閾值,輸入層第i個神經元與隱層第hh個神經元連接的權值是vih,隱層第h個神經元與輸出層第j個神經元連接的權值是whj

 

 

於是,按照神經網絡的傳輸法則,隱層第h個神經元接收到的輸入

 

,輸出

 

,輸出層j第個神經元的輸入

 

,輸出

 

,其中f函數是激活函數γhθj分別是隱藏層和輸出層的閾值,選擇Sigmoid函數作為激活函數。
  對訓練樣例(xk,yk),通過神經網絡后的輸出是

 

,則其均方誤差為

 

 

為了使輸出的均方誤差最小,我們以均方誤差對權值的負梯度方向進行調整,給定學習率η

 

 

這里為什么是取負梯度方向呢?因為我們是要是均方誤差最小,而
w的更新估計式為

 

 

如果,

 

,則表明減小w才能減小均方誤差,所以Δw應該小於零,反之,如果

 

,則表明增大w的值可以減小均方誤差,所以所以Δw應該大於零,所以在這里取負的偏導,以保證權值的改變是朝着減小均方誤差的方向進行。

  在這個神經網絡中,Ek是有關

 

的函數,是有關βj的函數,而βj是有關wij的函數,所以有

 

 

 

 

而對Sigmoid函數有

 

 

所以

 

 

將式(7)代入式(3)和式(4),就得到BP算法中關於Δwij的更新公式

 

 

類似可得:

 

 

其中,式(10)和式(11)

 

 

至此,誤差逆傳播算法的推導已經完成,我們可以回過頭看看,該算法為什么被稱為誤差逆傳播算法呢?誤差逆傳播,顧名思義是讓誤差沿着神經網絡反向傳播,根據上面的推導

 

其中,是輸出誤差,是輸出層節點的輸出y對於輸入β的偏導數,可以看做是誤差的調節因子,我們稱gj調節后的誤差

 

所以eh可以看做是調節后的誤差gj通過神經網絡后並經過調節的誤差,並且我們可以看出:權值的調節量=學習率x調節后的誤差x上層節點的輸出,算是對於誤差逆向傳播法表面上的通俗理解,有助於記憶。

整個逆向誤差傳遞算法工作流程:

 

 

需注意的是, BP 算法的目標是要最小化訓練集D上的累積誤差

 

 

但我們上面介紹的"標准 BP 算法"每次僅針對一個訓練樣例更新連接權和闊值,如果類似地推導出基於累積誤差最小化的更新規則,就得到了累積誤差逆傳算法累積 BP 算法與標准 BP 算法都很常用.一般來說,標准 BP 算法每次更新只針對單個樣例,參數更新得非常頻繁,而且對不同樣例進行更新的效果可能出現"抵消"現象.因此,為了達到同樣的累積誤差極小點 標准 BP 算法往往需進行更多次數的法代.累積 BP 算法直接針對累積誤差最小化,它在 賣取整個訓練集 一遍后才對參數進行更新,其參數更新的頻率低得多.但在很多任務中,累積誤差下降到一定程度之后,進一步下降會非常緩慢,這時標准 BP 往往會更快獲得較好的解,尤其是在訓練非常大時更明顯。

 

全局最小與局部最小:通過學習,我們知道,因為訓練神經網絡有個過程:

<1>Sample 獲得一批數據;

<2>Forward 通過計算圖前向傳播,獲得loss

<3>Backprop 反向傳播計算梯度,這個梯度能告訴我們如何去調整權重,最終能夠更好的分類圖片;

<4>Update 用計算出的梯度去更新參數

 

用一段偽碼表述上述文字:

 

while True:

     data_batch = dataset.sample_data_batch()

     loss = network.forward(data_batch)

     dx = network.backward()

     x += - learninng_rate * dx

當我們談論參數更新時,指的是上述偽碼的最后一行,我們所要討論的就是如何把這一行的更新迭代做的高級一點。梯度下降算法是深度學習中使用非常廣泛的優化算法,也是眾多機器學習算法中最常用的優化方法。幾乎當前每一個先進的(state-of-the-art)機器學習庫或者深度學習庫都會包括梯度下降算法的不同變種實現。但是,它們就像一個黑盒優化器,很難得到它們優缺點的實際解釋。

  1. 批量梯度下降(Batch gradient descent

旨在每次使用全量的訓練集樣本來更新模型參數,即:θ=θ−η⋅∇θJ(θ) 偽碼如下:

 

nb_epochs是用戶輸入的最大迭代次數。使用全量的訓練集樣本計算損失函數loss_function的梯度params_grad,然后使用學習速率learning_rate朝着梯度相反方向去更新模型的每一個參數params

批量梯度下降每次學習都使用整個訓練集,因此其優點在於每次更新都會朝着正確的方向進行,最后能夠保證收斂於極值點(凸函數收斂於全局極值點,非凸函數可能會收斂於局部極值點,屬於凸理論的問題了),但是其缺點在於每次學習時間過長,並且如果訓練集很大以至於需要消耗大量的內存,並且全量梯度下降不能進行在線模型參數更新。

  1. 隨機梯度下降(Stochastic gradient descent

旨在每次從訓練集中隨機選擇一個樣本來進行學習,即:θ=θ−η⋅∇θJ(θ;xi;yi) 
偽碼如下:

 

 

批量梯度下降算法每次都會使用全部訓練樣本,因此這些計算是冗余的,因為每次都使用完全相同的樣本集。而隨機梯度下降算法每次只隨機選擇一個樣本來更新模型參數,因此每次的學習是非常快速的,並且可以進行在線更新。

特別觀察一下SGD,紅色的那條線,從圖中可以看出SGD實際上是所有方法中最慢的一個,所以在實際中很少應用它,我們可以使用更好的方案。那我們來分析一下SGD的問題,是什么原因導致它的的速度這么慢?舉個栗子:

 

我們可以從水平方向上可以看出,它的梯度很是非常小的,因為處於在一個比較淺的水平里;但是垂直有很大的速率,因為它是一個非常陡峭的函數,所以出現了這種狀況:

 

在這種情況下使用SGD,在水平方向上進行比較緩慢,而在垂直方向上進展的很快,所以產生了很大的上下震盪。

  1. 小批量梯度下降(Mini-batch gradient descent

旨在綜合了 batch 梯度下降與 stochastic 梯度下降,在每次更新速度與更新次數中間取得一個平衡,其每次更新從訓練集中隨機選擇 m,m

 

 

相對於隨機梯度下降,Mini-batch梯度下降降低了收斂波動性,即降低了參數更新的方差,使得更新更加穩定。相對於全量梯度下降,其提高了每次學習的速度。並且其不用擔心內存瓶頸從而可以利用矩陣運算進行高效計算。一般而言每次更新隨機選擇[50,256]個樣本進行學習,但是也要根據具體問題而選擇,實踐中可以進行多次試驗,選擇一個更新速度與更次次數都較適合的樣本數。mini-batch梯度下降可以保證收斂性,常用於神經網絡中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM