⑴ 深度學習之損失函數與激活函數的選擇
深度學習之損失函數與激活函數的選擇
在深度神經網路(DNN)反向傳播演算法(BP)中,我們對DNN的前向反向傳播演算法的使用做了總結。其中使用的損失函數是均方差,而激活函數是Sigmoid。實際上DNN可以使用的損失函數和激活函數不少。這些損失函數和激活函數如何選擇呢?以下是本文的內容。
MSE損失+Sigmoid激活函數的問題
先來看看均方差+Sigmoid的組合有什麼問題。回顧下Sigmoid激活函數的表達式為:
函數圖像如下:
從圖上可以看出,對於Sigmoid,當z的取值越來越大後,函數曲線變得越來越平緩,意味著此時的導數σ′(z)也越來越小。同樣的,當z的取值越來越小時,也有這個問題。僅僅在z取值為0附近時,導數σ′(z)的取值較大。在均方差+Sigmoid的反向傳播演算法中,每一層向前遞推都要乘以σ′(z),得到梯度變化值。Sigmoid的這個曲線意味著在大多數時候,我們的梯度變化值很小,導致我們的W,b更新到極值的速度較慢,也就是我們的演算法收斂速度較慢。那麼有什麼什麼辦法可以改進呢?
交叉熵損失+Sigmoid改進收斂速度
Sigmoid的函數特性導致反向傳播演算法收斂速度慢的問題,那麼如何改進呢?換掉Sigmoid?這當然是一種選擇。另一種常見的選擇是用交叉熵損失函數來代替均方差損失函數。每個樣本的交叉熵損失函數的形式:
其中,?為向量內積。這個形式其實很熟悉,在邏輯回歸原理小結中其實我們就用到了類似的形式,只是當時我們是用最大似然估計推導出來的,而這個損失函數的學名叫交叉熵。
使用了交叉熵損失函數,就能解決Sigmoid函數導數變化大多數時候反向傳播演算法慢的問題嗎?我們來看看當使用交叉熵時,我們輸出層δL的梯度情況。
對比一下均方差損失函數時在δL梯度
使用交叉熵,得到的的δl梯度表達式沒有了σ′(z),梯度為預測值和真實值的差距,這樣求得的Wl,bl的梯度也不包含σ′(z),因此避免了反向傳播收斂速度慢的問題。通常情況下,如果我們使用了sigmoid激活函數,交叉熵損失函數肯定比均方差損失函數好用。
對數似然損失+softmax進行分類輸出
在前面我們都假設輸出是連續可導的值,但是如果是分類問題,那麼輸出是一個個的類別,那我們怎麼用DNN來解決這個問題呢?
DNN分類模型要求是輸出層神經元輸出的值在0到1之間,同時所有輸出值之和為1。很明顯,現有的普通DNN是無法滿足這個要求的。但是我們只需要對現有的全連接DNN稍作改良,即可用於解決分類問題。在現有的DNN模型中,我們可以將輸出層第i個神經元的激活函數定義為如下形式:
這個方法很簡潔漂亮,僅僅只需要將輸出層的激活函數從Sigmoid之類的函數轉變為上式的激活函數即可。上式這個激活函數就是我們的softmax激活函數。它在分類問題中有廣泛的應用。將DNN用於分類問題,在輸出層用softmax激活函數也是最常見的了。
對於用於分類的softmax激活函數,對應的損失函數一般都是用對數似然函數,即:
其中yk的取值為0或者1,如果某一訓練樣本的輸出為第i類。則yi=1,其餘的j≠i都有yj=0。由於每個樣本只屬於一個類別,所以這個對數似然函數可以簡化為:
可見損失函數只和真實類別對應的輸出有關,這樣假設真實類別是第i類,則其他不屬於第i類序號對應的神經元的梯度導數直接為0。對於真實類別第i類,它的WiL對應的梯度計算為:
可見,梯度計算也很簡潔,也沒有第一節說的訓練速度慢的問題。當softmax輸出層的反向傳播計算完以後,後面的普通DNN層的反向傳播計算和之前講的普通DNN沒有區別。
梯度爆炸or消失與ReLU
學習DNN,大家一定聽說過梯度爆炸和梯度消失兩個詞。尤其是梯度消失,是限制DNN與深度學習的一個關鍵障礙,目前也沒有完全攻克。
什麼是梯度爆炸和梯度消失呢?簡單理解,就是在反向傳播的演算法過程中,由於我們使用了是矩陣求導的鏈式法則,有一大串連乘,如果連乘的數字在每層都是小於1的,則梯度越往前乘越小,導致梯度消失,而如果連乘的數字在每層都是大於1的,則梯度越往前乘越大,導致梯度爆炸。
比如如下的梯度計算:
如果不巧我們的樣本導致每一層的梯度都小於1,則隨著反向傳播演算法的進行,我們的δl會隨著層數越來越小,甚至接近越0,導致梯度幾乎消失,進而導致前面的隱藏層的W,b參數隨著迭代的進行,幾乎沒有大的改變,更談不上收斂了。這個問題目前沒有完美的解決辦法。
而對於梯度爆炸,則一般可以通過調整我們DNN模型中的初始化參數得以解決。
對於無法完美解決的梯度消失問題,一個可能部分解決梯度消失問題的辦法是使用ReLU(Rectified Linear Unit)激活函數,ReLU在卷積神經網路CNN中得到了廣泛的應用,在CNN中梯度消失似乎不再是問題。那麼它是什麼樣子呢?其實很簡單,比我們前面提到的所有激活函數都簡單,表達式為:
也就是說大於等於0則不變,小於0則激活後為0。
其他激活函數
DNN常用的激活函數還有:
tanh
這個是sigmoid的變種,表達式為:
tanh激活函數和sigmoid激活函數的關系為:
tanh和sigmoid對比主要的特點是它的輸出落在了[-1,1],這樣輸出可以進行標准化。同時tanh的曲線在較大時變得平坦的幅度沒有sigmoid那麼大,這樣求梯度變化值有一些優勢。當然,要說tanh一定比sigmoid好倒不一定,還是要具體問題具體分析。
softplus
這個其實就是sigmoid函數的原函數,表達式為:
它的導數就是sigmoid函數。softplus的函數圖像和ReLU有些類似。它出現的比ReLU早,可以視為ReLU的鼻祖。
PReLU
從名字就可以看出它是ReLU的變種,特點是如果未激活值小於0,不是簡單粗暴的直接變為0,而是進行一定幅度的縮小。如下圖。
小結
上面我們對DNN損失函數和激活函數做了詳細的討論,重要的點有:
1)如果使用sigmoid激活函數,則交叉熵損失函數一般肯定比均方差損失函數好;
2)如果是DNN用於分類,則一般在輸出層使用softmax激活函數和對數似然損失函數;
3)ReLU激活函數對梯度消失問題有一定程度的解決,尤其是在CNN模型中。
⑵ 什麼是全連接神經網路,怎麼理解「全連接」
1、全連接神經網路解析:對n-1層和n層而言,n-1層的任意一個節點,都和第n層所有節點有連接。即第n層的每個節點在進行計算的時候,激活函數的輸入是n-1層所有節點的加權。
2、全連接的神經網路示意圖:
3、「全連接」是一種不錯的模式,但是網路很大的時候,訓練速度回很慢。部分連接就是認為的切斷某兩個節點直接的連接,這樣訓練時計算量大大減小。
⑶ 什麼是全連接神經網路怎麼理解「全連接」
1、全連接神經網路解析:對n-1層和n層而言,n-1層的任意一個節點,都和第n層所有節點有連接。即第n層的每個節點在進行計算的時候,激活函數的輸入是n-1層所有節點的加權。
2、全連接的神經網路示意圖:
3、「全連接」是一種不錯的模式,但是網路很大的時候,訓練速度回很慢。部分連接就是認為的切斷某兩個節點直接的連接,這樣訓練時計算量大大減小。
⑷ 【神經網路原理】神經網路結構 & 符號約定
神經元模型的符號約定:輸入: ,權重(weight): ,偏置(bias): ,未激活值: ,激活輸出值:
神經元可用於解決部分二分類問題 ——當有一個類別未知的 輸入感知機,若 輸出值a = 1時,感知機被激活 ,代表 x 屬於第一類;若 輸出值a = 0時,感知機未激活 ,則代表 x 屬於第二類。而對於sigmoid神經元,若輸出值a ≥ 0.5時,代表 x 屬於第一類,否則為第二類。
不難看出,感知機可以輕松實現「與非」邏輯,而與非邏輯可以組合成其他任意的邏輯,但對於一些過於復雜的問題,我們難以寫出其背後地邏輯結構。 這時候神經網路就能大顯身手 :它可以自適應的學習規律,調節網路地權重和偏置等參數,我們只需要用大量的數據對其正確地訓練,即可得到我們想要的效果!
那有一個很有意思的問題:相比於階躍函數,為什麼我們在神經網路中更願意採用sigmoid函數作為激活函數呢?
首先,由於感知機的激活函數為階躍函數(在0處突變),權重的一個小的變化就可能導致輸出值的突變,而如果將激活函數替換為sigmoid函數,輸出值的變化就能發生相應的小的變化,有利於網路學習;另外,由於採用二次代價函數作為損失函數時,利用BP演算法求梯度值需要對沖激函數求導,sigmoid函數正好時連續可導的,而且導數很好求。
為了便於理解,先畫一個三層的全連接神經網路示意圖,激活函數都選用sigmoid函數。 全連接神經網路 指除輸出層外,每一個神經元都與下一層中的各神經元相連接。網路的第一層為 輸入層 ,最後一層為 輸出層 ,中間的所有層統稱為 隱藏層 。其中,輸入層的神經元比較特殊,不含偏置 ,也沒有激活函數 。
神經網路結構的符號約定 : 代表第 層的第 個神經元與第 層的第 個神經元連線上的權重; 代表第 層與第 層之間的所有權重 構成的權重矩陣。 分別代表第 層的第 個神經元對應的偏置、未激活值、激活值; 則分別代表第 層的所有偏置組成的列向量、所有未激活值組成的列向量以及所有激活值組成的列向量。
下面展示了一個手寫體識別的三層全連接神經網路結構:
隱藏層的功能可以看作是各種特徵檢測器的組合:檢測到相應特徵時,相應的隱藏層神經元就會被激活,從而使輸出層相應的神經元也被激活。
⑸ 全連接神經網路參數個數怎麼計算
對n-1層和n層而言
n-1層的任意一個節點,都和第n層所有節點有連接。即第n層的每個節點在進行計算的時候,激活函數的輸入是n-1層所有節點的加權。
全連接是一種不錯的模式,但是網路很大的時候,訓練速度回很慢。部分連接就是認為的切斷某兩個節點直接的連接,這樣訓練時計算量大大減小
⑹ 卷積神經網路的 卷積層、激活層、池化層、全連接層
數據輸入的是一張圖片(輸入層),CONV表示卷積層,RELU表示激勵層,POOL表示池化層,Fc表示全連接層
全連接神經網路需要非常多的計算資源才能支撐它來做反向傳播和前向傳播,所以說全連接神經網路可以存儲非常多的參數,如果你給它的樣本如果沒有達到它的量級的時候,它可以輕輕鬆鬆把你給他的樣本全部都記下來,這會出現過擬合的情況。
所以我們應該把神經元和神經元之間的連接的權重個數降下來,但是降下來我們又不能保證它有較強的學習能力,所以這是一個糾結的地方,所以有一個方法就是 局部連接+權值共享 ,局部連接+權值共享不僅權重參數降下來了,而且學習能力並沒有實質的降低,除此之外還有其它的好處,下來看一下,下面的這幾張圖片:
一個圖像的不同表示方式
這幾張圖片描述的都是一個東西,但是有的大有的小,有的靠左邊,有的靠右邊,有的位置不同,但是我們構建的網路識別這些東西的時候應該是同一結果。為了能夠達到這個目的,我們可以讓圖片的不同位置具有相同的權重(權值共享),也就是上面所有的圖片,我們只需要在訓練集中放一張,我們的神經網路就可以識別出上面所有的,這也是 權值共享 的好處。
而卷積神經網路就是局部連接+權值共享的神經網路。
現在我們對卷積神經網路有一個初步認識了,下面具體來講解一下卷積神經網路,卷積神經網路依舊是層級結構,但層的功能和形式做了改變,卷積神經網路常用來處理圖片數據,比如識別一輛汽車:
在圖片輸出到神經網路之前,常常先進行圖像處理,有 三種 常見的圖像的處理方式:
均值化和歸一化
去相關和白化
圖片有一個性質叫做局部關聯性質,一個圖片的像素點影響最大的是它周邊的像素點,而距離這個像素點比較遠的像素點二者之間關系不大。這個性質意味著每一個神經元我們不用處理全局的圖片了(和上一層全連接),我們的每一個神經元只需要和上一層局部連接,相當於每一個神經元掃描一小區域,然後許多神經元(這些神經元權值共享)合起來就相當於掃描了全局,這樣就構成一個特徵圖,n個特徵圖就提取了這個圖片的n維特徵,每個特徵圖是由很多神經元來完成的。
在卷積神經網路中,我們先選擇一個局部區域(filter),用這個局部區域(filter)去掃描整張圖片。 局部區域所圈起來的所有節點會被連接到下一層的 一個節點上 。我們拿灰度圖(只有一維)來舉例:
局部區域
圖片是矩陣式的,將這些以矩陣排列的節點展成了向量。就能更好的看出來卷積層和輸入層之間的連接,並不是全連接的,我們將上圖中的紅色方框稱為filter,它是2*2的,這是它的尺寸,這不是固定的,我們可以指定它的尺寸。
我們可以看出來當前filter是2*2的小窗口,這個小窗口會將圖片矩陣從左上角滑到右下角,每滑一次就會一下子圈起來四個,連接到下一層的一個神經元,然後產生四個權重,這四個權重(w1、w2、w3、w4)構成的矩陣就叫做卷積核。
卷積核是演算法自己學習得到的,它會和上一層計算,比如,第二層的0節點的數值就是局部區域的線性組合(w1 0+w2 1+w3 4+w4 5),即被圈中節點的數值乘以對應的權重後相加。
卷積核計算
卷積操作
我們前面說過圖片不用向量表示是為了保留圖片平面結構的信息。 同樣的,卷積後的輸出若用上圖的向量排列方式則丟失了平面結構信息。 所以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接,每一個藍色結點連接四個黃色的結點。
卷積層的連接方式
圖片是一個矩陣然後卷積神經網路的下一層也是一個矩陣,我們用一個卷積核從圖片矩陣左上角到右下角滑動,每滑動一次,當然被圈起來的神經元們就會連接下一層的一個神經元,形成參數矩陣這個就是卷積核,每次滑動雖然圈起來的神經元不同,連接下一層的神經元也不同,但是產生的參數矩陣確是一樣的,這就是 權值共享 。
卷積核會和掃描的圖片的那個局部矩陣作用產生一個值,比如第一次的時候,(w1 0+w2 1+w3 4+w4 5),所以,filter從左上到右下的這個過程中會得到一個矩陣(這就是下一層也是一個矩陣的原因),具體過程如下所示:
卷積計算過程
上圖中左邊是圖矩陣,我們使用的filter的大小是3 3的,第一次滑動的時候,卷積核和圖片矩陣作用(1 1+1 0+1 1+0 0+1 1+1 0+0 1+0 0+1 1)=4,會產生一個值,這個值就是右邊矩陣的第一個值,filter滑動9次之後,會產生9個值,也就是說下一層有9個神經元,這9個神經元產生的值就構成了一個矩陣,這矩陣叫做特徵圖,表示image的某一維度的特徵,當然具體哪一維度可能並不知道,可能是這個圖像的顏色,也有可能是這個圖像的輪廓等等。
單通道圖片總結 :以上就是單通道的圖片的卷積處理,圖片是一個矩陣,我們用指定大小的卷積核從左上角到右下角來滑動,每次滑動所圈起來的結點會和下一層的一個結點相連,連接之後就會形成局部連接,每一條連接都會產生權重,這些權重就是卷積核,所以每次滑動都會產生一個卷積核,因為權值共享,所以這些卷積核都是一樣的。卷積核會不斷和當時卷積核所圈起來的局部矩陣作用,每次產生的值就是下一層結點的值了,這樣多次產生的值組合起來就是一個特徵圖,表示某一維度的特徵。也就是從左上滑動到右下這一過程中會形成一個特徵圖矩陣(共享一個卷積核),再從左上滑動到右下又會形成另一個特徵圖矩陣(共享另一個卷積核),這些特徵圖都是表示特徵的某一維度。
三個通道的圖片如何進行卷積操作?
至此我們應該已經知道了單通道的灰度圖是如何處理的,實際上我們的圖片都是RGB的圖像,有三個通道,那麼此時圖像是如何卷積的呢?
彩色圖像
filter窗口滑的時候,我們只是從width和height的角度來滑動的,並沒有考慮depth,所以每滑動一次實際上是產生一個卷積核,共享這一個卷積核,而現在depth=3了,所以每滑動一次實際上產生了具有三個通道的卷積核(它們分別作用於輸入圖片的藍色、綠色、紅色通道),卷積核的一個通道核藍色的矩陣作用產生一個值,另一個和綠色的矩陣作用產生一個值,最後一個和紅色的矩陣作用產生一個值,然後這些值加起來就是下一層結點的值,結果也是一個矩陣,也就是一張特徵圖。
三通道的計算過程
要想有多張特徵圖的話,我們可以再用新的卷積核來進行左上到右下的滑動,這樣就會形成 新的特徵圖 。
三通道圖片的卷積過程
也就是說增加一個卷積核,就會產生一個特徵圖,總的來說就是輸入圖片有多少通道,我們的卷積核就需要對應多少通道,而本層中卷積核有多少個,就會產生多少個特徵圖。這樣卷積後輸出可以作為新的輸入送入另一個卷積層中處理,有幾個特徵圖那麼depth就是幾,那麼下一層的每一個特徵圖就得用相應的通道的卷積核來對應處理,這個邏輯要清楚,我們需要先了解一下 基本的概念:
卷積計算的公式
4x4的圖片在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。
填充
當然也可以使用5x5的filte和2的zero padding可以保持圖片的原始尺寸,3x3的filter考慮到了像素與其距離為1以內的所有其他像素的關系,而5x5則是考慮像素與其距離為2以內的所有其他像素的關系。
規律: Feature Map的尺寸等於
(input_size + 2 * padding_size − filter_size)/stride+1
我們可以把卷積層的作用 總結一點: 卷積層其實就是在提取特徵,卷積層中最重要的是卷積核(訓練出來的),不同的卷積核可以探測特定的形狀、顏色、對比度等,然後特徵圖保持了抓取後的空間結構,所以不同卷積核對應的特徵圖表示某一維度的特徵,具體什麼特徵可能我們並不知道。特徵圖作為輸入再被卷積的話,可以則可以由此探測到"更大"的形狀概念,也就是說隨著卷積神經網路層數的增加,特徵提取的越來越具體化。
激勵層的作用可以理解為把卷積層的結果做 非線性映射 。
激勵層
上圖中的f表示激勵函數,常用的激勵函數幾下幾種:
常用的激勵函數
我們先來看一下激勵函數Sigmoid導數最小為0,最大為1/4,
激勵函數Sigmoid
Tanh激活函數:和sigmoid相似,它會關於x軸上下對應,不至於朝某一方面偏向
Tanh激活函數
ReLU激活函數(修正線性單元):收斂快,求梯度快,但較脆弱,左邊的梯度為0
ReLU激活函數
Leaky ReLU激活函數:不會飽和或者掛掉,計算也很快,但是計算量比較大
Leaky ReLU激活函數
一些激勵函數的使用技巧 :一般不要用sigmoid,首先試RELU,因為快,但要小心點,如果RELU失效,請用Leaky ReLU,某些情況下tanh倒是有不錯的結果。
這就是卷積神經網路的激勵層,它就是將卷積層的線性計算的結果進行了非線性映射。可以從下面的圖中理解。它展示的是將非線性操作應用到一個特徵圖中。這里的輸出特徵圖也可以看作是"修正"過的特徵圖。如下所示:
非線性操作
池化層:降低了各個特徵圖的維度,但可以保持大分重要的信息。池化層夾在連續的卷積層中間,壓縮數據和參數的量,減小過擬合,池化層並沒有參數,它只不過是把上層給它的結果做了一個下采樣(數據壓縮)。下采樣有 兩種 常用的方式:
Max pooling :選取最大的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖中取出最大的元素,最大池化被證明效果更好一些。
Average pooling :平均的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖算出平均值
Max pooling
我們要注意一點的是:pooling在不同的depth上是分開執行的,也就是depth=5的話,pooling進行5次,產生5個池化後的矩陣,池化不需要參數控制。池化操作是分開應用到各個特徵圖的,我們可以從五個輸入圖中得到五個輸出圖。
池化操作
無論是max pool還是average pool都有分信息被舍棄,那麼部分信息被舍棄後會損壞識別結果嗎?
因為卷積後的Feature Map中有對於識別物體不必要的冗餘信息,我們下采樣就是為了去掉這些冗餘信息,所以並不會損壞識別結果。
我們來看一下卷積之後的冗餘信息是怎麼產生的?
我們知道卷積核就是為了找到特定維度的信息,比如說某個形狀,但是圖像中並不會任何地方都出現這個形狀,但卷積核在卷積過程中沒有出現特定形狀的圖片位置卷積也會產生一個值,但是這個值的意義就不是很大了,所以我們使用池化層的作用,將這個值去掉的話,自然也不會損害識別結果了。
比如下圖中,假如卷積核探測"橫折"這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對"橫折"的探測產生影響。 試想在這里例子中如果不使用Max pooling,而讓網路自己去學習。 網路也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的參數的代價,卻還不如直接進行最大池化處理。
最大池化處理
在全連接層中所有神經元都有權重連接,通常全連接層在卷積神經網路尾部。當前面卷積層抓取到足以用來識別圖片的特徵後,接下來的就是如何進行分類。 通常卷積網路的最後會將末端得到的長方體平攤成一個長長的向量,並送入全連接層配合輸出層進行分類。比如,在下面圖中我們進行的圖像分類為四分類問題,所以卷積神經網路的輸出層就會有四個神經元。
四分類問題
我們從卷積神經網路的輸入層、卷積層、激活層、池化層以及全連接層來講解卷積神經網路,我們可以認為全連接層之間的在做特徵提取,而全連接層在做分類,這就是卷積神經網路的核心。
⑺ 激活函數思考
激活函數 : 神經網路神經元中,輸入的 inputs 通過加權,求和後,還被作用了一個函數,這個函數就是激活函數 Activation Function。
1. 為什麼要用激活函數?
神經網路中激活函數的主要作用是提供網路的非線性建模能力,如不特別說明,激活函數一般而言是非線性函數。 假設一個示例神經網路中僅包含線性卷積和全連接運算,那麼該網路僅能夠表達線性映射,即便增加網路的深度也依舊還是線性映射,難以有效建模實際環境中非線性分布的數據。 加入(非線性)激活函數之後,深度神經網路才具備了分層的非線性映射學習能力。
激活函數通常有如下一些性質:
(1)非線性: 如果不用激勵函數,每一層輸出都是上層輸入的線性函數,無論神經網路有多少層,輸出都是輸入的線性組合。如果使用的話,激活函數給神經元引入了非線性因素,使得神經網路可以任意逼近任何非線性函數,這樣神經網路就可以應用到眾多的非線性模型中。 當激活函數是非線性的時候,一個兩層的神經網路就可以逼近基本上所有的函數了。但是,如果激活函數是恆等激活函數的時候(即),就不滿足這個性質了,而且如果MLP使用的是恆等激活函數,那麼其實整個網路跟單層神經網路是等價的。
(2)可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
(3)單調性: 當激活函數是單調的時候,單層網路能夠保證是凸函數。 當激活函數滿足這個性質的時候,如果參數的初始化是random的很小的值,那麼神經網路的訓練將會很高效;如果不滿足這個性質,那麼就需要很用心的去設置初始值。
(4)輸出值的范圍: 當激活函數輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當激活函數的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate。
2. 激活函數如何選擇?
從定義來看,幾乎所有的連續可導函數都可以用作激活函數。但目前 常見的多是分段線性和具有指數形狀的非線性函數 。
選擇的時候,就是根據各個函數的優缺點來配置,例如:
如果使用 ReLU,要小心設置 learning rate, 注意不要讓網路出現很多 「dead」 神經元 ,如果不好解決,可以試試 Leaky ReLU、PReLU 或者 Maxout。
最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout。
一般來說,在分類問題上建議首先嘗試 ReLU,其次ELU,這是兩類不引入額外參數的激活函數。
然後可考慮使用具備學習能力的PReLU和MPELU,並 使用正則化技術 ,例如應該考慮在網路中增加Batch Normalization層。
通常來說,很少會把各種激活函數串起來在一個網路中使用的。
3. 為什麼引入非線性激勵函數?
激活函數通常分為 線性激活函數 和 非線性激活函數 。一般情況下,如果神經網路中使用的是線性激活函數,那麼每一層就相當於是上一層的線性組合,其輸入和輸出均是線性的,類似於感知機模型,則hidden layers沒有存在的意義了,同時這種線性函數對於 復雜的非線性問題擬合欠佳 。當我們使用非線性激活函數時,模型可以擬合任意函數的輸出,表現空間更大、使用該范圍廣、且效果更優。下圖為單層的感知機,是常用的神經網路組合單元,用它可以畫出一條線,把平面分開。
很容易聯想到多個感知機組和,獲得更強的分類能力,效果如下所示:
但是感知機的輸出是線性的,如下所示。當然可以用無限條線性的線擬合曲線,然而復雜度較高。
如果不用激勵函數(其實相當於激勵函數是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函數,很容易驗證,無論你神經網路有多少層,輸出都是輸入的線性組合,與只有一個隱藏層效果相當,這種情況就是多層感知機(MLP)了。
正因為上面的原因,我們決定引入非線性函數作為激勵函數,這樣深層神經網路就有意義了(不再是輸入的線性組合,可以逼近任意函數)。
當拓展到多層的情況時,就會變成一個復雜的函數,可以輕松擬合非線性的復雜場景。最早的想法是sigmoid函數或者tanh函數,輸出有界,很容易充當下一層輸入(以及一些人的生物解釋balabala)。
比較線性激活和非線性激活下的平滑分類平面,兩者分別如下。
非線性激活函數可以擬合出曲線的邊界。圖像的非線性特點,可以理解為在一些應用中,其分布為非線性的,無法通過直線來完整的分離開。
4. 為什麼引入ReLU呢?
第一,採用sigmoid等函數,反向傳播求誤差梯度時,求導計算量很大,而Relu求導非常容易,使得訓練時間短。
第二,對於深層網路,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0),從而無法完成深層網路的訓練。
第三,Relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。
參考:
[1] 神經網路之激活函數 https://www.csuldw.com/2019/05/26/2019-05-26-activation-function/
[2] 激活函數的解釋 https://www.hu.com/question/22334626
⑻ 全連接神經網路的激活函數可以使用relu函數嗎
可以啊,經常用ReLU或者PReLU
⑼ 卷積神經網路每一層都需要激活函數嗎
convolution layer需要激活函數
pooling layer需要激活函數
normalization layer不需要激活函數
fully-connected layer需要激活函數
cost layer不需要激活函數
⑽ 神經網路中的激活函數是用來干什麼的
不同的激活函數是用來實現不同的信息處理能力,神經元的變換函數反映了神經元輸出與其激活狀態之間的關系。