激活函數、正向傳播、反向傳播及softmax分類器,一篇就夠了!

1. 深度學習有哪些應用

  • 圖像:圖像識別、物體識別、圖片美化、圖片修復、目標檢測。
  • 天然語言處理:機器創做、個性化推薦、文本分類、翻譯、自動糾錯、情感分析。
  • 數值預測、量化交易

2. 什麼是神經網絡

咱們以房價預測的案例來講明一下,把房屋的面積做爲神經網絡的輸入(咱們稱之爲𝑥),經過一個節點(一個小圓圈),最終輸出了價格(咱們用𝑦表示)。其實這個小圓圈就是一個單獨的神經元,就像人的大腦神經元同樣。若是這是一個單神經元網絡,無論規模大小,它正是經過把這些單個神經元疊加在一塊兒來造成。若是你把這些神經元想象成單獨的樂高積木,你就經過搭積木來完成一個更大的神經網絡。git

神經網絡與大腦關聯不大。這是一個過分簡化的對比,把一個神經網絡的邏輯單元和右邊的生物神經元對比。至今爲止其實連神經科學家們都很難解釋,究竟一個神經元能作什麼。github

2.1 什麼是感知器

這要從邏輯迴歸講起,咱們都知道邏輯迴歸的目標函數以下所示:面試

z=\theta_0+\theta_1X_1+\theta_2X_2
a=g(z)=\frac{1}{1+e^{-z}}

咱們用網絡來表示,這個網絡就叫作感知器:算法

若是在這個感知器的基礎上加上隱藏層,就會獲得下面咱們要說的神經網絡結構了。編程

2.2 神經網絡的結構

神經網絡的通常結構是由輸入層、隱藏層(神經元)、輸出層構成的。隱藏層能夠是1層或者多層疊加,層與層之間是相互鏈接的,以下圖所示。網絡

通常說到神經網絡的層數是這樣計算的,輸入層不算,從隱藏層開始一直到輸出層,一共有幾層就表明着這是一個幾層的神經網絡,例如上圖就是一個三層結構的神經網絡。框架

**解釋隱藏層的含義:**在一個神經網絡中,當你使用監督學習訓練它的時候,訓練集包含了輸入𝑥也包含了目標輸出𝑦,因此術語隱藏層的含義是在訓練集中,這些中間結點的準確值咱們是不知道到的,也就是說你看不見它們在訓練集中應具備的值。dom

  • 多隱藏層的神經網絡比 單隱藏層的神經網絡工程效果好不少。
  • 提高隱層層數或者隱層神經元個數,神經網絡「容量」會變大,空間表達力會變強。
  • 過多的隱層和神經元節點,會帶來過擬合問題。
  • 不要試圖經過下降神經網絡參數量來減緩過擬合,用正則化或者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個隱藏單元在發揮做⽤。所以,正如在前⾯的實驗中所作的那樣,咱們一般將神經⽹絡的模型參數,特別是權重參數,進⾏隨機初始化。

有兩種初始化方法:

  1. 採用正態分佈的隨機初始化方法。

  2. Xavier初始化方法:假設某全鏈接層的輸入個數爲a,輸出個數爲b,Xavier隨機初始化將使該層中權重參數的每一個元素都隨機採樣於均勻分佈:

    U[-\sqrt{\frac{6}{a+b}},\sqrt{\frac{6}{a+b}}]

    初始化後,每層輸出的方差不會受該層輸入個數的影響,且每層梯度的方差也不受該層輸出個數的影響。

3.3 激活函數

3.3.1 激活函數有哪些

在隱層接一個線性變換後 ,再接一個非線性變換(如sigmoid),這個非線性變換叫作傳遞函數或者激活函數。上面的例子用的都是邏輯迴歸的Sigmoid激活函數,若是還不明白激活函數在哪,能夠看下面這幅圖。

  1. sigmoid函數

    image

    a=g(z)=\frac{1}{1+e^{-z}}
    g(z)^{'}=\frac{d}{dz}g(z)=\alpha(1-\alpha)
  2. tanh(雙曲正切)函數

    事實上,tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點,而且值域介於+1 和-1 之間。但有一個例外:在二分類的問題中,對於輸出層,由於𝑦的值是 0 或 1,因此想讓𝑦^的數值介於0和1之間,而不是在-1和+1之間。因此須要使用sigmoid激活函數。

    image

    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,致使下降梯度降低的速度。

  3. ReLu(修正線性單元)函數

    只要𝑧是正值的狀況下,導數恆等於 1,當𝑧是負 值的時候,導數恆等於 0。

    image

    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 函數。

  4. 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

    以前,咱們的激活函數都是接受單行數值輸入,例如 SigmoidReLu 激活函數,輸入一個實數,輸出一個實數。Softmax 激活函數的特殊之處在於,由於須要將全部可能的輸出歸一化,就須要輸入一個向量,最後輸出一個向量。

    hardmax 函數會觀察𝑧的元素,而後在𝑧中最大元素的位置放上 1,其它位置放上 0,Softmax 所作的從𝑧到這些機率的映射更爲溫和。

    Softmax 迴歸將 logistic 迴歸推廣到了兩種分類以上。

3.3.2 優缺點

  • 在𝑧的區間變更很大的狀況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個 if-else 語句,而 sigmoid 函數須要進行浮點四則運算,在實踐中,使用 ReLu 激活函數神經網絡一般會比使用 sigmoid 或者 tanh 激活函數學習的更快。
  • sigmoidtanh 函數的導數在正負飽和區的梯度都會接近於 0,這會形成梯度彌散,而 ReluLeaky ReLu 函數大於 0 部分都爲常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu 進入負半區的時候,梯度爲 0,神經元此時不會訓練,產生所謂的稀疏性,而 Leaky ReLu 不會有這問題) 𝑧在 ReLu 的梯度一半都是 0,可是,有足夠的隱藏層使得 z 值大於 0,因此對大多數的 訓練數據來講學習過程仍然能夠很快。

3.3.3 爲何使用激活函數

若是你使用線性激活函數或者沒有使用一個激活函數,那麼不管你的神經網絡有多少層一直在作的只是計算線性函數,因此不如直接去掉所有隱藏層。在咱們的簡明案例中,事實證實若是你在隱藏層用線性激活函數,在輸出層用 sigmoid 函數,那麼這個模型的複雜度和沒有任何隱藏層。的標準 Logistic 迴歸是同樣的。

在這裏線性隱層一點用也沒有,由於這兩個線性函數的組合自己就是線性函數,因此除非你引入非線性,不然你沒法計算更有趣的函數,即便你的網絡層數再多也不行。

3.3.4 人工神經網絡中爲何ReLu要好過於tanh和sigmoid function?

  1. 採用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求偏差梯度時,求導涉及除法和指數運算,計算量相對大,而採用Relu激活函數,整個過程的計算量節省不少。
  2. 對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的狀況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種狀況會形成信息丟失),這種現象稱爲飽和,從而沒法完成深層網絡的訓練。而ReLU就不會有飽和傾向,不會有特別小的梯度出現。
  3. Relu會使一部分神經元的輸出爲0,這樣就形成了網絡的稀疏性,而且減小了參數的相互依存關係,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。固然如今也有一些對relu的改進,好比prelu,random relu等,在不一樣的數據集上會有一些訓練速度上或者準確率上的改進,具體的你們能夠找相關的paper看。

3.3.5 激活函數有哪些性質?

  1. 非線性: 當激活函數是線性的,一個兩層的神經網絡就能夠基本上逼近全部的函數。但若是激活函數是恆等激活函數的時候,即 f(x)=x,就不知足這個性質,並且若是 MLP 使用的是恆等激活函數,那麼其實整個網絡跟單層神經網絡是等價的;
  2. 可微性: 當優化方法是基於梯度的時候,就體現了該性質;
  3. 單調性: 當激活函數是單調的時候,單層網絡可以保證是凸函數;
  4. f(x)≈x: 當激活函數知足這個性質的時候,若是參數的初始化是隨機的較小值,那麼神經網絡的訓練將會很高效;若是不知足這個性質,那麼就須要詳細地去設置初始值;
  5. 輸出值的範圍: 當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,由於特徵的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種狀況小,通常須要更小的 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+b\Rightarrow{a=\sigma(z)}\Rightarrow{L(a,y)}

3.5 反向傳播(BP)

反向傳播(back-propagation)指的是計算神經網絡參數梯度的方法。總的來講,反向傳播依據微積分中的鏈式法則,沿着從輸出層到輸入層的順序,依次計算並存儲目標函數有關神經網絡各層的中間變量以及參數的梯度。

由正向傳播通過全部的隱藏層到達輸出層,會獲得一個輸出結果O_L,而後根據這個O_L帶入loss funcation中,利用SGD算法進行最優化求解,其中每次梯度降低都會使用一次BP來更新各個網絡層中的參數值,這就是BP回傳偏差的意思。

image

  • 正向傳播求損失,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 對訓練效果影響到底如何?

  1. Batch_Size 過小,模型表現效果極其糟糕(error飆升)。
  2. 隨着 Batch_Size 增大,處理相同數據量的速度越快。
  3. 隨着 Batch_Size 增大,達到相同精度所須要的 epoch 數量愈來愈多。
  4. 因爲上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
  5. 因爲最終收斂精度會陷入不一樣的局部極值,所以 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. 神經網絡實現

TensorFlow示例:線性迴歸

機器學習通俗易懂系列文章

3.png


做者:@mantchs

GitHub:github.com/NLP-LOVE/ML…

歡迎你們加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

相關文章
相關標籤/搜索