Pytorch学习:Task4 PyTorch激活函数原理和使用
Pytorch學習:Task4 PyTorch激活函數原理和使用
- 1.torch.nn.ELU Sigmoid和ReLU結合體,具有左側軟飽和性
- 2.torch.nn.LeakyReLU
- 數學表達式:
- 圖像:
- 3.torch.nn.PReLU() ReLU和LReLU改進版本
- 數學表達式:
- 圖像
- 4.torch.nn.ReLU() CNN中最常用的
- 數學表達式:
- 圖像
- 優缺點
- 5.torch.nn.ReLU6()
- 數學表達式
- 圖像
- 6.torch.nn.Sigmoid()
- 數學表達式
- 圖像
- 優缺點
- 7.torch.nn.Tanh
- 數學公式:
- 圖像
- 優缺點
- 激活函數的選擇
- 小練習
參考鏈接1
參考鏈接2
1.torch.nn.ELU Sigmoid和ReLU結合體,具有左側軟飽和性
數學表達式:
圖像:
右側線性部分使得ELU可以緩解梯度消失問題,而左側軟飽和性能讓ELU對輸入變化或噪聲更魯棒。
而且ELU的輸出均值接近于0,所以沒有嚴重的偏移現象,所以收斂速度更快
2.torch.nn.LeakyReLU
數學表達式:
negative_slop是一個超參數,控制x為負數時斜率的角度,默認1e-2
圖像:
3.torch.nn.PReLU() ReLU和LReLU改進版本
數學表達式:
圖像
針對x<0的硬飽和問題,我們對ReLU作出改進,提出Leaky-ReLU,即在x<0部分添加一個參數α,如上圖所示。
P-ReLU則認為α也應當作為一個參數來學習,一般建議α初始化為0.25。
4.torch.nn.ReLU() CNN中最常用的
數學表達式:
圖像
優缺點
優點:
(1)收斂速度比 sigmoid 和 tanh 快;(梯度不會飽和,解決了梯度消失問題)
(2)計算復雜度低,不需要進行指數運算
缺點:
(1)ReLu的輸出不是zero-centered;
(2)Dead ReLU Problem(神經元壞死現象):某些神經元可能永遠不會被激活,導致相應參數不會被更新(在負數部分,梯度為0)。產生這種現象的兩個原因:參數初始化問題;learning rate太高導致在訓練過程中參數更新太大。解決辦法:采用Xavier初始化方法;以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。
(3)ReLu不會對數據做幅度壓縮,所以數據的幅度會隨著模型層數的增加不斷擴張。
5.torch.nn.ReLU6()
數學表達式
圖像
6.torch.nn.Sigmoid()
數學表達式
圖像
優缺點
優點:
(1)便于求導的平滑函數
(2)能壓縮數據,保證數據幅度不會有問題
(3)適合用于前向傳播
缺點:【梯度消失/冪運算耗時】
(1)容易出現梯度消失(gradient vanishing)的現象:當激活函數接近飽和區時,變化太緩慢,導數接近0,根據后向傳遞的數學依據是微積分求導的鏈式法則,當前導數需要之前各層導數的乘積,幾個比較小的數相乘,導數結果很接近0,從而無法完成深層網絡的訓練。
(2)Sigmoid的輸出不是0均值的:這會導致后層的神經元的輸入是非0均值的信號,這會對梯度產生影響。以 f=sigmoid(wx+b)為例, 假設輸入均為正數(或負數),那么對w的導數總是正數(或負數),這樣在反向傳播過程中要么都往正方向更新,要么都往負方向更新,導致有一種捆綁效果,使得收斂緩慢。
(3)冪運算相對耗時
7.torch.nn.Tanh
本質是sigmoid的變型,tanh(x)=2sigmoid(2x)-1
數學公式:
或
圖像
優缺點
改善:將輸出值映射到了-1到1之間,因此它是0均值的了
缺點:梯度消失和冪運算耗時長
激活函數的選擇
最好不要用sigmoid,tanh也是不適用的,其會導致梯度消失問題。使用relu函數,要小心設置learning rate。還有其他的激活函數,如leaky relu、prelu和maxout等等,可以優先選擇relu,如果出現Dead ReLU Problem,應該使用leaky relu、prelu和maxout。
小練習
在pytorch中手動實現上述激活函數
class ActivateFunction():def __init__(self):passdef relu(self,x):return max(0,x)def relu6(self,x):return min(max(0,x),6)def sigmoid(self,x):return 1/(1+math.exp(-x))def celu(self,x):return max(0,x) + min(0,a*(math.exp(x/a)-1))def logsigmoid(self,x):return math.log(1/(1+math.exp(-x)))def tanh(self,x):return (math.exp(x) - math.exp(-x))/(math.exp(x)+math.exp(-x))def prelu(self,x,a):return max(0,x)+a*min(0,x)def leakyrelu(self,x,negative_slope=1e-2):return max(0,x)+negative_slope*min(0,x)def elu(self,x,a):return max(0,x) + min(0,a*(math.exp(x)-1))def softshrink(x,l):if x>l:return x-lelif x<l:return x+lelse:return 0總結
以上是生活随笔為你收集整理的Pytorch学习:Task4 PyTorch激活函数原理和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pytorch学习 - Task6 Py
- 下一篇: Pytorch使用过程错误与解决 -汇总