亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)

 更新時間:2023年04月13日 09:52:04   作者:Billie使勁學  
激活函數(shù) (Activation functions) 對于人工神經(jīng)網(wǎng)絡模型去學習、理解非常復雜和非線性的函數(shù)來說具有十分重要的作用,這篇文章主要介紹了Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等),需要的朋友可以參考下

一、激活函數(shù)定義

激活函數(shù) (Activation functions) 對于人工神經(jīng)網(wǎng)絡模型去學習、理解非常復雜和非線性的函數(shù)來說具有十分重要的作用。它們將非線性特性引入到神經(jīng)網(wǎng)絡中。在下圖中,輸入的 inputs 通過加權,求和后,還被作用了一個函數(shù)f,這個函數(shù)f就是激活函數(shù)。引入激活函數(shù)是為了增加神經(jīng)網(wǎng)絡模型的非線性。沒有激活函數(shù)的每層都相當于矩陣相乘。就算你疊加了若干層之后,無非還是個矩陣相乘罷了。

為什么使用激活函數(shù)?

        如果不用激勵函數(shù)(其實相當于激勵函數(shù)是f(x) = x),在這種情況下你每一層節(jié)點的輸入都是上層輸出的線性函數(shù),很容易驗證,無論你神經(jīng)網(wǎng)絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了,那么網(wǎng)絡的逼近能力就相當有限。正因為上面的原因,我們決定引入非線性函數(shù)作為激勵函數(shù),這樣深層神經(jīng)網(wǎng)絡表達能力就更加強大(不再是輸入的線性組合,而是幾乎可以逼近任意函數(shù))。

激活函數(shù)有哪些性質?

  • 非線性:當激活函數(shù)是非線性的,一個兩層的神經(jīng)網(wǎng)絡就可以基本上逼近所有的函數(shù)。但如果激活函數(shù)是恒等激活函數(shù)的時候,即f(x) = x,就不滿足這個性質,而且如果MLP使用的是恒等激活函數(shù),那么其實整個網(wǎng)絡跟單層神經(jīng)網(wǎng)絡是等價的。
  • 可微性:當優(yōu)化方法是基于梯度的時候,就體現(xiàn)的該本質。
  • 單調(diào)性:當激活函數(shù)是單調(diào)的時候,單層網(wǎng)絡能夠保證是凸函數(shù)。
  • 輸出值的范圍:當激活函數(shù)輸出值是有限的時候,基于梯度的優(yōu)化方法會更加穩(wěn)定,因為特征的表示受有限權值的影響更顯著;當激活函數(shù)的輸出是無限的時候,模型的訓練更加高效,不過這種情況很小,一般需要更小的learning rate。

二、梯度消失與梯度爆炸   

1.什么是梯度消失與梯度爆炸

梯度消失與梯度爆炸

        層數(shù)比較多的神經(jīng)網(wǎng)絡模型在訓練的時候會出現(xiàn)梯度消失(gradient vanishing problem)梯度爆炸(gradient exploding problem)問題。梯度消失問題和梯度爆炸問題一般會隨著網(wǎng)絡層數(shù)的增加變得越來越明顯。

        例如,一個網(wǎng)絡含有三個隱藏層,梯度消失問題發(fā)生時,靠近輸出層的hidden layer 3的權值更新相對正常,但是靠近輸入層的hidden layer1的權值更新會變得很慢,導致靠近輸入層的隱藏層權值幾乎不變,仍接近于初始化的權值。這就導致hidden layer 1 相當于只是一個映射層,對所有的輸入做了一個函數(shù)映射,這時此深度神經(jīng)網(wǎng)絡的學習就等價于只有后幾層的隱藏層網(wǎng)絡在學習。梯度爆炸的情況是:當初始的權值過大,靠近輸入層的hidden layer 1的權值變化比靠近輸出層的hidden layer 3的權值變化更快,就會引起梯度爆炸的問題。
 

2.梯度消失的根本原因

梯度消失的根本原因

以下圖的反向傳播為例:

假設σ為sigmoid,C為代價函數(shù)。

下圖(1)式為該網(wǎng)絡的前向傳播公式。

根據(jù)前向傳播公式,我們得出梯度更新公式:

其中由公式(1)得出

\frac{\partial y_{i}}{\partial z_{i}}=\sigma ^{'}(z_{i})

\frac{\partial z_{i}}{\partial x_{i}}=w_{i}

 sigmoid函數(shù)的導數(shù)如下圖所示

\sigma ^{'}(x)

的最大值是

\frac{1}{4}

,而我們一般會使用標準方法來初始化網(wǎng)絡權重,即使用一個均值為0標準差為1的高斯分布。因此,初始化的網(wǎng)絡權值通常都小于1,從而有\left | \sigma ^{'}(z)w \right |\leq \frac{1}{4}。對于2式的鏈式求導,層數(shù)越多,求導結果越小,前面的網(wǎng)絡層比后面的網(wǎng)絡層梯度變化更小,故權值變化緩慢,最終導致梯度消失的情況出現(xiàn)。

梯度爆炸的根本原因

    當\left | \sigma ^{'}(z)w \right |> 1,也就是w比較大的情況。則前面的網(wǎng)絡層比后面的網(wǎng)絡層梯度變化更快,引起了梯度爆炸的問題。

當激活函數(shù)為sigmoid時,梯度消失和梯度爆炸那個更容易發(fā)生?

梯度消失較容易發(fā)生

        量化分析梯度爆炸時x的取值范圍:因導數(shù)最大為0.25,故|w|>4,才可能出現(xiàn);按照可計算出x的數(shù)值變化范圍很窄,僅在公式3范圍內(nèi),才會出現(xiàn)梯度爆炸。畫圖如5所示,可見x的數(shù)值變化范圍很小;最大數(shù)值范圍也僅僅0.45,當|w|=6.9時出現(xiàn)。因此僅僅在此很窄的范圍內(nèi)會出現(xiàn)梯度爆炸的問題。

\frac{2}{\left | w \right |}ln(\frac{\left | w \right |(1+\sqrt{1-4/\left | w \right |})}{2}-1)

3.如何解決梯度消失與梯度爆炸問題 

如何解決梯度消失和梯度爆炸問題?

        梯度消失和梯度爆炸問題都是因為網(wǎng)絡太深,網(wǎng)絡權值更新不穩(wěn)定造成的,本質上是因為梯度反向傳播中的連乘效應。對于更普遍的梯度消失問題,可以考慮一下三種方案解決:

1.    用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。

2.    用Batch Normalization。

3.    LSTM的結構設計也可以改善RNN中的梯度消失問題。

三、常用激活函數(shù)

激活函數(shù)分為兩類,飽和激活函數(shù)和非飽和激活函數(shù)。

飽和激活函數(shù)包括sigmoid、tanh;非飽和激活函數(shù)包括ReLU、PReLU、Leaky ReLU、RReLU、ELU等。

那什么是飽和函數(shù)呢?

        sigmoid和tanh是“飽和激活函數(shù)”,而ReLU及其變體則是“非飽和激活函數(shù)”。使用“非飽和激活函數(shù)”的優(yōu)勢在于兩點:(1)"非飽和激活函數(shù)”能解決所謂的“梯度消失”問題。(2)它能加快收斂速度。

        Sigmoid函數(shù)將一個實值輸入壓縮至[0,1]的范圍---------σ(x) = 1 / (1 + exp(−x))
        tanh函數(shù)將一個實值輸入壓縮至 [-1, 1]的范圍---------tanh(x) = 2σ(2x) − 1
        由于使用sigmoid激活函數(shù)會造成神經(jīng)網(wǎng)絡的梯度消失和梯度爆炸問題,所以許多人提出了一些改進的激活函數(shù),如:tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、Maxout。

1.Sigmoid

sigmoid的數(shù)學公式為\sigma (x)=\frac{1}{1+e^{-x}}

其導數(shù)公式為\sigma ^{'}(x)=\frac{e^{-x}}{(1+e^{-x})^{2}}=\sigma (x)(1-\sigma (x))

如下圖所示,左圖為sigmoid的函數(shù)圖,右圖為其導數(shù)圖.

特點:它能夠把輸入的連續(xù)實值變換為0和1之間的輸出,特別的,如果是非常大的負數(shù),那么輸出就是0;如果是非常大的正數(shù),輸出就是1。

在什么情況下適合使用 Sigmoid 激活函數(shù)?

Sigmoid 函數(shù)的輸出范圍是 0 到 1。由于輸出值限定在 0 到 1,因此它對每個神經(jīng)元的輸出進行了歸一化;用于將預測概率作為輸出的模型。由于概率的取值范圍是 0 到 1,因此 Sigmoid 函數(shù)非常合適;梯度平滑,避免「跳躍」的輸出值;函數(shù)是可微的。這意味著可以找到任意兩個點的 sigmoid 曲線的斜率;明確的預測,即非常接近 1 或 0。

缺點:

容易出現(xiàn)梯度消失函數(shù)輸出并不是zero-centered(零均值)冪運算相對來講比較耗時

1.梯度消失

        優(yōu)化神經(jīng)網(wǎng)絡的方法是梯度回傳:先計算輸出層對應的 loss,然后將 loss 以導數(shù)的形式不斷向上一層網(wǎng)絡傳遞,修正相應的參數(shù),達到降低loss的目的。 Sigmoid函數(shù)在深度網(wǎng)絡中常常會導致導數(shù)逐漸變?yōu)?,使得參數(shù)無法被更新,神經(jīng)網(wǎng)絡無法被優(yōu)化。原因在于兩點:

當σ(x)中的x較大或較小時,導數(shù)接近0,而后向傳遞的數(shù)學依據(jù)是微積分求導的鏈式法則,當前層的導數(shù)需要之前各層導數(shù)的乘積,幾個小數(shù)的相乘,結果會很接近0。Sigmoid導數(shù)的最大值是0.25,這意味著導數(shù)在每一層至少會被壓縮為原來的1/4,通過兩層后被變?yōu)?/16,…,通過10層后為1/1048576。請注意這里是“至少”,導數(shù)達到最大值這種情況還是很少見的。

2.零均值

       零均值是不可取的,因為這會導致后一層的神經(jīng)元將得到上一層輸出的非0均值的信號作為輸入。 Sigmoid函數(shù)的輸出值恒大于0,這會導致模型訓練的收斂速度變慢。舉例來講,對\sigma (\sum_{i}^{}w_{i}x_{i}+b),如果所有x_{i}均為正數(shù)或負數(shù),那么其對w_{i}的導數(shù)總是正數(shù)或負數(shù),這會導致如下圖紅色箭頭所示的階梯式更新,這顯然并非一個好的優(yōu)化路徑。深度學習往往需要大量時間來處理大量數(shù)據(jù),模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網(wǎng)絡盡量使用zero-centered數(shù)據(jù) (可以經(jīng)過數(shù)據(jù)預處理實現(xiàn)) 和zero-centered輸出。

不是zero-centered產(chǎn)生的一個結果就是:如果數(shù)據(jù)進入神經(jīng)元的時候是正的,那么 w 計算出的梯度也會始終都是正的。當然了,如果你是按batch去訓練,那么那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產(chǎn)生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。

3.冪運算相對耗時

        相對于前兩項,這其實并不是一個大問題,我們目前是具備相應計算能力的,但面對深度學習中龐大的計算量,最好是能省則省。之后我們會看到,在ReLU函數(shù)中,需要做的僅僅是一個thresholding,相對于冪運算來講會快很多。

2.Tanh

tanh的數(shù)學公式為:tanh(x)=\frac{2}{1+e^{-2x}}-1

其導數(shù)為:tanh^{'}(x)=\frac{4e^{2x}}{(1+e^{-2x})^{2}}

sigmoid與tanh的比較

        首先,當輸入較大或較小時,輸出幾乎是平滑的并且梯度較小,這不利于權重更新。二者的區(qū)別在于輸出間隔,tanh 的輸出間隔為 1,并且整個函數(shù)以 0 為中心,比 sigmoid 函數(shù)更好;

        在 tanh 圖中,負輸入將被強映射為負,而零輸入被映射為接近零。

        注意:在一般的二元分類問題中,tanh 函數(shù)用于隱藏層,而 sigmoid 函數(shù)用于輸出層,但這并不是固定的,需要根據(jù)特定問題進行調(diào)整。

圖片

3.ReLU

ReLU的數(shù)學表達式為

其導數(shù)公式為

ReLU的優(yōu)點:

解決了梯度消失問題 (在正區(qū)間),ReLU的非飽和性可以有效地解決梯度消失的問題, 提供相對寬的激活邊界。Sigmoid和Tanh激活函數(shù)均需要計算指數(shù), 復雜度高, 而ReLU只需要一個閾值即可得到激活值。ReLU 函數(shù)中只存在線性關系,因此它的計算速度比 sigmoid 和 tanh 更快。計算速度非??欤?strong>只需要判斷輸入是否大于0。收斂速度遠快于sigmoid和tanhReLU使得一部分神經(jīng)元的輸出為0,這樣就造成了網(wǎng)絡的稀疏性,并且減少了參數(shù)的互相依存關系,緩解了過擬合問題的發(fā)生

ReLU存在的問題

ReLU 函數(shù)的輸出為 0 或正數(shù),不是zero-centered對參數(shù)初始化和學習率非常敏感;ReLU 函數(shù)的輸出均值大于0,偏移現(xiàn)象和神經(jīng)元死亡會共同影響網(wǎng)絡的收斂性。存在神經(jīng)元死亡,指的是某些神經(jīng)元可能永遠不會被激活,導致相應的參數(shù)永遠不能被更新。這是由于函數(shù)導致負梯度在經(jīng)過該ReLU單元時被置為0, 且在之后也不被任何數(shù)據(jù)激活, 即流經(jīng)該神經(jīng)元的梯度永遠為0, 不對任何數(shù)據(jù)產(chǎn)生響應。 當輸入為負時,ReLU 完全失效,在正向傳播過程中,這不是問題。有些區(qū)域很敏感,有些則不敏感。但是在反向傳播過程中,如果輸入負數(shù),則梯度將完全為零,sigmoid 函數(shù)和 tanh 函數(shù)也具有相同的問題。有兩個主要原因可能導致這種情況產(chǎn)生: (1) 非常不幸的參數(shù)初始化,這種情況比較少見; (2) learning rate太高導致在訓練過程中參數(shù)更新太大,會導致超過一定比例的神經(jīng)元不可逆死亡, 進而參數(shù)梯度無法更新, 整個訓練過程失敗。解決方法是可以采用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調(diào)節(jié)learning rate的算法。

怎樣理解ReLU(<0)時是非線性激活函數(shù)?

 從圖像可看出具有如下特點:

單側抑制相對寬闊的興奮邊界稀疏激活性

        ReLU函數(shù)從圖像上看,是一個分段線性函數(shù),把所有的負值都變?yōu)?,而正值不變,這樣就成為單側抑制。

        因為有了這單側抑制,才使得神經(jīng)網(wǎng)絡中的神經(jīng)元也具有了稀疏激活性。

        稀疏激活性:從信號方面來看,即神經(jīng)元同時只對輸入信號的少部分選擇性響應,大量信號被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特征。當x<0時,ReLU硬飽和,當x>0時,則不存在飽和函數(shù)。ReLU能夠在在x>0時保持梯度不衰減,從而緩解梯度消失問題。

4.Leaky ReLU

人們?yōu)榱私鉀Q失效神經(jīng)元,提出了將ReLU的前半段設為αx而非0。

Leaky ReLU的數(shù)學表達式為

其導數(shù)公式為

在這里插入圖片描述

為什么 Leaky ReLU 比 ReLU 更好?

Leaky ReLU 通過把 x 的非常小的線性分量給予負輸入(αx)來調(diào)整負值的零梯度(zero gradients)問題;leak 有助于擴大 ReLU 函數(shù)的范圍,通常 a 的值為 0.01 左右;Leaky ReLU 的函數(shù)范圍是(負無窮到正無窮)。

     但另一方面, a值的選擇增加了問題難度, 需要較強的人工先驗或多次重復訓練以確定合適的參數(shù)值。

LeakyReLU與ReLU和PReLU之間區(qū)別

if α=0 ,則函數(shù)是ReLUif α>0 ,則函數(shù)是Leaky ReLUif α是可學習參數(shù),則函數(shù)是PReLU(Parametric ReLU)

5.ELU

        ELU 的提出也解決了 ReLU 的問題。與 ReLU 相比,ELU 有負值,這會使激活的平均值接近零。均值激活接近于零可以使學習更快,因為它們使梯度更接近自然梯度。

顯然,ELU 具有 ReLU 的所有優(yōu)點,并且:

沒有 Dead ReLU 問題,輸出的平均值接近 0,以 0 為中心;ELU 通過減少偏置偏移的影響,使正常梯度更接近于單位自然梯度,從而使均值向零加速學習;ELU 在較小的輸入下會飽和至負值,從而減少前向傳播的變異和信息。

       一個小問題是它的計算強度更高。與 Leaky ReLU 類似,盡管理論上比 ReLU 要好,但目前在實踐中沒有充分的證據(jù)表明 ELU 總是比 ReLU 好。

6.softmax

        Softmax 是用于多類分類問題的激活函數(shù),在多類分類問題中,超過兩個類標簽則需要類成員關系。對于長度為 K 的任意實向量,Softmax 可以將其壓縮為長度為 K,值在(0,1)范 圍內(nèi),并且向量中元素的總和為 1 的實向量。

        Softmax 與正常的 max 函數(shù)不同:max 函數(shù)僅輸出最大值,但 Softmax 確保較小的值具有較小的概率,并且不會直接丟棄。我們可以認為它是 argmax 函數(shù)的概率版本或「soft」版本。        

        Softmax 函數(shù)的分母結合了原始輸出值的所有因子,這意味著 Softmax 函數(shù)獲得的各種概率彼此相關。

Softmax 激活函數(shù)的主要缺點是:

在零點不可微;負輸入的梯度為零,這意味著對于該區(qū)域的激活,權重不會在反向傳播期間更新,因此會產(chǎn)生永不激活的死亡神經(jīng)元。

7.Swish

Swish的表達式為y = x * sigmoid (x)

        Swish 的設計受到了 LSTM 和高速網(wǎng)絡中 gating 的 sigmoid 函數(shù)使用的啟發(fā)。我們使用相同的 gating 值來簡化 gating 機制,這稱為 self-gating。

        self-gating 的優(yōu)點在于它只需要簡單的標量輸入,而普通的 gating 則需要多個標量輸入。這使得諸如 Swish 之類的 self-gated 激活函數(shù)能夠輕松替換以單個標量為輸入的激活函數(shù)(例如 ReLU),而無需更改隱藏容量或參數(shù)數(shù)量。

  Swish 激活函數(shù)的主要優(yōu)點如下:

「無界性」有助于防止慢速訓練期間,梯度逐漸接近 0 并導致飽和;(同時,有界性也是有優(yōu)勢的,因為有界激活函數(shù)可以具有很強的正則化,并且較大的負輸入問題也能解決);導數(shù)恒 > 0;平滑度在優(yōu)化和泛化中起了重要作用。

到此這篇關于Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)的文章就介紹到這了,更多相關激活函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Pandas中兩個dataframe的交集和差集的示例代碼

    Pandas中兩個dataframe的交集和差集的示例代碼

    這篇文章主要介紹了Pandas中兩個dataframe的交集和差集的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • pytorch finetuning 自己的圖片進行訓練操作

    pytorch finetuning 自己的圖片進行訓練操作

    這篇文章主要介紹了pytorch finetuning 自己的圖片進行訓練操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python爬蟲之selenium模塊

    python爬蟲之selenium模塊

    本文詳細講解了python爬蟲之selenium模塊,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • python 獲取星期字符串的實例

    python 獲取星期字符串的實例

    這篇文章主要介紹了python 獲取星期字符串的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python3 集合set入門基礎

    Python3 集合set入門基礎

    集合也也也也是python內(nèi)置的一種數(shù)據(jù)結構,它是一個無序且元素不重復的序列。這里有兩個關鍵詞一個是無序,這一點和字典是一樣的,另一個關鍵詞是元素不重復,這一點和字典的key(鍵)是一樣的
    2020-02-02
  • python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作

    python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作

    這篇文章主要介紹了python 使用xlsxwriter循環(huán)向excel中插入數(shù)據(jù)和圖片的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 詳解Django中Request對象的相關用法

    詳解Django中Request對象的相關用法

    這篇文章主要介紹了詳解Django中Request對象的相關用法,Django是Python重多人氣框架中最著名的一個,需要的朋友可以參考下
    2015-07-07
  • 解鎖Python中神器vars內(nèi)置函數(shù)的使用

    解鎖Python中神器vars內(nèi)置函數(shù)的使用

    vars()函數(shù)是一個內(nèi)置函數(shù),用于返回對象的__字典__,其中包含對象的__屬性__,本文主要為大家詳細介紹了vars()函數(shù)的具體使用,需要的小伙伴可以了解下
    2023-11-11
  • python實現(xiàn)m3u8格式轉換為mp4視頻格式

    python實現(xiàn)m3u8格式轉換為mp4視頻格式

    這篇文章主要為大家詳細介紹了python實現(xiàn)m3u8格式轉換為mp4視頻格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Django框架使用富文本編輯器Uedit的方法分析

    Django框架使用富文本編輯器Uedit的方法分析

    這篇文章主要介紹了Django框架使用富文本編輯器Uedit的方法,結合實例形式分析了Django框架中使用Uedit的安裝、配置方法及Uedit相關插件制作方法,需要的朋友可以參考下
    2018-07-07

最新評論