1. 程式人生 > >python 深度學習(3) -- 模型優化準則

python 深度學習(3) -- 模型優化準則

(一)啟用函式的選擇

在前面我們提到的啟用函式是 sigmoid 函式,但 sigmoid 函式有一個很大的侷限性,就是當 x 增大或減少時,它的梯度變得越來也小。如果使用梯度下降或類似的方法,就存在問題。也就是 梯度消失問題 。因為大的負數變為 0 ,大的整數變成 1 這意味著大面積的輸入空間被對映到一個非常小的範圍。

使用不會將輸入空間壓縮成狹小範圍的啟用函式,將可以避免梯度消失的問題。用“非擠壓式”函式替換“擠壓式”函式能顯著的改善深度神經網路的效能。

最常用的“非擠壓式”函式之一就是 線性整流函式 ReLu,它的定義是: f(x) = max(x,0)

該啟用函式非常流行,因為其顯著的提高了語音識別和計算機視覺任務的分類率。該函式只有在輸出神經元是正的時候,它才會允許啟用。使用 ReLu 代替前面的 sigmoid 函式如下

fit2 = Regressor(
            ''' 使用線性整流函式,最後指定一個線性輸出(迴歸問題的標準) '''
            layers = [Layer("Rectifier",units = 6),Layer("Rectifier",units = 4),Layer("Linear")],
            learning_rate = 0.002,
            random_state = 2018,
            n_iter = 10)  

(二)層數 & 神經元的選擇

這個只能根據嘗試和經驗法則:函式越複雜,需要使用的層數越多;訓練模式的數量越多,可使用的神經元數量越多,更多的神經元可以檢測資料中的良好結構和規律

。但層數越多會使得模型越複雜,過擬合的風險就越大。因此建議遵循 奧卡姆剃刀法則

(三)奧卡姆剃刀法則

簡約之法則:若無必要,勿增實體”-- 奧卡姆剃刀法則

   1.如果較小的一組屬效能充分擬合觀測值,便使用這些屬性。避免“疊加”附加屬性來提高模型的 擬合度
   2.選擇需要最少假設的建模方法
   3.只保留那些與假設的預測有明顯差異的假定子集
   4.如果幾種假設能同樣好的解釋一種現象,通常在開始選擇最簡單的一個

   5.如果幾個模型具有相同的預測精度,請選擇最簡單的模型

(四)奧卡姆法則 -- 正則化

在構建深度神經網路時,面臨的永遠存在的問題就是過擬合。過擬合的結果是模型在訓練集上表現的非常不錯,但是在測試樣本上都是失敗的。為了降低深度神經網路的複雜度並提高泛化能力的一個常見的網路限制方法就是 正則化

。正則化限制了模型的複雜度,這意味著正則化可能會降低模型在訓練資料集上的表現。當然可能也不會降低,正則化將通過抑制網路權重避免其變得非常大。正則化有兩種,第一種是 L1 正則化,使用權重絕對值的和 。第二種是 L2 正則化,使用權重的平方和。

加入正則化的程式碼如下:權重衰減引數 0.001

fit4 = Regressor(
            layers = [Layer("Rectifier",units = 6),Layer("Rectifier",units = 14),Layer("Linear")],
            learning_rate = 0.02,
            random_state = 2018,
            ''' 加入正則化 '''
            regularize = "L2",
            weight_decay = 0.001, # 權重衰減引數
            n_iter = 10)

如果正則化後的模型在訓練集上的表現相對於不使用正則化來說並沒有太大的減弱,則使用正則化簡化模型將可以避免過擬合

備註:

1.網路權重的凍結

凍結優化模型的權重後,可以將其用於未來資料而不必重新訓練模型。這可以通過指定凍結引數來實現。

# 指定 frozen 引數
fitFr = Regressor(
                layers = [Layer("Rectifier",units = 6,frozen = True),Layer("Rectifier",units = 14,frozen = True),
                                                    Layer("Linear")],
                learing_rate = 0.02,
                random_state = 2018,
                regularize = "L2",
                weight_decay = 0.001,
                n_iter = 100)

這裡所有層都被凍結。也可以凍結特定的層,如果想調查非凍結層的權重如何響應輸入屬性,這樣做會很有用

2.模型的儲存 & 載入

相對於 TensorFlow 來說,這裡的儲存和載入方式很簡潔。

# 儲存模型
import cPickle
f = open("Boston_fit4.pkl","w")
cPickle.dump(fit4,f)
f.close()

# 載入模型
f = open("Boston_fit4.pkl")
fit4 = cPickle.load(f)
f.close()