Overfitting 也被稱為過度學習,過度擬合。它是機器學習中常見的問題。舉個Classification(分類)的例子。
圖1 Classification
圖中黑色曲線是正常模型,綠色曲線就是overfitting模型。儘管綠色曲線很精確的區分了所有的訓練數據,但是並沒有描述數據的整體特徵,對新測試數據的適應性較差。
圖2 Regression (回歸)
舉個Regression (回歸)的例子,我們的data points是一條曲線,在最左邊的這條是underfitting他沒有成功的表達這條曲線,那中間的這種曲線呢?他就是機器學習當中已經很好的囊括了我的所有對他的特徵。但是最右的是overfitting,這條曲線經過每一個data Point,但是,如果新增加兩個綠色的點,他不能成功的預測這兩個點,所以這就是一個overfitting的問題了,儘管它經過了所有的訓練點,但是不能很好的反應數據的趨勢,預測能力嚴重不足。 TensorFlow提供了強大的dropout方法來解決overfitting問題。
建立 dropout 層:
說明:
Dropout的目的也是用來減少overfitting(過擬合)。而和L1,L2 Regularization不同的是,Dropout不是針對cost函式,而是改變神經網路本身的結構。
對於Dropout為什麼可以減少overfitting的原因如下:
一般情況下,對於同一組訓練資料,利用不同的神經網路訓練之後,求其輸出的平均值可以減少overfitting。Dropout就是利用這個原理,每次丟掉一半的一隱藏層神經元,相當於在不同的神經網路上進行訓練,這樣就減少了神經元之間的依賴性。即每個神經元不能依賴於某幾個其他的神經元(指層與層之間相連線的神經元)使神經網路更加能學習到與其他神經元之間的更加健壯robust的特徵
例子:
本次內容需要使用一下 sklearn 數據庫當中的數據, 沒有安裝 sklearn 的同學可以參考一下這個教程 安裝一下. 然後 import 以下模塊.
圖3 import 模組
這裡的keep_prob是保留概率,即我們要保留的結果所佔比例,它作為一個placeholder,在run時傳入, 當keep_prob=1的時候,相當於100%保留,也就是dropout沒有起作用。下面我們分析一下程序結構,首先準備數據,
圖4 keep_prob 保留率
其中X_train是訓練數據, X_test是測試數據。然後添加隱含層和輸出層
圖5 資料定義
loss函數(即最優化目標函數)選用交叉熵函數。交叉熵用來衡量預測值和真實值的相似程度,如果完全相同,交叉熵就等於零。
圖6 loss函數
train方法(最优化算法)采用梯度下降法。
圖7 train函數
訓練中keep_prob=1時,就可以暴露出overfitting問題。我們可以兩種參數分別運行程序,對比一下結果。 當keep_prob=1時,模型對訓練數據的適應性優於測試數據,存在overfitting,輸出如下: 紅線是train 的誤差,藍線是 test 的誤差。
圖8 keep_prob=1
圖8 keep_prob=0.5
當keep_prob=0.5時效果好了很多,keep_prob=0.5時,dropout就發揮了作用。
評論