Pytorch_第九篇_神經網絡中常用的激活函數

2021-01-11 紙鶴視界

神經網絡中常用的激活函數

Introduce

理論上神經網絡能夠擬合任意線性函數,其中主要的一個因素是使用了非線性激活函數(因為如果每一層都是線性變換,那有啥用啊,始終能夠擬合的都是線性函數啊)。本文主要介紹神經網絡中各種常用的激活函數。

以下均為個人學習筆記,若有錯誤望指出。

各種常用的激活函數

早期研究神經網絡常常用sigmoid函數以及tanh函數(下面即將介紹的前兩種),近幾年常用ReLU函數以及Leaky Relu函數(下面即將介紹的後兩種)。torch中封裝了各種激活函數,可以通過以下方式來進行調用:

torch.sigmoid(x)torch.tanh(x)torch.nn.functional.relu(x)torch.nn.functional.leaky_relu(x,α)對於各個激活函數,以下分別從其函數公式、函數圖像、導數圖像以及優缺點來進行介紹。

(1) sigmoid 函數:

sigmoid函數是早期非常常用的一個函數,但是由於其諸多缺點現在基本很少使用了,基本上只有在做二分類時的輸出層才會使用。

sigmoid 的函數公式如下:

\[sigmoid(x) = {1 \over (1+exp(-x))} \]

sigmoid函數的導數有一個特殊的性質(導數是關於原函數的函數),導數公式如下:

\[sigmoid'(x) = sigmoid(x)*(1-sigmoid(x)) \]

sigmoid 的函數圖形如下:

sigmoid 的導數圖形如下:

sigmoid 優點:

能夠把輸入的連續值變換為0和1之間的輸出 (可以看成概率)。如果是非常大的負數或者正數作為輸入的話,其輸出分別為0或1,即輸出對輸入比較不敏感,參數更新比較穩定。sigmoid 缺點:

在深度神經網絡反向傳播梯度時容易產生梯度消失(大概率)和梯度爆炸(小概率)問題。根據求導的鏈式法則,我們都知道一般神經網絡損失對於參數的求導涉及一系列偏導以及權重連乘,那連乘會有什麼問題呢?如果隨機初始化各層權重都小於1(注意到以上sigmoid導數不超過0.25,也是一個比較小的數),即各個連乘項都很小的話,接近0,那麼最終很多很多連乘(對應網絡中的很多層)會導致最終求得梯度為0,這就是梯度消失現象(大概率發生)。同樣地,如果我們隨機初始化權重都大於1(非常大)的話,那麼一直連乘也是可能出現最終求得的梯度非常非常大,這就是梯度爆炸現象(很小概率發生)。sigmoid函數的輸出是0到1之間的,並不是以0為中心的(或者說不是關於原點對稱的)。這會導致什麼問題呢?神經網絡反向傳播過程中各個參數w的更新方向(是增加還是減少)是可能不同的,這是由各層的輸入值x決定的(為什麼呢?推導詳見)。有時候呢,在某輪迭代,我們需要一個參數w0增加,而另一個參數w1減少,那如果我們的輸入都是正的話(sigmoid的輸出都是正的,會導致這個問題),那這兩個參數在這一輪迭代中只能都是增加了,這勢必會降低參數更新的收斂速率。當各層節點輸入都是負數的話,也如上分析,即所有參數在這一輪迭代中只能朝同一個方向更新,要麼全增要麼全減。(但是一般在神經網絡中都是一個batch更新一次,一個batch中輸入x有正有負,是可以適當緩解這個情況的)sigmoid涉及指數運算,計算效率較低。(2) tanh 函數

tanh是雙曲正切函數。(一般二分類問題中,隱藏層用tanh函數,輸出層用sigmod函數,但是隨著Relu的出現所有的隱藏層基本上都使用relu來作為激活函數了)

tanh 的函數公式如下:

\[tanh(x) = {exp(x)-exp(-x) \over exp(x)+exp(-x) } \]

其導數也具備同sigmoid導數類似的性質,導數公式如下:

\[tanh'(x) = 1 - tanh^2(x) \]

tanh 的函數圖形如下:

tanh 的導數圖形如下:

tanh 優點:

輸出區間在(-1,1)之間,且輸出是以0為中心的,解決了sigmoid的第二個問題。如果使用tanh作為激活函數,還能起到歸一化(均值為0)的效果。tanh 缺點:

梯度消失的問題依然存在(因為從導數圖中我們可以看到當輸入x偏離0比較多的時候,導數還是趨於0的)。函數公式中仍然涉及指數運算,計算效率偏低。(3) ReLU 函數

ReLU (Rectified Linear Units) 修正線性單元。ReLU目前仍是最常用的activation function,在隱藏層中推薦優先嘗試!

ReLU 的函數公式如下:

\[ReLU = max(0,x) \]

ReLU 的函數圖形如下:

ReLU 的導數圖形如下:

ReLU 優點:

梯度計算很快,只要判斷輸入是否大於0即可,這一點加快了基於梯度的優化算法的計算效率,收斂速度遠快於Sigmoid和tanh。在正區間上解決了梯度消失(因為梯度永遠為1,不會連乘等於0)的問題。ReLU 缺點:

ReLU 的輸出不是以0為中心的,但是這點可以通過一個batch更新一次參數來緩解。Exist Dead ReLU Problem,某些神經元存在死機的問題(永遠不會被激活),這是由於當輸入x小於0的時候梯度永遠為0導致的,梯度為0代表參數不更新(加0減0),這個和sigmoid、tanh存在一樣的問題,即有些情況下梯度很小很小很小,梯度消失。但是實際的運用中,該缺陷的影響不是很大。 因為比較難發生,為什麼呢?因為這種情況主要有兩個原因導致,其一:非常恰巧的參數初始化。神經元的輸入為加權求和,除非隨機初始化恰好得到了一組權值參數使得加權求和變成負數,才會出現梯度為0的現象,然而這個概率是比較低的。其二:學習率設置太大,使得某次參數更新的時候,跨步太大,得到了一個比原先更差的參數。選擇已經有一些參數初始化的方法以及學習率自動調節的算法可以防止出現上述情況。(具體方法筆者暫時還未了解!了解了之後再進行補充)(4) Leaky Relu 函數(PRelu)

Leaky Relu 的函數公式如下:

\[PRelu(α,x)=max(αx,x) \]

以下以α為0.1的情況為例,通常α=0.01,這邊取0.1隻是為了圖形梯度大一點,畫出來比較直觀。

Leaky Relu 的函數圖形如下:

Leaky Relu 的導數圖形如下:

Leaky Relu 優點:

解決了relu函數輸入小於0時梯度為0的問題。與ReLU一樣梯度計算快,是常數,只要判斷輸入大於0還是小於0即可。對於Leaky Relu 的缺點筆者暫時不了解,但是實際應用中,並沒有完全證明Leaky ReLU總是好於ReLU,因此ReLU仍是最常用的激活函數。

相關焦點

  • 神經網絡中的激活函數
    什麼是神經網絡激活函數?激活函數有助於決定我們是否需要激活神經元。如果我們需要發射一個神經元那麼信號的強度是多少。激活函數是神經元通過神經網絡處理和傳遞信息的機制為什麼在神經網絡中需要一個激活函數?在神經網絡中,z是輸入節點與節點權值加上偏差的乘積。
  • 人工神經網絡的驅動者:激活函數是什麼?
    圖源:unsplash激活函數是人工神經網絡的驅動因素,其位於神經元之上,並管理著神經元行為,比如是否需要處理某個輸入數據,若需要,又以何種程度處理等等。從技術上來講,某個節點的激活函數將其在神經網絡中前一個節點的數據輸入,並輸出一個確定值,這個值繼而指導後續節點如何發動來響應特定輸入信號。本文剖析由激活函數組成的神經網絡,以及神經網絡的生物類似物,並簡要介紹幾種常用的激活函數。神經網絡的結構作為一名數據科學愛好者,你一定見過上面的這張圖片或者與之相似的圖片。這張圖片是對雙層神經網絡工作流程的經典描述。
  • 神經網絡中的各種損失函數介紹
    不同的損失函數可用於不同的目標。在這篇文章中,我將帶你通過一些示例介紹一些非常常用的損失函數。這篇文章提到的一些參數細節都屬於tensorflow或者keras的實現細節。損失函數的簡要介紹損失函數有助於優化神經網絡的參數。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    keras是神經網絡的一個模型計算框架,嚴格來說不是神經網絡框架。本身沒有重量級計算,它使用其他AI框架作為計算後臺,傻瓜式的使用。它的計算後臺還支持 Theano、CNTK(微軟的一個AI計算後臺)等,也就是說keras是多個計算後臺的門面。官方設計哲學為Simple. Flexible.
  • 神經網絡為何非激活函數不可?
    激活函數是神經網絡中一個至關重要的概念,決定了某個神經元是否被激活,判斷該神經元獲得的信息是否有用,並決定該保留還是該去掉此神經元。本文作者 Vandit Jain 對激活函數的相關知識進行了一個較為全面的總結,重點聚焦於以下幾個方面:一、激活函數是什麼?簡單地說,激活函數就是加入到人工神經網絡中的一個函數,目的在於幫助神經網絡從數據中學習複雜模式。
  • 通過函數圖像,了解26種神經網絡激活函數都長啥樣.
    重磅乾貨,第一時間送達在本文中,作者對包括 Relu、Sigmoid 在內的 26 種激活函數做了可視化,並附上了神經網絡的相關屬性
  • ReLU到Sinc的26種神經網絡激活函數可視化大盤點
    在神經網絡中,激活函數決定來自給定輸入集的節點的輸出,其中非線性激活函數允許網絡複製複雜的非線性行為。正如絕大多數神經網絡藉助某種形式的梯度下降進行優化,激活函數需要是可微分(或者至少是幾乎完全可微分的)。此外,複雜的激活函數也許產生一些梯度消失或爆炸的問題。
  • 從ReLU到GELU,一文概覽神經網絡的激活函數
    根據每一層前面的激活、權重和偏置,我們要為下一層的每個激活計算一個值。但在將該值發送給下一層之前,我們要使用一個激活函數對這個輸出進行縮放。本文將介紹不同的激活函數。在閱讀本文之前,你可以閱讀我前一篇介紹神經網絡中前向傳播和反向傳播的文章,其中已經簡單地提及過激活函數,但還未介紹其實際所做的事情。
  • 神經網絡篇——用TensorFlow2.0框架實現BP網絡
    熬過了上一篇漫長的代碼,稍微解開了一丟丟疑惑,使得抽象的BP有一點具體化了,可是還是有好多細節的東西沒有講清楚,比如,為什麼要用激活函數?為什麼隨機梯度下降沒有提到?下面我們來一一解開疑惑。首先是為什麼要使用激活函數?這要回顧一下我們在學習BP之前學習的感知器模型。它模仿的是人類體內的信號傳導的過程,當信號達到一定的閾值時,就可以繼續向後傳播。
  • AI瘋狂進階——激活函數篇
    本文作者專注於AI進階算法,正在推出AI瘋狂進階之基礎理論進階篇,如有興趣可持續關注我。核心導讀:1. 神經網絡激活函數的作用是什麼?2. 如何評價激活函數的好壞?3. ReLU存在哪些問題?4.存在替換萬年ReLU的激活函數嗎?激活函數對於人工神經網絡模型學習、理解非常複雜的數據來說具有十分重要的作用。激活函數給神經元引入了非線性因素,使得神經網絡可以逼近任何非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。目前最常見的激活函數當屬ReLU以及在其基礎上改進的如PReLU,RReLU,LeakyReLU等。
  • 斯坦福的神經網絡用這種激活函數,高保真還原圖像視頻
    視頻中對一隻貓咪的動態進行了還原,可以看見,使用SIREN重構的貓咪明顯具有更高的清晰度。從圖中就能看見,SIREN對音頻的還原幾乎可以用「完全一致」來形容。對於圖像的還原,SIREN的效率有點高,視頻中可見,SIREN以極少的迭代次數將圖像高度還原了出來。要問為什麼這個神經網絡架構能表現出這麼好的效果?接著往下看。
  • 如何選擇神經網絡激活函數:有效的改善模型學習模式的能力
    什麼是人工神經網絡?典型的人工神經網絡(ANN)是受人腦工作啟發而設計的受生物啟發的電腦程式。 這些ANN稱為網絡,因為它們由不同的功能組成,這些功能通過使用過去稱為訓練示例的經驗來檢測數據中的關係和模式來收集知識。 數據中的學習模式通過適當的激活函數進行修改,並作為神經元的輸出呈現,如下圖所示:什麼是激活函數?在神經網絡模型中怎麼使用?
  • 深度學習基礎篇:如何選擇正確的激活函數?
    而在深度學習中,我們也需要一種類似的機制來分類傳入的信息。不是所有信息都是有用的,一些只是噪音。激活函數可以幫助神經網絡做這種隔離。它激活有用的信息,並抑制無關的數據點。激活函數如此重要,那麼都有哪些比較熱門呢?它們是如何工作的?又適合解決什麼問題?本文將為你一一解答。以下是本文目錄。1.簡單介紹神經網絡2.什麼是激活函數?
  • 人工智慧系列(六) 深度學習中的神經網絡
    原力君在系列的第五篇《人工智慧系列(五) 深度學習簡介》中提到深度學習可以看作是一種更高級的函數擬合方法;人工神經網絡、激活函數、代價函數、梯度下降、反向傳播是深度學習的幾個關鍵點;常見的深度學習神經網絡結構有多層感知機、DNN、CNN、RNN等。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    主要流程分為以下三個部分:1,自定義生成一個訓練集,具體為在二維平面上的一些點,分為兩類;2,構建一個淺層神經網絡,實現對特徵的擬合,主要是明白在 pytorch 中網絡結構如何搭建;3,完成訓練和測試部分的工作,熟悉 pytorch 如何對網絡進行訓練和測試。1.
  • Facebook 開源 3D 深度學習函數庫 PyTorch3D
    PyTorch3D為3D數據提供了一組常用的3D運算符和快速且可微分的損失函數(loss function),以及模塊化的可微分渲染API。通過上述的功能,研究人員可以立即將這些函數導入至當前最先進的深度學習系統中。研究人員和工程師可以利用PyTorch3D進行各種3D深度學習研究(無論是3D重構、集束調整,乃至3D推理),以及改進在二維空間下的識別任務。
  • 吳恩達深度學習(20)-激活函數的導數和神經網絡的梯度下降
    激活函數的導數(Derivatives of activation functions)在神經網絡中使用反向傳播的時候,你真的需要計算激活函數的斜率或者導數。>在神經網絡中a=g(z);g(z)'=d/dz g(z)=a(1-a)2) Tanh activation function其具體的求導如下: 公式2: g(z)=tanh(z)=(e^z-e^(-z))/(e^z+e^(-z) )在神經網絡中;3)Rectified Linear Unit
  • 機器學習中的激活函數綜合指南
    自2012年以來,神經網絡研究的進展主導了大多數人工智慧(AI)文獻。激活函數對神經網絡的效率和穩定性起著至關重要的作用。在這篇文章中,將儘可能簡要地概述激活函數的最新發展,並關注為什麼需要它們以及何時應用它們。為什麼需要激活函數?
  • 引爆機器學習圈:「自歸一化神經網絡」提出新型激活函數SELU
    g 映射前後兩層神經網絡的均值和方差以達到歸一化的效果。有趣的是,這篇 NIPS 投稿論文雖然只有 9 頁正文,卻有著如同下圖一樣的 93 頁證明附錄。在這篇文章中,機器之心對該論文進行了概要介紹。此外,Github 上已有人做出了論文中提出的 SELUs 與 ReLU 和 Leaky ReLU 的對比,我們也對此對比進行了介紹。
  • 神經網絡中容易被忽視的基礎知識
    這次主要講解的內容有:神經元下面圖表的左邊展示了一個生物學的神經元,右邊展示了一個常用的數學模型。乍一看還是有點相似的,事實上也是,人工神經網絡中的神經元也有受到生物神經元的啟發。總結要點:在生物的神經元(也就是左圖)中,樹突將信號傳遞到細胞體,信號在細胞體中相加。