1. 程式人生 > >神經網路之啟用函式 dropout原理解讀 BatchNormalization 程式碼實現

神經網路之啟用函式 dropout原理解讀 BatchNormalization 程式碼實現

神經網路之啟用函式(Activation Function)

日常 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 比賽中被提出的。

核心思想就是,在訓練過程中,α 是從一個高斯分佈 

相關推薦

神經網路啟用函式 dropout原理解讀 BatchNormalization 程式碼實現

神經網路之啟用函式(Activation Function) 日常 coding 中,我們會很自然的使用一些啟用函式,比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事: 為什麼需要啟用函式?啟用函式都有哪些?都長什麼樣?有哪些優缺點?怎麼選用啟用函式? 本文

人工神經網路啟用函式 -tanh函式

tanh函式 tanh(x)=e2x−1e2x+1tanh′(x)=1−tanh(x)2 證明 ∂tanh(x)∂x=(1−2e2x+1)′=2⋅2e2x(e2x+1)2=4e2x(e2x+1)2=(e2x+1)2−(e2x−1)2(e2x+1)2=1−(e2x−1e2x

神經網路啟用函式(Activation Function)

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

神經網路啟用函式(Activation Function)(附maxout)

啟用函式參考的原文地址http://blog.csdn.net/cyh_24/article/details/50593400 maxout部分參考的原文地址http://www.cnblogs.com/tornadomeet/p/3428843.html Why us

深度神經網路損失函式啟用函式

1.損失函式和啟用函式簡介 通過前面深度神經網路之前向傳播演算法和深度神經網路之反向傳播演算法的學習,我們能夠了解到損失函式是用來評估模型的預測值與真實值之間的差異程度。另外損失函式也是神經網路中優化的目標函式,神經網路訓練或者優化的過程就是最小化損失函式的過程

神經網路常用啟用函式對比 sigmoid VS sofmax(附python原始碼)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

話談tensorflow神經網路啟用函式

神經網路啟用函式有很多,我們來看下: 1、我們常用啟用函式是S型函式,也就是sigmod(x)。S 型函式並非是唯一可以使用的啟用函式,實際上它具有一些不足。        從圖中可以看出,S 型函式的導數最大值為

神經網路之一 啟用函式

啟用函式執行時啟用神經網路中的某一部分神經元,將啟用資訊向後轉入下一層的神經網路。神經網路之所以能夠解決非線性問題,本質上就是啟用函式加入了非線性因素,彌補了線性模型的表達力,把啟用的神經元的特徵通過函式保留並對映到下一層。因為神經網路的數學基礎是處處可微,所以選取的啟用函式

通俗理解神經網路激勵函式(Activation Function)

本文整理自部落格、知乎上關於激勵函式的部落格和回答。部分圖片引用自知乎,如有侵權,請聯絡作者。 關於神經網路激勵函式的作用,常聽到的解釋是:不使用激勵函式的話,神經網路的每層都只是做線性變換,多層輸入疊加後也還是線性變換。因為線性模型的表達能力不夠,激

通俗理解神經網路激勵函式

關於神經網路激勵函式的作用,常聽到的解釋是:不使用激勵函式的話,神經網路的每層都只是做線性變換,多層輸入疊加後也還是線性變換。因為線性模型的表達能力不夠,激勵函式可以引入非線性因素。 其實很多時候我們更想直觀的瞭解激勵函式的是如何引入非線性因素的。 我們使用神經網路來分

卷積神經網路學習--啟用函式

這篇學習筆記主要參考和綜合了兩個帖子的內容,詳見參考文件,感謝兩位大神。 1 什麼是啟用函式? 啟用函式,並不是去啟用什麼,而是指如何把“啟用的神經元的特徵”通過函式把特徵保留並映射出來(保留特徵,去除一些資料中是的冗餘),這是神經網路能解決非線性問題關鍵。 目前知道的啟

【深度學習技術】卷積神經網路常用啟用函式總結

本文記錄了神經網路中啟用函式的學習過程,歡迎學習交流。 神經網路中如果不加入啟用函式,其一定程度可以看成線性表達,最後的表達能力不好,如果加入一些非線性的啟用函式,整個網路中就引入了非線性部分,增加了網路的表達能力。目前比較流行的啟用函式主要分為以下7種:

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

假設神經元的輸入是一個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個輸出值對映

神經網路softmax啟用函式的求導過程

在使用softmax函式作為輸出層啟用函式的神經網路中,進行反向傳播時需要計算損耗函式相對於Z的導數,即 。網上有很多公式推導,但都太“數學”化了,看著比較抽象。所以總結下自己理解的比較簡單的推導過程。 首先,為了直觀理解,我們假設Z為一個3x1的向量,通過soft max

神經網路常用啟用函式對比:sigmoid VS sofmax(附python原始碼)

Graph Y readings: [0.5, 0.7310585786300049, 0.8807970779778823, 0.9525741268224334, 0.9820137900379085, 0.9933071490757153, 0.9975273768433653, 0.999088948

神經網路中BP演算法的原理與用Python實現原始碼

(1)什麼是梯度下降和鏈式求導法則 1.梯度下降 假設我們有一個函式J(w),如下圖所示。 現在,我們要求當w等於什麼的時候,J(w)能夠取到最小值。從圖中我們知道最小值在初始位置的左邊,也就意味著如果想要使J(w)最小,w的值需要減小。而初始位置的切線斜率a>0

CNN卷積神經網路應用於人臉識別(詳細流程+程式碼實現)和相應的超引數解釋

DeepLearning tutorial(5)CNN卷積神經網路應用於人臉識別(詳細流程+程式碼實現) @author:wepon 本文主要講解將CNN應用於人臉識別的流程,程式基於Python+numpy+theano+PIL開發,採用類似LeNet5的

全卷積神經網路FCN詳解(附帶Tensorflow詳解程式碼實現)

一.導論 在影象語義分割領域,困擾了電腦科學家很多年的一個問題則是我們如何才能將我們感興趣的物件和不感興趣的物件分別分割開來呢?比如我們有一隻小貓的圖片,怎樣才能夠通過計算機自己對影象進行識別達到將小貓和圖片當中的背景互相分割開來的效果呢?如下圖所示:      而在2015年

深層神經網路經典損失函式

一, 交叉熵函式 交叉熵是一個資訊理論中的概念,但在此我們不深究它的本身意義,我們要知道,交叉熵刻畫了兩個概率分佈之間的距離,在深度神經網路的構建中,我們知道真實值和預測值之間會存在一個差值,這也就是為什麼使用交叉熵函式的原因. 給定兩個概率分佈p,q, 通過q來表示p的

李理:卷積神經網路Dropout

上文介紹了Batch Normalization技術。Batch Normalization是加速訓練收斂速度的非常簡單但又好用的一種實用技術,下面我們介紹可以提高模型的泛化能力的DropOut技術。4. Dropout4.1 Dropout簡介dropout是