神經網絡中容易被忽視的基礎知識


以下大多筆記主要來自 cs231n 和其他深度學習資料和一些我自己的補充,首先 CS231n 一個非常不錯的 deep learning 課,值得一看,奉上鏈接(http://cs231n.stanford.edu/),然后,cs231n 本身是有筆記的(https://cs231n.github.io/),最后,知乎上的一些大神對這個筆記進行了翻譯 (http://t.cn/RtgQHyT)。在這里,我主要是將一些重要的筆記,我認為是比較容易被我們忽視的,加上查閱其他博文,做一個筆記和心得總結!

這次主要講解的內容有:

  • 基本神經元

  • 作為線性分類器的單個神經元

  • 為什么要是深度神經網而不是” 肥胖 “神經網絡?

  • 為什么在人工神經網絡中的神經元需要激活函數?

  • 一些主要的激活函數

  • 神經網絡中的偏置有什么意義?

  • 初始化神經網絡的參數可以全為 0 嗎,其他普通線性分類器呢?

  • 交叉熵損失存在的意義和與平方差損失相比有什么好處?

神經元

下面圖表的左邊展示了一個生物學的神經元,右邊展示了一個常用的數學模型。乍一看還是有點相似的,事實上也是,人工神經網絡中的神經元也有受到生物神經元的啟發。總結要點:

  • 在生物的神經元(也就是左圖)中,樹突將信號傳遞到細胞體,信號在細胞體中相加。如果最終之和高於某個閾值,那么神經元將會激活,向其軸突輸出一個峰值信號,注意這里輸出是一個脈沖信號!

  • 在數學計算模型(也就是右圖)中,首先將輸入進行加權求和加上偏執,得到待激勵值,然后將該值作為輸入,輸入到激活函數中,最后輸出的是一個激勵后的值,這里的激活函數可以看成對生物中神經元的激活率建模。由於歷史原因,激活函數常常選擇使用sigmoid 函數 σ當然還有很多其他激活函數,下面再仔細聊!

  • 需要注意:1. 一個神經元可以看成包含兩個部分,一個是對輸入的加權求和加上偏置,一個是激活函數對求和后的激活或者抑制。2. 注意生物中的神經元要復雜的多,其中一個是生物中的輸出是一個脈沖,而現在大多數的數學模型神經輸出的就是一個值,當然現在也有一些脈沖人工神經網絡,可以自行了解!

                                           

                                                                    作為線性分類器的單個神經元

  • 比如基礎的邏輯回歸,結合上面的神經元知識,可以發現,邏輯回歸就是激活函數是sigmoid的單層簡單神經網絡。也就是說,只要在神經元的輸出端有一個合適的損失函數,就能讓單個神經元變成一個線性分類器。因此說,那些線性的分類器本身就是一個單層神經網絡

  • 但注意,對於非線性的模型:SVM 和神經網絡走了兩條不同的道路:神經網絡通過多個隱層的方法來實現非線性的函數,有一些理論支持(比如說帶隱層的神經網絡可以模擬任何函數),但是目前而言還不是非常完備;SVM 則采用了 kernel trick 的方法,這個在理論上面比較完備(RKHS,簡單地說就是一個泛函的線性空間)。兩者各有好壞,神經網絡最近的好處是網絡設計可以很靈活,有很多的 trick&tip,很多理論都不清不楚的;SVM 的理論的確漂亮,但是 kernel 設計不是那么容易,所以最近也就沒有那么熱了。

為什么要是深度神經網而不是” 肥胖 “(寬度)神經網絡?

 

“肥胖” 網絡的隱藏層數較少,如上左圖。雖然有研究表明,淺而肥的網絡也可以擬合任何的函數,但它需要非常的 “肥胖”,可能一層就要成千上萬個神經元。而這直接導致的后果是參數的數量增加到很多很多。

也有實驗表明,也就是上圖的實驗,我們可以清楚的看出,當准確率差不多的時候,參數的數量卻相差數倍。這也說明我們一般用深層的神經網絡而不是淺層 “肥胖” 的網絡。

注意:說神經網絡多少層數的時候一般不包括輸入層。 在神經網絡中的激活主要講的是梯度的更新的激活。

為什么在人工神經網絡中的神經元需要激活函數?

 

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

                                                            圖 a

                                                              圖 b

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

一層很多時候是遠遠不夠的,前面講過,簡單的線性分類器就可以看成是一層的神經網絡,比如上圖,激活函數是 signmoid,那就可以看成是二分類的邏輯回歸!

下面擴展到多層,如下圖 1,2:

                                                                              圖 1

                                                                               圖 2

圖 1 是一個簡單的 MLP(全鏈接神經網絡),圖 2 的右邊課簡單表示左圖的可視化,那么對比之前的無激活函數的圖,很明顯是更加的非線性,擬合能力也會更強,同時可以想到,當層數更多,其能力也會越來越強!

簡單來說:就是使得神經網絡具有的擬合非線性函數的能力,使得其具有強大的表達能力!

簡單擴展,神經網絡的萬能近似定理: 一個前饋神經網絡如果具有線性層和至少一層具有 "擠壓" 性質的激活函數(如 signmoid 等),給定網絡足夠數量的隱藏單元,它可以以任意精度來近似任何從一個有限維空間到另一個有限維空間的 borel 可測函數。

要相符上面的定理,也就是想擬合任意函數,一個必須點是 “要有帶有 “擠壓” 性質的激活函數”。這里的 “擠壓” 性質是因為早期對神經網絡的研究用的是sigmoid類函數,所以對其數學性質的研究也主要基於這一類性質:將輸入數值范圍擠壓到一定的輸出數值范圍。(后來發現,其他性質的激活函數也可以使得網絡具有普適近似器的性質,如 ReLU 。

一些主要的激活函數:

sigmoid:

優點:有較好的解釋性

缺點:1.Sigmoid 函數飽和使梯度消失。sigmoid 神經元有一個不好的特性,就是當神經元的激活在接近 0 或 1 處時會飽和:在這些區域,梯度幾乎為 0。2.輸出不是零中心的,這一情況將影響梯度下降的運作,因為如果輸入神經元的數據總是正數,那么關於 w 的梯度在反向傳播的過程中,將會要么全部是正數,要么全部是負數,這樣梯度下降權重更新時出現 z 字型的下降。這樣收斂會變得異常的慢。(這也是為什么要一直保持為數據的 0 中心化)—–但這個問題比較小3.exp()在深度神經網絡時候相比其他運算就比較慢

Tanh:

優點:1.它的輸出是零中心的。因此,在實際操作中,tanh 非線性函數比 sigmoid 非線性函數更受歡迎。

缺點:1. 和 Sigmoid 函數一樣,飽和使梯度消失。計算慢

ReLU:

優點:1.ReLU 對於隨機梯度下降的收斂有巨大的加速作用( Krizhevsky 等的論文 alexnet 指出有 6 倍之多)。據稱這是由它的線性,非飽和的公式導致的;2.注意:現在大部分的 DNN 用的激活函數就是 ReLu

缺點:1.當 x 是小於 0 的時候,那么從此所以流過這個神經元的梯度將都變成 0;這個時候這個 ReLU 單元在訓練中將死亡(也就是參數無法更新),這也導致了數據多樣化的丟失(因為數據一旦使得梯度為 0,也就說明這些數據已不起作用)。

Leaky ReLU:

優點:1.非飽和的公式; 2.Leaky ReLU 是為解決 “ReLU 死亡” 問題的嘗試

缺點:1. 有些研究者的論文指出這個激活函數表現很不錯,但是其效果並不是很穩定

Kaiming He 等人在 2015 年發布的論文 Delving Deep into Rectifiers 中介紹了一種新方法 PReLU,把負區間上的斜率當做每個神經元中的一個參數。然而該激活函數在在不同任務中均有益處的一致性並沒有特別清晰。

ELU:

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

ELU.png 函數曲線如下:

Maxout:

  • Maxout 是對 ReLU 和 leaky ReLU 的一般化歸納

優點:1. 擁有 ReLU 單元的所有優點(線性操作和不飽和),而沒有它的缺點(死亡的 ReLU 單元)

缺點 :1.每個神經元的參數數量增加了一倍,這就導致整體參數的數量激增。難訓練, 容易過擬合

怎么用激活函數

“那么該用那種呢?”用 ReLU 非線性函數。注意設置好學習率,(如果學習率設置得太高,可能會發現網絡中 40% 的神經元都會死掉(在整個訓練集中這些神經元都不會被激活)。通過合理設置學習率,這種情況的發生概率會降低。),解決方案:或許可以監控你的網絡中死亡的神經元占的比例。如果單元死亡問題困擾你,就試試 Leaky ReLU 或者 Maxout,不要再用 sigmoid 了。也可以試試 tanh,但是其效果應該不如 ReLU 或者 Maxout。

神經網絡中的偏置有什么意義?

最基礎的神經元感知器如下:

這個例子中輸入為三個變量, 輸出為 0 或 1. 當三個變量的加權和大於某個閾值的時候, 輸出為 1, 反之為 0。

注意這里的閾值, 它度量了神經元產生正 (負) 激勵的難易程度. 也就是說,在上文的模型中, 閾值越大, 產生正激勵的難度越大.

而為了更好的計算和表達,我們可以把其中的 b 和 移到同一邊,同時給他取了一個不錯的名字,叫做偏置 Bias,而 w 叫做權重 weight!

也就是說: 偏置的大小度量了神經元產生正 (負) 激勵的難易程度.

這是最簡單的感知器神經元. 而現代神經網絡中常用的 Sigmoid, tanh 或是 ReLU 都是在的基礎上加上一個激活函數, Bias 也就是 b 的意義是一樣的。

同時對於偏置需要注意的點是:偏置是不需要正則化的,並且正則化偏置的話會導致欠擬合。我們從意義上去理解話,若對偏置正則化(懲罰),會導致激活變得更加簡單,偏差就會上升,學習的能力就會下降!

初始化神經網絡的參數可以全為 0 嗎,其他普通線性分類器呢?

在講初始化前,先簡單復習下反向傳播算法可表示為以下幾個步驟:

1. 進行前饋傳導計算,利用前向傳導公式,得到 ,直到輸出層 的激活值。

對輸出層(第 nl 層),計算:

3. 對於 的各層,計算:

4. 計算最終需要的偏導數值:

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

從上往下,其中y 代表正確 label, 代表最后一層的輸出, 表達的是最后一層的加權求和值, f 代表的是激活函數,δ代表的是要反向傳播回去的誤差, l 代表第 l 層,w,b 表示權重和偏置。

我們前面說過:線性分類器邏輯回歸模型可以算作為一個簡單的單層神經網絡。為了更好的說明問題,假設一個場景,在十類分類的數字手寫識別中,我們將本來二分類的邏輯回歸推到多分類的softmax,也就是說,神經元的激活函數是 softmax。也就是下圖,然后分析:

  • 輸入層(不算是一層):28×28=784 個輸入單元。也就是 n=784

  • 輸出層:10 個輸出單元, 激活函數為softmax,也就是 m=10

  • 它由兩組參數組成: W和 b, 前者是一個 10×784 維的權值矩陣, 后者是長度為 10 的 bias 列向量. 現在我們假設把它們全部初始化為 0:

  • 第一次正向計算過程中, 簡單算出,輸出層的所有輸出為 0.5.

  • 反向時, 根據前面復習的反向傳播算法,首先計算δ,假如 =1, 即輸入x對應的數字為i, 那么除了第i個神經元的δ是不同的,其他的值都是一樣, 又於計算權重 w 梯度的公式得知,注意此時的 就是輸入值 x,又由於輸入向量x的元素之間的不同, 所以即使δ是一樣的,但最終得到的 10 個梯度值有很大概率是不同且非 0 的, 所以第一次 BP 過程可以取得成效並將一些w和所有的b變成非 0 值.

  • 由於 w 值已經變得不相同了,這個時候前向傳播和后向傳播也就會正常的進行, 后面的訓練顯然也可以順利進行.

得出結論,沒有隱層時, 可以將所有的參數初始化為 0.

如果有隱層呢? 假如還是用sigmoid 激活函數呢。來個更簡單 MLP,

  • 第一次正向計算過程中, 簡單算出,輸出層的所有輸出為神經元 4,5,6 輸出的值(初始化 w,b 為 0, 激活函數是sigmoid)都是一樣的,都是 0.5

  • 第一個反向傳播過程,由權重的更新公式,算出即 (神經元 6 和 4,5 之間的權重) 是一樣的,同樣算出 都一樣,但非 0, 由 sgd 算法賦值。

  • 然后第二次正向時,算出神經元 4,5 的輸出一樣(因為 4,5 都是接受 1,2,3 神經元的輸入,且權重相同),但和神經元 6 的輸出不一樣。

  • 然后第二次反向時,根據公式,得出 一樣。原因在於計算 用的是一樣的輸出,這個也可以從公式得出!

  • 最后結論,一直循環,發現學習得到的模型中, 所有的隱單元都是相同的(在這里就是神經元 4,5 永遠 一樣). 學習失敗.

對於隱層使用了其他函數比如 ReLU: f(net)=max(0,net)其結果也是一樣的: 除了輸入層的輸出值為x本身, 不為 0, 其余的所有層的輸出都為 0. BP 時所有梯度也都為 0, 包括輸出層. 這意味着所有的非輸入神經元都是無意義的. 學習失敗.對於卷積神經網絡,循環神經網絡也是一樣的,故一般會用其他初始化方式。

最后最后的結論是, 一般只在訓練 SLP / 邏輯回歸模型時才使用 0 初始化所有參數., 更實用的結論是, 深度模型都不會使用 0 初始化所有參數.

交叉熵存在的意義和與平方差相比有什么好處?

一個非常常見的,非常漂亮的成本函數是 “交叉熵”(cross-entropy)。交叉熵產生於信息論里面的信息壓縮編碼技術,但是它后來演變成為從博弈論到機器學習等其他領域里的重要技術手段。它的定義如下:

其中,y 是我們預測的概率分布, y’ 是實際的分布

1. 交叉熵是正的,2. 當所有輸入 x 的輸出都能接近期望輸出 y 的話,交叉熵的值將會接近 0。這兩個特征在直覺上我們都會覺得它適合做代價函數。事實上,我們的均方代價函數也同時滿足這兩個特征。然而....

為什么在神經網絡中用交叉熵代替二次代價函數?

還是從反向傳播,參數更新的角度理解更新參數的公式如下:

a 是 神經元的輸出,其中 a = σ(z), z = wx + b,可知,偏導數受激活函數的導數影響,假設這里是傳統的sigmoid 激活函數(在之前很多時候都是)。那么 sigmoid 的導數在輸出接近 0 和 1 的時候 是非常小的,這會導致一些實例在剛開始訓練時學習得非常慢!

但是如果換成是交叉熵 loss,其更新權重公式最后推導得出如下:

由以上公式可知,權重學習的速度受到 σ(z) − y 影響,更大的誤差,就有更快的學習速度,還避免了二次代價函數方程中因 σ′(z) 導致的學習緩慢。

但是現在也有很多其他的激活函數並不會產生飽和狀態,那么均方差也有其存在價值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM