【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU
①激活函數:主要通過加入非線性因素,你不線性模型表達能力不足的缺陷,因為神經網絡中的數學基礎是處處可微分的函數,故要求激活函數也應該保證數據的輸入與輸出是可微分。
②激活函數可以分為飽和激活函數與不飽和激活函數,激活函數的右飽和指當x趨向于正無窮時,函數的導數趨近于0。同樣的,當x趨向于負無窮時,函數的導數趨近于0,此時稱為左飽和。當一個函數既滿足右飽和,又滿足左飽和,則稱為飽和函數,否則稱為非飽和函數。
1 Sigmoid函數
對于分類任務來說,如果僅僅給出分類的結果,在某些場景下,提供的信息可能并不充足,這就會帶來一定的局限。因此,我們建立分類模型,不僅應該能夠進行分類,同時,也應該能夠提供樣本屬于該類別的概率。這在現實中是非常實用的。例如,某人患病的概率,明天下雨概率等。因此,我們需要將z的值轉換為概率值,邏輯回歸使用sigmoid函數來實現轉換。
1.1 Sigmoid函數介紹
1.1.1 表達式
1.1.2 函數原型
1.1.3 圖像
圖像描述:在x趨近于正無窮與負無窮的情況下,函數值去想與1或者0,這種情況稱為飽和。處于飽和狀態的函數將意味著,x=10與x=1000在結果上無差別,使得在這個區間內的信息被丟棄。
1.1.4 LogSigmoid
函數表示為?
圖像表示為
LogSigmoid激活函數常常被用作與NULLoss損失函數一起使用,用作神經網絡反向傳播過程中的計算交叉熵的環節。
1.2 LogSigmoid()與Sigmoid()代碼
import torch from torch import nninput = torch.autograd.Variable(torch.randn(2)) print(input) #輸出 tensor([0.3439, 0.6682]) ### 函數括號后還有一個括號,介紹第一個函數返回了一個函數 ### 如果后面還有括號,介紹前面那個也返回了一個函數。以此類推。 print(nn.Sigmoid()(input)) # 輸出 tensor([0.5851, 0.6611]) print(nn.LogSigmoid()(input)) # tensor([-0.5359, -0.4139])2 tanh函數
2.1 函數介紹
tanh是Sigmoid值域的升級版,從0~1升為-1~1,但是不能完全代替,因為在需要輸出結果始終大于0的情況下,還需要Sigmoid函數。
tanh函數依舊存在飽和問題,輸入的絕對值不可過大,否則無法訓練
2.1.1 函數圖像
?2.1.2 代碼
torch.nn.tanh(input,out=None)3 ReLU函數
3.1 函數介紹
3.1.1函數公式
3.1.2 函數圖像
?3.1.3 函數解釋
當輸入X大于0時,函數返回值為其本身。
當輸入X小于0時,函數返回值為0
神經網絡中使用ReLu函數可以取得很好的擬合效果,運算簡單,效率高
3.2 ReLU的變種函數
3.2.1 ReLu6===》有效防止訓練過程中的梯度爆炸現象
函數代碼:?relu6 = min(max(features, 0), 6)
特點:結果是把小于0的變成0,大于6的取6。
缺點:這個訓練收斂比較快,但是收斂比較好后,目標檢測網絡回歸框不太準。
import torch import torchvision import torch.nn as nn# inplace為True,將會改變輸入的數據 ,否則不會改變原輸入,只會產生新的輸出 x = torch.linspace(-5, 10, 20)r6 = nn.ReLU6(inplace=True) print(x) y=r6(x) print(y)relu= nn.ReLU(inplace=True) y=relu(x) print(y)y2= torch.clamp(x,0,6) print(y2)3.2.2?Leaky ReLU
Leaky ReLU函數的特點:
- Leaky ReLU函數通過把x xx的非常小的線性分量給予負輸入0.01 x 0.01x0.01x來調整負值的零梯度問題。
- Leaky有助于擴大ReLU函數的范圍,通常α \alphaα的值為0.01左右。
- Leaky ReLU的函數范圍是負無窮到正無窮。
Leaky ReLU函數的圖像:
3.2.3?PReLU
PReLU函數中,參數α \alphaα通常為0到1之間的數字,并且通常相對較小。
- 如果α i = 0 ,則PReLU(x)變為 ReLU。
- 如果α i > 0 ,則PReLU(x)變為Leaky ReLU。
- 如果α i是可學習的參數,則PReLU(x)為PReLU函數。
PReLU函數的特點:
- 在負值域,PReLU的斜率較小,這也可以避免Dead ReLU問題。
- 與ELU相比,PReLU 在負值域是線性運算。盡管斜率很小,但不會趨于0。
3.2.4 ELU
ELU有負值,這會使激活的平均值接近零。均值激活接近于零可以使學習更快,因為它們使梯度更接近自然梯度。
ELU函數的特點:
- 沒有Dead ReLU問題,輸出的平均值接近0,以0為中心。
- ELU 通過減少偏置偏移的影響,使正常梯度更接近于單位自然梯度,從而使均值向零加速學習。
- ELU函數在較小的輸入下會飽和至負值,從而減少前向傳播的變異和信息。
- ELU函數的計算強度更高。與Leaky ReLU類似,盡管理論上比ReLU要好,但目前在實踐中沒有充分的證據表明ELU總是比ReLU好。
ELU函數的圖像:
3.3 ReLU對應的函數實現
- torch.nn.ReLU((input,inplace=False)是一般的ReLU函數,即max(input,,O)。如果參數inplace為Tue則會改變輸入的數據,否則不會改變原輸入,只會產生新的輸出。
- torch.nn.ReLU6(input,,inplace:=False)是激活函數ReLU6的實現。如果參數inplace為True則將會改變輸入的數據,否則不會改變原輸入,只會產生新的輸出。
- torch.nn.LeakyReLU(input,negative_slope=0.01,inplace=False)是激活函數LeakyReLU的實現。如果參數inplace為True則將會改變輸入的數據,否則不會改變原輸入,只會產生新的輸出。
- torch.nn.PReLU(num_parameters-=1,init=0.25)是激活函數PReLU的實現。其中參數num_parameters代表可學習參數的個數,init代表可學習參數的初始值。
- torch.nn.ELU(alpha=1.0,inplace=False)是激活函數ELU的實現。
在使用ReLU搭建模型時,設置參數inplace為True還是False,只與內存的使用有關。
如果參數inplace為True,那么會減少內存的開銷,但要注意的是,這時的輸入值已經被改變了。
如果認為注意inplace增加了開發過程的復雜性,那么可以將ReLU的調用方式寫成:
X=torch.nn.ReLU(X)
這種寫法直接將函數torh.nn.ReLU()的返回值賦給一個新的x變量,而不再去關心原有輸入X。即使torch.nn,ReLU()函數對輸入的x做了修改,也不會影響程序的其他部分。
4 SoftPlus函數
4.1 函數介紹
4.1.1 函數公式
4.1.2 函數圖像
4.1.3 函數解釋
SoftPlus函數的曲線更平滑,計算量更大,對于小于0的值保留得更多
?4.2 代碼實現
torch.nn.Softplus(beta=1,threshold=20)參數threshold為激活函數輸出的最大閾
好的激活函數可以對特征數據的激活更加準確,使得提高模型的精度,其他結構不變的情況下,將激活函數變為Swish與Mish函數將使得模型的精度有所上升。
在大量實驗結果表明,Mish>Swish
5 Swish(更好的激活函數)
5.1 Swish函數簡介
5.1.1 Swish函數公式
PS:其中β為x的縮小參數,默認取1,但在使用批量歸一算法的情況下,就需要對β進行調整。β可以手動調節,也可以由神經網絡自動學習得到。
5.1.2 Swish函數圖像
?
6 Mish(更好的激活函數)
6.1 Mish函數介紹
6.1.1 函數公式
Mish激活函數無邊界(即正值可以達到任何高度)
6.1.2 函數圖像
?6.2 Swish與Mish函數的封裝實現
import torch import torch.nn.functional as F import torch.nn as nndef swish(x,beta=1): # Swish激活函數return x * torch.nn.Sigmoid()(x * beta)def mish(x): # Mish激活函數return x * (torch.tanh(F.tanh(F.softplus(x))))class Mish(nn.Module): #Mish激活函數的類方法實現def __init__(self):super(Mish, self).__init__()def forward(self):return x * (torch.tanh(F.softplus(x)))7 GELU(NLP任務的激活函數)
7.1 函數介紹 [ 高斯誤差線性單元]
GELU函數就是一個綜合體,它實現了非線性加上泛化,特別占內存,計算量很大
這里Φ ( x ) 是正太分布的概率函數,可以簡單采用正太分布N ( 0 , 1 ) , 當然可以使用參數化的正太分布N ( μ , σ ) , 然后通過訓練得到μ , σ 。
對于假設為標準正太分布的GELU(x),,論文中提供了近似計算的數學公式,如下:
7.1.1 GELE激活函數將激活參數0或1的取值概率與神經網絡的激活值結合,使得神經網絡具有自我確定性決策,即神經網絡的激活值越小,其所乘的激活參數為1的概率越小
7.1.2 Swish與GELU函數的關系
Swish激活函數屬于GELU的一個特例,Mish函數也屬于GELU的一個特例。
7.2 代碼實現
def gelu(input_tensor):cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))return input_tesnsor * cdf?8 激活函數總結
在神經網絡中,特征見的差距會隨著循環計算的推進而不斷地被放大,當輸入數據較大時,使用tanh()較為合理,輸入數據差距較小時,使用Sigmoid()函數較為合適。
GeLU()激活函數,主要能夠生成稀疏性更好的特征數據,即將數據轉化為只有最大數值,其他為0 的特征,可以更好的突出輸入特征,用大多數元素為0的稀疏矩陣來實現。
Swish與Mish函數是在ReLu基礎上進一步優化產生,Mish()>Swish()
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux as5 启动mysql_Re
- 下一篇: AttributeError: ‘lis