神經(jīng)網(wǎng)絡過擬合的處理方法
獲取更多的訓練數(shù)據(jù)
調(diào)節(jié)模型允許存儲的信息量
模型越小宝冕,越不容易過擬合。因為當模型容量很大的時候邓萨,網(wǎng)絡會學習到一種類似全映射的方式地梨。好比如反正能記住,所有的圖片對應的答案都記下來缔恳。這會導致泛化能力變差宝剖。如果你去約束他的記憶容量,然后通過訓練避免網(wǎng)絡模型去提取壓縮有效的內(nèi)在映射關(guān)系歉甚。這樣會幫助提升泛化能力万细。
添加權(quán)重正則化
這里的前提是這樣一個經(jīng)驗, 模型的參數(shù)值分布的熵越小的模型越不容易過擬合纸泄, 這個前提就當經(jīng)驗好了赖钞,為啥不知道。所以我們希望訓練出來的參數(shù)逼近正態(tài)分布聘裁,均值為0雪营。 對于大的參數(shù)進行懲罰,讓網(wǎng)絡訓練通過懲罰反饋衡便,不斷的把參數(shù)中的大值打壓下去献起。
要實現(xiàn)這個目的,方法是镣陕,在計算傳遞損失的時候征唬,添加懲罰值。
from keras import regularizers
model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(10000,)))
...
上面代碼中regularizers.l2(0.001)
表示在損失反向傳遞的時候茁彭,在計算損失的時候,要加上權(quán)重矩陣引起的懲罰扶歪,該層權(quán)重矩陣每個系數(shù)的平方*0.001作為懲罰值添加到損失中理肺。這個損失只有在訓練的時候添加摄闸,在測試的時候是不懲罰的。
dropout正則化
對某一層使用dropout妹萨,就是在訓練過程中隨機把該層的輸出舍棄一些年枕。(設置為0)同時因為測試時沒有單元被舍棄,所以需要該層的輸出值按dropout比例縮小(這個純粹就講不出啥道理了)
通常測試中為了讓測試時輸出不變乎完,訓練時dropout往往這樣實現(xiàn)
layer_output *= np.random.randint(0,high=2,size=layer_output.shape)
layer_output /= 0.5 #注意因為隨機丟掉了一半熏兄,這里參數(shù)要擴大一倍(感覺是經(jīng)驗做法)
在keras可以通過dropout層向網(wǎng)絡中引入正則化。dropout將被應用與前面一層的輸出
model.add(layers.Dropout(0.5))
機器學習模型建立的通用流程
1 定義問題,收集數(shù)據(jù)集
要明確并整理你要用機器學習解決的問題. 他的輸入是什么,輸出是什么. 要收集足夠的數(shù)據(jù)集. 并且這些數(shù)據(jù)集包含足夠的學習信息(輸入到輸出的各種映射關(guān)系都涵蓋).
2 選擇衡量成功的指標
這個涉及的是如何計算損失树姨。對于平衡分類問題(每個類別的可能性相同)摩桶,精度和接收者操作特征曲線下面積是常用指標,對于類別不平衡的問題帽揪,可以使用準確率硝清, 這里精度和準確率的區(qū)別是啥?转晰?芦拿?
3確定評估方法
根據(jù)數(shù)據(jù)集的大小可以選擇
- 留出驗證集
- K折交叉驗證
- 重復的K折交叉驗證
3準備數(shù)據(jù)
比如將數(shù)據(jù)格式化為張量(因為神經(jīng)網(wǎng)絡的輸入必須是張量)
比如把張量的取值縮放到較小的值范圍
比如當不同的特征具有不同的取值范圍的時候,進行數(shù)據(jù)標準化
你可能需要做特征工程查邢,尤其是對于小數(shù)據(jù)問題 (這句話不理解)