深度神經網路權值初始化的詭異問題

2021-07-11 21:24:00 字數 1805 閱讀 3111

最近自己些 cnn網路,遇到麻煩事了。直接使用c++從頭寫,按照層次化 模組化編寫。為的是做之後的海量動態增量學習的 cnn。 寫完**,除錯,結果基本和預期一樣的差,畢竟要注意的引數很多。各個任何地方遺漏乙個引數符號都會導致網路失敗。於是從頭開始bp網路檢查錯誤。

1、使用1維個輸入值,做3層bp網路測試。

1> 2分類,兩輸出節點情況。網路快速收斂。樣本格式, x為輸入數值,y為標籤類別。

<0, 0>; <1, 1>     

sigmod 啟用。網路收斂。

relu啟用,網路快速收斂。

注意這裡乙個陷阱,relu啟用函式只能用於 輸出層之外的各層。最後一層必須使用sigmod函式,否則在複雜資料的網路不收斂,或者發散。2個樣本的情況下輸出層使用relu也會收斂更快速。測試好多次才發現,最後網上搜尋到也有少許文章提到。大部分時候大部分人都是預設直接使用輸出層為softmax,所以估計沒有機會遇到我說的這個麻煩事情。

2> 2分類,兩輸出節點情況。 3 個樣本。

<0, 0>;<0.5, 1>   ; <1, 0>     

sigmod函式啟用。網路收斂。

relu啟用。網路也收斂。但是sigmod 情況也是學習率提高到 0.5 甚至0.9。relu情況下,啟用值大於0.15 網路就不收斂或者發散。

3> 2分類,兩輸出節點情況。 4 個樣本。測試出詭異的現象

<0, 0>;<0.3, 1> ; <0.6, 0> ; <1, 1>     

sigmod函式啟用。網路收斂。

relu啟用。網路不收斂。無論怎麼修改學習率,查錯。訓練之後,網路都發散。

我的網路使用的初始化為使用過程中動態初始化。這個情況就每次初始化乙個神經元的w權重和b偏置。簡單bp 網路是固定網路,程式開始一次初始化,並且是所有的神經元權重向量橫向初始化, 並不是一次初始化乙個神經元的連線權重。而是一層多少個神經元,逐個初始化每個神經元的第乙個權重,再迴圈初始化第乙個權重,再第三個。。。 同樣一層神經元的偏置b 也是單獨做為乙個向量一次初始化。

這樣在簡單bp網路上, 修改初始化方式之後,發現也變得發散不收斂了。。。。

我是非數學出生,自行做的學習研究。數學方面不太擅長,所以暫時沒找到其中原因。看網上說 relu情況下,使用高斯隨機數初始化效果會更好。所以想試試這個,是否還和初始化的橫向縱向有關係。 都是隨機初始化,這個差別這麼大呢。。。而且是sigmod 對這個無影響,relu的情況對這個絕對致命。。。。

2016-5-19:

針對上面的問題再次經過反覆測試排查。發現初始化順序稍微不一樣,relu就可能發散,而sigmod 則不會。 這樣訓練神經網路太危險了吧。 重新思考之後,把送入神經網路的樣本也隨機化。 這樣如何初始化權重和偏置,貌似都不會有問題了。而且收斂速度加快。

再次測試好像還是有問題。。。

不知道有沒有高手給分析下這情況。。。。

2016-5-20:

網上搜尋,無果。。。

多次思考之後,決定多增加一層網路,把最後兩層網路啟用函式使用 sigmod, 其他層次使用relu。這個貌似理論上滿足傳統 bp網路的方法,同時滿足深層網路relu的方式傳播啟用。 對比 大部份cnn,只是觀察,發現確實最後不只一層sigmod。

這樣修改之後,網路成功收斂。

2016-6-16:

1relu +  1 sigmod + 1sigmod,使用5個數值兩類 交叉排列。仍然不收斂。relu sigmod 都不收斂。

加入batchnormalize relu不收斂,將 relu修改為 sigmod 收斂。而且 有了 bn 速度真快。之前 幾萬次的訓練,現在幾百次。 有時候幾十次就收斂。速度是十倍百倍。

不過沒有 relu,多層訓練會不會有訓練不動的問題呢。。。。

深度學習 2 1 1 神經網路引數初始化

三種引數初始化方法 zero initialization 將輸入引數初始化為0 random initialization 隨機初始化輸入引數,權重w初始化的值較大 he initialization 在一定範圍內隨即初始化權重w值 zero initialization實現 for l in r...

解析深度學習神經網路權重初始化

以全連線模型為例 輸入資料為a 784 的陣列,模型共2層神經元,第一層100個,第二層即輸出層為10個神經元,則第一層的權重有 784,100 個,截距有 100 個,第二層有 100,10 個權重,截距 10 個,用w1表示第一層權重矩陣,b1表示截距行向量,w2表示第二層權重矩陣,b2表示截距...

神經網路的引數初始化

1.對於神經網路fminunc函式,我們需要初始化神經網路的initialtheta的引數。對於邏輯回歸來說,我們可以全部初始化為0,但是對於神經網路來說將initialtheta全部初始化為0是不可以的。2.為什麼全部初始化成0是不可以的呢?如果所有引數初始化成0,那麼隱藏層的每個節點的輸出都是相...