sigmoid激勵函數是個很敏感的函數

1/(1+exp(-x))在x大於10的時候,計算結果就差不多是1了,此時sigmoid的導函數sigmoid(x)(1-sigmoid(x))幾乎為0,如果開發的時候用的是C/C++,訓練的時候由於double類型加減時數量級差距過大訓練無效,如果是python這種能給出高精度浮點數的語言,訓練的效果也幾乎沒有。

對於sigmoid的使用,在初始化權重,偏置時,結合輸入數據,初步估算一下權重和偏置的大小範圍,以免一開始初始化就過大,從而導致訓練的時候導數幾乎為0。sigmoid導數最大的時候x=0,根據以往經驗來看x在-4到4之間,sigmoid的導數都是比較精確且比較大的。(然而並不能大於0.25)

如果訓練的模型深度比較足,tanh,ReLU,Leaky_ReLU都是不錯的激勵函數,而sigmoid因為梯度消失就鮮有出現了,使用的激勵函數類型還是要看具體情況而定。


Sigmoid激活函數,在數值較大或者較小的時候會難以訓練,使用ReLU激活函數max(0,x)。


前面加 btach normalization?


可以考慮一下batch normalize,尤其是sigmoid激活函數,通過batchnorm把輸入重新拉回到均值0方差1的正態分佈上,避免梯度消失的問題。

不過有一點要注意一下,因為不一定都要標準正態,為了增強網路表達能力,經常在batchnorm之後再加兩個調節參數,具體可以百度一下。


方法有很多,基本思路可以歸為以下兩類。

1. 自適應學習率。 learning rate 是動態調整,一般開始時候大,後面慢慢調小。

2. 採用其他損失/激活函數。如hinge損失函數。


一般這種行為是 公式寫錯,或者下標寫錯,請重新閱讀BP1234條公式來源


推薦閱讀:
相關文章