所謂過拟合,指的是當一個模型過為複雜之後,它可以很好的“記憶”每一個訓練資料中随機噪音的部分而忘記了要去“學習”訓練資料中通用的趨勢。
舉一個極端的例子,如果一個模型的參數比訓練資料的總說還多,那麼隻要訓練資料不沖突,這個模型完全可以記住所有訓練資料的結果進而使得損失函數為0。然而,過度拟合訓練資料中的随機噪音雖然可以得到非常小的損失函數,但是對于未知資料可能無法做出可靠的判斷。
下圖顯示了模型訓練的三種不同情況。分别展示了模型欠拟合、just right、以及模型過拟合。
為了避免過拟合問題,一個常用的方法就是正則化。簡單而言,正則化的思想就是在損失函數中假如刻畫模型複雜程度的名額。通俗點說,假設損失函數為J(θ),那麼在優化時不僅僅優化J(θ),而是優化J(θ)+λR(w),其中R(w)刻畫的是模型的複雜程度,而λ表示模型複雜損失在總損失中的比例。這裡θ表示的是一個神經網絡中所有的參數,包括權重w和偏置項b。一般而言模型的複雜度隻由權重w決定。
神經網絡中常用的正則化方法和一般機器學習的正則化類似,有兩種,一種是L1正則化,計算公式為
另一種是L2正則化,計算公式是:
無論以上哪一種正則化方式,基本的思想都是希望通過限制權重的大小,使得模型不能任意拟合訓練資料中的随機噪聲。但是這兩種正則化的方法有很大差別。首先,L1正則化會讓參數變得稀疏,而L2正則化不會。所謂參數變得更加稀疏是指會有更多的參數變成0,這樣可以達到類似特征選取的功能。下圖解釋了L1會讓參數變得稀疏的原因,從上到下依次為L1正則化、L2正則化。
其次,L1正則化的計算公式不可導,而L2正則化公式可導,因為在優化時需要計算損失函數的偏導數,是以對含有L2正則化損失函數的優化要更加簡潔,優化帶有L1正則化的損失函數要更加複雜。在實踐中,也可以将L1正則化和L2正則化同時使用:
在TensorFlow中,
L1正則:
tf.contrib.layers.l1_regularizer(scale, scope=None)
L2正則:
tf.contrib.layers.l2_regularizer(scale, scope=None)
L1正則和L2正則同時使用:
tf.contrib.layers.l1_l2_regularizer(scale_l1=1.0, scale_l2=1.0, scope=None)
以下代碼給出了使用這兩個函數的樣例,其中λ取0.5:
在簡單神經網絡中,這樣的方式就可以很好的計算帶有正則化的損失函數了。