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})爲例
爲了描述的簡便,先忽略掉b[1]。因爲利用 Python 的廣播機制,可以很容易的將b[1]加進來。
定義訓練集矩陣X,是將所有樣本向量堆疊起來得到。本例只有3個樣本,如果有更多的樣本,只需要繼續橫向堆疊上去。
然後我們可以推導得到
Z[1]也是列向量的堆疊形成,這些是特徵樣本(featturing examples)。
現在你可以明白,爲什麼之前我們對單個樣本的計算要寫成
這是上一節介紹的多樣本向量化4個公式中的第一個。
事實證明,類似的分析邏輯同樣適合另外3個公式。即如果將輸入按列向量橫向堆疊進矩陣,那麼通過公式計算之後,也能得到成列堆疊的輸出。
總結一下
對於以下雙層單一隱藏層(淺層)NN網絡
如果你要在單個訓練樣本中實現正向傳播算法,就需要i從1到m遍歷。
現在我們把訓練樣本堆疊起來
這裏的每一個值z[1],a[1],z[2],a[2]對應各列也堆疊起來得到對應矩陣。
以如下A[1]爲例,對於Z[1],Z[2],A[2]也都成立。
最終就得到向量化形式,讓m個樣本同時計算。
在這裏定義,因爲單樣本時候曾經定義過,所以。
這樣一來,4個向量化公式就可以寫作如下形式。後2個公式和前2個公式完全類似,只是上標不同而已。
到現在爲止,我們已經顯示了NN的不同層次的每一步計算。你可以發現其實只不過是同樣的計算不斷重複而已。
3.6 激活函數 Activation functions
使用NN時,需要決定使用哪種激活函數用隱藏層上,哪種用在輸出節點上。到目前爲止我們使用的都是sigmoid激活函數。但是,有時其他的激活函數效果會更好。
上一節公式中的就是我們熟悉的sigmoid激活函數。
一般情況,我們用g(z)來表示激勵函數,g可以是非線性函數,sigmod函數就是其中之一。
sigmod函數輸出是介於0和1之間,tanh函數或者雙曲正切函數比它表現更好。
。如下圖,這個函數是介於+1和-1之間。
事實證明,如果你使用激勵函數tanh(z),效果總是要比sigmod要好。因爲它的輸出介於+1和-1之間,這樣激活函數輸出的平均值就更加接近0(而不是0.5),達到數據中心化效果。
這會使下一層學習更加容易一點,在下一門課中會詳細講解(算法優化相關)。
有一點要說明:吳恩達基本已經不用sigmoid激活函數了,tanh函數在所有場合都優於sigmoid函數。
但是有一個例外:在二分類的問題中,對於輸出層,因爲y的值是0或1,所以更合理的是讓預測值介於0和1之間,而不是在-1和+1之間,此時就需要使用sigmoid激活函數。
所以,多樣本向量化公式變爲,隱藏層激活函數變爲tanh函數。
不同層可以採用不同的激勵函數。爲了表示不同的激活函數,在不同的層中,使用方括號上標來指出。本例中
- g[1]表示隱藏層激勵函數
- g[2]表示輸出層激勵函數
sigmoid函數和tanh函數兩者共同的缺點是,在z特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於0(也就是曲線上的點距離縱軸越遠),導致梯度下降的速度變慢。
在機器學習另一個很流行的函數是:修正線性單元的函數(ReLu)。
- 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的學習速度通常會很快,比和tanh函數要快很多。
總結,不同激活函數的利弊:
- sigmoid激活函數:除了輸出層是一個二分類問題基本不會用它。
- tanh激活函數:tanh是非常優秀的,幾乎適合所有場合。
- ReLu激活函數:最常用的默認函數,,如果不確定用哪個激活函數,就使用ReLu或者Leaky ReLu。
深度學習有一個特點:在建立NN時候經常有很多不同的選擇。例如:隱藏層單元的個數、激活函數的選擇、初始化權重等。有時候很難去定下一個準則,來確定什麼參數最適合你的問題。
一個建議是::如果不確定哪一個激活函數效果更好,可以把它們都試試,在交叉驗證集或者開發集上運行一下,然後看哪一種表現的更好,就去使用它。
通過在應用中測試不同的選擇,可以搭建出具有前瞻性的NN架構,對我們問題的特質更有針對性,讓算法的迭代更加流暢。