搭建乙個神經網路時,你可以選擇隱藏層中或者輸出層中使用什麼啟用函式(actuation function),到目前為止,我們一直使用的是sigmoid函式,但其他函式效果會更好。
在實際訓練中,有個函式表現總是比sigmoid好,叫tanh(雙曲正切函式),它的輸出是(-1,1),從數學上,它其實是sigmoid函式的平移。
z)但是這兩個函式在z很大或者很小的時候,導數接近與0,這會拖慢梯度下降演算法。
目前最受歡迎的修正線性單元relu(rectified linear unit),它在z大於0的時候導數一直為1.在小於0的情況下,導數為0,但是實際運算中,z同時為0的概率很低。
,z)還有乙個帶洩露的relu(leaky relu),這通常比relu效果好,不過實際使用的頻率並不高。
在選擇啟用函式時有個經驗法則:如果輸出是0或者1或者二分類問題,輸出層啟用函式可以選擇sigmoid函式,其餘全部為relu。實際使用relu或者leaky relu,神經網路收斂會快的多。
為什麼啟用函式都要使用非線性函式呢?事實證明,要讓你的神經網路計算出有趣的函式,你必須使用非線性函式。因為你如果採用了線性啟用函式,那麼你的**輸出只不過是輸入的線性組合
當你對神經網路進行反向傳播時,你需要計算啟用函式的斜率或者導數。利用微積分我們可以輕易的計算常見啟用函式的導數。下面給出啟用函式的導數公式:
sigmoid function:dz
=a(1
−a) dz=
a(1−
a)tanh function: dz
=1−a
2 dz=
1−a2
relu function:dz
=1if
z>0,
dz=0
ifz<
0 dz=
1ifz
>0,
dz=0
ifz<
0leaky dunction dz
=1if
z>0,
dz=0.
oz,i
fz<
0 dz=
1ifz
>0,
dz=0.
oz,i
fz<
0, 這裡我們取leaky relu = max(0.01z, z)
對於2層的神經網路,我們有:
引數:w[1
],b[
1],w
[2],
b[2]
w [1
],b[
1],w
[2],
b[2]
成本函式:j(
w[1]
,b[1
],w[
2],b
[2])
j (w
[1],
b[1]
,w[2
],b[
2])那麼梯度下降法就可以寫成:
repeat
這樣,我們就實現了一次迭代。每個導數的具體實現只需要根據鏈式求導方法就可以計算出來。最後結果如下:
對於神經網路的權重不能同時初始化為0,因為這樣會發現,所有的節點都是完全對稱的,每個節點都在計算相同的函式。這個問題的解決方案是隨機初始化所有引數,如w[
1]]=
np.r
ando
m.ra
ndn(
(2,2
))∗0.01
w [1
]]=n
p.ra
ndom
.ran
dn((
2,2)
)∗0.01
,即將其初始化為高斯分布的很小的權重。b其實沒有具備的破壞對稱性問題,故它可以初始化為0。之所以後面*0.01是因為如果啟用函式為sigmoid或者tanh,會減小收斂速度。
神經網路和深度學習 淺層神經網路
乙個淺層神經網路示意圖 如圖所示,表示乙個單隱層的網路結構。這裡主要需要注意的是,層與層之間引數矩陣的規格大小 隱藏層和輸出層之間 由上面我們可以總結出,在神經網路中,我們以相鄰兩層為觀測物件,前面一層作為輸入,後面一層作為輸出,兩層之間的w引數矩陣大小為 n out,nin b引數矩陣大小為 n ...
神經網路學習(十)淺層BP神經網路總結
系列部落格是博主學習神經網路中相關的筆記和一些個人理解,僅為作者記錄筆記之用,不免有很多細節不對之處。我的這一階段目標是在學習完淺層bp神經網路的相關知識時,可以將手寫字的識別率達到98 在前面的幾次實驗中,mnist手寫字的識別率始終未達到98 以上,這樣的結果是有些讓人沮喪的。今天進過艱苦奮鬥,...
神經網路和深度學習(二)淺層神經網路
1 計算神經網路的輸出 正向傳播 矩陣表示 向量化 2 多個樣本的向量化 正向傳播 3 啟用函式 1 sigmoid函式僅用於二分分類的情況,較少使用 2 tanh函式絕大多數情況下優於sigmoid函式 3 relu函式是預設的常用啟用函式 4 leaking relu 帶洩露的relu函式 4 ...