關於神經網路參數初始化為全0的思考

參考:為什麼神經網路參數不能全部初始化為全0?

以下內容是與憶臻討論得出。

現有神經網路表示如下:

net_0=W_0x+b_0 \ a=tanh(net_0)\ net_1=W_1a+b_1\ y_p = tanh(net_1)\ loss = LossFunction(y_p,y_r)

討論的問題為,當 W_0,b_0,W_1,b_1 均賦值為0的時候,神經網路是否被訓練。下面先從公式角度思考。

首先 net_0,a,net_1,y_p 在前向計算時均為0,下面開始考慮反向傳播。

frac{partial loss}{partial y_p} 很容易求出來,根據矩陣求導術得出 frac{partial y_p}{partial net_1}=diag^T[(1-y_p)circ(1-y_p)] ,frac{partial net_1}{partial a}=W_1^T , frac{partial net_1}{partial W_1}=(a^Totimes I_{m*m})^T ,這裡設 W_1m*n 的矩陣, an*1 的向量。則由上可推出 frac{partial loss}{partial a}=W_1^Tdiag^T[(1-y_p)circ(1-y_p)]frac{partial loss}{partial y_p}

frac{partial loss}{partial W_1}=(a^Totimes I_{m*m})^Tdiag^T[(1-y_p)circ(1-y_p)]frac{partial loss}{partial y_p}frac{partial loss}{partial b_1}=diag^T[(1-y_p)circ(1-y_p)]frac{partial loss}{partial y_p}

W_0,b_0,W_1,b_1 均賦值為0的時候, b_1 梯度不為0,故可被更新。由於 a 均為0,則 W_1 的梯度為0。由於 W_1 為0,則 a 的梯度為0。由於 a 的梯度為0,則 W_0,b_0 的梯度均為0,無法更新。

下面再來考慮反向傳播後的再一輪的前向計算。由上可知, W_0,b_0,W_1 均未被更新,故全是0, net_0,a 在前向計算時均為0。故反向傳播過程未被改變。所以網路僅能通過 b_1學到一點知識。

總結一下,當 W_0,b_0,W_1,b_1 均賦值為0的時候,僅能 b_1能被更新, W_0,b_0,W_1 均不被更新,保持為0。

那麼如何避免這種情況?一是不將 W_0,b_0,W_1,b_1 均賦值為0,二是不使用 tanh 函數,因 tanh(0) 為0,採用 sigmoid 函數。

根據上述推導,設計實驗,即使用MLP進行分詞任務。

1、激活函數使用 tanhW_0,b_0,W_1,b_1 均賦值為0。

W_0,b_0,W_1,b_1 均賦值為0的時候, b_1 梯度不為0,故可被更新。由於 a 均為0,則 W_1 的梯度為0。由於 W_1 為0,則 a 的梯度為0。由於 a 的梯度為0,則 W_0,b_0 的梯度均為0,無法更新。

實驗代碼與結果如下:

註:由於 W_0,b_0,W_1 維度較高,故梯度sum後輸出,已驗證每一維均為0。

2、與1對比,激活函數使用 tanhW_0,b_0,W_1,b_1 不賦值為0。

3、激活函數使用 sigmoidW_0,b_0,W_1,b_1 賦值為0。

注意,這裡第一輪 W_0,b_0 梯度均為0,是因為 frac{partial loss}{partial a}=W_1^Tdiag^T[(1-y_p)circ(1-y_p)]frac{partial loss}{partial y_p} ,因 W_1 為0,故前式等於0。所以 W_0,b_0 梯度均為0。由於因W_1 有梯度,所以後一輪改變,所以以後 W_0,b_0,W_1,b_1 均有梯度。

4、與3對比,激活函數使用 sigmoidW_0,b_0,W_1,b_1 不賦值為0。


推薦閱讀:

攻擊神經網路有多難?去掉一個像素就夠了
從弱智能到強智能
風險投資投什麼?
透過產業AI的發展歷程,看阿里的「愚公移山」精神
嚴肅化學

TAG:人工智慧 | 自然語言處理 | 深度學習DeepLearning |