摘要:通過查看導函數圖像,激活函數最大的問題就是兩端飽和,造成梯度消失解決辦法使用激活函數,等,此外輸出不以中心以中心的好處是可以加快模型收斂。
作用
深度神經網絡引入非線性單元,使訓練問題不再是一個凸優化問題,雖然我們很難得到最優解,但是可以通過梯度下降去尋找局部最小值。
增強模型的擬合能力,理論上只要有足夠的神經元,一層隱藏層就可以表達任意函數。
性質可微(多元函數):函數可微保證使用梯度下降優化的可計算性。
單調性:保證梯度方向相對穩定。
輸出值范圍:當輸出有限,由于特征表示受有限權值影響,基于梯度的優化方法會更加穩定;當輸出無限,特征表示不受影響,但由于高梯度需要小學習率。
非飽和性:
當激活函數滿足如下要求,稱為右飽和:
當激活函數滿足如下要求,稱為左飽和:
激活函數飽和會造成梯度值接近0,導致梯度消失使模型無法收斂。
sigmoid函數,導函數圖像:
sigmoid激活函數具有“連續可微”,“單調性”,“輸出值有限”。通過查看導函數圖像,sigmoid激活函數最大的問題就是兩端飽和,造成梯度消失(解決辦法:使用relu激活函數,BN等),此外輸出不以0中心(以0中心的好處是可以加快模型收斂)。
目前sigmoid激活函數多使用在二分類問題(對于大于二分類問題,如果類別之間存在相互關系使用sigmoid,反之使用softmax),門控機制的判斷等。
import tensorflow as tf tf.enable_eager_execution() sigmoid_test=tf.nn.sigmoid([-3.,-2.,-1.,0.0,1.,2.,3.],name="sigmoid_op") print(sigmoid_test)
輸出:
tf.Tensor( [0.04742587 0.11920292 0.26894143 0.5 0.7310586 0.880797 0.95257413], shape=(7,), dtype=float32)tanh
tanh函數,導函數圖像:
tanh激活函數輸出區間[-1,1],輸出值以0為中心,與sigmoid激活函數相比具有更大的梯度值,再加上輸出值以0為中心,模型收斂更快。不過它依然存在兩端飽和,梯度消失問題還是存在,tanh激活函數在RNN模型中應用較多。
import tensorflow as tf tf.enable_eager_execution() tanh_test=tf.nn.tanh([-3.,-2.,-1.,0.0,1.,2.,3.],name="tanh_op") print(tanh_test)
輸出:
tf.Tensor( [-0.9950547 -0.9640276 -0.7615942 0. 0.7615942 0.9640276 0.9950547], shape=(7,), dtype=float32)relu
relu函數,導函數圖像:
relu與線性單元的區別是在其一半的定義域上輸出為0,這使得它易于優化,計算。通過圖像可得,relu激活函數的梯度不僅大,而且一致,更重要的是它沒有sigmoid,tanh激活函數的飽和性,有效緩解了梯度消失問題。目前,relu激活函數是神經網絡隱藏層的首選。
但是,它最大的問題是當輸入小于0時,輸出值為0,此時神經元將無法學習。
import tensorflow as tf tf.enable_eager_execution() relu_test=tf.nn.relu([-3.,-2.,-1.,0.0,1.,2.,3.],name="relu_op") tf.nn.relu print(relu_test)
輸出:
tf.Tensor([0. 0. 0. 0. 1. 2. 3.], shape=(7,), dtype=float32)leakyrelu
leakyrelu函數,導函數圖像:
leakyrelu激活函數是relu的衍變版本,主要就是為了解決relu輸出為0的問題。如圖所示,在輸入小于0時,雖然輸出值很小但是值不為0。
leakyrelu激活函數一個缺點就是它有些近似線性,導致在復雜分類中效果不好。
import tensorflow as tf tf.enable_eager_execution() # alpha: Slope of the activation function at x < 0 leaky_relu_test=tf.nn.leaky_relu([-3.,-2.,-1.,0.0,1.,2.,3.],alpha=0.2,name="leaky_relu_op") print(leaky_relu_test)
輸出:
tf.Tensor([-0.6 -0.4 -0.2 0. 1. 2. 3. ], shape=(7,), dtype=float32)elu
elu函數,導函數圖像:
elu和relu的區別在負區間,relu輸出為0,而elu輸出會逐漸接近-α,更具魯棒性。elu激活函數另一優點是它將輸出值的均值控制為0(這一點確實和BN很像,BN將分布控制到均值為0,標準差為1)。
import tensorflow as tf tf.enable_eager_execution() elu_relu_test=tf.nn.elu([-10000,-100.,-3.,-2.,-1.,0.0,1.,2.,3.],name="elu_relu_op") print(elu_relu_test)
輸出:
tf.Tensor( [-1. -1. -0.95021296 -0.86466473 -0.63212055 0. 1. 2. 3. ], shape=(9,), dtype=float32)softmax
softmax單元常作為網絡的輸出層,它很自然地表示了具有 k 個可能值的離散型隨機變量的概率分布。
softmax將向量等比例壓縮到[0,1]之間,且保證所有元素之和為1。
import tensorflow as tf tf.enable_eager_execution() softmax_test=tf.nn.softmax([-3.,-2.,-1.,0.0,1.,2.,3.],name="softmax_op") print(softmax_test) softmax_test_sum=tf.reduce_sum(softmax_test) print(softmax_test_sum)
輸出:
tf.Tensor( [0.0015683 0.00426308 0.01158826 0.03150015 0.0856263 0.23275642 0.6326975 ], shape=(7,), dtype=float32)
tf.Tensor(1.0, shape=(), dtype=float32)總結
激活函數的選擇還要根據項目實際情況,考慮不同激活函數的優缺點。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42826.html
摘要:類似地,輸入中的大規模特征將主導網絡并導致下游發生更大的變化。因此,使用神經網絡庫的自動規范化往往是不夠的,這些神經網絡庫會在每個特征的基礎上盲目地減去平均值并除以方差。 如果你的神經網絡不工作,該怎么辦?作者在這里列出了建神經網絡時所有可能做錯的事情,以及他自己的解決經驗。忘記規范化數據忘記檢查結果忘記預處理數據忘記使用正則化使用的batch太大使用了不正確的學習率在最后層使用了錯誤的激活...
閱讀 3274·2023-04-25 18:03
閱讀 1143·2021-11-15 11:38
閱讀 5522·2021-10-25 09:45
閱讀 840·2021-09-24 09:48
閱讀 2272·2021-09-22 15:34
閱讀 1734·2019-08-30 15:44
閱讀 2675·2019-08-30 13:12
閱讀 604·2019-08-29 16:05