一、調試處理
week2中提到有如下的超參數:
- α
- hidden units
- mini-batch size
- β
- layers
- learning rate decay
- \(β_1,β_2,ε\)
顏色表示重要性,以及調試過程中可能會需要修改的程度。
那么如何選擇超參數的值呢?
- 首先是粗略地隨機地尋找最優參數
建議使用圖右的方式,原因如下:
對於圖左的超參數分布而言,可能會使得參考性降低,我們假設超參1是學習率α,超參2是ε,根據week2中Adam算法的介紹,我們知道ε的作用幾乎可以忽略,所以對於圖左25中參數分布來說,其本質只有5種參數分布。而右邊則是25種隨機分布,更能幫助我們選擇合適的超參數。
- 其次在上面找到的最優參數分布周圍再隨機地尋找最有參數

二、為超參數選擇合適的范圍
上一節提到的的隨機采樣雖然能幫助我們尋找最優參數分布,但是這有點像大海撈針,如果能夠指出參數取值的范圍,然后再去尋找最優的參數分布豈不是更加的美滋滋?那如何為超參數選擇合適的范圍呢?
- \(n^{[l]}=50,……,100\)
- layers=2~4
- α=0.0001,……,1
此時需要注意了,如果按照線性划分的話(如下圖),那么隨機采樣的值90%的數據來自[0.1,1]這個區間,這顯然與不太符合隨機性。
所以為了改進這一問題,我們需要將區間對數化來采樣。例如我們將[0.0001,1]轉化成四個區間[0.0001,0.001],[0.001,0.01],[0.01,0.1],[0.1,1],再轉化成對數就是[-4,-3],[-3,-2],[-2,-1],[-1,0]。($10^{-4}=0.0001$,其他同理取指數)。
然后我們可以用Python中提供的方法來實現隨機采樣:
r = -4*np.random.rand() # rand()表示在[0,1]上均勻采樣, 最后的采樣區間是[-4, 0]
a = pow(10, r)
- β=0.9,……,0.999
同理這里也不能使用線性軸來采樣數據,我們可以通過對1-β=0.1,……,0.001來間接采樣。轉化成[0.1, 0.01],[0.01,0.001],轉化成對數指數[-1,-2],[-2,-3]。 即$r∈[-3,-1],1-β=10r,β=1-10r$,
三、超參數訓練的實踐: Pandas VS Caviar
- Babysitting one model 這種方法適用於有足夠的數據集,但是GPU,CPU資源有限的情況,所以可能只能訓練一個模型,然后每天對模型做某一項超參數的修改,查看效果是否變得更好,如下圖示
例如第一天令所有超參數隨機初始化。到了第二天發現效果還不錯,此時可以去增加學習率(也可以修改其他參數)。……,到了某一天加入修改了mini-batch size,結果效果明顯減弱,這時則需要重新恢復到前一天的狀態。
總的來說這一過程就像熊貓一樣,只照顧一個寶寶,多的照顧不過來。
- Train many models in parallel
這種方法適用於財大氣粗的情況,即並行訓練多個模型,最后選出效果最好的一個即可。這就像魚子醬一樣,一下生多大一億的孩子~~

四、正則化網絡的激活函數
1.歸一化輸入數據
其實不僅僅只是歸一化輸入數據X,隱藏層的數據也是要歸一化的。但是一般來說隱藏層數據有$Z$和$a$兩種,在該視頻教程中吳大大推薦歸一化$z$。
- 輸入數據歸一化方法:
\(μ=\frac{1}{m}\sum_{i}{x^{(i)}}\)
\(σ^2=\frac{1}{m}\sum_{i}x^{(i)^2}\)
\(x=\frac{x-μ}{σ^2}\)
- 隱藏層數據歸一化方法
\(μ=\frac{1}{m}\sum_{i}{z^{(i)}-μ}\)
\(σ^2=\frac{1}{m}\sum_{i}(z^{(i)^2}-μ)^2\)
\(z^{(i)}_{norm}=\frac{z^{(i)}-μ}{\sqrt{σ^2+ε}}\)
上面得到的歸一化后的數據$z$都是服從均值為0,方差為1的,顯然這樣不能滿足咱們的需求,所以還需要做進一步處理,如下:
\(\tilde{z}^{(i)}=γz^{(i)}\)+β 上式中的$γ$可以設置方差,$β$可以設置均值。
五、將Batch Norm擬合進神經網絡
adding batch Norm to a network

working with mini-batches
一般的方法中
\(z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}\)
在上面歸一化數據過程中需要減去均值,所以$b^{[l]}$這一項可以省略掉,所以歸一化后是
\(z_{norm}^{[l]}=w^{[l]}a^{[l-1]}\) 為了能夠使數據分布更加滿足我們的要求,可以用如下公式
\(\tilde{z}^{[l]}=γ^{[l]}z_{norm}^{[l]}+β^{[l]}\)
Implementing gradient descent
for t= 1,……,numMinBatches
- 計算基於第t批數據的前向傳播
- 在計算反向傳播時使用$\tilde{[l]}$,得到$dw{[l]},dβ^{[l]},dγ^{[l]}$
- 更新參數 \(w^{[l]}=w^{[l]}-αdw^{[l]}\) \(β^{[l]}=β^{[l]}-αdβ^{[l]}\) \(γ^{[l]}=γ^{[l]}-αdγ^{[l]}\)
六、Batch Norm為什么奏效
- 原因一
batch norm可以使得權重比你的網絡更滯后或更深層,為了更好地理解可以看下面的例子:
如上圖所示,假設我們現在要計算第三層隱藏層的值,很顯然該層的計算結果依賴第二層的數據,但是第二層的數據如果未歸一化之前是不可知的,分布是隨機的。而如果進行歸一化后,即$\tilde{[2]}=γ{[2]}z_{[2]}+β{[2]}$可以將第二層數據限制為均值為$β^{[2]}$,方差為$γ^{[2]}$的分布,注意這兩個參數並不需要人為設置,它會自動學習的。所以即使輸入數據千變萬化,但是經過歸一化后分布都是可以滿足我們的需求的,更簡單地說就是歸一化數據可以減弱前層參數的作用與后層參數的作用之間的聯系,它使得網絡每層都可以自己學習。
- 原因二
batch norm奏效的另一個原因則是它具有正則化的效果。其與dropout有異曲同工之妙,我們知道dropout會隨機的丟掉一些節點,即數據,這樣使得模型訓練不會過分依賴某一個節點或某一層數據。batch norm也是如此,通過歸一化使得各層之間的依賴性降低,並且會給每層都加入一些噪聲,從而達到正則化的目的。
七、 測試的Batch Norm
前面提到的batch norm都是基於訓練集的,但是在測試集上,有時候可能我們的測試數據很少,例如只有1個,在這個時候進行歸一化則顯得沒多大意義了。那么該怎么辦呢?均值$μ$和方差$σ^2$該如何確定呢?
方法還是有的,而且已經在上面提到過了。
沒錯,真聰明!!!就是第三節所介紹的指數加權平均啦,原理是類似的。
假設一共有如下$x^{{1}},x^{{2}},……,x^{{5000}}$的批量數據,每組mini-batch都得到了對應的均值$μ$(方差同理,不詳細說明了),即$μ^{{1}},μ^{{2}},……,μ^{{5000}}$,如果測試集數據很少,那么就可以使用指數加權平均的方法來得到測試集的均值和方差。
之后就根據指數加權平均計算得到的值來計算歸一化后的輸入值即可。

注意:測試集的均值和方差生成的方式不一定非得是上面提到的指數加權平均,也可以是簡單粗暴的計算所有訓練集的均值和方差,視頻中吳大大說這也是可行的~
八、 Softmax回歸
前面教程中提到的分類算法例子都是二分類問題,即是或不是。但是當我們要區分多種事物時該怎么辦呢?這時就需要softmax算法登場了。
假設第$l$層有$z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}$,激活函數為$a^{[l]}=\frac{e^{z^{[l]}}}{\sum_e{z^{[l]}_j}}$
該節視頻中吳大大並沒有很詳細的介紹softmax的原理和公式推導,感興趣的可以戳如下鏈接進行進一步了解:
九、 訓練一個Softmax分類器
具體實踐項目可參見softmax分類算法原理(用python實現)
十、 深度學習框架
介紹了很多深度學習框架,這里不再詳述。感興趣的伙伴們可以Google一下,或者某度一下~~~。
十一、 TensorFlow
演示了一下TensorFlow使用方法,這里不再詳述,不過我推薦一個比較好的TensorFlow的練手項目:
