這一節的主要內容是當測試資料的準確度不夠高的時候應該怎麼做。
首先一定要檢查你的訓練資料集的誤差,如果發現是你的訓練資料集誤差也比較大,那麼就有兩種可能:
- 模型過於簡單,無法很好的擬合當前的資料集
- 陷入區域性最優價,也就是最佳化演算法做的不夠好
那麼如果分辨這兩種情況呢?找模型來比較
例如在上圖,一個20層的神經網路和56層的神經網路,發現測試集上56層的神經網路的誤差更大,那麼這很容易讓我們覺得這是過擬合的問題,但是如果我們檢查一下訓練集的誤差發現,同樣是56層的誤差更大,這就說明不是過擬合,如果是過擬合應該是56層的網路的訓練集的誤差很小才對,那麼56層的神經網路肯定比20層的複雜度高,只剩下一種可能就是最佳化演算法做得不夠好
那麼這給我們的啟發就是,在面對一個未知的問題時可以這樣做:
- 先訓練一些簡單的模型,比如層次較低的神經網路,比較SVM,這些模型的最佳化演算法比較容易實現,就會找到在這個模型複雜度下的最優價
- 再訓練複雜的模型,如果複雜的模型明明彈性(即複雜度)比簡單的模型更大,可誤差反而更加不理想,那麼可能就是複雜模型的最佳化演算法做得不夠好了
那麼經過上述解決完訓練資料的問題,使得訓練資料精度足夠小時再重新計算測試資料的精度,如果此時仍然是測試資料的誤差很大,那麼就有可能是真的遇到了過擬合的問題,甚至是遇到了mismatch問題,解決辦法有兩個:
- 最直接的方法就是增加訓練資料集。例如找新的資料,或者對資料進行處理,影像翻轉等等
- 給模型更多的限制,例如給比較少的引數,共用引數,正則化、早停等等
模型複雜度與誤差的曲線大致如下:
在選取不同的模型時,最好是不要直接在測試集上比較,因為測試集是用來衡量該模型的泛化誤差的,因此通常是將原本的訓練集分為訓練集和驗證集兩部分,在訓練集上訓練各個不同的模型,然後再在驗證集上選出最好的模型,再在測試集上得到該模型的泛化能力。那麼這個時候就要考慮到驗證集選取的問題了,為了避免隨機選取到不合適的驗證集,可以用k折交叉驗證:
即將訓練資料進行k等分,然後選取其中一個作為驗證集其他作為訓練集,然後訓練模型並驗證在驗證集上的好壞,這個操作重複k次保證每一個子集都有機會當驗證集,之後將k次結果去平均即可。
mismatch問題就是訓練集的分佈和測試集的分佈是不同的分佈,這就導致不管你如何增加訓練集的資料或者改進模型都很難在測試集上取得好的結果。