激活函數、正向傳播、反向傳播及softmax分類器,一篇就夠了!
- 2019 年 10 月 3 日
- 筆記
1. 深度學習有哪些應用
- 圖像:圖像識別、物體識別、圖片美化、圖片修復、目標檢測。
- 自然語言處理:機器創作、個性化推薦、文本分類、翻譯、自動糾錯、情感分析。
- 數值預測、量化交易
2. 什麼是神經網絡
我們以房價預測的案例來說明一下,把房屋的面積作為神經網絡的輸入(我們稱之為?),通過一個節點(一個小圓圈),最終輸出了價格(我們用?表示)。其實這個小圓圈就是一個單獨的神經元,就像人的大腦神經元一樣。如果這是一個單神經元網絡,不管規模大小,它正是通過把這些單個神經元疊加在一起來形成。如果你把這些神經元想像成單獨的樂高積木,你就通過搭積木來完成一個更大的神經網絡。
神經網絡與大腦關聯不大。這是一個過度簡化的對比,把一個神經網絡的邏輯單元和右邊的生物神經元對比。至今為止其實連神經科學家們都很難解釋,究竟一個神經元能做什麼。
2.1 什麼是感知器
這要從邏輯回歸講起,我們都知道邏輯回歸的目標函數如下所示:
[z=theta_0+theta_1X_1+theta_2X_2]
[a=g(z)=frac{1}{1+e^{-z}}]
我們用網絡來表示,這個網絡就叫做感知器:
如果在這個感知器的基礎上加上隱藏層,就會得到下面我們要說的神經網絡結構了。
2.2 神經網絡的結構
神經網絡的一般結構是由輸入層、隱藏層(神經元)、輸出層構成的。隱藏層可以是1層或者多層疊加,層與層之間是相互連接的,如下圖所示。
一般說到神經網絡的層數是這樣計算的,輸入層不算,從隱藏層開始一直到輸出層,一共有幾層就代表着這是一個幾層的神經網絡,例如上圖就是一個三層結構的神經網絡。
解釋隱藏層的含義:在一個神經網絡中,當你使用監督學習訓練它的時候,訓練集包含了輸入?也包含了目標輸出?,所以術語隱藏層的含義是在訓練集中,這些中間結點的準確值我們是不知道到的,也就是說你看不見它們在訓練集中應具有的值。
- 多隱藏層的神經網絡比 單隱藏層的神經網絡工程效果好很多。
- 提升隱層層數或者隱層神經元個數,神經網絡「容量」會變大,空間表達力會變強。
- 過多的隱層和神經元節點,會帶來過擬合問題。
- 不要試圖通過降低神經網絡參數量來減緩過擬合,用正則化或者dropout。
2.3 為什麼神經網絡具有非線性切分能力
假設對下圖進行分類,圓圈為一類,紅叉叉為另一類,如果用線性切分的話無論如何都不能把它們進行分開。
這時,引入神經網絡(2層神經網絡),包含一個隱藏層,在隱藏層中,分別得到了P1和P2的圖形,P1這條線以上的部分都是紅叉叉,P2這條線以下的部分都是紅叉叉,兩個神經元就有2條線性直線。從隱藏層到輸出層要做的事情就是把這兩條直線給合併起來,就會得到h(x)的圖形,也就是說P1以上的空間交上P2以下的空間就是紅叉叉的分類,其餘空間分類為圓圈。這就使得原本不能夠線性切分變成非線性切分了。
如果隱藏層更加複雜的話,就能夠完美的實現複雜平面樣本點分佈的劃分(類似於摳圖),如下圖所示:
3. 神經網絡的計算過程
3.1 計算過程
如下圖所示。用圓圈表示神經網絡的計算單元,邏輯回歸的計算有兩個步驟,首先你按步驟計算出?,然後在第二
步中你以 sigmoid 函數為激活函數計算?(得出?),一個神經網絡只是這樣子做了好多次重複計算。
其中的一個神經元計算如下圖所示:
向量化計算,如果你執行神經網絡的程序,用 for 循環來做這些看起來真的很低效。所以接下來我們要做的就是把這四個等式向量化。向量化的過程是將神經網絡中的一層神經元參數縱向堆積起來,例如隱藏層中的?縱向堆積起來變成一個(4,3)的矩陣,用符號?[1]表示。另一個看待這個的方法是我們有四個邏輯回歸單元,且每一個邏輯回歸單元都有相對應的參數——向量?,把這四個向量堆積在一起,你會得出這 4×3 的矩陣。
上面公式表示的是一個樣本的向量化計算,那麼多樣本向量化計算其實就是在上面公式的基礎上再增列數,每一列相當於一個樣本。
3.2 隨機初始化模型參數
在神經⽹絡中,通常需要隨機初始化模型參數。下⾯我們來解釋這樣做的原因。
假設輸出層只保留⼀個輸出單元o1(刪去o2和o3以及指向它們的箭頭),且隱藏層使⽤相同的激活函數。如果將每個隱藏單元的參數都初始化為相等的值,那麼在正向傳播時每個隱藏單元將根據相同的輸⼊計算出相同的值, 並傳遞⾄輸出層。在反向傳播中,每個隱藏單元的參數梯度值相等。因此,這些參數在使⽤基於梯度的優化算法迭代後值依然相等。之後的迭代也是如此。
在這種情況下,⽆論隱藏單元有多少, 隱藏層本質上只有1個隱藏單元在發揮作⽤。因此,正如在前⾯的實驗中所做的那樣,我們通常將神經⽹絡的模型參數,特別是權重參數,進⾏隨機初始化。
有兩種初始化方法:
-
採用正態分佈的隨機初始化方法。
-
Xavier初始化方法:假設某全連接層的輸入個數為a,輸出個數為b,Xavier隨機初始化將使該層中權重參數的每個元素都隨機採樣於均勻分佈:
[U[-sqrt{frac{6}{a+b}},sqrt{frac{6}{a+b}}]]
初始化後,每層輸出的方差不會受該層輸入個數的影響,且每層梯度的方差也不受該層輸出個數的影響。
3.3 激活函數
3.3.1 激活函數有哪些
在隱層接一個線性變換後 ,再接一個非線性變換(如sigmoid),這個非線性變換叫做傳遞函數或者激活函數。上面的例子用的都是邏輯回歸的Sigmoid激活函數,如果還不明白激活函數在哪,可以看下面這幅圖。
-
sigmoid函數
[a=g(z)=frac{1}{1+e^{-z}}]
[g(z)^{'}=frac{d}{dz}g(z)=alpha(1-alpha)]
-
tanh(雙曲正切)函數
事實上,tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點,並且值域介於+1 和-1 之間。但有一個例外:在二分類的問題中,對於輸出層,因為?的值是 0 或 1,所以想讓?^的數值介於0和1之間,而不是在-1和+1之間。所以需要使用sigmoid激活函數。
[a=g(z)=tanh(z)=frac{e^z-e^{-z}}{e^z+e^{-z}}]
[g(z)^{'}=frac{d}{dz}g(z)=1-(tanh(z))^2]
sigmoid函數和tanh函數兩者共同的缺點是,在?特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於 0,導致降低梯度下降的速度。
-
ReLu(修正線性單元)函數
只要?是正值的情況下,導數恆等於 1,當?是負 值的時候,導數恆等於 0。
[a=max(0,z)]
[ g(x){'}=left{ begin{aligned} 0 & & if z < 0 \ 1 & & if z > 0 \ undefined & & if z =0 end{aligned} right. ]
這有一些選擇激活函數的經驗法則: 如果輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,然後其它的所有單 元都選擇 Relu 函數。
-
softmax激活函數
- 非線性變換之前計算:(z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)})
- 經過非線性變換,臨時變量:(t=e^{z^{(l)}})
- (a^{l}=frac{t_i}{sum_{j=1}^{n}t_i}) 歸一化
- (a^l)表示的就是第幾個類別的概率值,這些概率值和為1
之前,我們的激活函數都是接受單行數值輸入,例如 Sigmoid 和 ReLu 激活函數,輸入一個實數,輸出一個實數。Softmax 激活函數的特殊之處在於,因為需要將所有可能的輸出歸一化,就需要輸入一個向量,最後輸出一個向量。
hardmax 函數會觀察?的元素,然後在?中最大元素的位置放上 1,其它位置放上 0,Softmax 所做的從?到這些概率的映射更為溫和。
Softmax 回歸將 logistic 回歸推廣到了兩種分類以上。
3.3.2 優缺點
- 在?的區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個 if-else 語句,而 sigmoid 函數需要進行浮點四則運算,在實踐中,使用 ReLu 激活函數神經網絡通常會比使用 sigmoid 或者 tanh 激活函數學習的更快。
- sigmoid 和 tanh 函數的導數在正負飽和區的梯度都會接近於 0,這會造成梯度彌散,而 Relu 和 Leaky ReLu 函數大於 0 部分都為常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu 進入負半區的時候,梯度為 0,神經元此時不會訓練,產生所謂的稀疏性,而 Leaky ReLu 不會有這問題) ?在 ReLu 的梯度一半都是 0,但是,有足夠的隱藏層使得 z 值大於 0,所以對大多數的 訓練數據來說學習過程仍然可以很快。
3.3.3 為什麼使用激活函數
如果你使用線性激活函數或者沒有使用一個激活函數,那麼無論你的神經網絡有多少層一直在做的只是計算線性函數,所以不如直接去掉全部隱藏層。在我們的簡明案例中,事實證明如果你在隱藏層用線性激活函數,在輸出層用 sigmoid 函數,那麼這個模型的複雜度和沒有任何隱藏層。的標準 Logistic 回歸是一樣的。
在這裡線性隱層一點用也沒有,因為這兩個線性函數的組合本身就是線性函數,所以除非你引入非線性,否則你無法計算更有趣的函數,即使你的網絡層數再多也不行。
3.3.4 人工神經網絡中為什麼ReLu要好過於tanh和sigmoid function?
- 採用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法和指數運算,計算量相對大,而採用Relu激活函數,整個過程的計算量節省很多。
- 對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失),這種現象稱為飽和,從而無法完成深層網絡的訓練。而ReLU就不會有飽和傾向,不會有特別小的梯度出現。
- Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關係,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。
3.3.5 激活函數有哪些性質?
- 非線性: 當激活函數是線性的,一個兩層的神經網絡就可以基本上逼近所有的函數。但如果激活函數是恆等激活函數的時候,即 $ f(x)=x $,就不滿足這個性質,而且如果 MLP 使用的是恆等激活函數,那麼其實整個網絡跟單層神經網絡是等價的;
- 可微性: 當優化方法是基於梯度的時候,就體現了該性質;
- 單調性: 當激活函數是單調的時候,單層網絡能夠保證是凸函數;
- $ f(x)≈x $: 當激活函數滿足這個性質的時候,如果參數的初始化是隨機的較小值,那麼神經網絡的訓練將會很高效;如果不滿足這個性質,那麼就需要詳細地去設置初始值;
- 輸出值的範圍: 當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,因為特徵的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的 Learning Rate。
3.4 正向傳播
正向傳播(forward-propagation)是指對神經網絡沿着從輸入層到輸出層的順序,依次計算並存儲模型的中間變量(包括輸出)。
邏輯回歸的計算步驟:所以回想當時我們討論邏輯回歸的時候,我們有這個正向傳播步驟,其中我們計算?,然後?,然後損失函數?。 正向傳播類似,計算(z^{[1]}),(a^{[1]}),再計算(z^{[2]}),(a^{[2]}),最後得到loss function。
[ left. begin{aligned} x \ w \ b end{aligned} right}Rightarrow{z}=w^Tx+bRightarrow{a=sigma(z)}Rightarrow{L(a,y)}]
3.5 反向傳播(BP)
反向傳播(back-propagation)指的是計算神經網絡參數梯度的方法。總的來說,反向傳播依據微積分中的鏈式法則,沿着從輸出層到輸入層的順序,依次計算並存儲目標函數有關神經網絡各層的中間變量以及參數的梯度。
由正向傳播經過所有的隱藏層到達輸出層,會得到一個輸出結果(O_L),然後根據這個(O_L)帶入loss funcation中,利用SGD算法進行最優化求解,其中每次梯度下降都會使用一次BP來更新各個網絡層中的參數值,這就是BP回傳誤差的意思。
- 正向傳播求損失,BP回傳誤差。
- 根據誤差信號修正每層的權重。對各個w進行求導,然後更新各個w。
- 鏈式依賴損失函數:(y^{-}=h(g(f(x))))
3.6 隨機梯度下降法(SGD)
3.6.1 mini-batch梯度下降
你可以把訓練集分割為小一點的子集訓練,這些子集被取名為 mini-batch,假設每一個子集中只有 1000 個樣本,那麼把其中的? (1)到? (1000)取出來,將其稱為第一個子訓練集,也叫做 mini-batch,然後你再取出接下來的 1000 個樣本,從? (1001)到? (2000),然後再取 1000個樣本,以此類推。
在訓練集上運行 mini-batch 梯度下降法,你運行 for t=1……5000,因為我們有5000個各有 1000 個樣本的組,在 for 循環里你要做得基本就是對? {?}和? {?}執行一步梯度下降法。
- batch_size=1,就是SGD。
- batch_size=n,就是mini-batch
- batch_size=m,就是batch
其中1<n<m,m表示整個訓練集大小。
優缺點:
- batch:相對噪聲低些,幅度也大一些,你可以繼續找最小值。
- SGD:大部分時候你向著全局最小值靠近,有時候你會遠離最小值,因為那個樣本恰好給你指的方向不對,因此隨機梯度下降法是有很多噪聲的,平均來看,它最終會靠近最小值,不過有時候也會方向錯誤,因為隨機梯度下降法永遠不會收斂,而是會一直在最小值附近波動。一次性只處理了一個訓練樣本,這樣效率過於低下。
- mini-batch:實踐中最好選擇不大不小的 mini-batch,得到了大量向量化,效率高,收斂快。
首先,如果訓練集較小,直接使用 batch 梯度下降法,這裡的少是說小於 2000 個樣本。一般的 mini-batch 大小為 64 到 512,考慮到電腦內存設置和使用的方式,如果 mini-batch 大小是 2 的?次方,代碼會運行地快一些。
3.6.2 調節 Batch_Size 對訓練效果影響到底如何?
- Batch_Size 太小,模型表現效果極其糟糕(error飆升)。
- 隨着 Batch_Size 增大,處理相同數據量的速度越快。
- 隨着 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
- 由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
- 由於最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。
4. 為什麼說神經網絡是端到端的網絡?
端到端學習(end-to-end)是一種解決問題的思路,與之對應的是多步驟解決問題,也就是將一個問題拆分為多個步驟分步解決,而端到端是由輸入端的數據直接得到輸出端的結果。
就是不要預處理和特徵提取,直接把原始數據扔進去得到最終結果。
特徵提取包含在神經網絡內部,所以說神經網絡是端到端的網絡。
優點:
通過縮減人工預處理和後續處理,儘可能使模型從原始輸入到最終輸出,給模型更多可以根據數據自動調節的空間,增加模型的整體契合度。
缺點
- 它可能需要大量的數據。要直接學到這個?到?的映射,你可能需要大量(?, ?)數據。
- 它排除了可能有用的手工設計組件。
5. 深度學習框架比較
現有的深度學習開源平台主要有 Caffe, PyTorch, MXNet, CNTK, Theano, TensorFlow, Keras, fastai等。
平台 | 優點 | 缺點 |
---|---|---|
TensorFlow | 1.功能很齊全,能夠搭建的網絡更豐富。 2.支持多種編程語言。 3.擁有強大的計算集群。 4.谷歌支持 5.社區活躍度高。 6.支持多GPU。 7.TensorBoard支持圖形可視化。 |
1.編程入門難度較大。 2.計算圖是純 Python 的,因此速度較慢 3.圖構造是靜態的,意味着圖必須先被「編譯」再運行 |
Keras | 1.Keras是TensorFlow高級集成APi 2.Keras是一個簡潔的API。 可以快速幫助您創建應用程序。 3.代碼更加可讀和簡潔。 4.Keras處於高度集成框架。 5.社區活躍。 |
1.Keras框架環境配置比其他底層框架要複雜一些。 2.雖然更容易創建模型,但是面對複雜的網絡結構時可能不如TensorFlow。 3.性能方面比較欠缺。 |
Pytorch | 1.它可以在流程中更改體系結構。 2.訓練神經網絡的過程簡單明了。 3.可以使用標準 Python 語法編寫 for 循環語句。 4.大量預訓練模型 |
1.不夠TensorFlow全面,不過未來會彌補。 2.PyTorch部署移動端不是很好。 |
MXNet | 1.支持多語言。 2.文檔齊全。 3.支持多個GPU。 4.清晰且易於維護的代碼。 5.命令式和符號式編程風格之間進行選擇。 |
1.不被廣泛使用。 2.社區不夠活躍。 3.學習難度大一些。 |
目前從招聘來說,公司使用TensorFlow的佔大多數,畢竟TensorFlow的社區、性能、部署方面都是很強的,所以之後寫的實例代碼都使用TensorFlow來完成。
6. softmax分類器
6.1 什麼是softmax
在圖像分類的情景中,softmax分類器輸出可以是一個圖像類別的離散值,和線性回歸不同的是,softmax輸出單元從一個變成了多個。
softmax回歸和線性回歸一樣將輸入特徵與權重做線性疊加。與線性回歸的一個主要不同在於,softmax回歸的輸出值個數等於標籤里的類別數。下圖是用神經網絡描繪了softmax回歸,也是一個單層神經網絡,由於每個輸出 (o_1,o_2,o_3) 的計算都要依賴於所有的輸入 (x_1,x_2,x_3,x_4) ,softmax回歸的輸出層也是一個全連接層。
[o_1=x_1w_{11}+x_2w_{21}+x_3w_{31}+x_4w_{41}]
[o_2=x_1w_{12}+x_2w_{22}+x_3w_{32}+x_4w_{42}]
[o_3=x_1w_{13}+x_2w_{23}+x_3w_{33}+x_4w_{43}]
[o_4=x_1w_{14}+x_2w_{24}+x_3w_{34}+x_4w_{44}]
6.2 softmax的計算
一個簡單的辦法是將輸出值 (o_i) 當做預測類別是i的置信度,並將值最大的輸出所對應的類別作為預測輸出。例如,如果 (o_1,o_2,o_3) 分別為0.1 ; 10 ; 0.1,由於 (o_2) 最大,那麼預測類別為2。
然而,直接使用輸出層的輸出會有兩個問題:
- 由於輸出層的輸出值的範圍不確定,我們難以直觀上判斷這些值得意義。
- 由於真實標籤是離散值,這些離散值與不確定範圍的輸出值之間的誤差難以衡量。
softmax運算解決了以上兩個問題。它通過下面的公式將輸出值變換成值為正且和為1的概率分佈:
[softmax(o_i)=frac{exp(o_i)}{sum_{i=1}^{n}exp(o_i)}]
6.3 交叉熵損失函數
我們已經知道,softmax運算將輸出變換成一個合法的類別預測分佈。實際上,真實標籤也可以用類別分佈表達:
對於樣本i,我們構造向量 (y^{(i)}in_{}R^q) ,使其第 (y^{(i)}) 個元素為1,其餘為0。這樣我們的訓練目標可以設為使預測概率分佈 (hat{y}^{(i)}) 儘可能接近真實的標籤概率 (y^{(i)})。
想要預測分類結果正確,我們其實並不需要預測概率完全等於標籤概率,而平方損失則過於嚴格。改善這個問題的一個方法是使用更適合衡量兩個概率分佈差異的測量函數。其中,交叉熵(cross entropy)是一個常用的衡量方法:
[H(y^{(i)},hat{y}^{(i)})=-sum_{j=1}^{q}y_j^{(i)}log{hat{y}}_j^{(i)}=-log{hat{y}}_{y^{(i)}}^{(i)}]
其中帶下標的 (y_j^{(i)}) 是向量 (y^{(i)}) 中非 0 即 1 的元素。也就是說,交叉熵只關心對正確類別的預測概率,因為只要其值足夠大,就可以確保分類結果正確。即最小化交叉熵損失函數等價於最大化訓練數據集所有標籤類別的聯合預測概率。
7. 神經網絡實現
作者:@mantchs