網(wǎng)站開發(fā)制做seo搜索引擎優(yōu)化工作內(nèi)容
目錄
torch.nn子模塊Non-linear Activations
nn.ELU
主要特點(diǎn)與注意事項(xiàng)
使用方法與技巧
示例代碼
圖示
nn.Hardshrink
Hardshrink函數(shù)定義
參數(shù)
形狀
示例代碼
圖示
nn.Hardsigmoid
Hardsigmoid函數(shù)定義
參數(shù)
形狀
示例代碼
圖示
nn.Hardtanh
HardTanh函數(shù)定義
參數(shù)
形狀
示例代碼
圖示
nn.Hardswish
Hardswish函數(shù)定義
參數(shù)
形狀
示例代碼
圖示
nn.LeakyReLU
LeakyReLU函數(shù)定義
參數(shù)
形狀
示例代碼
圖示
nn.LogSigmoid
LogSigmoid函數(shù)定義
形狀
示例代碼
圖示
nn.MultiheadAttention
多頭注意力的定義
參數(shù)
?示例
nn.PReLU
PReLU函數(shù)定義
參數(shù)
形狀
變量
示例
圖示
nn.ReLU
ReLU函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.ReLU6
ReLU6函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.RReLU
RReLU函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.SELU
SELU函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.CELU
CELU函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.GELU
GELU函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.Sigmoid
Sigmoid函數(shù)定義
形狀
示例
圖示
nn.SiLU
SiLU函數(shù)定義
形狀
示例
圖示
nn.Mish
Mish函數(shù)定義
形狀
示例
圖示
nn.Softplus
Softplus函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.Softshrink
Softshrink函數(shù)定義
參數(shù)
形狀
示例
圖示
nn.Softsign
Softsign函數(shù)定義
形狀
示例
圖示
nn.Tanh
Tanh函數(shù)定義
形狀
示例
圖示?
nn.Tanhshrink
Tanhshrink函數(shù)定義
形狀
示例
圖示
nn.Threshold
Threshold函數(shù)定義
參數(shù)
形狀
示例
nn.GLU
GLU函數(shù)定義
參數(shù)
形狀
示例
總結(jié)
torch.nn子模塊Non-linear Activations
nn.ELU
PyTorch中的torch.nn.ELU
函數(shù)是一個(gè)神經(jīng)網(wǎng)絡(luò)層,用于應(yīng)用指數(shù)線性單元(Exponential Linear Unit, ELU)激活函數(shù)。這個(gè)函數(shù)首次由Clevert等人在論文《Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)》中提出。ELU激活函數(shù)旨在解決傳統(tǒng)ReLU激活函數(shù)中的某些問題,比如不活躍的神經(jīng)元問題。
主要特點(diǎn)與注意事項(xiàng)
-
定義:當(dāng)輸入
x
大于0時(shí),ELU函數(shù)輸出值為x
本身;當(dāng)x
小于或等于0時(shí),輸出為α * (exp(x) - 1)
。這里的α
是ELU函數(shù)的一個(gè)參數(shù),通常默認(rèn)為1.0。 -
參數(shù):
alpha
:控制負(fù)輸入值的飽和度。默認(rèn)為1.0。inplace
:若設(shè)置為True
,將會(huì)直接在輸入數(shù)據(jù)上進(jìn)行操作,從而減少內(nèi)存占用。但這可能會(huì)對(duì)原始數(shù)據(jù)產(chǎn)生不可預(yù)知的影響。默認(rèn)為False
。
-
形狀:
- 輸入:任意形狀。
- 輸出:與輸入形狀相同。
-
使用場(chǎng)景:適用于需要激活函數(shù)的神經(jīng)網(wǎng)絡(luò)層,特別是在深度學(xué)習(xí)模型中,以增加非線性。
-
注意事項(xiàng):
- 使用
inplace=True
時(shí)需謹(jǐn)慎,因?yàn)檫@可能會(huì)改變?cè)紨?shù)據(jù)。 - 在某些情況下,ELU可能比ReLU激活函數(shù)更難優(yōu)化,因?yàn)樗妮敵鰧?duì)負(fù)輸入值是非零的。
- 使用
使用方法與技巧
- 初始化:在定義神經(jīng)網(wǎng)絡(luò)模型時(shí),通過
nn.ELU()
來創(chuàng)建ELU層。 - 配置參數(shù):根據(jù)需要調(diào)整
alpha
值以控制負(fù)輸入值的飽和度。
示例代碼
下面是一個(gè)使用torch.nn.ELU
的簡單例子,展示了如何在PyTorch模型中實(shí)現(xiàn)和使用ELU激活函數(shù):
import torch
import torch.nn as nn# 創(chuàng)建一個(gè)ELU激活函數(shù)層
elu = nn.ELU(alpha=1.0, inplace=False)# 創(chuàng)建一個(gè)隨機(jī)輸入數(shù)據(jù)
input_data = torch.randn(2)# 應(yīng)用ELU激活函數(shù)
output = elu(input_data)print("Input:", input_data)
print("Output:", output)
在這個(gè)例子中,我們首先導(dǎo)入了必要的PyTorch庫,然后創(chuàng)建了一個(gè)ELU激活函數(shù)層,并對(duì)一個(gè)隨機(jī)生成的輸入數(shù)據(jù)進(jìn)行了處理。最后,我們打印出輸入和經(jīng)過ELU激活函數(shù)處理后的輸出。這個(gè)示例是在PyTorch框架下使用ELU激活函數(shù)的基本方式。
圖示
這個(gè)圖是一個(gè)二維平面圖,顯示了ELU(Exponential Linear Unit)激活函數(shù)的圖形表示。圖的X軸表示輸入值,Y軸表示ELU函數(shù)的輸出值。在X軸的正半軸上,即輸入值大于0時(shí),ELU函數(shù)的輸出與輸入值相同,因此圖形呈現(xiàn)出一條穿過原點(diǎn)的直線,斜率為1。在X軸的負(fù)半軸上,即輸入值小于或等于0時(shí),ELU函數(shù)的輸出變?yōu)橐粋€(gè)漸進(jìn)的曲線,這部分曲線逐漸接近但不會(huì)觸及Y軸下方的水平線,這條水平線對(duì)應(yīng)于α * (exp(x) - 1)
當(dāng)x
接近負(fù)無窮大時(shí)的極限值。
圖形的標(biāo)題是“ELU(alpha=1.0)”,指出了這個(gè)圖是在α值設(shè)定為1.0的情況下繪制的。整個(gè)圖表背景是網(wǎng)格線,有助于觀察和估計(jì)函數(shù)在特定輸入值下的輸出值。圖形的曲線以藍(lán)色顯示,整體上呈現(xiàn)出ELU激活函數(shù)典型的非線性特性,即在正值區(qū)域保持線性,在負(fù)值區(qū)域提供平滑的非線性過渡。
nn.Hardshrink
PyTorch的torch.nn.Hardshrink
函數(shù)是一個(gè)神經(jīng)網(wǎng)絡(luò)層,用來應(yīng)用硬收縮(Hardshrink)函數(shù)。這個(gè)函數(shù)是一個(gè)閾值激活函數(shù),通常用在神經(jīng)網(wǎng)絡(luò)的正則化過程中,可以在訓(xùn)練過程中幫助減少微小的權(quán)重,促進(jìn)模型的簡化和稀疏性。
Hardshrink函數(shù)定義
Hardshrink函數(shù)的行為如下:
- 當(dāng)輸入
x
大于閾值λ
時(shí),輸出等于輸入x
。 - 當(dāng)輸入
x
小于負(fù)的閾值-λ
時(shí),輸出也等于輸入x
。 - 在其他情況下,輸出為0。
這意味著Hardshrink函數(shù)會(huì)將所有絕對(duì)值小于λ
的輸入“收縮”為0,而保持其他輸入不變。這可以被看作是一種過濾噪聲或非重要特征的方式。
參數(shù)
lambd
(浮點(diǎn)數(shù)):用于Hardshrink公式的λ值,默認(rèn)為0.5。這個(gè)值決定了何時(shí)激活一個(gè)神經(jīng)元,何時(shí)將其輸出設(shè)置為0。
形狀
- 輸入:任意形狀的張量。
- 輸出:與輸入相同形狀的張量。
示例代碼
以下是如何使用torch.nn.Hardshrink
的一個(gè)例子:
import torch
import torch.nn as nn# 創(chuàng)建Hardshrink層,設(shè)置λ=0.5
hardshrink = nn.Hardshrink(lambd=0.5)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 通過Hardshrink層處理輸入
output_tensor = hardshrink(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
?這段代碼首先導(dǎo)入了PyTorch和它的神經(jīng)網(wǎng)絡(luò)模塊。然后創(chuàng)建了一個(gè)Hardshrink
層,其λ值默認(rèn)為0.5。接著,生成了一個(gè)包含兩個(gè)隨機(jī)數(shù)的張量作為輸入,并通過Hardshrink
層處理。最后,輸出了原始輸入張量和處理后的輸出張量,可以觀察到絕對(duì)值小于0.5的輸入值被置為0。
圖示
上傳的圖形是一個(gè)二維坐標(biāo)系上的圖示,展現(xiàn)了Hardshrink函數(shù)的特性。圖中X軸表示輸入值,Y軸表示經(jīng)過Hardshrink函數(shù)處理后的輸出值。
從圖中可以看出,Hardshrink函數(shù)對(duì)于絕對(duì)值大于0.5的輸入,直接輸出該輸入值,這部分曲線與45度角直線一致,穿過第一和第三象限。對(duì)于絕對(duì)值小于0.5的輸入,輸出值為0,這在圖中表現(xiàn)為X軸上-0.5到0.5之間的一段水平線。圖形的標(biāo)題“Hardshrink(0.5)”表示λ值為0.5。
總的來說,Hardshrink函數(shù)在λ的閾值范圍內(nèi)將輸入“硬性切斷”為0,而在閾值外保持輸入不變。這種特性使得Hardshrink函數(shù)在去除小幅度信號(hào)或?qū)崿F(xiàn)稀疏表示方面非常有用。
nn.Hardsigmoid
torch.nn.Hardsigmoid
是PyTorch神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),用于逐元素(element-wise)應(yīng)用Hardsigmoid函數(shù)。Hardsigmoid函數(shù)是Sigmoid激活函數(shù)的一個(gè)分段線性近似,通常計(jì)算更快,且在硬件上更易于實(shí)現(xiàn)。
Hardsigmoid函數(shù)定義
Hardsigmoid函數(shù)定義如下:
- 當(dāng)輸入
x
小于或等于-3時(shí),輸出為0。 - 當(dāng)輸入
x
大于或等于+3時(shí),輸出為1。 - 在其他情況下,輸出為
x/6 + 1/2
。
這個(gè)定義使得Hardsigmoid函數(shù)在輸入值遠(yuǎn)離0點(diǎn)時(shí)產(chǎn)生飽和效應(yīng),即當(dāng)輸入值超出某個(gè)范圍時(shí),輸出值會(huì)被限制在0和1之間。在中間區(qū)域,輸出值隨輸入值線性變化。
參數(shù)
inplace
(布爾值):可以選擇是否就地(in-place)進(jìn)行操作。默認(rèn)為False
。當(dāng)設(shè)置為True
時(shí),操作會(huì)直接在輸入數(shù)據(jù)上進(jìn)行,從而減少內(nèi)存消耗。但是,這可能會(huì)對(duì)原始數(shù)據(jù)造成破壞。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入同形狀的張量。
示例代碼
以下是如何使用torch.nn.Hardsigmoid
的一個(gè)例子:
import torch
import torch.nn as nn# 創(chuàng)建Hardsigmoid激活函數(shù)層
hardsigmoid = nn.Hardsigmoid()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 通過Hardsigmoid層處理輸入
output_tensor = hardsigmoid(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,首先導(dǎo)入了必要的PyTorch庫和神經(jīng)網(wǎng)絡(luò)模塊。然后實(shí)例化了一個(gè)Hardsigmoid
激活函數(shù)層。創(chuàng)建了一個(gè)含有兩個(gè)隨機(jī)數(shù)值的張量作為輸入,并通過Hardsigmoid
激活函數(shù)層進(jìn)行處理。最后,打印了輸入張量和輸出張量,可以看到輸入值在不同范圍內(nèi)如何被轉(zhuǎn)換成輸出值。
圖示
這張圖展示了Hardsigmoid激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Hardsigmoid函數(shù)處理后的輸出值。
從圖形可以看出以下幾點(diǎn):
- 當(dāng)輸入值小于-3時(shí)(X軸的-3左側(cè)),輸出值保持為0,這對(duì)應(yīng)于Hardsigmoid函數(shù)定義中的下限飽和區(qū)域。
- 當(dāng)輸入值大于+3時(shí)(X軸的+3右側(cè)),輸出值保持為1,這是Hardsigmoid函數(shù)定義中的上限飽和區(qū)域。
- 在輸入值介于-3到+3之間時(shí),輸出值是輸入值的線性函數(shù),具體是
x/6 + 1/2
。這導(dǎo)致了圖中從X軸-3到+3的斜率變化,輸出值從0平滑過渡到1。
整體而言,圖形顯示了Hardsigmoid函數(shù)作為一種分段線性函數(shù)的特征,與傳統(tǒng)Sigmoid函數(shù)相比,它在計(jì)算上更簡單,易于優(yōu)化。圖形的標(biāo)題“Hardsigmoid()”表明這是一個(gè)不帶參數(shù)的Hardsigmoid函數(shù)標(biāo)準(zhǔn)圖形。
nn.Hardtanh
torch.nn.Hardtanh
是PyTorch中的一個(gè)神經(jīng)網(wǎng)絡(luò)模塊,它提供了HardTanh激活函數(shù)的實(shí)現(xiàn)。HardTanh是Tanh(雙曲正切)激活函數(shù)的分段線性版本,經(jīng)常用于神經(jīng)網(wǎng)絡(luò)中以增加非線性,同時(shí)保持計(jì)算的高效性。
HardTanh函數(shù)定義
HardTanh函數(shù)的行為如下:
- 當(dāng)輸入
x
大于max_val
時(shí),輸出為max_val
。 - 當(dāng)輸入
x
小于min_val
時(shí),輸出為min_val
。 - 在其他情況下,輸出為輸入
x
本身。
這個(gè)函數(shù)通過限制輸出值在一個(gè)指定的范圍內(nèi),為輸入值提供了硬飽和。
參數(shù)
min_val
(浮點(diǎn)數(shù)):線性區(qū)域范圍的最小值,默認(rèn)為-1。max_val
(浮點(diǎn)數(shù)):線性區(qū)域范圍的最大值,默認(rèn)為1。inplace
(布爾值):可以選擇是否就地(in-place)進(jìn)行操作,這會(huì)直接在輸入數(shù)據(jù)上修改,減少內(nèi)存占用,但會(huì)破壞原數(shù)據(jù)。默認(rèn)為False
。
min_value
和max_value
是過時(shí)的關(guān)鍵字參數(shù),現(xiàn)在應(yīng)使用min_val
和max_val
。
形狀
- 輸入:可以是任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例代碼
下面是使用torch.nn.Hardtanh
的一個(gè)示例:
import torch
import torch.nn as nn# 創(chuàng)建Hardtanh激活函數(shù)層,指定最小值和最大值
hardtanh = nn.Hardtanh(min_val=-2, max_val=2)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Hardtanh激活函數(shù)
output_tensor = hardtanh(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
?在上述代碼中,我們首先導(dǎo)入了必要的庫,然后創(chuàng)建了一個(gè)Hardtanh
激活函數(shù)層,其中min_val
設(shè)置為-2,max_val
設(shè)置為2。接下來,生成了一個(gè)隨機(jī)張量作為輸入,并通過Hardtanh
層處理。最后,打印出輸入和輸出張量,可以觀察到輸入值在[-2, 2]的范圍內(nèi)是線性的,在這個(gè)范圍外則被裁剪到-2或2。
圖示
這張圖展示了Hardtanh激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Hardtanh函數(shù)處理后的輸出值。
從圖中可以看出:
- 當(dāng)輸入值小于-1時(shí),輸出值保持在-1,這部分是圖中的水平線段,位于X軸左側(cè)。
- 當(dāng)輸入值大于1時(shí),輸出值保持在1,這部分是圖中的另一個(gè)水平線段,位于X軸右側(cè)。
- 在輸入值介于-1到1之間時(shí),輸出值與輸入值相同,這部分是圖中的斜線段,穿過原點(diǎn)。
圖表的標(biāo)題“Hardtanh(min_val=-1.0, max_val=1.0)”表明了這個(gè)函數(shù)的兩個(gè)參數(shù)min_val
和max_val
分別被設(shè)置為-1.0和1.0??傮w上,Hardtanh函數(shù)提供了一個(gè)輸出值在[-1, 1]范圍內(nèi)的有界線性區(qū)域,并且在這個(gè)區(qū)間之外將輸入值限制在這個(gè)范圍的上下限值。這樣的特性使Hardtanh函數(shù)在深度學(xué)習(xí)中被用來避免梯度爆炸并加速訓(xùn)練。
nn.Hardswish
torch.nn.Hardswish
是PyTorch神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它提供了Hardswish函數(shù)的實(shí)現(xiàn)。Hardswish是在Google的論文《Searching for MobileNetV3》中提出的,被設(shè)計(jì)用于更高效的深度學(xué)習(xí)模型,尤其是在移動(dòng)和邊緣設(shè)備上。
Hardswish函數(shù)定義
Hardswish函數(shù)的行為如下:
- 當(dāng)輸入
x
小于或等于-3時(shí),輸出為0。 - 當(dāng)輸入
x
大于或等于+3時(shí),輸出為x
。 - 在其他情況下,輸出為
x * (x + 3) / 6
。
這個(gè)函數(shù)提供了一個(gè)平滑的非線性激活函數(shù),與ReLU類似,但是在接近0的區(qū)域內(nèi)提供了一些梯度,從而避免了ReLU的一些潛在問題。
參數(shù)
inplace
(布爾值):可以選擇是否就地(in-place)進(jìn)行操作。默認(rèn)為False
。當(dāng)設(shè)置為True
時(shí),操作會(huì)直接在輸入數(shù)據(jù)上進(jìn)行,從而減少內(nèi)存消耗,但會(huì)破壞原數(shù)據(jù)。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入同形狀的張量。
示例代碼
以下是使用torch.nn.Hardswish
的一個(gè)示例:
import torch
import torch.nn as nn# 創(chuàng)建Hardswish激活函數(shù)層
hardswish = nn.Hardswish()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Hardswish激活函數(shù)
output_tensor = hardswish(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
?在這段代碼中,我們導(dǎo)入了PyTorch及其神經(jīng)網(wǎng)絡(luò)模塊,然后創(chuàng)建了一個(gè)Hardswish
激活函數(shù)層。接著,我們創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量作為輸入,通過Hardswish
激活函數(shù)層進(jìn)行處理。最后,打印出了輸入和經(jīng)過激活函數(shù)處理后的輸出張量,從中可以觀察到輸入值在不同區(qū)間內(nèi)的變化。
圖示
這張圖展示了Hardswish激活函數(shù)的曲線。X軸代表輸入值,而Y軸代表Hardswish函數(shù)處理后的輸出值。
從圖中可以看出:
- 當(dāng)輸入值小于或等于-3時(shí)(X軸左側(cè)的部分),輸出保持為0,這對(duì)應(yīng)Hardswish函數(shù)中的第一個(gè)條件。
- 當(dāng)輸入值介于-3和+3之間時(shí),輸出是輸入值的一個(gè)縮放版,并且向上平移,這符合Hardswish函數(shù)的第三個(gè)條件,即
x * (x + 3) / 6
,導(dǎo)致曲線在這個(gè)區(qū)間內(nèi)平滑地從0過渡到正值。 - 當(dāng)輸入值大于或等于+3時(shí)(X軸右側(cè)的部分),輸出值與輸入值相等,這對(duì)應(yīng)Hardswish函數(shù)中的第二個(gè)條件。
總的來說,圖形顯示了Hardswish函數(shù)提供的平滑非線性激活,它在負(fù)值區(qū)域開始為0,然后隨著輸入值增加而漸進(jìn)地增加,直到輸入值大于+3時(shí),輸出值直接等于輸入值,這種特性使得Hardswish激活函數(shù)在某些場(chǎng)合比標(biāo)準(zhǔn)的ReLU函數(shù)更受歡迎。圖表的標(biāo)題“Hardswish()”表明這是標(biāo)準(zhǔn)的Hardswish激活函數(shù),沒有自定義參數(shù)。
nn.LeakyReLU
torch.nn.LeakyReLU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),用于在神經(jīng)網(wǎng)絡(luò)中逐元素應(yīng)用LeakyReLU函數(shù)。LeakyReLU是ReLU(修正線性單元)激活函數(shù)的變種,其目的是解決ReLU激活函數(shù)在訓(xùn)練期間神經(jīng)元“死亡”(輸出始終為零)的問題。
LeakyReLU函數(shù)定義
LeakyReLU函數(shù)的行為如下:
- 當(dāng)輸入
x
大于或等于0時(shí),輸出為x
。 - 當(dāng)輸入
x
小于0時(shí),輸出為x
乘以一個(gè)小的正斜率(negative_slope
)。
形式上,函數(shù)可以表示為:
LeakyReLU(x) = max(0, x) + negative_slope * min(0, x)
或者等價(jià)的分段函數(shù)形式:
LeakyReLU(x) = { x if x >= 0, negative_slope * x otherwise }
參數(shù)
negative_slope
(浮點(diǎn)數(shù)):控制負(fù)斜率的角度,用于輸入值為負(fù)時(shí)。默認(rèn)值為0.01。inplace
(布爾值):可選地進(jìn)行就地操作。默認(rèn)值為False
。
形狀
- 輸入:任意形狀的張量。
- 輸出:與輸入相同形狀的張量。
示例代碼
下面是使用torch.nn.LeakyReLU
的一個(gè)示例:
import torch
import torch.nn as nn# 創(chuàng)建LeakyReLU激活函數(shù)層,設(shè)置negative_slope參數(shù)
leaky_relu = nn.LeakyReLU(negative_slope=0.1)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用LeakyReLU激活函數(shù)
output_tensor = leaky_relu(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,我們首先導(dǎo)入了必要的庫,然后創(chuàng)建了一個(gè)LeakyReLU
激活函數(shù)層,其中negative_slope
參數(shù)設(shè)置為0.1。這表示對(duì)于輸入值小于0的元素,它們的輸出將會(huì)被該系數(shù)縮小,而不是直接設(shè)置為0。接下來,我們創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量作為輸入,并通過LeakyReLU
層處理。最后,打印出了輸入和輸出張量,可以觀察到負(fù)輸入值經(jīng)過處理后被縮小了,而正輸入值保持不變。
圖示
這張圖展示了LeakyReLU激活函數(shù)的圖形,其中負(fù)斜率(negative_slope
)參數(shù)設(shè)置為0.1。X軸代表輸入值,Y軸代表LeakyReLU函數(shù)處理后的輸出值。
圖中顯示了LeakyReLU函數(shù)的兩個(gè)主要特點(diǎn):
- 對(duì)于所有大于0的輸入值(X軸的正值部分),輸出與輸入相同,這部分的函數(shù)圖形是一條通過原點(diǎn)的斜率為1的直線。
- 對(duì)于小于0的輸入值(X軸的負(fù)值部分),輸出是輸入值的0.1倍,這部分的函數(shù)圖形是一條更平緩的線,斜率為0.1。
圖形上方的標(biāo)題“LeakyReLU(negative_slope=0.1)”指出了使用的激活函數(shù)及其參數(shù)??傮w上,LeakyReLU通過為負(fù)輸入值提供一個(gè)小的非零斜率,避免了ReLU函數(shù)中的神經(jīng)元死亡問題,允許梯度在負(fù)區(qū)域傳播,有助于保持神經(jīng)網(wǎng)絡(luò)的活性。
nn.LogSigmoid
torch.nn.LogSigmoid
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中提供的一個(gè)激活函數(shù)。它對(duì)輸入張量逐元素應(yīng)用LogSigmoid激活函數(shù)。LogSigmoid函數(shù)是Sigmoid激活函數(shù)的對(duì)數(shù)版本,它能夠?qū)⑤斎胫涤成涞揭粋€(gè)平滑的梯度,有利于防止梯度消失的問題,特別是在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí)。
LogSigmoid函數(shù)定義
LogSigmoid函數(shù)定義如下:
LogSigmoid(x) = log(1 / (1 + exp(-x)))
這個(gè)函數(shù)實(shí)際上是計(jì)算Sigmoid函數(shù)的輸出的對(duì)數(shù)。由于對(duì)數(shù)函數(shù)在0到1范圍內(nèi)是單調(diào)的,因此LogSigmoid能夠保留Sigmoid函數(shù)將輸入擠壓到(0, 1)區(qū)間的性質(zhì),同時(shí)在梯度下降過程中提供更平滑的梯度。
形狀
- 輸入:可以是任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例代碼
以下是如何使用torch.nn.LogSigmoid
的一個(gè)示例:
import torch
import torch.nn as nn# 創(chuàng)建LogSigmoid激活函數(shù)層
log_sigmoid = nn.LogSigmoid()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用LogSigmoid激活函數(shù)
output_tensor = log_sigmoid(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
?在上述代碼中,首先導(dǎo)入了PyTorch及其神經(jīng)網(wǎng)絡(luò)模塊,然后創(chuàng)建了一個(gè)LogSigmoid
激活函數(shù)層。接著,我們創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量作為輸入,并通過LogSigmoid
層處理。最后,打印出了輸入和輸出張量,展示了LogSigmoid激活函數(shù)將輸入映射到對(duì)數(shù)空間后的結(jié)果。
圖示
這張圖展示了LogSigmoid激活函數(shù)的圖形。X軸代表輸入值,而Y軸代表LogSigmoid函數(shù)處理后的輸出值。
從圖中可以看出:
- 當(dāng)輸入值非常負(fù)時(shí)(X軸的左側(cè)部分),LogSigmoid的輸出接近于0,但是輸出是負(fù)無窮大,因?yàn)閘og函數(shù)在0附近趨于負(fù)無窮。
- 當(dāng)輸入值增加接近0時(shí),輸出值開始上升。
- 當(dāng)輸入值正且繼續(xù)增大時(shí)(X軸的右側(cè)部分),LogSigmoid的輸出增加速度減慢,并且開始趨于平穩(wěn)。這是因?yàn)殡S著Sigmoid函數(shù)輸出接近1時(shí),其對(duì)數(shù)將接近0。
總體上,LogSigmoid函數(shù)提供了一個(gè)在負(fù)無窮到0的平滑過渡,這有助于梯度下降算法穩(wěn)定地更新權(quán)重,特別是在梯度值較小的情況下。圖形上方的標(biāo)題“LogSigmoid()”表明這是標(biāo)準(zhǔn)的LogSigmoid激活函數(shù),沒有自定義參數(shù)。
nn.MultiheadAttention
torch.nn.MultiheadAttention
是 PyTorch 中實(shí)現(xiàn)的多頭注意力(Multi-Head Attention)機(jī)制,這種機(jī)制首次在論文 "Attention Is All You Need" 中被提出。多頭注意力是一種機(jī)制,它允許模型在不同的表示子空間中聯(lián)合注意(即同時(shí)處理)信息,這是現(xiàn)代 Transformer 架構(gòu)的核心組件之一。
多頭注意力的定義
多頭注意力的定義是:
- 對(duì)于給定的查詢(Q)、鍵(K)和值(V),將它們與不同的權(quán)重矩陣
相乘,得到不同頭的表示。
- 每個(gè)頭計(jì)算出的注意力
。
- 所有頭計(jì)算的注意力通過拼接(Concat)后,再乘以輸出權(quán)重矩陣
得到最終的輸出。
參數(shù)
embed_dim
:模型的總維度。num_heads
:并行注意力頭的數(shù)量。注意,embed_dim
將在num_heads
之間分割(即每個(gè)頭的維度將是embed_dim // num_heads
)。dropout
:在 attn_output_weights 上應(yīng)用的 Dropout 概率。默認(rèn)為 0.0(無dropout)。bias
:如果指定,會(huì)添加到輸入/輸出投影層的偏置。默認(rèn)為 True。add_bias_kv
:如果指定,在dim=0上為鍵和值序列添加偏置。默認(rèn)為 False。add_zero_attn
:如果指定,在dim=1上為鍵和值序列添加一批零。默認(rèn)為 False。kdim
:鍵的特征總數(shù)。默認(rèn)為 None(使用 kdim=embed_dim)。vdim
:值的特征總數(shù)。默認(rèn)為 None(使用 vdim=embed_dim)。batch_first
:如果為 True,則輸入和輸出張量的格式為(批次,序列,特征)。默認(rèn)為 False(序列,批次,特征)。
?示例
import torch
import torch.nn as nn# 初始化多頭注意力層
multihead_attn = nn.MultiheadAttention(embed_dim, num_heads)# 隨機(jī)生成query, key, value張量
query = torch.randn(seq_length, batch_size, embed_dim)
key = torch.randn(seq_length, batch_size, embed_dim)
value = torch.randn(seq_length, batch_size, embed_dim)# 應(yīng)用多頭注意力層
attn_output, attn_output_weights = multihead_attn(query, key, value)
在上面的示例中,query
、key
和value
張量需要具有合適的形狀,以便與多頭注意力層的參數(shù)相匹配。attn_output
是注意力操作的輸出,attn_output_weights
是注意力權(quán)重。
當(dāng)使用多頭注意力層時(shí),可以通過設(shè)置不同的參數(shù)來控制模型的行為,例如調(diào)整注意力頭的數(shù)量或改變dropout率以防止過擬合。該層通常用于自注意力場(chǎng)景,即 query
、key
和 value
是同一個(gè)張量的情況,這是 Transformer 架構(gòu)中的常見用法。此外,根據(jù)輸入和訓(xùn)練/推理模式的不同,該層可以使用優(yōu)化的 scaled_dot_product_attention()
實(shí)現(xiàn),以加速推理過程。
nn.PReLU
torch.nn.PReLU
是 PyTorch 中實(shí)現(xiàn)的參數(shù)化修正線性單元(Parametric Rectified Linear Unit,PReLU)激活函數(shù)。PReLU 是 ReLU 激活函數(shù)的一種推廣,允許負(fù)輸入值時(shí)的斜率也能夠通過學(xué)習(xí)得到,而不是被設(shè)為固定的0。
PReLU函數(shù)定義
PReLU函數(shù)定義如下:
- 當(dāng)輸入
x
大于等于 0 時(shí),輸出為x
。 - 當(dāng)輸入
x
小于 0 時(shí),輸出為a * x
。
其中 a
是可學(xué)習(xí)的參數(shù)。
參數(shù)
num_parameters
(int):要學(xué)習(xí)的a
的數(shù)量。盡管它接受一個(gè)整數(shù)作為輸入,但只有兩個(gè)值是合法的:1,或輸入通道的數(shù)量。默認(rèn)值為 1。init
(float):a
的初始值。默認(rèn)值為 0.25。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
變量
weight
(Tensor):可學(xué)習(xí)的權(quán)重,形狀為(num_parameters)。
示例
import torch
import torch.nn as nn# 初始化PReLU層
m = nn.PReLU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用PReLU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述示例代碼中,m
是一個(gè) PReLU 激活函數(shù)層,其中 a
的數(shù)量為默認(rèn)值 1,初始值為 0.25。然后創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 PReLU 層進(jìn)行處理。由于 a
是可學(xué)習(xí)的,所以在訓(xùn)練過程中,網(wǎng)絡(luò)可以調(diào)整這個(gè)參數(shù),以改進(jìn)模型對(duì)數(shù)據(jù)的擬合能力。
注意,在學(xué)習(xí) a
時(shí)不應(yīng)該使用權(quán)重衰減(weight decay),因?yàn)檫@可能會(huì)影響學(xué)習(xí)性能。通常,當(dāng)輸入張量的維度小于 2 時(shí),不存在通道維度,這種情況下通道數(shù)為 1。在具有更多維度的輸入上使用 PReLU,num_parameters
可以設(shè)置為通道數(shù),允許每個(gè)通道有其自己的 a
值。
圖示
這張圖展示了Parametric Rectified Linear Unit(PReLU)激活函數(shù)的圖形,其中可學(xué)習(xí)參數(shù)的數(shù)量(num_parameters
)被設(shè)置為1。X軸代表輸入值,Y軸代表PReLU函數(shù)處理后的輸出值。
從圖中可以觀察到以下特點(diǎn):
- 當(dāng)輸入值大于或等于0時(shí)(X軸的正值部分),輸出值與輸入值相同,即函數(shù)圖形是一條通過原點(diǎn)的斜率為1的直線。
- 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),輸出值是輸入值的線性函數(shù),具有一個(gè)比1小的正斜率。這個(gè)斜率是可學(xué)習(xí)參數(shù)
a
的值,由于這里num_parameters=1
,所有通道共享同一個(gè)a
參數(shù)。
圖形的標(biāo)題“PReLU(num_parameters=1)”表明這是一個(gè)使用單一可學(xué)習(xí)參數(shù) a
的PReLU函數(shù)。這種激活函數(shù)允許負(fù)輸入值時(shí)有一個(gè)非零的梯度,這可以幫助在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí)防止激活單元“死亡”。
nn.ReLU
torch.nn.ReLU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它逐元素地應(yīng)用修正線性單元(Rectified Linear Unit,ReLU)函數(shù)。
ReLU函數(shù)定義
ReLU函數(shù)定義如下:
ReLU(x) = max(0, x)
- 當(dāng)輸入
x
大于或等于 0 時(shí),輸出為x
。 - 當(dāng)輸入
x
小于 0 時(shí),輸出為 0。
參數(shù)
inplace
(bool):可選參數(shù),如果設(shè)為 True,則會(huì)直接在輸入上進(jìn)行修改,而不是創(chuàng)建新的輸出張量。默認(rèn)為 False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化ReLU激活函數(shù)層
m = nn.ReLU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用ReLU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
ReLU 是神經(jīng)網(wǎng)絡(luò)中最常用的激活函數(shù)之一,因?yàn)樗唵吻矣?jì)算效率高。ReLU 的主要優(yōu)點(diǎn)是它能夠解決梯度消失問題(在正區(qū)域),并且加速神經(jīng)網(wǎng)絡(luò)的收斂速度。
此外,ReLU的另一種變體是CReLU(Concatenated ReLU),它在原始ReLU的基礎(chǔ)上,將輸入的正部分和輸入的負(fù)部分的相反數(shù)(通過ReLU后)拼接在一起。這種激活函數(shù)可以提供更豐富的特征表示,因?yàn)樗瑫r(shí)保留了輸入的正激活和負(fù)激活信息。在CReLU的實(shí)現(xiàn)中,通常需要對(duì)輸入的負(fù)值部分也使用ReLU函數(shù),然后將正部分的輸出和負(fù)部分的輸出拼接起來。在PyTorch中,這可以通過以下示例代碼實(shí)現(xiàn):
import torch
import torch.nn as nn# 初始化ReLU激活函數(shù)層
m = nn.ReLU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入并增加一個(gè)維度
input_tensor = torch.randn(2).unsqueeze(0)# 應(yīng)用CReLU激活函數(shù)
output_tensor = torch.cat((m(input_tensor), m(-input_tensor)), dim=1)print("Input:", input_tensor)
print("Output:", output_tensor)
?在這段代碼中,輸入張量 input_tensor
通過 unsqueeze(0)
在第0維增加了一個(gè)維度,使其形狀變?yōu)?#xff08;1, 2),然后分別對(duì)原輸入和其相反數(shù)應(yīng)用ReLU,最后在第1維將兩者的輸出拼接起來,產(chǎn)生ReLU的輸出。
圖示
這張圖展示了ReLU(Rectified Linear Unit)激活函數(shù)的圖形。X軸代表輸入值,Y軸代表ReLU函數(shù)處理后的輸出值。
從圖中可以觀察到以下特點(diǎn):
- 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),ReLU函數(shù)的輸出為0,這部分的函數(shù)圖形是一條位于X軸上的水平線。
- 當(dāng)輸入值大于或等于0時(shí)(X軸的正值部分),ReLU函數(shù)的輸出與輸入相同,這部分的函數(shù)圖形是一條斜率為1的直線,即函數(shù)圖形是一個(gè)45度角的直線。
圖形上方的標(biāo)題“ReLU()”表明這是標(biāo)準(zhǔn)的ReLU激活函數(shù),沒有自定義參數(shù)。ReLU激活函數(shù)因其簡單性和效率而被廣泛用于神經(jīng)網(wǎng)絡(luò)模型中,特別是在隱藏層中。它的主要優(yōu)點(diǎn)是計(jì)算簡單并且能夠緩解梯度消失問題。
nn.ReLU6
torch.nn.ReLU6
是 PyTorch 中的一個(gè)激活函數(shù),它逐元素地應(yīng)用ReLU6函數(shù)。ReLU6是標(biāo)準(zhǔn)ReLU函數(shù)的一個(gè)變體,它限制了輸出的最大值為6。這種激活函數(shù)在移動(dòng)網(wǎng)絡(luò)中比較流行,如MobileNet架構(gòu),因?yàn)樗軌蛟诓伙@著增加計(jì)算負(fù)擔(dān)的情況下,減少模型的大小和提高運(yùn)行速度。
ReLU6函數(shù)定義
ReLU6函數(shù)定義如下:
ReLU6(x) = min(max(0, x), 6)
- 當(dāng)輸入
x
大于或等于 0 且小于或等于 6 時(shí),輸出為x
。 - 當(dāng)輸入
x
小于 0 時(shí),輸出為 0。 - 當(dāng)輸入
x
大于 6 時(shí),輸出為 6。
參數(shù)
inplace
(bool):如果設(shè)置為 True,則會(huì)直接在輸入上進(jìn)行修改,而不是額外創(chuàng)建一個(gè)輸出張量。默認(rèn)為 False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化ReLU6激活函數(shù)層
m = nn.ReLU6()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用ReLU6激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述示例代碼中,通過 nn.ReLU6()
創(chuàng)建了一個(gè) ReLU6 激活函數(shù)層,然后生成了一個(gè)包含兩個(gè)隨機(jī)數(shù)的張量作為輸入,并應(yīng)用了 ReLU6 激活函數(shù)。ReLU6 函數(shù)將輸入張量中所有小于0的值置為0,并將所有大于6的值置為6,輸出張量將具有與輸入相同的形狀。
圖示
這張圖展示了ReLU6激活函數(shù)的圖形。X軸代表輸入值,Y軸代表ReLU6函數(shù)處理后的輸出值。
從圖中可以看出ReLU6函數(shù)的特點(diǎn):
- 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),輸出值保持為0。
- 當(dāng)輸入值在0和6之間時(shí),輸出值與輸入值相同,即在這個(gè)區(qū)間內(nèi),函數(shù)圖形是一條斜率為1的直線。
- 當(dāng)輸入值大于6時(shí),輸出值保持為6,這部分是圖中的水平線段,位于Y軸的6處。
圖形上方的標(biāo)題“ReLU6()”指明這是ReLU6激活函數(shù)的標(biāo)準(zhǔn)形式。ReLU6函數(shù)是ReLU函數(shù)的一個(gè)變體,它不僅將所有負(fù)輸入截?cái)酁?,還將所有超過6的輸入值截?cái)酁?,這有助于在某些情況下減少模型的過擬合。
nn.RReLU
torch.nn.RReLU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它逐元素地應(yīng)用隨機(jī)泄露的整流線性單元(Randomized Leaky Rectified Linear Unit,RReLU)函數(shù)。RReLU 是 LeakyReLU 的一個(gè)隨機(jī)變種,其負(fù)斜率 a
不是固定的,而是在訓(xùn)練期間從一個(gè)均勻分布中隨機(jī)采樣的。在測(cè)試時(shí),a
是固定的,通常是 lower
和 upper
邊界的平均值。
RReLU函數(shù)定義
RReLU函數(shù)的行為如下:
- 當(dāng)輸入
x
大于或等于 0 時(shí),輸出為x
。 - 當(dāng)輸入
x
小于 0 時(shí),輸出為a * x
,其中a
是從均勻分布U(lower, upper)
中隨機(jī)采樣的。
在訓(xùn)練期間,a
的值是隨機(jī)的,幫助模型增加魯棒性。在評(píng)估期間(例如,模型被設(shè)置為 .eval()
),a
的值是固定的,等于 (lower + upper) / 2
。
參數(shù)
lower
(float):均勻分布的下界。默認(rèn)為 1/8。upper
(float):均勻分布的上界。默認(rèn)為 1/3。inplace
(bool):可以選擇是否就地操作。默認(rèn)為 False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化RReLU激活函數(shù)層,指定lower和upper
m = nn.RReLU(0.1, 0.3)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用RReLU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) RReLU 激活函數(shù)層,其中 lower
和 upper
分別被設(shè)置為 0.1 和 0.3。然后創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 RReLU 層進(jìn)行處理。在訓(xùn)練過程中,每個(gè)負(fù)輸入的 a
值將從 [0.1, 0.3]
的均勻分布中隨機(jī)采樣。而在模型評(píng)估時(shí),這些值將被固定為兩者的平均值,即 0.2。?
圖示
這張圖展示了RReLU(Randomized Leaky Rectified Linear Unit)激活函數(shù)的圖形。X軸代表輸入值,Y軸代表RReLU函數(shù)處理后的輸出值。
圖中可以看出RReLU函數(shù)的主要特點(diǎn):
- 當(dāng)輸入值大于或等于0時(shí)(X軸的正值部分),輸出值與輸入值相同,這部分的函數(shù)圖形是一條斜率為1的直線。
- 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),輸出值為輸入值乘以一個(gè)小的正斜率。這個(gè)斜率在訓(xùn)練期間是從一個(gè)由
lower
和upper
參數(shù)定義的均勻分布中隨機(jī)采樣的,因此在圖中呈現(xiàn)出許多不同斜率的線段。這些斜率的變化導(dǎo)致負(fù)輸入部分的圖形呈現(xiàn)出一種隨機(jī)的、有噪聲的外觀。
圖形上方的標(biāo)題“RReLU(lower=0.125, upper=0.3333333333333333)”指明了定義RReLU行為的參數(shù)。在此示例中,lower
參數(shù)為0.125,upper
參數(shù)大約為0.333,這表明在訓(xùn)練期間對(duì)于每個(gè)負(fù)輸入值,其斜率是在這兩個(gè)值之間隨機(jī)選取的。
總體而言,這種圖形展示了RReLU函數(shù)在負(fù)輸入值時(shí)可以增加模型的魯棒性,因?yàn)樗ㄟ^引入隨機(jī)性來防止模型過于依賴于任何特定的激活路徑。在評(píng)估或測(cè)試模式下,RReLU的行為類似于LeakyReLU,但斜率是lower
和upper
的平均值。
nn.SELU
torch.nn.SELU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中實(shí)現(xiàn)的激活函數(shù),它逐元素地應(yīng)用縮放指數(shù)線性單元(Scaled Exponential Linear Unit,SELU)。SELU 激活函數(shù)在論文 "Self-Normalizing Neural Networks" 中被提出,旨在通過激活函數(shù)自身的屬性使神經(jīng)網(wǎng)絡(luò)的輸出在訓(xùn)練過程中自我歸一化,這有助于改善深層網(wǎng)絡(luò)的訓(xùn)練過程。
SELU函數(shù)定義
SELU函數(shù)定義如下:
SELU(x) = scale * (max(0, x) + min(0, α * (exp(x) - 1)))
其中 α
和 scale
是預(yù)定義的常數(shù),α ≈ 1.6732632423543772848170429916717
和 scale ≈ 1.0507009873554804934193349852946
。
SELU函數(shù)的特點(diǎn)是在輸入值為正時(shí),它表現(xiàn)得像一個(gè)線性函數(shù)(帶有scale
縮放),而在輸入值為負(fù)時(shí),它是一個(gè)接近0的指數(shù)函數(shù)(也帶有scale
縮放和α
偏移)。
參數(shù)
inplace
(bool,可選):可以選擇是否就地進(jìn)行操作。默認(rèn)為 False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化SELU激活函數(shù)層
m = nn.SELU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用SELU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) SELU 激活函數(shù)層,然后生成了一個(gè)包含兩個(gè)隨機(jī)數(shù)的張量 input_tensor
作為輸入,并通過 SELU 層進(jìn)行處理。SELU 激活函數(shù)會(huì)自動(dòng)調(diào)整輸入張量的值,使得經(jīng)過訓(xùn)練的深度神經(jīng)網(wǎng)絡(luò)層的輸出盡可能自我歸一化,從而增強(qiáng)訓(xùn)練的穩(wěn)定性。
在使用基于He初始化(也稱為Kaiming初始化)方法時(shí),如果目標(biāo)是獲得自歸一化的網(wǎng)絡(luò)屬性,建議在 torch.nn.init
中將nonlinearity
參數(shù)設(shè)置為 'linear'
而不是 'selu'
。這是因?yàn)镠e初始化假定激活函數(shù)在負(fù)值時(shí)為0,而SELU在負(fù)值時(shí)不為0。
圖示
這張圖展示了SELU(Scaled Exponential Linear Unit)激活函數(shù)的圖形。X軸代表輸入值,Y軸代表SELU函數(shù)處理后的輸出值。
從圖中可以看出SELU函數(shù)的特點(diǎn):
- 當(dāng)輸入值大于或等于0時(shí)(X軸的正值部分),輸出值與輸入值相同,但經(jīng)過一個(gè)固定的
scale
因子放大,這部分的函數(shù)圖形是一條斜率略大于1的直線。 - 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),輸出值是負(fù)值部分的指數(shù)函數(shù)經(jīng)過放大和偏移,其增長速度隨著輸入值的減小而減慢,趨向于一個(gè)負(fù)的飽和值。
圖形上方的標(biāo)題“SELU()”表明這是標(biāo)準(zhǔn)的SELU激活函數(shù),沒有自定義參數(shù)。SELU激活函數(shù)通過其自身的屬性有助于神經(jīng)網(wǎng)絡(luò)層的輸出自我歸一化,這通常有助于改善深層網(wǎng)絡(luò)的訓(xùn)練穩(wěn)定性。在實(shí)際應(yīng)用中,SELU激活函數(shù)可能有助于減少需要批量歸一化的層數(shù)。
nn.CELU
torch.nn.CELU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它逐元素地應(yīng)用連續(xù)可微的指數(shù)線性單元(Continuously Differentiable Exponential Linear Unit,CELU)。CELU 是 ELU(Exponential Linear Unit)的一個(gè)變種,設(shè)計(jì)成在負(fù)值部分具有連續(xù)的梯度,這可以改善梯度下降的性能。
CELU函數(shù)定義
CELU函數(shù)定義如下:
CELU(x) = max(0, x) + min(0, α * (exp(x / α) - 1))
其中 α
是 CELU 函數(shù)的一個(gè)參數(shù),它決定了激活函數(shù)在負(fù)值區(qū)域的飽和點(diǎn)。
參數(shù)
alpha
(float):CELU公式中的α
值。默認(rèn)為 1.0。inplace
(bool):可選參數(shù),如果設(shè)為 True,則會(huì)直接在輸入上進(jìn)行修改,而不是創(chuàng)建新的輸出張量。默認(rèn)為 False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化CELU激活函數(shù)層,指定alpha參數(shù)
m = nn.CELU(alpha=1.0)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用CELU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) CELU 激活函數(shù)層,其中 alpha
參數(shù)被設(shè)置為默認(rèn)值 1.0。然后創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 CELU 層進(jìn)行處理。CELU 函數(shù)將輸入張量中所有大于0的值保持不變,并將所有小于0的值轉(zhuǎn)換為 α * (exp(x / α) - 1)
,輸出張量將具有與輸入相同的形狀。
圖示
這張圖展示了CELU(Continuously Differentiable Exponential Linear Unit)激活函數(shù)的圖形,其中參數(shù) alpha
被設(shè)置為1.0。X軸代表輸入值,Y軸代表CELU函數(shù)處理后的輸出值。
從圖中可以觀察到CELU函數(shù)的主要特點(diǎn):
- 當(dāng)輸入值大于或等于0時(shí)(X軸的正值部分),輸出值與輸入值相同,這部分的函數(shù)圖形是一條斜率為1的直線。
- 當(dāng)輸入值小于0時(shí)(X軸的負(fù)值部分),輸出值是輸入值經(jīng)過一個(gè)指數(shù)函數(shù)變換后的結(jié)果。這部分的曲線表現(xiàn)出平滑過渡,隨著輸入值的減小而逐漸飽和,接近于
α * (exp(x / α) - 1)
的值,由于alpha
設(shè)置為1,這個(gè)表達(dá)式簡化為(exp(x) - 1)
。
圖形上方的標(biāo)題“CELU(alpha=1.0)”指明了使用的激活函數(shù)及其參數(shù)。CELU激活函數(shù)在負(fù)輸入值時(shí)提供了平滑的非線性轉(zhuǎn)換,這有助于改善神經(jīng)網(wǎng)絡(luò)在負(fù)值輸入時(shí)的學(xué)習(xí)特性。與ELU類似,CELU旨在提供ReLU的一些優(yōu)點(diǎn),如減輕梯度消失問題,同時(shí)在負(fù)數(shù)區(qū)域提供更強(qiáng)的梯度信息。
nn.GELU
torch.nn.GELU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它逐元素地應(yīng)用高斯誤差線性單元(Gaussian Error Linear Unit,GELU)函數(shù)。GELU 是一種基于高斯分布的非線性激活函數(shù),被廣泛用于最新的深度學(xué)習(xí)模型中,例如BERT語言模型。
GELU函數(shù)定義
GELU函數(shù)定義如下:
GELU(x) = x * Φ(x)
其中 Φ(x)
是高斯分布的累積分布函數(shù)(CDF)。
參數(shù)
approximate
(str,可選):GELU近似算法的類型:'none' | 'tanh'。默認(rèn)為 'none'。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化GELU激活函數(shù)層
m = nn.GELU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用GELU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) GELU 激活函數(shù)層,然后生成了一個(gè)包含兩個(gè)隨機(jī)數(shù)的張量 input_tensor
作為輸入,并通過 GELU 層進(jìn)行處理。GELU 函數(shù)提供了一種平滑的非線性轉(zhuǎn)換,它在輸入的正負(fù)區(qū)域都提供了有用的梯度,且特別適合自然語言處理等任務(wù)。
如果使用 'tanh' 近似,GELU函數(shù)可以用以下公式表示:
GELU(x) ≈ 0.5 * x * (1 + tanh(sqrt(2/π) * (x + 0.044715 * x^3)))
這是一種近似計(jì)算,能夠提高計(jì)算效率。
圖示
這張圖展示了GELU(Gaussian Error Linear Unit)激活函數(shù)的圖形,其中approximate
參數(shù)被設(shè)置為'none'
,意味著這里使用的是GELU的精確形式而不是近似形式。X軸代表輸入值,Y軸代表GELU函數(shù)處理后的輸出值。
從圖中可以觀察到GELU函數(shù)的主要特點(diǎn):
- 在輸入值小于0的區(qū)域(X軸左側(cè)),GELU函數(shù)提供了平滑的非線性轉(zhuǎn)換,使輸出值逐漸接近0,而非突然跳躍到0。
- 隨著輸入值從負(fù)向正增加,輸出值開始增加,并在接近0的位置提供了平滑的曲線過渡。
- 在輸入值大于0的區(qū)域(X軸右側(cè)),輸出值隨輸入值的增加而線性增加,但由于GELU的特性,增長速度略微低于輸入值本身的增長速度。
圖形上方的標(biāo)題“GELU(approximate='none')”表明這是標(biāo)準(zhǔn)的GELU激活函數(shù)。GELU激活函數(shù)因其平滑的性質(zhì)而在深度學(xué)習(xí)模型中受到青睞,尤其是在處理自然語言處理任務(wù)時(shí)。它能夠在輸入數(shù)據(jù)的正負(fù)區(qū)間內(nèi)都提供有意義的梯度,從而有助于訓(xùn)練過程中的梯度傳播。
nn.Sigmoid
torch.nn.Sigmoid
是 PyTorch 中的一個(gè)激活函數(shù)層,它逐元素地應(yīng)用Sigmoid函數(shù)。Sigmoid函數(shù)是一個(gè)經(jīng)典的激活函數(shù),它將任意實(shí)數(shù)值映射到(0, 1)區(qū)間,常用于二分類問題的輸出層。
Sigmoid函數(shù)定義
Sigmoid函數(shù)的數(shù)學(xué)表達(dá)式為:
Sigmoid(x) = σ(x) = 1 / (1 + exp(-x))
這個(gè)函數(shù)的輸出值始終在0和1之間。
形狀
- 輸入:可以是任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Sigmoid激活函數(shù)層
m = nn.Sigmoid()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Sigmoid激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述示例中,m
是一個(gè) Sigmoid 激活函數(shù)層。通過 nn.Sigmoid()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 Sigmoid 層進(jìn)行處理。Sigmoid 函數(shù)將輸入張量中的每個(gè)元素映射到(0, 1)區(qū)間,輸出張量將具有與輸入相同的形狀。
Sigmoid函數(shù)在深度學(xué)習(xí)早期非常流行,但在現(xiàn)代深度學(xué)習(xí)模型中由于其一些缺點(diǎn)(如梯度消失問題)而逐漸被其他激活函數(shù)(如ReLU及其變種)所取代。盡管如此,它仍然在某些特定場(chǎng)合下(如輸出層需要概率輸出時(shí))被使用。
圖示
這張圖展示了Sigmoid激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Sigmoid函數(shù)處理后的輸出值。
從圖中可以觀察到Sigmoid函數(shù)的特點(diǎn):
- 當(dāng)輸入值遠(yuǎn)小于0時(shí)(X軸左側(cè)),Sigmoid函數(shù)的輸出接近于0。
- 當(dāng)輸入值遠(yuǎn)大于0時(shí)(X軸右側(cè)),Sigmoid函數(shù)的輸出接近于1。
- 在輸入值接近0時(shí)(X軸中間部分),Sigmoid函數(shù)的輸出從0平滑過渡到1,其中輸出值0.5對(duì)應(yīng)于輸入值0。
圖形上方的標(biāo)題“Sigmoid()”表明這是標(biāo)準(zhǔn)的Sigmoid激活函數(shù)。Sigmoid激活函數(shù)因其S形曲線(Sigmoid曲線)而得名,它是最早用于神經(jīng)網(wǎng)絡(luò)的激活函數(shù)之一,特別是在二分類問題中,用于將輸出映射到概率。
nn.SiLU
torch.nn.SiLU
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中實(shí)現(xiàn)的一個(gè)激活函數(shù),逐元素地應(yīng)用Sigmoid Linear Unit(SiLU),也被稱為swish函數(shù)。SiLU函數(shù)是一個(gè)平滑的非單調(diào)激活函數(shù),它將Sigmoid函數(shù)與輸入相乘,提供了ReLU函數(shù)的非飽和性質(zhì),并改善了訓(xùn)練過程。
SiLU函數(shù)定義
SiLU函數(shù)定義如下:
silu(x) = x * σ(x)
其中 σ(x)
是邏輯Sigmoid函數(shù)。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化SiLU激活函數(shù)層
m = nn.SiLU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用SiLU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) SiLU 激活函數(shù)層。通過 nn.SiLU()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 SiLU 層進(jìn)行處理。SiLU 函數(shù)將輸入張量中的每個(gè)元素乘以Sigmoid函數(shù)的結(jié)果,輸出張量將具有與輸入相同的形狀。
SiLU激活函數(shù)的一個(gè)特點(diǎn)是在輸入值較大時(shí)它近似于線性,而在輸入值較小時(shí)它接近于0,這個(gè)特性使得它可以自適應(yīng)地調(diào)節(jié)激活門限。在一些最新的深度學(xué)習(xí)模型中,SiLU顯示出了優(yōu)于ReLU的性能。
圖示
這張圖展示了SiLU(Sigmoid Linear Unit)激活函數(shù)的圖形。X軸代表輸入值,Y軸代表SiLU函數(shù)處理后的輸出值。
從圖中可以觀察到SiLU函數(shù)的主要特點(diǎn):
- 在輸入值小于0的區(qū)域(X軸左側(cè)),SiLU函數(shù)提供了平滑的非線性轉(zhuǎn)換,使輸出值逐漸接近0,但不是突然跳躍到0。
- 在輸入值為0附近,SiLU函數(shù)的輸出從0平滑地上升,提供了一個(gè)非線性的過渡區(qū)域。
- 在輸入值大于0的區(qū)域(X軸右側(cè)),SiLU函數(shù)的輸出開始類似線性增加,但由于Sigmoid函數(shù)的作用,輸出值的增加速度略低于輸入值的增加速度。
圖形上方的標(biāo)題“SiLU()”表明這是標(biāo)準(zhǔn)的SiLU激活函數(shù)。SiLU激活函數(shù)有助于在正區(qū)域內(nèi)保持激活的同時(shí),在負(fù)區(qū)域內(nèi)引入非線性,它結(jié)合了ReLU的正區(qū)域?qū)傩耘cSigmoid函數(shù)的平滑非線性特性。
nn.Mish
torch.nn.Mish
是 PyTorch 中的一個(gè)激活函數(shù),它按元素應(yīng)用Mish函數(shù)。Mish是一種相對(duì)較新的激活函數(shù),它結(jié)合了TanH和Softplus函數(shù)的特點(diǎn),以提供一種自我正則化的非單調(diào)激活函數(shù)。它被發(fā)現(xiàn)在多個(gè)任務(wù)中優(yōu)于ReLU及其變體,如LeakyReLU和ELU。
Mish函數(shù)定義
Mish函數(shù)定義如下:
Mish(x) = x * Tanh(Softplus(x))
其中 Softplus(x)
是一個(gè)平滑的ReLU變體,定義為 log(1 + exp(x))
。因此,Mish函數(shù)結(jié)合了Softplus提供的平滑閾值和TanH提供的非線性擠壓效應(yīng)。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Mish激活函數(shù)層
m = nn.Mish()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Mish激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) Mish 激活函數(shù)層。通過 nn.Mish()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 Mish 層進(jìn)行處理。Mish 函數(shù)將輸入張量中的每個(gè)元素經(jīng)過Softplus和TanH處理后乘以原始輸入,輸出張量將具有與輸入相同的形狀。
Mish函數(shù)由于其平滑性和自我正則化的特性,尤其在深度學(xué)習(xí)模型的訓(xùn)練中表現(xiàn)出色,有助于改善梯度流動(dòng)并減少訓(xùn)練過程中的梯度消失問題。
圖示
這張圖展示了Mish激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Mish函數(shù)處理后的輸出值。
從圖中可以觀察到Mish函數(shù)的主要特點(diǎn):
- 當(dāng)輸入值小于0時(shí)(X軸左側(cè)),Mish函數(shù)提供平滑的非線性轉(zhuǎn)換,使輸出值逐漸接近0。由于Softplus函數(shù)的特性,輸出值在負(fù)無窮時(shí)趨于0,而不是直接跳躍到0。
- 當(dāng)輸入值為0附近時(shí),Mish函數(shù)的輸出從0平滑地上升。
- 當(dāng)輸入值大于0時(shí)(X軸右側(cè)),Mish函數(shù)的輸出與輸入值的增加而增加,但由于Tanh函數(shù)的作用,增加速度稍微慢于線性。
圖形上方的標(biāo)題“Mish()”表明這是標(biāo)準(zhǔn)的Mish激活函數(shù)。Mish激活函數(shù)是一種自我正則化的激活函數(shù),它在正區(qū)域內(nèi)近似線性,在負(fù)區(qū)域內(nèi)提供非線性響應(yīng)。Mish因其在訓(xùn)練深度網(wǎng)絡(luò)時(shí)改善梯度流和減少梯度消失問題的能力而受到關(guān)注。
nn.Softplus
torch.nn.Softplus
是 PyTorch 中的一個(gè)激活函數(shù),它按元素應(yīng)用Softplus函數(shù)。Softplus函數(shù)是ReLU函數(shù)的平滑近似,可以用來確保機(jī)器輸出始終為正值。
Softplus函數(shù)定義
Softplus函數(shù)定義如下:
Softplus(x) = (1 / β) * log(1 + exp(β * x))
其中 β
是函數(shù)的一個(gè)參數(shù),它決定了函數(shù)近似ReLU的彎曲程度。當(dāng) β
的值越大,Softplus函數(shù)越接近ReLU函數(shù)。然而,為了數(shù)值穩(wěn)定性,當(dāng)輸入乘以 β
大于 threshold
時(shí),Softplus函數(shù)會(huì)轉(zhuǎn)換為線性函數(shù)。
參數(shù)
beta
(int):Softplus公式中的β
值。默認(rèn)值為 1。threshold
(int):當(dāng)輸入乘以β
超過這個(gè)閾值時(shí),函數(shù)將變?yōu)榫€性。默認(rèn)值為 20。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Softplus激活函數(shù)層
m = nn.Softplus()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Softplus激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè) Softplus 激活函數(shù)層。通過 nn.Softplus()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過 Softplus 層進(jìn)行處理。Softplus 函數(shù)將輸入張量中的每個(gè)元素通過Softplus函數(shù)轉(zhuǎn)換,使得輸出張量的所有值都為正,且具有與輸入相同的形狀。
Softplus函數(shù)因其平滑性而在深度學(xué)習(xí)模型中得到了應(yīng)用,尤其是在需要正輸出的情況下,例如在模型中預(yù)測(cè)價(jià)格或概率時(shí)。
圖示
這張圖展示了Softplus激活函數(shù)的圖形,其中參數(shù) beta
被設(shè)置為1,threshold
被設(shè)置為20。X軸代表輸入值,Y軸代表Softplus函數(shù)處理后的輸出值。
從圖中可以看出Softplus函數(shù)的主要特點(diǎn):
- 在輸入值為負(fù)的區(qū)域(X軸左側(cè)),Softplus函數(shù)的輸出平滑且逐漸接近0。這表明對(duì)于負(fù)輸入,激活函數(shù)輸出一個(gè)接近于0的正值,而不是0,這有助于保持梯度流動(dòng)。
- 在輸入值為正的區(qū)域(X軸右側(cè)),Softplus函數(shù)輸出值隨輸入值的增加而增加,且增長速度逐漸接近線性。
- 函數(shù)圖形整體呈現(xiàn)為平滑的曲線,逐漸從左側(cè)的飽和區(qū)轉(zhuǎn)變?yōu)橛覀?cè)的線性區(qū)。由于
threshold
被設(shè)置為20,所以在此輸入范圍內(nèi),我們不會(huì)看到函數(shù)轉(zhuǎn)為線性的行為,該線性行為僅在更高的輸入值(乘以beta
超過threshold
)時(shí)發(fā)生。
圖形上方的標(biāo)題“Softplus(beta=1, threshold=20)”明確了激活函數(shù)的參數(shù)設(shè)置。Softplus函數(shù)是ReLU函數(shù)的平滑版本,常被用于輸出層以確保預(yù)測(cè)值始終為正,或在隱藏層中作為ReLU的替代,以提供更豐富的梯度信息。
nn.Softshrink
torch.nn.Softshrink
是 PyTorch 中的一個(gè)激活函數(shù),按元素應(yīng)用軟縮減函數(shù)(Softshrinkage function)。
Softshrink函數(shù)定義
Softshrink函數(shù)定義如下:
SoftShrinkage(x) = { x - λ, if x > λ; x + λ, if x < -λ; 0, otherwise }
其中 λ
(lambda)是軟縮減公式中的參數(shù),必須大于等于零。
參數(shù)
lambd
(float):Softshrink公式中的λ
值。默認(rèn)為 0.5。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Softshrink激活函數(shù)層
m = nn.Softshrink()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Softshrink激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)Softshrink激活函數(shù)層,其中 λ
參數(shù)被設(shè)置為默認(rèn)值0.5。然后創(chuàng)建了一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過Softshrink層進(jìn)行處理。Softshrink函數(shù)會(huì)將輸入張量中所有絕對(duì)值大于 λ
的元素向零縮減 λ
的值,而將絕對(duì)值小于 λ
的元素置為0,從而得到輸出張量。這種激活函數(shù)可以增加數(shù)據(jù)的稀疏性,有助于某些類型的模型,比如壓縮感知和去噪任務(wù)。
圖示
圖片展示了Softshrink激活函數(shù)的圖像,其中λ(lambda)值設(shè)置為0.5。圖中的X軸表示輸入值,Y軸表示Softshrink函數(shù)處理后的輸出值。
從圖中可以看出Softshrink函數(shù)的特點(diǎn):
- 當(dāng)輸入值大于λ時(shí)(在這個(gè)例子中是0.5),輸出值為輸入值減去λ。
- 當(dāng)輸入值小于負(fù)λ時(shí)(在這個(gè)例子中是-0.5),輸出值為輸入值加上λ。
- 當(dāng)輸入值在-λ和λ之間時(shí),輸出值為0。
這種激活函數(shù)通常用于稀疏編碼應(yīng)用中,因?yàn)樗梢砸种戚^小的值,僅保留較大的激活值,從而產(chǎn)生稀疏的激活模式。在圖像的中心區(qū)域,我們可以看到一個(gè)“死區(qū)”,其中輸入值沒有任何輸出。
nn.Softsign
torch.nn.Softsign
是 PyTorch 神經(jīng)網(wǎng)絡(luò)模塊中的一個(gè)激活函數(shù),它按元素應(yīng)用Softsign函數(shù)。
Softsign函數(shù)定義
Softsign函數(shù)定義如下:
SoftSign(x) = x / (1 + |x|)
這個(gè)函數(shù)類似于tanh函數(shù),它將輸入值映射到(-1, 1)的范圍內(nèi)。不同于tanh的是,Softsign在輸入值很大時(shí),其曲線的接近飽和區(qū)的速度更慢,這使得它在輸入值很大時(shí)不那么敏感。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Softsign激活函數(shù)層
m = nn.Softsign()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Softsign激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)Softsign激活函數(shù)層。通過 nn.Softsign()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過Softsign層進(jìn)行處理。Softsign 函數(shù)將輸入張量中的每個(gè)元素轉(zhuǎn)換成一個(gè)在(-1, 1)范圍內(nèi)的值,輸出張量將具有與輸入相同的形狀。
Softsign函數(shù)提供了一種替代tanh和Sigmoid函數(shù)的方式,特別是在需要避免梯度消失問題時(shí)。由于其性質(zhì)更為平滑,它在某些情況下可能比tanh函數(shù)表現(xiàn)得更好。
圖示
這張圖展示了Softsign激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Softsign函數(shù)處理后的輸出值。
從圖中可以看出Softsign函數(shù)的特點(diǎn):
- 當(dāng)輸入值增加時(shí),輸出值趨于1,但是接近飽和的速度比Sigmoid和tanh函數(shù)要慢。
- 當(dāng)輸入值減少時(shí),輸出值趨于-1,同樣地,接近飽和的速度也比Sigmoid和tanh函數(shù)要慢。
- 在輸入值為0附近,Softsign函數(shù)提供了一個(gè)平滑的非線性過渡。
Softsign函數(shù)因其簡單且平滑的性質(zhì),在某些情況下可能是一個(gè)比Sigmoid或tanh更好的選擇,尤其是在需要避免梯度消失問題時(shí)。圖形上方的標(biāo)題“Softsign()”表明這是標(biāo)準(zhǔn)的Softsign激活函數(shù)。
nn.Tanh
torch.nn.Tanh
是 PyTorch 中的一個(gè)激活函數(shù),它按元素應(yīng)用雙曲正切(Hyperbolic Tangent,Tanh)函數(shù)。
Tanh函數(shù)定義
Tanh函數(shù)定義如下:
Tanh(x) = tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
Tanh函數(shù)將輸入值映射到(-1, 1)的范圍內(nèi),這使得它在許多情況下都是一個(gè)很好的選擇,特別是當(dāng)你想要輸出值包含負(fù)值并且有界時(shí)。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Tanh激活函數(shù)層
m = nn.Tanh()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Tanh激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)Tanh激活函數(shù)層。通過 nn.Tanh()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過Tanh層進(jìn)行處理。Tanh函數(shù)將輸入張量中的每個(gè)元素映射到(-1, 1)的范圍內(nèi),輸出張量將具有與輸入相同的形狀。
Tanh因其輸出范圍和平滑的梯度曲線而在深度學(xué)習(xí)模型中得到了廣泛的應(yīng)用,尤其是在早期的神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)中。然而,由于可能發(fā)生的梯度消失問題,現(xiàn)代深度學(xué)習(xí)實(shí)踐中常常使用ReLU及其變種作為激活函數(shù)。
圖示?
這張圖展示了Tanh(雙曲正切)激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Tanh函數(shù)處理后的輸出值。
從圖中可以觀察到Tanh函數(shù)的主要特點(diǎn):
- 當(dāng)輸入值小于0時(shí)(X軸左側(cè)),Tanh函數(shù)的輸出值逐漸接近-1。
- 當(dāng)輸入值大于0時(shí)(X軸右側(cè)),Tanh函數(shù)的輸出值逐漸接近1。
- 在輸入值為0時(shí),Tanh函數(shù)的輸出值為0,表現(xiàn)為一個(gè)S形的曲線(即Sigmoid曲線),它是Sigmoid函數(shù)的縮放和平移版本。
圖形上方的標(biāo)題“Tanh()”表明這是標(biāo)準(zhǔn)的Tanh激活函數(shù)。Tanh激活函數(shù)因其輸出范圍在(-1, 1)之間并且在輸入值為0時(shí)具有最大的導(dǎo)數(shù)(即最陡峭的斜率)而被廣泛用于神經(jīng)網(wǎng)絡(luò)中。這種性質(zhì)使得Tanh函數(shù)在處理以0為中心的數(shù)據(jù)時(shí)特別有用,因?yàn)樗梢詭椭P蛯W(xué)習(xí)到負(fù)相關(guān)性。然而,對(duì)于深層網(wǎng)絡(luò),Tanh函數(shù)可能會(huì)導(dǎo)致梯度消失的問題,這是因?yàn)楫?dāng)輸入值的絕對(duì)值變得很大時(shí),梯度會(huì)接近于0。
nn.Tanhshrink
torch.nn.Tanhshrink
是 PyTorch 中的一個(gè)激活函數(shù),它按元素應(yīng)用Tanhshrink函數(shù)。
Tanhshrink函數(shù)定義
Tanhshrink函數(shù)定義如下:
Tanhshrink(x) = x - tanh(x)
這個(gè)函數(shù)計(jì)算輸入值與其雙曲正切值的差。當(dāng)輸入值較小(接近0)時(shí),雙曲正切函數(shù)的輸出接近于輸入值,因此Tanhshrink的結(jié)果接近于0。當(dāng)輸入值的絕對(duì)值增加時(shí),雙曲正切函數(shù)趨向于1或-1,因此Tanhshrink的輸出將趨向于輸入值減去1或加上1。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Tanhshrink激活函數(shù)層
m = nn.Tanhshrink()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Tanhshrink激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)Tanhshrink激活函數(shù)層。通過 nn.Tanhshrink()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過Tanhshrink層進(jìn)行處理。Tanhshrink函數(shù)會(huì)對(duì)輸入張量中的每個(gè)元素進(jìn)行操作,輸出張量將具有與輸入相同的形狀。
Tanhshrink激活函數(shù)在深度學(xué)習(xí)中不如其他函數(shù)(如ReLU或其變種)常見,但它可以在特定情況下提供有用的性質(zhì),特別是在需要減少輸入值影響的情況下。
圖示
這張圖展示了Tanhshrink激活函數(shù)的圖形。X軸代表輸入值,Y軸代表Tanhshrink函數(shù)處理后的輸出值。
從圖中可以觀察到Tanhshrink函數(shù)的主要特點(diǎn):
- 在輸入值為0時(shí),Tanhshrink函數(shù)的輸出也為0,因?yàn)榇藭r(shí)
tanh(0) = 0
。 - 當(dāng)輸入值為正或負(fù)時(shí),Tanhshrink函數(shù)的輸出是輸入值與其雙曲正切值(tanh(x))的差。由于tanh(x)在x為正時(shí)小于x且為x為負(fù)時(shí)大于x,Tanhshrink函數(shù)的曲線在0附近有一個(gè)平滑的非線性過渡,然后逐漸趨向于線性。
- 當(dāng)輸入值的絕對(duì)值變得很大時(shí),雙曲正切函數(shù)的輸出接近于1或-1,因此Tanhshrink函數(shù)的輸出將趨向于輸入值本身,因?yàn)?code>x - tanh(x)將接近于
x - 1
或x + 1
。
總體而言,Tanhshrink激活函數(shù)在輸入值較小的時(shí)候提供了一種平滑的非線性轉(zhuǎn)換,而在輸入值較大的時(shí)候則提供了近似線性的行為。這種性質(zhì)使得Tanhshrink在特定的深度學(xué)習(xí)模型中可能會(huì)有其應(yīng)用場(chǎng)景,尤其是在希望減少極端值影響時(shí)。
nn.Threshold
torch.nn.Threshold
是 PyTorch 中的一個(gè)激活函數(shù),按元素對(duì)輸入張量應(yīng)用閾值操作。
Threshold函數(shù)定義
Threshold函數(shù)定義如下:
y = { x, if x > threshold; value, otherwise }
這意味著如果輸入元素大于閾值(threshold),則輸出該元素;否則輸出指定的值(value)。
參數(shù)
threshold
(float):要在其上應(yīng)用閾值的值。value
(float):替換小于閾值元素的值。inplace
(bool):可選參數(shù),如果設(shè)置為True,則會(huì)在原地修改輸入張量。默認(rèn)為False。
形狀
- 輸入:任意維度的張量。
- 輸出:與輸入相同形狀的張量。
示例
import torch
import torch.nn as nn# 初始化Threshold激活函數(shù)層,設(shè)定閾值和替換值
m = nn.Threshold(0.1, 20)# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(2)# 應(yīng)用Threshold激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)Threshold激活函數(shù)層,其中閾值設(shè)為0.1,替換值設(shè)為20。通過 nn.Threshold()
創(chuàng)建該層后,生成一個(gè)隨機(jī)數(shù)值的張量 input_tensor
作為輸入,并通過Threshold層進(jìn)行處理。Threshold函數(shù)將輸入張量中所有小于或等于0.1的元素替換為20,輸出張量將具有與輸入相同的形狀。
Threshold函數(shù)在處理一些特定的機(jī)器學(xué)習(xí)問題時(shí)很有用,特別是在需要對(duì)異常值或不重要的值進(jìn)行過濾時(shí)。它可以用作數(shù)據(jù)預(yù)處理的一部分,或者在神經(jīng)網(wǎng)絡(luò)中作為一個(gè)激活函數(shù)來增加稀疏性。
nn.GLU
torch.nn.GLU
是 PyTorch 中的一個(gè)模塊,它應(yīng)用門控線性單元(Gated Linear Unit)函數(shù)。GLU 是一種利用輸入數(shù)據(jù)的一部分來決定另一部分如何通過網(wǎng)絡(luò)的激活函數(shù)。
GLU函數(shù)定義
GLU函數(shù)的操作可以定義為:
GLU(a, b) = a ? σ(b)
其中 a
是輸入張量的前一半,b
是輸入張量的后一半,σ
是Sigmoid激活函數(shù),?
表示逐元素乘法。
參數(shù)
dim
(int):用于在該維度上分割輸入張量的維數(shù)。默認(rèn)為 -1,表示最后一個(gè)維度。
形狀
- 輸入:形狀為
(?1, N, ?2)
的張量,其中*
表示任意數(shù)量的額外維度。 - 輸出:形狀為
(?1, M, ?2)
的張量,其中M = N / 2
。
示例
import torch
import torch.nn as nn# 初始化GLU激活函數(shù)層
m = nn.GLU()# 創(chuàng)建一個(gè)隨機(jī)張量作為輸入
input_tensor = torch.randn(4, 2)# 應(yīng)用GLU激活函數(shù)
output_tensor = m(input_tensor)print("Input:", input_tensor)
print("Output:", output_tensor)
在上述代碼中,m
是一個(gè)GLU激活函數(shù)層。通過 nn.GLU()
創(chuàng)建該層后,生成一個(gè)形狀為(4, 2)的張量 input_tensor
作為輸入,并通過GLU層進(jìn)行處理。GLU函數(shù)將輸入張量分為兩半,第一半與第二半的Sigmoid激活的逐元素乘積作為輸出,輸出張量的維度將是輸入張量的一半。
GLU激活函數(shù)在某些深度學(xué)習(xí)模型中表現(xiàn)出了優(yōu)異的性能,尤其是在自然語言處理和序列數(shù)據(jù)建模中,因?yàn)樗梢栽黾幽P偷姆蔷€性并允許網(wǎng)絡(luò)學(xué)習(xí)更復(fù)雜的表示。
總結(jié)
本文綜合概述了PyTorch框架中一系列關(guān)鍵的激活函數(shù),從經(jīng)典的ReLU到前沿的GELU和Mish,探討了它們的數(shù)學(xué)定義、特點(diǎn)及實(shí)際應(yīng)用。通過各函數(shù)對(duì)輸入數(shù)據(jù)的不同處理方式,文章揭示了如何通過激活函數(shù)為神經(jīng)網(wǎng)絡(luò)模型注入非線性動(dòng)力,以及它們?cè)谏疃葘W(xué)習(xí)中的核心作用。從Sigmoid的平滑概率轉(zhuǎn)換到GLU的復(fù)雜數(shù)據(jù)門控,這些激活函數(shù)是構(gòu)建高效、穩(wěn)健機(jī)器學(xué)習(xí)模型的基石,同時(shí)它們的多樣性和特定應(yīng)用場(chǎng)景為深度學(xué)習(xí)的進(jìn)步提供了廣闊空間。