1)神經元模型
最簡單的MP模型,右圖是“與”邏輯的數學表達:
神經元模型
基函數表示“如何組合”
激活函數表示“是否到閾值”
“最后網絡表達的方式”
基函數類型1:線性函數
給定訓練集,權重wi以及閾值θ可通過學習得到。閾值可看做一個固定輸入為-1.0的“啞結點”所對應連接權重w(n+1),這樣權重和閾值的學習就可以統一為權重的學習。感知機學習規則非常簡單,對訓練樣例(x,y),若當前感知機的輸出為y’,則感知機權重將這樣調整:
其中,被稱為學習率,若感知機對訓練樣例(x,y)預測正確,即y’=y,則感知機不會再發生變化,否則將根據錯誤的程度對權重進行調整。
關於線性可分問題:感知機只有輸出神經元進行F函數處理,學習能力十分有限,實際上,與、或、非問題等都是線性可分的,存在一個線性超平面能將他們划分(超平面將空間分成兩部分,一部分大於0,一部分小於0),對於該種線性超平面問題,感知機學習過程一定會收斂,否則感知機就會發生震盪,不能求得合適解。
要解決非線性可分問題,使用多層功能神經元:
我們知道神經網絡里面有很多的層,每一層又有很多的神經元。看起來就非常復雜,似乎輸入與輸出都很凌亂,對它的理解也很難。那么我們可以從單個神經元入手,考慮單個神經元的輸入與輸出之間的關系,再擴展到整個神經網絡。
從圖中可以得到:
hθ(x)=g(−30+20x1+20x2)
hθ(x)=g(−30+20x1+20x2)
假如x1和x2的組合如下:
x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1
我們將x1和x2輸入到假設函數,可以得到:
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)1,a1(2)神經元是一個“與”操作。a(2)2,a2(2)神經元是一個“非與”操作。a(3)1,a1(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)機器學習庫或者深度學習庫都會包括梯度下降算法的不同變種實現。但是,它們就像一個黑盒優化器,很難得到它們優缺點的實際解釋。
- 批量梯度下降(Batch gradient descent)
旨在每次使用全量的訓練集樣本來更新模型參數,即:θ=θ−η⋅∇θJ(θ) 偽碼如下:
nb_epochs是用戶輸入的最大迭代次數。使用全量的訓練集樣本計算損失函數loss_function的梯度params_grad,然后使用學習速率learning_rate朝着梯度相反方向去更新模型的每一個參數params。
批量梯度下降每次學習都使用整個訓練集,因此其優點在於每次更新都會朝着正確的方向進行,最后能夠保證收斂於極值點(凸函數收斂於全局極值點,非凸函數可能會收斂於局部極值點,屬於凸理論的問題了),但是其缺點在於每次學習時間過長,並且如果訓練集很大以至於需要消耗大量的內存,並且全量梯度下降不能進行在線模型參數更新。
- 隨機梯度下降(Stochastic gradient descent)
旨在每次從訓練集中隨機選擇一個樣本來進行學習,即:θ=θ−η⋅∇θJ(θ;xi;yi)
偽碼如下:
批量梯度下降算法每次都會使用全部訓練樣本,因此這些計算是冗余的,因為每次都使用完全相同的樣本集。而隨機梯度下降算法每次只隨機選擇一個樣本來更新模型參數,因此每次的學習是非常快速的,並且可以進行在線更新。
特別觀察一下SGD,紅色的那條線,從圖中可以看出SGD實際上是所有方法中最慢的一個,所以在實際中很少應用它,我們可以使用更好的方案。那我們來分析一下SGD的問題,是什么原因導致它的的速度這么慢?舉個栗子:
我們可以從水平方向上可以看出,它的梯度很是非常小的,因為處於在一個比較淺的水平里;但是垂直有很大的速率,因為它是一個非常陡峭的函數,所以出現了這種狀況:
在這種情況下使用SGD,在水平方向上進行比較緩慢,而在垂直方向上進展的很快,所以產生了很大的上下震盪。
- 小批量梯度下降(Mini-batch gradient descent)
旨在綜合了 batch 梯度下降與 stochastic 梯度下降,在每次更新速度與更新次數中間取得一個平衡,其每次更新從訓練集中隨機選擇 m,m
相對於隨機梯度下降,Mini-batch梯度下降降低了收斂波動性,即降低了參數更新的方差,使得更新更加穩定。相對於全量梯度下降,其提高了每次學習的速度。並且其不用擔心內存瓶頸從而可以利用矩陣運算進行高效計算。一般而言每次更新隨機選擇[50,256]個樣本進行學習,但是也要根據具體問題而選擇,實踐中可以進行多次試驗,選擇一個更新速度與更次次數都較適合的樣本數。mini-batch梯度下降可以保證收斂性,常用於神經網絡中。