在訓練神經網路過程中,網路訓練速度是比較引人關注的乙個問題。我們希望在訓練過程中網路代價函式會快速收斂,準確率會快速提公升,下面來說說一些常見的方法。
1.代價函式更換
1.1. quadratic-cost functionj(
w,b)
=12n
∑i=1
n(yi
−h(w
,b)(
xi))
2+r(
w)上式中,r(
w)是正則項,對於第乙個代價函式,我們由第二節的知識可知,最後一層w更新公式為 w(
l)=w
(l)−
α⋅∂j
(w,b
)w(l
)=w(
l)−α
⋅δ(l
+1)⋅
a(l)
其中 δ(
l+1)
=−(y
−a(l
+1))
f′(z
(l))
而f′(z(l
))是啟用函式的導數,之前的實驗中我們選取的啟用函式為sigmod函式,其對應的函式曲線為
從上圖中可以看出,在曲線的兩端,sigmod函式導數幾乎為0,也就是δ(
l+1)
中的f′(
z(l)
) 幾乎為0,所以導致權重更新得到的值很小,導致網路學習很慢。
1.2. cross-entropy cost function
對於上面提到的問題,如果能讓δ(
l+1)
中的f′
(⋅) 消失,那麼w和
b 的更新程度將會增大,網路學習速度就會提示。而cross-entropy函式正好可以實現這樣的期盼。 j(
w,b)
=−1n
∑i=1
n[yi
⋅ln(
h(w,
b)(x
))+(
1−yi
)⋅ln
(1−h
(w,b
)(x)
)]此時,對於cross-entropy代價函式,有 ∂j
∂w(l
)=∂j
∂h⋅∂
h∂z(
l)⋅∂
z(l)
w(l)
其中∂j
∂h=−
(yh−
1−y1
−h)=
−(y−
hh(1
−h))
,我們根據第二接的定義可知,對於最後一層輸出h=
a(l+
1),而∂h∂
z(l)
=f′(
z(l)
) ,當
f 為sigmod函式時,∂h
∂z(l
)=a(
l+1)
⋅(1−
a(l+
1)),而
z(l)
w(l)
=a(l
) ,那麼 ∂j
∂w(l
)=−(
y−a(
l+1)
)⋅a(
l)可以看到,由於沒有了f′
(⋅) 項,w 和
b的更新將會比之前的quadratic函式快。
然而對於非最後一層的w 和
b,其殘差項 δ(
l)=δ
(l+1
)⋅w(
l)⋅f
′(z(
l−1)
) 也會隨著bp演算法向前傳播而迅速趨近於0,導致底層引數更新慢。下圖是基於quadratic cost和cross-entropy cost函式在mnist上執行後得到的結果比較。
可以看出,cross-entropy函式收斂速度快於quadratic cost函式。
2.引數初始化
對於初始的
w 和
b,通常都是有標準正態分佈隨機產生,例如第
l 層網路有n(
l)個神經元,那麼其對應到第l+
1 層第
k 個神經元,有 z(
l+1)
k=∑i
=1n(
l)w(
l+1)
k,i⋅
a(l+
1)i假設輸入a(
l+1)
i 都為1,那麼由於n(
l)個w(l
+1)k
,i服從標準正態分佈,因此z(
l+1)
k∼n(
0,n(
l)) 的正態分佈,其分布如下:
其中藍色是標準正態分佈,紅色是n(0,100)的正態分佈,可以看到,當n(
l)=100
時,z(
l+1)
有很大概率落到值很大的地方,對於到之前的sigmod函式就可看到落在了梯度很小幾乎為0的地方概率很大。而我們常用的網路n(
l)遠遠大於100,那麼f′
(z) 等於0的概率就更大,因此我們要對
w 的初始化做一些限制,使得z服從標準正態分佈。我們在產生w和
b 時使其服從n(
0,1n
(l)√
)的正態分佈,最後z(
l+1)
k∼n(
0,1)
,梯度比之前遠遠要大。
下圖是利用隨機初始化和服從n(
0,1n
(l)√
) 產生的結果對比
可以看出,改善權重更新後,網路更新速度得以提公升,結果也更好。
3.relu啟用函式
因為之前的啟用函式在函式兩端梯度幾乎為0,所以如果能換其他函式使得其在輸入很大的情況下梯度不會非常小,那麼網路收斂速度就不會受太大影響。relu啟用函式就具備這樣的性質,relu函式為 z=
max(
0,z)
下圖是三種啟用函式的對比
可以看出,在橫軸大於5時,sigmod和tanh函式梯度幾乎為零,但是relu函式梯度不變一直為1.
4.momentum-based gradient descent(動量梯度下降)
該方法出發點為,既然梯度每次都會下降,拿我們對其在其下降方向上對下降程度進行累加,如果每次下降方向相同,那麼下降速度會越來越快。有 w=
w+v
v=μ⋅
v−α⋅
∂j∂w
這樣,每次下降都會考慮到上次下降的程度(由
μ 控制),這樣梯度會沿著下降最快的方向行進。下圖是利用動量梯度下降和原始梯度下降的對比效果。
python專案 功能
函式隨機初始化函式
reset_qinit()
cross-entropy代價函式
backppg_cs()
momentum-based gradient decent
在呼叫trainnet()時新增第二個引數」mo」以及最後一行輸入」-p x」設定活躍神經元的比例
參考 [1] michael nielsen
神經網路簡介 多層神經網路
如上圖所示,該神經網路有三層。我們標記第一層 也就是輸入層 為a 1 第一層與第二層連線權重為w 1 然後第一層輸入與第一層權重的線性和為z 1 第一層神經元個數為n 1 並依次標記剩餘網路層。可以看出,存在 z l j i 1 n l a l i w l i,j a l w l j a l 1 f...
神經網路加速指南
分析各步驟耗時 1 cpu上的操作耗時 嘗試將操作放在gpu上進行,如np.argmax的操作 2 cpu 耗時 嘗試減少傳輸tensor的大小 3 資料預處理耗時 1 resample操作嘗試放到gpu上處理?2 先crop後resample?4 呼叫不同的包耗時不同 如scipy skimage...
神經網路加速理論
1 gpu計算神經網路加速原理 2 脈動陣列計算神經網路原理 3 谷歌tpu架構 4 脈動陣列 參考文獻 gpu實現神經網路加速優化的關鍵方式是並行化與向量化,一種最常見的gpu加速神經網路的模式為通用矩陣相乘 general matrix multiply 即將各類神經網路核心計算展開為矩陣計算的...