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