日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU

發(fā)布時(shí)間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

①激活函數(shù):主要通過加入非線性因素,你不線性模型表達(dá)能力不足的缺陷,因?yàn)樯窠?jīng)網(wǎng)絡(luò)中的數(shù)學(xué)基礎(chǔ)是處處可微分的函數(shù),故要求激活函數(shù)也應(yīng)該保證數(shù)據(jù)的輸入與輸出是可微分。

②激活函數(shù)可以分為飽和激活函數(shù)與不飽和激活函數(shù),激活函數(shù)的右飽和指當(dāng)x趨向于正無窮時(shí),函數(shù)的導(dǎo)數(shù)趨近于0。同樣的,當(dāng)x趨向于負(fù)無窮時(shí),函數(shù)的導(dǎo)數(shù)趨近于0,此時(shí)稱為左飽和。當(dāng)一個(gè)函數(shù)既滿足右飽和,又滿足左飽和,則稱為飽和函數(shù),否則稱為非飽和函數(shù)。

1 Sigmoid函數(shù)

對(duì)于分類任務(wù)來說,如果僅僅給出分類的結(jié)果,在某些場(chǎng)景下,提供的信息可能并不充足,這就會(huì)帶來一定的局限。因此,我們建立分類模型,不僅應(yīng)該能夠進(jìn)行分類,同時(shí),也應(yīng)該能夠提供樣本屬于該類別的概率。這在現(xiàn)實(shí)中是非常實(shí)用的。例如,某人患病的概率,明天下雨概率等。因此,我們需要將z的值轉(zhuǎn)換為概率值,邏輯回歸使用sigmoid函數(shù)來實(shí)現(xiàn)轉(zhuǎn)換。

1.1 Sigmoid函數(shù)介紹

1.1.1 表達(dá)式

1.1.2 函數(shù)原型

1.1.3 圖像

圖像描述:在x趨近于正無窮與負(fù)無窮的情況下,函數(shù)值去想與1或者0,這種情況稱為飽和。處于飽和狀態(tài)的函數(shù)將意味著,x=10與x=1000在結(jié)果上無差別,使得在這個(gè)區(qū)間內(nèi)的信息被丟棄。

1.1.4 LogSigmoid

函數(shù)表示為?

圖像表示為

LogSigmoid激活函數(shù)常常被用作與NULLoss損失函數(shù)一起使用,用作神經(jīng)網(wǎng)絡(luò)反向傳播過程中的計(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ù)。以此類推。 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ù)依舊存在飽和問題,輸入的絕對(duì)值不可過大,否則無法訓(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)練過程中的梯度爆炸現(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為True,將會(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ù)通過把x xx的非常小的線性分量給予負(fù)輸入0.01 x 0.01x0.01x來調(diào)整負(fù)值的零梯度問題。
  • Leaky有助于擴(kuò)大ReLU函數(shù)的范圍,通常α \alphaα的值為0.01左右。
  • Leaky ReLU的函數(shù)范圍是負(fù)無窮到正無窮。

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問題。
  • 與ELU相比,PReLU 在負(fù)值域是線性運(yùn)算。盡管斜率很小,但不會(huì)趨于0。

3.2.4 ELU

ELU有負(fù)值,這會(huì)使激活的平均值接近零。均值激活接近于零可以使學(xué)習(xí)更快,因?yàn)樗鼈兪固荻雀咏匀惶荻取?/p>

ELU函數(shù)的特點(diǎn):

  • 沒有Dead ReLU問題,輸出的平均值接近0,以0為中心。
  • ELU 通過減少偏置偏移的影響,使正常梯度更接近于單位自然梯度,從而使均值向零加速學(xué)習(xí)。
  • ELU函數(shù)在較小的輸入下會(huì)飽和至負(fù)值,從而減少前向傳播的變異和信息。
  • ELU函數(shù)的計(jì)算強(qiáng)度更高。與Leaky ReLU類似,盡管理論上比ReLU要好,但目前在實(shí)踐中沒有充分的證據(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為Tue則會(huì)改變輸入的數(shù)據(jù),否則不會(huì)改變?cè)斎?#xff0c;只會(huì)產(chǎn)生新的輸出。
  • torch.nn.ReLU6(input,,inplace:=False)是激活函數(shù)ReLU6的實(shí)現(xiàn)。如果參數(shù)inplace為True則將會(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為True則將會(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為True還是False,只與內(nèi)存的使用有關(guān)。

如果參數(shù)inplace為True,那么會(huì)減少內(nèi)存的開銷,但要注意的是,這時(shí)的輸入值已經(jīng)被改變了。

如果認(rèn)為注意inplace增加了開發(fā)過程的復(fù)雜性,那么可以將ReLU的調(diào)用方式寫成:
X=torch.nn.ReLU(X)
這種寫法直接將函數(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ù)無邊界(即正值可以達(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ù)的類方法實(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 ( μ , σ ) , 然后通過訓(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ò)中,特征見的差距會(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的稀疏矩陣來實(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ì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。