1. 程式人生 > >RELU 啟用函式及其他相關的函式

RELU 啟用函式及其他相關的函式

日常 coding 中,我們會很自然的使用一些啟用函式,比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事:

  1. 為什麼需要啟用函式?
  2. 啟用函式都有哪些?都長什麼樣?有哪些優缺點?
  3. 怎麼選用啟用函式?

本文正是基於這些問題展開的,歡迎批評指正!

此處輸入圖片的描述
(此圖並沒有什麼卵用,純屬為了裝x …)

Why use activation functions?

啟用函式通常有如下一些性質:

  • 非線性: 當啟用函式是線性的時候,一個兩層的神經網路就可以逼近基本上所有的函數了。但是,如果啟用函式是恆等啟用函式的時候(即f(x)=x),就不滿足這個性質了,而且如果MLP使用的是恆等啟用函式,那麼其實整個網路跟單層神經網路是等價的。
  • 可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
  • 單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。
  • f(x)x: 當啟用函式滿足這個性質的時候,如果引數的初始化是random的很小的值,那麼神經網路的訓練將會很高效;如果不滿足這個性質,那麼就需要很用心的去設定初始值。
  • 輸出值的範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate.

這些性質,也正是我們使用啟用函式的原因!

Activation Functions.

Sigmoid

此處輸入圖片的描述

Sigmoid 是常用的非線性的啟用函式,它的數學形式如下: 

f(x)=11+ex

正如前一節提到的,它能夠把輸入的連續實值“壓縮”到0和1之間。 
特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1. 
sigmoid 函式曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因為它的一些 缺點:

  • Sigmoids saturate and kill gradients. (saturate 這個詞怎麼翻譯?飽和?)sigmoid 有一個非常致命的缺點,當輸入非常大或者非常小的時候(saturation),這些神經元的梯度是接近於0的,從圖中可以看出梯度的趨勢。所以,你需要尤其注意引數的初始值來儘量避免saturation的情況。如果你的初始值很大的話,大部分神經元可能都會處在saturation的狀態而把gradient kill掉,這會導致網路變的很難學習。
  • Sigmoid 的 output 不是0均值. 這是不可取的,因為這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。 
    產生的一個結果就是:如果資料進入神經元的時候是正的(e.g. x>0 elementwise in f=wTx+b),那麼 w 計算出的梯度也會始終都是正的。 
    當然了,如果你是按batch去訓練,那麼那個batch可能得到不同的訊號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。

tanh

tanh 是上圖中的右圖,可以看出,tanh 跟sigmoid還是很像的,實際上,tanh 是sigmoid的變形: 

tanh(x)=2sigmoid(2x)1

與 sigmoid 不同的是,tanh 是0均值的。因此,實際應用中,tanh 會比 sigmoid 更好(畢竟去粗取精了嘛)。

此處輸入圖片的描述

ReLU

近年來,ReLU 變的越來越受歡迎。它的數學表示式如下: 

f(x)=max(0,x)

很顯然,從圖左可以看出,輸入訊號<0時,輸出都是0,>0 的情況下,輸出等於輸入。w 是二維的情況下,使用ReLU之後的效果如下:

此處輸入圖片的描述

ReLU 的優點:

  • Krizhevsky et al. 發現使用 ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多(看右圖)。有人說這是因為它是linear,而且 non-saturating
  • 相比於 sigmoid/tanh,ReLU 只需要一個閾值就可以得到啟用值,而不用去算一大堆複雜的運算。

ReLU 的缺點: 當然 ReLU 也有缺點,就是訓練的時候很”脆弱”,很容易就”die”了. 什麼意思呢?

舉個例子:一個非常大的梯度流過一個 ReLU 神經元,更新過引數之後,這個神經元再也不會對任何資料有啟用現象了。

如果這個情況發生了,那麼這個神經元的梯度就永遠都會是0.

實際操作中,如果你的learning rate 很大,那麼很有可能你網路中的40%的神經元都”dead”了。 
當然,如果你設定了一個合適的較小的learning rate,這個問題發生的情況其實也不會太頻繁。

Leaky-ReLU、P-ReLU、R-ReLU

Leaky ReLUs: 就是用來解決這個 “dying ReLU” 的問題的。與 ReLU 不同的是: 

f(x)=αx(x<0) f(x)=x(x>=0)

這裡的 α 是一個很小的常數。這樣,即修正了資料分佈,又保留了一些負軸的值,使得負軸資訊不會全部丟失。

此處輸入圖片的描述

關於Leaky ReLU 的效果,眾說紛紜,沒有清晰的定論。有些人做了實驗發現 Leaky ReLU 表現的很好;有些實驗則證明並不是這樣。

此處輸入圖片的描述

Parametric ReLU: 對於 Leaky ReLU 中的α,通常都是通過先驗知識人工賦值的。 
然而可以觀察到,損失函式對α的導數我們是可以求得的,可不可以將它作為一個引數進行訓練呢? 
Kaiming He的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓練,而且效果更好。

公式非常簡單,反向傳播至未啟用前的神經元的公式就不寫了,很容易就能得到。對α的導數如下:

δyiδα=0(ifyi>0)else=yi

原文說使用了Parametric ReLU後,最終效果比不用提高了1.03%.

Randomized ReLU: 
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α 是random的). 
它首次試在 kaggle 的NDSB 比賽中被提出的。

核心思想就是,在訓練過程中,α 是從一個高斯分佈 U(l,u) 中 隨機出來的,然後再測試過程中進行修正(有點像dropout的用法)。

數學表示如下:

此處輸入圖片的描述

在測試階段,把訓練過程中所有的 αij 取個平均值。NDSB 冠軍的 α 是從 U(3,8) 中隨機出來的。那麼,在測試階段,啟用函式就是就是: 

yij=xijl+u2

看看 cifar-100 中的實驗結果:

此處輸入圖片的描述

Maxout

此處輸入圖片的描述

Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。 
Maxout 公式如下: 

fi(x)=maxj[1,k]zij

假設 w 是2維,那麼有: 

f(x)=max(wT1x+b1,wT2x+b2)

可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如,w1,

相關推薦

RELU 啟用函式及其相關函式

日常 coding 中,我們會很自然的使用一些啟用函式,比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事: 為什麼需要啟用函式?啟用函式都有哪些?都長什麼樣?有哪些優缺點?怎麼選用啟用函式? 本文正是基於這些問題展開的,歡迎批評指正! (此圖並沒有

【神經網路】RELU 啟用函式及其相關函式

轉載自:http://blog.csdn.net/u013146742/article/details/51986575 日常 coding 中,我們會很自然的使用一些啟用函式,比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事: 為什

認識Cpu、核和執行緒及其相關概念

1、cpu、核和執行緒的關係 cpu個數: 是指物理上,也就是硬體上的核心數 核: 邏輯上的、模擬出來的核心數 執行緒數:同一時刻裝置並行執行的程式個數,執行緒數=cpu個數 * 核數 2、單核cpu和多核cpu 單核也就是說一個物理上的cpu可以模擬出來的核心數是1個,多核

【oKong | 趔趄的猿】分享程式猿日常,不定期釋出關於SpringBoot、SpringCloud、Java及其相關教程,記錄工作中碰到的問題。公眾號:lqdevOps,歡迎關注~個人部落格:http://blog.lqdev.cn

分享程式猿日常,不定期釋出關於SpringBoot、SpringCloud、Java及其他相關教程,記錄工作中碰到的問題。公眾號:lqdevOps,歡迎關注~個人部落格:http://blog.lqde...

webpack3.x配置/dev-server相關配置說明及其相關配置

第一種方式:在package.json進行設定;"scripts": { "build": "webpack", "dev": "webpack-dev-server --content-base build --progress --host 127.0.0

面向物件三大特性及其相關概念

面向物件 面向物件是一種對現實世界理解與抽象的方法。三大特性:封裝、繼承、多型。 封裝 封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。 封裝是面向物件的特徵之一,是物件和類概念的主

1.socket程式設計:socket程式設計,網路位元組序,函式介紹,IP地址轉換函式,sockaddr資料結構,網路套接字函式,socket相關函式,TCP server和client

 1Socket程式設計 socket這個詞可以表示很多概念: 在TCP/IP協議中,“IP地址+TCP或UDP埠號”唯一標識網路通訊中的一個程序,“IP 地址+埠號”就

自協方差函式,自相關函式,協方差矩陣

1.自相關函式(Autocorrelation function) 自相關函式是描述隨機訊號X(t)在任意兩個不同時刻t1,t2,的取值之間的相關程度 2. 自協方差函式(Autocovariance function) 自協方差函式是描述隨機訊號X(t)在任意兩個不同

字元驅動裝置原理及其相關函式(二)

參看朱有鵬老師嵌入式視屏,第五部分第三章 1、(1)老介面:register_chrdev (2)新介面:register_chrdev_region/alloc_chrdev_region + cdev register_chrdev_region/alloc_chrdev_regio

[python3 Numpy使用技巧]一條語句實現numpy陣列relu啟用函式

一條語句實現numpy陣列relu啟用函式 就是實現numpy陣列中,小於零的元素賦值零。類似於神經網路裡的啟用函式,請看程式碼: Idata = 1 * (Idata > 0) * Idata 可以分解一下 temp = Idata > 0 temp = 1

【轉載】ReLU啟用函式:簡單之美

導語 在深度神經網路中,通常使用一種叫修正線性單元(Rectified linear unit,ReLU)作為神經元的啟用函式。ReLU起源於神經科學的研究:2001年,Dayan、Abott從生物學角度模擬出了腦神經元接受訊號更精確的啟用模型,如下圖: 其中橫軸是時間(m

ReLU啟用函式:簡單之美

導語 在深度神經網路中,通常使用一種叫修正線性單元(Rectified linear unit,ReLU)作為神經元的啟用函式。ReLU起源於神經科學的研究:2001年,Dayan、Abott從生物學角度模擬出了腦神經元接受訊號更精確的啟用模型,如下圖:   其中橫軸是時

relu啟用函式解讀

Tensorflow學習——ReLu 轉載 2017年07月17日 22:39:50

啟用函式及其作用以及梯度消失、爆炸、神經元節點死亡的解釋

一、神經網路梯度消失與梯度爆炸 (1)簡介梯度消失與梯度爆炸 層數比較多的神經網路模型在訓練的時候會出現梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)問題。梯度消失問

ReLu啟用函式

起源:傳統啟用函式、腦神經元啟用頻率研究、稀疏啟用性 傳統Sigmoid系啟用函式 傳統神經網路中最常用的兩個啟用函式,Sigmoid系(Logistic-Sigmoid、Tanh-Sigmoid)被視為神經網路的核心所在。 從數學上來看,非線性的Sigmoid函式對中央區的訊號增益較大,對兩側區的

ReLU啟用函式的缺點

訓練的時候很”脆弱”,很容易就”die”了,訓練過程該函式不適應較大梯度輸入,因為在引數更新以後,ReLU的神經元不會再有啟用的功能,導致梯度永遠都是零。 例如,一個非常大的梯度流過一個 ReLU 神經元,更新過引數之後,這個神經元再也不會對任何資料有啟用現象了,那麼這個神經

深度學習中的啟用函式Sigmoid和ReLu啟用函式和梯度消失問題。

1. Sigmoid啟用函式:              Sigmoid啟用函式的缺陷:當 x 取很大的值之後他們對應的 y 值區別不會很大,就會出現梯度消失的問題。因此現在一般都不使用Sigmoid函式,而是使用ReLu啟用函式。2. ReLu啟用函式:       ReL

神經網路常用啟用函式及其應用舉例

假設神經元的輸入是一個4維的向量 X=[x1,x2,x3,x4],其中xi的值為0或者1,並且只取4中樣本: x1=[1,0,0,0]x2=[0,1,0,0]x3=[0,0,1,0]x4=[0,0,0,1] 對這一組樣本,採用一個很小的隨機數來模擬生成20000個樣本,同時,將神經元的4個輸出值對映

cdev結構體及其相關函式 【轉】

1、在Linux2.6核心中一個字元裝置用cdev結構來描述,其定義如下: struct cdev {         struct kobject kobj;         struct module *owner;   //所屬模組         cons

Autowired的使用:推薦對建構函式進行註釋及其兩種方式

在編寫程式碼的時候,使用@Autowired註解是,發現IDE報的一個警告,如下:   Spring Team recommends "Always use constructor based dependency injection in your beans.