1. 程式人生 > >吳恩達-深度學習-課程筆記-8: 超參數調試、Batch正則化和softmax( Week 3 )

吳恩達-深度學習-課程筆記-8: 超參數調試、Batch正則化和softmax( Week 3 )

erp 搜索 給定 via 深度 mode any .com sim

1 調試處理( tuning process )

如下圖所示,ng認為學習速率α是需要調試的最重要的超參數。

其次重要的是momentum算法的β參數(一般設為0.9),隱藏單元數和mini-batch的大小。

第三重要的是神經網絡的層數和學習率衰減

adam算法的三個參數一般不調整,設定為0.9, 0.999, 10^-8。

註意這些直覺是ng的經驗,ng自己說了,可能其它的深度學習研究者是不這麽認為的。

那麽如何選擇參數呢?下面介紹兩個策略,隨機搜索和精細搜索。

早一代的機器學習算法中,如下圖左側,會在網格中比如按5*5的行列取樣點進行嘗試,參數少的話這麽做是可以的。

在深度學習中,我們做的是隨機選擇點,如下圖右側,在網格中隨機選25個點進行嘗試,因為對於你要解決的問題你很難知道哪個超參數最重要,比如參數1是α,參數2是ε,α是比較重要的需要調整,而ε一般不需要怎麽調整,你就會發現不管ε怎麽變都沒多大影響,但是α只取了5個點進行嘗試,如果你隨機取的話,可能α就進行了更多點的嘗試。

技術分享圖片

另一個慣用的策略是從粗糙到精細( coarse to fine ),當你用隨機取點得到最好的點時,你可能會發現周圍的點效果也很好,你就縮小範圍,在這個更小的這個方格內做隨機取點嘗試,更密集地取值。

技術分享圖片

2 為超參數選擇合適的範圍( Using an appropriate scale to pick hyperparameters )

對於隱藏單元數比如說從50-100隨機選一個數,或者對於隱藏層數從2-4隨機選一個數,看上去還是挺合理的。

但是對於其它超參來說,比如學習率,如果你在0.0001和1之間隨機取值,那麽取到0.1到1之間的數的概率是90%,而在0.0001和0.1之間我們就很難取到數,這是不合理的,這個時候應該分段用log來取,0.0001到0.001之間用( -4到-3之間隨機取),0.001到0.01之間用(-3到-2之間隨機取),0.01到0.1之間用(-2到-1之間隨機取),0.1到1之間用(-1到0隨機取),可以認為是在-4到0之間隨機取一個值。在python中可用 10 ^ ( -4 * np.random.rand() ) 表示在0.0001和1之間隨機取一個值。

另外一個問題是給β取值,比如你認為0.9到0.999是搜索範圍,那麽0.9意味著平均10個值,0.999意味著平均1000個值,這種情況我們考慮1-β的範圍為0.001到0.1,用上面所說的方法分成0.001到0.01之間用(-3到-2之間隨機取),0.01到0.1之間用(-2到-1之間隨機取),可以認為是在在-3到-1之間隨機取一個值。因為在不同範圍變化的造成的變化大小不同,所以需要這樣來取值,舉個例子,當β很靠近1時候,小小的變化會造成很大的變化,比如0.9990到0.9995,一個是平均1000個值,一個是平均2000個值。而從0.9變化到0.9005,都是平均10個值,造成的變化很小。在靠近1的區域,需要更密集地取值。

3 超參數訓練的實踐:Pandas VS Caviar ( Hyperparameters tuning in practice: Pandas vs Caviar )

Babysitting one model:在你CPU/GPU資源匱乏,計算能力不足的時候,訓練一個模型,每天觀察你模型的學習曲線,每天做一些參數的調整來使你模型保持良好的訓練表現。

Training many models in parallel:同時訓練不同參數的模型,觀察它們的學習曲線(比如代價函數的下降曲線),選擇最好的那一個。

ng把第一種方法稱為pandas,因為熊貓有了孩子後,它們的孩子非常少,它們花很多經歷撫養熊貓寶寶確保它能成活。

第二種方法稱為caviar,它類似魚類的行為,它會產生很多卵,但不對任何一個多加照料,只希望其中一個,其中一群能夠表現出色。

4 網絡的歸一化( Normalizing activations in a network )

之前講過對神經網絡的原始特征輸入進行歸一化,可以加速訓練,更快收斂。

同理,對於某一層的輸出,我們也可以做歸一化,這樣利於下一層的參數訓練,這就是Batch Normalization。

深度學習的文獻中存在爭議,有人覺得在每一層的激活之後再歸一化,有人覺得再激活之前先歸一化,ng的默認選擇是後一種,對z進行歸一化,然後再激活。

具體怎麽做呢,如下圖所示,對於每一層,求出給定樣本的均值和方差,用原來的每個z減去均值,再除以方差,為了防止分母為0加上一個很小的ε,這樣得到的就是一個均值為0,方差為1的一些數據。和原始特征輸入不一樣的是,我們不想讓隱藏單元總是含有均值為0,方差為1的數據,也許隱藏單元含有不同的分布會更有意義,所以這裏加多一步計算,乘以gamma,然後加上beta,這兩個參數通過梯度下降學習得到,跟權重類似,它使得你可以構造含有其他均值和方差的隱藏單元數據,如果gamma為方差(加ε),beta為均值,那麽這個z就是原來的z,相當於沒有變化。

對於後面那個公式,舉個例子,比如我們想利用simoid的特性,不想讓所有數據都集中在中間靠近0的那一塊區域,我們想讓它的方差更大,所以對它進行運算變化。或者可以理解成我們把隱藏層的均值和方差限定為某個值,不單單是0和1,而是這個值有更多選擇,它由兩個參數gamma和beta來學習,這裏註意一下gamma和beta的維度和z是一致的,(n,1),n表示該隱藏層的單元數。

技術分享圖片

5 Batch Norm為什麽奏效( Why does Batch Norm work ? )

假如我在第3層得到了一些值,第3層到輸出層之間的網絡在做一個對(第三層的輸入,最終輸出)的映射預測,但是訓練的時候前面的第2層第1層的權重也會改變,它會對第三層造成一定的影響。我們在第三層做了一個BN,就認為是把第三層的輸入做了一個規範化,把數據規範在均值和方差為某個值的一個分布上。可以理解為這樣做減少了前層對後層的影響,後層更容易去適應前層的更新,使每層可以自己學習,稍微獨立於其它層,這有助於加速整個網絡的學習。

BN還有一個輕微的正則化作用,首先對均值的方差計算是在mini-batch上進行而不是整個數據集進行的,那本身就含有一定的噪音。其次在利用均值和方差進行轉換的時候,因為均值和方差是帶噪音的,所以這個過程也會加入噪音。所以它對隱藏單元施加了一些噪音,使得後層的隱藏單元不過分依賴任何一個隱藏單元。因為添加的噪音很微小,並不是很大的正則,可以把它和dropout一起用。順帶一說,BN不是正則,不要把它看成正則。

6 測試時的Batch Norm( Batch Norm at test time )

在訓練的時候我們在一個mini-batch上做了BN,那測試的時候對於一個樣本,如何來實施BN呢,估算u和方差的方式有好多種,ng介紹了一種做法。

對於某個隱藏單元,我們對每個mini-batch求出的u做指數加權平均得到一個u,對每個mini-batch求出的方差做指數加權平均得到一個方差,用得到的這兩個數作為測試時那個隱藏單元進行運算的u和方差。

7 softmax回歸( softmax regression )

這一節講多分類和softmax。

約定符號C表示類別個數,則輸出層的單元個數為C,輸出C個概率,表示分到某一類的概率為多少,C個概率加起來為1,這一層就是平常說的softmax層。

softmax層是如何計算的呢,首先z跟往常的計算方法一樣,然後計算t = e ^ z,如下圖所示,假設有4個類別要分類,z的shape是4*1,t也是4*1。

然後計算a,a就是計算(某個分量t)占(4個t分量的和)的比例,這就是分到各個類別的概率。

softmax層的特殊之處就是它是輸入一列向量,輸出一列向量,它是整個層的一個激活函數。而之前的sigmoid或relu都是從實數到實數,是某個單元的激活。

softmax這個名字的來源是與hardmax進行對比,hardmax就是把向量中最大的那個置1,其它置0。

softmax是邏輯回歸的推廣,當softmax的C等於2的時候實際上就是一個邏輯回歸。

技術分享圖片

然後我們來看看softmax的損失計算,和邏輯回歸的損失有點類似,它計算每個輸出單元和真實概率的交叉熵然後累加,這樣,對於真實值為0的那樣項就全部為0了,所以在優化的時候就是使得真實值為1的那個單元的輸出概率盡量大,交叉熵就會盡量小。另外,如果想自己實現softmax的反向傳播的話,記住最後一層的dz = y^ - y,可以自己推導驗證一下。

技術分享圖片

8 深度學習框架和Tensorflow( deep learning framework and tensorflow)

最後兩節講的是深度學習框架的選擇和tensorflow的基本使用,這些我就不記錄了。

吳恩達-深度學習-課程筆記-8: 超參數調試、Batch正則化和softmax( Week 3 )