深度學習筆記——理論與推導之DNN(三)
阿新 • • 發佈:2019-02-09
DNN
目錄
- 激勵函式(ReLU以及ReLU的變形,梯度消失問題)
- 成本函式
- 資料處理
- 優化
- 一般化
激勵函式:
Rectified Linear Unit(ReLU)
- 選擇Relu的原因:
- 計算速度快
- 生物原因
- 類似於具有不同偏差的無限個sigmoid
- 可以解決梯度消失問題
- sigmoid的問題(梯度消失問題):
sigmoid function的微分函式是藍色的線,我們可以發現,藍線上的所有值都處於(0,1)之間,而最大值出現在x = 0的位置,值為1/4。這會導致在backward pass中,因為每通過一個layer,Error signal就要乘以一個scalar(這個scalar就是sigmoid function的導數),導致Error signal會不斷被減弱,最終會導致Gradient越來越小。這會導致在neural network中越靠近input的gradient都比較小,這時,如果你選用的是一個constant learning rate,你就會發現靠近input的weight就會都比較小,也就會導致靠近input的weight值的變化會很小,也就是它learn的速度會比較慢。
- 那麼ReLU是如何解決梯度消失的問題呢?
這是由於ReLU的導數非0即1,因此不會削弱Error signal的值。
- 這裡需要考慮一個問題:
所有連線到偏導為0的weight都不會更新: - 可能的解決方法:
- softplus function
- initialize with large bias
- 然而這個問題不會照常太大影響,因為要對多個x進行訓練,所以基本上他的weight都會被訓練到。
- 這裡需要考慮一個問題:
- ReLU的變形:
- Parametric ReLU:
- Maxout ReLU:
所有的ReLU變形都是特殊的Maxout案例
左邊是一般的ReLU,綠色的線是藍線通過ReLU以後的變化;右邊是Maxout ReLU,只要找到適當的引數,Maxout也可以做出和一般ReLU一樣的事情。
由於w和b的值是根據data所learn出來的,所以Maxout可以也是一個可以被learn出來的activation function
如何去training maxout呢?
沒用到的z可以直接去掉,所以train的其實就是一個thin和linear的network
- Parametric ReLU:
成本函式:
- 直接輸出cost function可能存在一個問題:
雖然上面的y的cost function的值可能更小,但就我們對nerual network的理解,應該是下面的y更準確,因為值越大代表越重要。
- 解決方法:softmax,將softmax layer作為output layer。
softmax就是將所有的輸出值的和變為1。
如果我們用softmax layer作為output,那我們應該使用怎麼樣的cost function呢?
- 什麼樣的cost function是算是好的呢?output和pred相差很大時,我們的cost function需要得到較大的Error Signal,這樣在fixed learning rate時我們就能快速的學習。
- 什麼樣的cost function可以搭配softmax function呢?
這裡不要考慮除了r的其他維,因為我們這時候使用的是softmax,如果r維為1,或者r維儘量大,那麼其他維度就會變小。
- 接下來我們來看一下cost entropy的error signal(因為我們需要cost function越大時,error signal也要越大)
如果yr和1的差距越大,那麼error signal就會越大,反之越小,這樣的話就滿足了我們的要求。
i=r的時候:
下面計算i≠r的時候
資料處理:
優化
- Vanilla Graident Descent(就是之前的Gradient Descent)
- 如何判斷learning rate是否過大(過小):
- 當cost不減小,並且上下波動時,表示learning rate過大。
- 當cost遞減速度比較慢時,表示learning rate過小
- 當cost第一次下降就很多時,可能表示learning rate適當。
- 如何確定learning rate:
- 一個比較簡單的方法:在每次輸出中,減少learning rate的值
- 在開始的時候我們需要比較大的learning rtae
- 在靠近結尾的時候,我們會減小learning rate的值。
- 例如:
- Adagrad:將每個引數的學習率除以為它前一個偏導數的平均平方根。
下面是Adagrad的步驟:
- 什麼是最好的步伐呢(即learning rate)?
- 難道Larger gradient,larger steps一定是對的嗎?
如上圖所示,如果從x0要到達最低點-b/2a,那麼他的最好的步伐應該是|x0+b/2a|也就是|2ax0+b|/2a,2ax0+b其實就是曲線在x0的一階導數,表面上看larger gradient確實和larger steps成正比,然而我們忽略了2a,這個2a其實就是曲線在x0的二階導數,因此最好的步伐應該是|一階導數|/|二階導數|。 - 如果是多個引數呢?如下:
- 難道Larger gradient,larger steps一定是對的嗎?
- 然而你如果算二次微分的速度很慢的話,這樣計算learning rate就沒有意義。因為如果你的learning rate設定很小,那麼理論上說是可以達到一個比較好的結果的。這時候Adagrad就起到作用了,因為雖然這裡Adagrad只做了一次微分,但是它的分母對二次微分做了估算。
- 一個比較簡單的方法:在每次輸出中,減少learning rate的值
- 遇到local minima 和saddle point 怎麼辦?
- Momentum(動量):
動量其實就是模擬物理中小球下滑的過程,即Momentum不僅僅基於gradient,還基於上一次的movement(即上次下滑的gradient),如下:
Momentum的流程:
- Momentum(動量):
- 如何判斷learning rate是否過大(過小):
一般化
- 萬靈丹:
- 增加更多的training data
- 產生更多的training data,如旋轉等
- Early Stop(早點停下不迭代到指定的次數,不容易做到)
- Weight Decay:
我們在選引數的時候,我們都是根據training-set和cost function來決定,但其實我們更喜歡的是接近0的引數,因為如下情況:
因此,我們在做learning的時候,我們想要找的不僅僅是一組可以minimizing original cost的parameter,跟是希望parameter趨近於0,如下,定義一個cost function
接下來我們對新的cost function做偏微分
這也就是wt+1會小於wt - Dropout:
- 在神經網路中,大規模的神經網路有兩個缺點:費時和容易過擬合。而dropout的程式可以很好的解決過擬合問題,每次做完dropout,相當於從原始的網路中找到一個更瘦的網路。
- dropout就是在每次迭代中,丟棄p%的神經元。
- 要注意的是如果在training中dropout=0.5,wij = 1,那麼在Test中wij應該等於wij = 1*(1-0.5) = 0.5
因為這個時候的testing中的z這個時候就是training中z的兩倍,因此weights就需要乘以(1-dropout)%
- 為什麼dropout的效果更好呢?
可以將其理解為訓練不同的網路後,對不同網路進行整合,雖然從直觀上看dropout是整合(ensemble)在分類效能上的一個近似,然而實際中,dropout畢竟還是在一個神經網路上進行的,只訓練出了一套模型引數,那麼為什麼dropout有效呢?因為dropout強迫一個神經單元,和隨機挑選出來的其他神經單元共同工作,達到好的效果。消減了神經元節點之間的聯合適應性,增強了泛化能力。如下:
使用一個data訓練一個網路,在這個網路中還有引數共享的部分,如果有一共有M個神經元,那麼就能構建出2^M個可能的網路。
- 對於dropout的一些可行性建議:
- 更大的網路:如果你需要n個神經元,那麼對於dropout = p%的網路來說,你的網路就需要n/(1-p)個神經元。
- 更長的訓練時間:
- 更高得到learning rate:
- 更大的momentum: