2020-5-8 吳恩達-NN&DL-w3 淺層NN(3.5 向量化實現的解釋(含算法總結),3.6 激活函數-3種)

1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai

3.5 向量化實現的解釋 Explanation for vectorized implementation

本節將介紹,爲什麼上一節中寫下的公式就是將多個樣本向量化的正確實現。

我們先手動對幾個樣本計算一下前向傳播,看看有什麼規律。

上一節中,已經得到多樣本情況下,隱藏層第一個節點的第一步計算公式如下,以3個訓練樣本(x(1},x(2},x(3})爲例
z[1](1)=W[1]x(1)+b[1]z^{[1](1)}=W^{[1]}x^{(1)}+b^{[1]}
z[1](2)=W[1]x(2)+b[1]z^{[1](2)}=W^{[1]}x^{(2)}+b^{[1]}
z[1](3)=W[1]x(3)+b[1]z^{[1](3)}=W^{[1]}x^{(3)}+b^{[1]}
爲了描述的簡便,先忽略掉b[1]。因爲利用 Python 的廣播機制,可以很容易的將b[1]加進來。

定義訓練集矩陣X,是將所有樣本向量堆疊起來得到。本例只有3個樣本,如果有更多的樣本,只需要繼續橫向堆疊上去。
X=[x(1)x(2)x(3)]X=\left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & x^{(3)} & \vdots\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right]

然後我們可以推導得到
W[1]X=[w(1)x(1)w(1)x(2)w(1)x(3)]=[z[1](1)z[1](2)z[1](3)]=Z[1]W^{[1]}X= \left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ w^{(1)}x^{(1)} & w^{(1)}x^{(2)} & w^{(1)}x^{(3)} & \vdots\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right] =\\ \left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & z^{[1](3)} & \vdots\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right] = Z^{[1]}

Z[1]也是列向量的堆疊形成,這些是特徵樣本(featturing examples)。

現在你可以明白,爲什麼之前我們對單個樣本的計算要寫成z[1](i)=W[1]x(i)+b[1]z^{[1](i)}=W^{[1]}x^{(i)}+b^{[1]}

這是上一節介紹的多樣本向量化4個公式中的第一個。

事實證明,類似的分析邏輯同樣適合另外3個公式。即如果將輸入按列向量橫向堆疊進矩陣,那麼通過公式計算之後,也能得到成列堆疊的輸出。

總結一下

對於以下雙層單一隱藏層(淺層)NN網絡
在這裏插入圖片描述

如果你要在單個訓練樣本中實現正向傳播算法,就需要i從1到m遍歷。
在這裏插入圖片描述

現在我們把訓練樣本堆疊起來
在這裏插入圖片描述

這裏的每一個值z[1],a[1],z[2],a[2]對應各列也堆疊起來得到對應矩陣。
以如下A[1]爲例,對於Z[1],Z[2],A[2]也都成立。
在這裏插入圖片描述

最終就得到向量化形式,讓m個樣本同時計算。
在這裏插入圖片描述

在這裏定義X=A[0]X=A^{[0]},因爲單樣本時候曾經定義過x=a[0]x=a^{[0]},所以x(i)=a[0](i)x^{(i)}=a^{[0](i)}
這樣一來,4個向量化公式就可以寫作如下形式。後2個公式和前2個公式完全類似,只是上標不同而已。
z[1]=W[1]A[0]+b[1]z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}
A[1]=σ(Z[1])A^{[1]}=\sigma(Z^{[1]})
z[2]=W[2]A[1]+b[2]z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}
A[2]=σ(Z[2])A^{[2]}=\sigma(Z^{[2]})

到現在爲止,我們已經顯示了NN的不同層次的每一步計算。你可以發現其實只不過是同樣的計算不斷重複而已。

3.6 激活函數 Activation functions

使用NN時,需要決定使用哪種激活函數用隱藏層上,哪種用在輸出節點上。到目前爲止我們使用的都是sigmoid激活函數。但是,有時其他的激活函數效果會更好。

上一節公式A[1]=σ(Z[1])A^{[1]}=\sigma(Z^{[1]})中的σ\sigma就是我們熟悉的sigmoid激活函數。

a=σ(z)=11+e1a=\sigma(z)=\frac 1{1+e^{-1}}
在這裏插入圖片描述

一般情況,我們用g(z)來表示激勵函數,g可以是非線性函數,sigmod函數就是其中之一。

sigmod函數輸出是介於0和1之間,tanh函數或者雙曲正切函數比它表現更好。

a=tanh(z)=ezezez+eza=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}。如下圖,這個函數是介於+1和-1之間。
在這裏插入圖片描述

事實證明,如果你使用激勵函數tanh(z),效果總是要比sigmod要好。因爲它的輸出介於+1和-1之間,這樣激活函數輸出的平均值就更加接近0(而不是0.5),達到數據中心化效果。

這會使下一層學習更加容易一點,在下一門課中會詳細講解(算法優化相關)。

有一點要說明:吳恩達基本已經不用sigmoid激活函數了,tanh函數在所有場合都優於sigmoid函數。

但是有一個例外:在二分類的問題中,對於輸出層,因爲y的值是0或1,所以更合理的是讓預測值y^\hat y介於0和1之間,而不是在-1和+1之間,此時就需要使用sigmoid激活函數。

所以,多樣本向量化公式變爲,隱藏層激活函數變爲tanh函數。
z[1]=W[1]A[0]+b[1]z^{[1]}=W^{[1]}A^{[0]}+b^{[1]}
A[1]=tanh(Z[1])A^{[1]}=tanh(Z^{[1]})
z[2]=W[2]A[1]+b[2]z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}
A[2]=σ(Z[2])A^{[2]}=\sigma(Z^{[2]})

不同層可以採用不同的激勵函數。爲了表示不同的激活函數,在不同的層中,使用方括號上標來指出。本例中

  • g[1]表示隱藏層激勵函數
  • g[2]表示輸出層激勵函數

sigmoid函數和tanh函數兩者共同的缺點是,在z特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於0(也就是曲線上的點距離縱軸越遠),導致梯度下降的速度變慢。

在機器學習另一個很流行的函數是:修正線性單元的函數(ReLu)。

a=max(0,z)a=max(0,z)

  • z爲正,導數(斜率)恆爲1
  • z爲負,導數(斜率)恆爲0
  • z爲零,沒有意義。編程時候,z是等於0的時候,給導數賦值是1或者0都可以。

在這裏插入圖片描述

總結,選擇激活函數的經驗法則: 如果輸出是0和1(二分類問題),則輸出層選擇sigmoid函數,其它的所有單元都選擇Relu函數。

Relu函數是很多激活函數的默認選擇,如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用Relu激活函數。當然,偶爾也有人會使用tanh激活函數。

Relu的一個缺點是:當是負值的時候,導數等於0,在實際運用中這並沒有什麼問題。

Relu還有另外一個版本被稱爲帶泄露的Relu,Leaky Relu。當是負值時,這個函數的值不是等於0,而是一個很平緩的傾斜,通常這比Relu函數更加好,不過實際使用的頻率並不高。
在這裏插入圖片描述

由於Relu曲線右半部分的斜率大於0,所以在實際使用,如果足夠多的隱藏單元,讓z>0,對於大多數的訓練樣本來說,NN的學習速度通常會很快,比σ\sigma和tanh函數要快很多。

總結,不同激活函數的利弊:

  • sigmoid激活函數:除了輸出層是一個二分類問題基本不會用它。
  • tanh激活函數:tanh是非常優秀的,幾乎適合所有場合。
  • ReLu激活函數:最常用的默認函數,,如果不確定用哪個激活函數,就使用ReLu或者Leaky ReLu。

深度學習有一個特點:在建立NN時候經常有很多不同的選擇。例如:隱藏層單元的個數、激活函數的選擇、初始化權重等。有時候很難去定下一個準則,來確定什麼參數最適合你的問題。

一個建議是::如果不確定哪一個激活函數效果更好,可以把它們都試試,在交叉驗證集或者開發集上運行一下,然後看哪一種表現的更好,就去使用它。

通過在應用中測試不同的選擇,可以搭建出具有前瞻性的NN架構,對我們問題的特質更有針對性,讓算法的迭代更加流暢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章