0
雷鋒網(wǎng)按:本文原作者Evan,本文原載于作者的知乎專欄記學(xué)習(xí)--機(jī)器學(xué)習(xí)。雷鋒網(wǎng)已獲得轉(zhuǎn)載授權(quán)。
以下大多筆記主要來自 cs231n 和其他深度學(xué)習(xí)資料和一些我自己的補(bǔ)充,首先 CS231n 一個非常不錯的 deep learning 課,值得一看,奉上鏈接,然后,cs231n 本身是有筆記的-鏈接,最后,知乎上的一些大神對這個筆記進(jìn)行了翻譯-鏈接。在這里,我主要是將一些重要的筆記,我認(rèn)為是比較容易被我們忽視的,加上查閱其他博文,做一個筆記和心得總結(jié)!
這次主要講解的內(nèi)容有:
基本神經(jīng)元
作為線性分類器的單個神經(jīng)元
為什么要是深度神經(jīng)網(wǎng)而不是” 肥胖 “神經(jīng)網(wǎng)絡(luò)?
為什么在人工神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元需要激活函數(shù)?
一些主要的激活函數(shù)
神經(jīng)網(wǎng)絡(luò)中的偏置有什么意義?
初始化神經(jīng)網(wǎng)絡(luò)的參數(shù)可以全為 0 嗎,其他普通線性分類器呢?
交叉熵?fù)p失存在的意義和與平方差損失相比有什么好處?
下面圖表的左邊展示了一個生物學(xué)的神經(jīng)元,右邊展示了一個常用的數(shù)學(xué)模型。乍一看還是有點相似的,事實上也是,人工神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元也有受到生物神經(jīng)元的啟發(fā)??偨Y(jié)要點:
在生物的神經(jīng)元(也就是左圖)中,樹突將信號傳遞到細(xì)胞體,信號在細(xì)胞體中相加。如果最終之和高于某個閾值,那么神經(jīng)元將會激活,向其軸突輸出一個峰值信號,注意這里輸出是一個脈沖信號!
在數(shù)學(xué)計算模型(也就是右圖)中,首先將輸入進(jìn)行加權(quán)求和加上偏執(zhí),得到待激勵值,然后將該值作為輸入,輸入到激活函數(shù)中,最后輸出的是一個激勵后的值,這里的激活函數(shù)可以看成對生物中神經(jīng)元的激活率建模。由于歷史原因,激活函數(shù)常常選擇使用 sigmoid 函數(shù) σ當(dāng)然還有很多其他激活函數(shù),下面再仔細(xì)聊!
需要注意:1. 一個神經(jīng)元可以看成包含兩個部分,一個是對輸入的加權(quán)求和加上偏置,一個是激活函數(shù)對求和后的激活或者抑制。2. 注意生物中的神經(jīng)元要復(fù)雜的多,其中一個是生物中的輸出是一個脈沖,而現(xiàn)在大多數(shù)的數(shù)學(xué)模型神經(jīng)輸出的就是一個值,當(dāng)然現(xiàn)在也有一些脈沖人工神經(jīng)網(wǎng)絡(luò),可以自行了解!

作為線性分類器的單個神經(jīng)元
比如基礎(chǔ)的邏輯回歸,結(jié)合上面的神經(jīng)元知識,可以發(fā)現(xiàn),邏輯回歸就是激活函數(shù)是sigmoid 的單層簡單神經(jīng)網(wǎng)絡(luò)。也就是說,只要在神經(jīng)元的輸出端有一個合適的損失函數(shù),就能讓單個神經(jīng)元變成一個線性分類器。因此說,那些線性的分類器本身就是一個單層神經(jīng)網(wǎng)絡(luò)。
但注意,對于非線性的模型:SVM 和神經(jīng)網(wǎng)絡(luò)走了兩條不同的道路:神經(jīng)網(wǎng)絡(luò)通過多個隱層的方法來實現(xiàn)非線性的函數(shù),有一些理論支持(比如說帶隱層的神經(jīng)網(wǎng)絡(luò)可以模擬任何函數(shù)),但是目前而言還不是非常完備;SVM 則采用了 kernel trick 的方法,這個在理論上面比較完備(RKHS,簡單地說就是一個泛函的線性空間)。兩者各有好壞,神經(jīng)網(wǎng)絡(luò)最近的好處是網(wǎng)絡(luò)設(shè)計可以很靈活,有很多的 trick&tip,很多理論都不清不楚的;SVM 的理論的確漂亮,但是 kernel 設(shè)計不是那么容易,所以最近也就沒有那么熱了。
為什么要是深度神經(jīng)網(wǎng)而不是” 肥胖 “(寬度)神經(jīng)網(wǎng)絡(luò)?


“肥胖” 網(wǎng)絡(luò)的隱藏層數(shù)較少,如上左圖。雖然有研究表明,淺而肥的網(wǎng)絡(luò)也可以擬合任何的函數(shù),但它需要非常的 “肥胖”,可能一層就要成千上萬個神經(jīng)元。而這直接導(dǎo)致的后果是參數(shù)的數(shù)量增加到很多很多。
也有實驗表明,也就是上圖的實驗,我們可以清楚的看出,當(dāng)準(zhǔn)確率差不多的時候,參數(shù)的數(shù)量卻相差數(shù)倍。這也說明我們一般用深層的神經(jīng)網(wǎng)絡(luò)而不是淺層 “肥胖” 的網(wǎng)絡(luò)。
注意:說神經(jīng)網(wǎng)絡(luò)多少層數(shù)的時候一般不包括輸入層。 在神經(jīng)網(wǎng)絡(luò)中的激活主要講的是梯度的更新的激活。

上圖可看做普通的線性分類器,也就是線性回歸方程。這個比較基礎(chǔ),效果如右圖。當(dāng)然有時候我們發(fā)現(xiàn)這樣的線性分類器不符合我們要求時,我們很自然的想到那我們就加多一層,這樣可以擬合更加復(fù)雜的函數(shù),如下圖 a:


但同時當(dāng)我們動筆算下, 就會發(fā)現(xiàn), 這樣一個神經(jīng)網(wǎng)絡(luò)組合起來, 輸出的時候無論如何都還是一個線性方程。如上圖 b 右邊,就只能這樣分類。(那也太蠢了吧)。下圖表示一層加如激活函數(shù)的情況!

一層很多時候是遠(yuǎn)遠(yuǎn)不夠的,前面講過,簡單的線性分類器就可以看成是一層的神經(jīng)網(wǎng)絡(luò),比如上圖,激活函數(shù)是 signmoid,那就可以看成是二分類的邏輯回歸!
下面擴(kuò)展到多層,如下圖 1,2:

圖 1

圖 2
圖 1 是一個簡單的 MLP(全鏈接神經(jīng)網(wǎng)絡(luò)),圖 2 的右邊課簡單表示左圖的可視化,那么對比之前的無激活函數(shù)的圖,很明顯是更加的非線性,擬合能力也會更強(qiáng),同時可以想到,當(dāng)層數(shù)更多,其能力也會越來越強(qiáng)!
簡單來說:就是使得神經(jīng)網(wǎng)絡(luò)具有的擬合非線性函數(shù)的能力,使得其具有強(qiáng)大的表達(dá)能力!
簡單擴(kuò)展,神經(jīng)網(wǎng)絡(luò)的萬能近似定理: 一個前饋神經(jīng)網(wǎng)絡(luò)如果具有線性層和至少一層具有 "擠壓" 性質(zhì)的激活函數(shù)(如 signmoid 等),給定網(wǎng)絡(luò)足夠數(shù)量的隱藏單元,它可以以任意精度來近似任何從一個有限維空間到另一個有限維空間的 borel 可測函數(shù)。
要相符上面的定理,也就是想擬合任意函數(shù),一個必須點是 “要有帶有 “擠壓” 性質(zhì)的激活函數(shù)”。這里的 “擠壓” 性質(zhì)是因為早期對神經(jīng)網(wǎng)絡(luò)的研究用的是 sigmoid 類函數(shù),所以對其數(shù)學(xué)性質(zhì)的研究也主要基于這一類性質(zhì):將輸入數(shù)值范圍擠壓到一定的輸出數(shù)值范圍。(后來發(fā)現(xiàn),其他性質(zhì)的激活函數(shù)也可以使得網(wǎng)絡(luò)具有普適近似器的性質(zhì),如 ReLU 。
一些主要的激活函數(shù)
優(yōu)點:有較好的解釋性
缺點:1.Sigmoid 函數(shù)飽和使梯度消失。sigmoid 神經(jīng)元有一個不好的特性,就是當(dāng)神經(jīng)元的激活在接近 0 或 1 處時會飽和:在這些區(qū)域,梯度幾乎為 0。2. 輸出不是零中心的,這一情況將影響梯度下降的運(yùn)作,因為如果輸入神經(jīng)元的數(shù)據(jù)總是正數(shù),那么關(guān)于 w 的梯度在反向傳播的過程中,將會要么全部是正數(shù),要么全部是負(fù)數(shù),這樣梯度下降權(quán)重更新時出現(xiàn) z 字型的下降。這樣收斂會變得異常的慢。(這也是為什么要一直保持為數(shù)據(jù)的 0 中心化)—–但這個問題比較小。3.exp()在深度神經(jīng)網(wǎng)絡(luò)時候相比其他運(yùn)算就比較慢。

優(yōu)點:它的輸出是零中心的。因此,在實際操作中,tanh 非線性函數(shù)比 sigmoid 非線性函數(shù)更受歡迎。
缺點: 和 Sigmoid 函數(shù)一樣,飽和使梯度消失。計算慢。

優(yōu)點:1.ReLU 對于隨機(jī)梯度下降的收斂有巨大的加速作用( Krizhevsky 等的論文 alexnet 指出有 6 倍之多)。據(jù)稱這是由它的線性,非飽和的公式導(dǎo)致的;2. 注意:現(xiàn)在大部分的 DNN 用的激活函數(shù)就是 ReLu
缺點:當(dāng) x 是小于 0 的時候,那么從此所以流過這個神經(jīng)元的梯度將都變成 0;這個時候這個 ReLU 單元在訓(xùn)練中將死亡(也就是參數(shù)無法更新),這也導(dǎo)致了數(shù)據(jù)多樣化的丟失(因為數(shù)據(jù)一旦使得梯度為 0,也就說明這些數(shù)據(jù)已不起作用)。

優(yōu)點:1. 非飽和的公式; 2.Leaky ReLU 是為解決 “ReLU 死亡” 問題的嘗試
缺點:1. 有些研究者的論文指出這個激活函數(shù)表現(xiàn)很不錯,但是其效果并不是很穩(wěn)定
Kaiming He 等人在 2015 年發(fā)布的論文 Delving Deep into Rectifiers 中介紹了一種新方法 PReLU,把負(fù)區(qū)間上的斜率當(dāng)做每個神經(jīng)元中的一個參數(shù)。然而該激活函數(shù)在在不同任務(wù)中均有益處的一致性并沒有特別清晰。

指數(shù)線性單元(Exponential Linear Units, ELU) ELU 的公式為:

ELU.png 函數(shù)曲線如下:

Maxout 是對 ReLU 和 leaky ReLU 的一般化歸納
優(yōu)點: 擁有 ReLU 單元的所有優(yōu)點(線性操作和不飽和),而沒有它的缺點(死亡的 ReLU 單元)。
缺點 :每個神經(jīng)元的參數(shù)數(shù)量增加了一倍,這就導(dǎo)致整體參數(shù)的數(shù)量激增。難訓(xùn)練, 容易過擬合。
“那么該用那種呢?” 用 ReLU 非線性函數(shù)。注意設(shè)置好學(xué)習(xí)率,(如果學(xué)習(xí)率設(shè)置得太高,可能會發(fā)現(xiàn)網(wǎng)絡(luò)中 40% 的神經(jīng)元都會死掉(在整個訓(xùn)練集中這些神經(jīng)元都不會被激活)。通過合理設(shè)置學(xué)習(xí)率,這種情況的發(fā)生概率會降低。),解決方案:或許可以監(jiān)控你的網(wǎng)絡(luò)中死亡的神經(jīng)元占的比例。如果單元死亡問題困擾你,就試試 Leaky ReLU 或者 Maxout,不要再用 sigmoid 了。也可以試試 tanh,但是其效果應(yīng)該不如 ReLU 或者 Maxout。
神經(jīng)網(wǎng)絡(luò)中的偏置有什么意義?
最基礎(chǔ)的神經(jīng)元感知器如下:

這個例子中輸入為三個變量, 輸出為 0 或 1. 當(dāng)三個變量的加權(quán)和
大于某個閾值的時候, 輸出為 1, 反之為 0。

注意這里的閾值, 它度量了神經(jīng)元產(chǎn)生正 (負(fù)) 激勵的難易程度。也就是說,在上文的模型中,閾值越大, 產(chǎn)生正激勵的難度越大。
而為了更好的計算和表達(dá),我們可以把其中的 b 和 移到同一邊,同時給他取了一個不錯的名字,叫做偏置 Bias,而 w 叫做權(quán)重 weight!

也就是說: 偏置的大小度量了神經(jīng)元產(chǎn)生正 (負(fù)) 激勵的難易程度。
這是最簡單的感知器神經(jīng)元. 而現(xiàn)代神經(jīng)網(wǎng)絡(luò)中常用的 Sigmoid, tanh 或是 ReLU 都是在的基礎(chǔ)上加上一個激活函數(shù), Bias 也就是 b 的意義是一樣的。
同時對于偏置需要注意的點是:偏置是不需要正則化的,并且正則化偏置的話會導(dǎo)致欠擬合。我們從意義上去理解話,若對偏置正則化(懲罰),會導(dǎo)致激活變得更加簡單,偏差就會上升,學(xué)習(xí)的能力就會下降!
初始化神經(jīng)網(wǎng)絡(luò)的參數(shù)可以全為 0 嗎,其他普通線性分類器呢?
在講初始化前,先簡單復(fù)習(xí)下反向傳播算法可表示為以下幾個步驟:
1. 進(jìn)行前饋傳導(dǎo)計算,利用前向傳導(dǎo)公式,得到,直到輸出層
的激活值。
對輸出層(第 nl 層),計算:
3. 對于的各層,計算:
4. 計算最終需要的偏導(dǎo)數(shù)值:

5. 對 f 舉個例子,若表示 sigmoid 函數(shù),就可以計算得到

從上往下,其中y 代表正確 label,
代表最后一層的輸出,
表達(dá)的是最后一層的加權(quán)求和值, f 代表的是激活函數(shù),δ代表的是要反向傳播回去的誤差,
代表第 l 層,w,b 表示權(quán)重和偏置。
我們前面說過:線性分類器邏輯回歸模型可以算作為一個簡單的單層神經(jīng)網(wǎng)絡(luò)。為了更好的說明問題,假設(shè)一個場景,在十類分類的數(shù)字手寫識別中,我們將本來二分類的邏輯回歸推到多分類的softmax,也就是說,神經(jīng)元的激活函數(shù)是 softmax。也就是下圖,然后分析:

輸入層(不算是一層):28×28=784 個輸入單元。也就是 n=784
輸出層:10 個輸出單元, 激活函數(shù)為softmax,也就是 m=10
它由兩組參數(shù)組成: W和 b, 前者是一個 10×784 維的權(quán)值矩陣, 后者是長度為 10 的 bias 列向量. 現(xiàn)在我們假設(shè)把它們?nèi)砍跏蓟癁?0:
第一次正向計算過程中, 簡單算出,輸出層的所有輸出為 0.5。
反向時, 根據(jù)前面復(fù)習(xí)的反向傳播算法,首先計算δ,假如 , 即輸入x對應(yīng)的數(shù)字為i, 那么除了第i個神經(jīng)元的δ是不同的,其他的值都是一樣, 又于計算權(quán)重 w 梯度的公式得知,注意此時的 就是輸入值 x,又由于輸入向量x的元素之間的不同, 所以即使δ是一樣的,但最終得到的 10 個梯度值有很大概率是不同且非 0 的, 所以第一次 BP 過程可以取得成效并將一些w和所有的b變成非 0 值。
由于 w 值已經(jīng)變得不相同了,這個時候前向傳播和后向傳播也就會正常的進(jìn)行, 后面的訓(xùn)練顯然也可以順利進(jìn)行。
得出結(jié)論,沒有隱層時, 可以將所有的參數(shù)初始化為 0。
如果有隱層呢? 假如還是用 sigmoid 激活函數(shù)呢。來個更簡單 MLP,

第一次正向計算過程中, 簡單算出,輸出層的所有輸出為神經(jīng)元 4,5,6 輸出的值(初始化 w,b 為 0, 激活函數(shù)是 sigmoid)都是一樣的,都是 0.5
第一個反向傳播過程,由權(quán)重的更新公式,算出即 (神經(jīng)元 6 和 4,5 之間的權(quán)重) 是一樣的,同樣算出
都一樣,但非 0, 由 sgd 算法賦值。
然后第二次正向時,算出神經(jīng)元 4,5 的輸出一樣(因為 4,5 都是接受 1,2,3 神經(jīng)元的輸入,且權(quán)重相同),但和神經(jīng)元 6 的輸出不一樣。
然后第二次反向時,根據(jù)公式,得出神經(jīng)元 4,5 永遠(yuǎn)一樣。原因在于計算用的是一樣的輸出,這個也可以從公式得出!
最后結(jié)論,一直循環(huán),發(fā)現(xiàn)學(xué)習(xí)得到的模型中, 所有的隱單元都是相同的(在這里就是神經(jīng)元 4,5 永遠(yuǎn)一樣). 學(xué)習(xí)失敗。
對于隱層使用了其他函數(shù)比如 ReLU: f(net)=max(0,net)其結(jié)果也是一樣的: 除了輸入層的輸出值為x本身, 不為 0, 其余的所有層的輸出都為 0. BP 時所有梯度也都為 0, 包括輸出層. 這意味著所有的非輸入神經(jīng)元都是無意義的. 學(xué)習(xí)失敗. 對于卷積神經(jīng)網(wǎng)絡(luò),循環(huán)神經(jīng)網(wǎng)絡(luò)也是一樣的,故一般會用其他初始化方式。
最后最后的結(jié)論是, 一般只在訓(xùn)練 SLP / 邏輯回歸模型時才使用 0 初始化所有參數(shù)., 更實用的結(jié)論是, 深度模型都不會使用 0 初始化所有參數(shù).
交叉熵存在的意義和與平方差相比有什么好處?
一個非常常見的,非常漂亮的成本函數(shù)是 “交叉熵”(cross-entropy)。交叉熵產(chǎn)生于信息論里面的信息壓縮編碼技術(shù),但是它后來演變成為從博弈論到機(jī)器學(xué)習(xí)等其他領(lǐng)域里的重要技術(shù)手段。它的定義如下:

其中,y 是我們預(yù)測的概率分布, y’ 是實際的分布
1. 交叉熵是正的,2. 當(dāng)所有輸入 x 的輸出都能接近期望輸出 y 的話,交叉熵的值將會接近 0。這兩個特征在直覺上我們都會覺得它適合做代價函數(shù)。事實上,我們的均方代價函數(shù)也同時滿足這兩個特征。然而....
為什么在神經(jīng)網(wǎng)絡(luò)中用交叉熵代替二次代價函數(shù)?
還是從反向傳播,參數(shù)更新的角度理解更新參數(shù)的公式如下:


a 是 神經(jīng)元的輸出,其中 a = σ(z), z = wx + b,可知,偏導(dǎo)數(shù)受激活函數(shù)的導(dǎo)數(shù)影響,假設(shè)這里是傳統(tǒng)的 sigmoid 激活函數(shù)(在之前很多時候都是)。那么 sigmoid 的導(dǎo)數(shù)在輸出接近 0 和 1 的時候 是非常小的,這會導(dǎo)致一些實例在剛開始訓(xùn)練時學(xué)習(xí)得非常慢!
但是如果換成是交叉熵 loss,其更新權(quán)重公式最后推導(dǎo)得出如下:


由以上公式可知,權(quán)重學(xué)習(xí)的速度受到 σ(z) ? y 影響,更大的誤差,就有更快的學(xué)習(xí)速度,還避免了二次代價函數(shù)方程中因 σ′(z) 導(dǎo)致的學(xué)習(xí)緩慢。
但是現(xiàn)在也有很多其他的激活函數(shù)并不會產(chǎn)生飽和狀態(tài),那么均方差也有其存在價值。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。