# Tips for Deep Learning ![](https://i.imgur.com/Bu2Z9h9.png) :::info ### Not good on traning-data 模型沒有被適度訓練,兩種解決方法。 * [1]更換activation function :::spoiler 梯度消失問題(Vanishing Gradient Problem on Sigmoid) 由於Sigmoid的特性,***輸入值的變化會被壓縮***,所以經過deep network後,gradient會逐漸變小,導致learning緩慢,參數幾乎停留在random。 ![](https://i.imgur.com/1yMTbzy.png) * 此時模型效率很差,因為後面的neural幾乎base on random值。 ::: * ReLU ReLU為線性函數,可以解決梯度消失問題,同時input<0時等同於放棄神經元。 ![](https://i.imgur.com/LLRBnda.png) * Maxout ![](https://i.imgur.com/VrMntmu.png) :::spoiler Maxout的activation function會隨w,b改變(learnable),一個Group如果有n個點,則對應的activation function會有n-1個轉折點。 ![](https://i.imgur.com/BMH5EHb.png) 訓練時,選定最大值,就將activation function視為線性,進行微分運算。 ![](https://i.imgur.com/v0i6uyn.png) ::: * [2]調整learning rate * RMSProp替代Adagrad 藉由調整$\alpha$的值,可以使得最近的梯度影響較大,適應同方向快速變動的梯度。 ![](https://i.imgur.com/V9t7rjI.png) :::spoiler 原理 Adagrad方法,每一個gradient的權重都相同(平均) ![](https://i.imgur.com/46uIjTA.png) 藉由調整權重,在下圖中可以更快適應同方向的梯度變化。 ![](https://i.imgur.com/HMIPDRL.png) ::: * Momentum (動量) 每一次權重更新,不只考慮gradient,同時考慮上次權重移動的慣性。 v1=$\lambda$*v0+$\eta$*gradient ![](https://i.imgur.com/qaApVkN.png) :::spoiler 原理 現實中,球滾落高地時,會帶有動量,可以突破local minimum。 ![](https://i.imgur.com/mfIONkS.png) ::: ::: :::warning ### Not good on testing data * Early Stopping 防止過度擬合 ![](https://i.imgur.com/8K0tnhN.png) * Rrgularization * L2 Regularization 每次更新weight都相當於乘上小於1的數,最後weight會趨近於0(不一定等於0,會在前後項間平衡)。 ![](https://i.imgur.com/9YLYR1b.png) * L1 Regularization 每次更新weight都加減1個數(>0為減,<0為加),會使得權重趨近於0,或是一個很大的數(加減1沒辦法使大數歸零)。 ![](https://i.imgur.com/CgfXrB5.png) :::spoiler 原理 * 初始化的weight都接近0,但每次的訓練會把weight推離0,通過正規化防止過度訓練。 * 模擬人腦運作,拋棄不必要的神經元。 ![](https://i.imgur.com/aBDHJ99.png) ::: * Dropout 每次訓練,有p%的機率不使用神經元。而實際使用時,使用所有神經元,但將各項weight乘上(1-p)% ![](https://i.imgur.com/MMaIQtJ.png) :::spoiler 原理 * 每次訓練時,都會有不同神經元被啟用,可以看做設計了一大把network,再將計算的總合作平均。 ![](https://i.imgur.com/p60eMmK.png) * 實際上只有activation function為線性時,能視為一堆模型。因此Dropout對ReLU/Max-Out之類的線性函式進步較大。 ![](https://i.imgur.com/HlMhlMK.png) ::: ::: ###### tags: `ML2020`