深度學習tips-搭建深度學習模型,不知如何下手?

很多剛剛入門的同學們面對一個剛剛到手的課題就像面對一塊剛剛到手的燙山芋一樣,無從下口… …是無從下手。那麼應該如何開始呢?答案很簡單,立刻搭建一個最簡單的模型,然後按照劃分的訓練集開始訓練,然後用開發集測試得到的結果進行一輪一輪的迭代。
如果你是這一行業的老手,或許熟知這一領域的各種方法,或許博覽這一領域的著名paper,當然你不需要從最簡單的模型開始搭建。
當你搭建好了一個最初的模型,就放心的訓練它吧,當然你不能幻想它能帶給你什麼樣的結果,但是它能給你一個非常重要的信息,就是指向優秀結果的路標。


當你的最初的最簡單的這個模型訓練結束後,得到測試結果,你會通過測試結果知道是偏差出了問題還是方差出了問題(不清楚偏差與方差的同學請點擊鏈接)。當然最初的模型都是偏差過大。


然後我們要分析測試過程中模型搞錯的那些樣本的特性。看看是哪些問題造成了模型將這些樣本搞錯。
用貓鑑別器舉例,我們訓練一個模型來鑑別一個圖片是不是貓,結果有10%鑑別錯誤,我們就來分析一下這10%的樣本有什麼特性。
結果發現,其中6%是因爲圖片模糊,3%因爲把豹子等貓科動物也鑑別成貓,1%是因爲樣本標籤是錯的(例如本來是狗,標籤寫的卻是貓)。通過分析,我們可以清晰地知道改進什麼會給我們帶來多大的收益。改進圖片模糊問題,最高可以增加6%的準確率。而花多達數月的時間去糾正樣本標籤,最高的收益也只是1%而已。


如果誤差只有2%了,那由於標籤錯誤而產生的1%的誤差就顯得非常重要了。因爲標籤很多都是人工手打上去的,難免會出現個別錯誤,例如將狗的標籤打成貓,將貓的標籤打成雞。
毋庸置疑,這時候我們要修改錯誤的標籤了。可以想象的是,這是一項工作量巨大的任務。因此對於佔數據量絕大多數的訓練集來說,我們認爲個別的錯誤不會影響訓練模型的魯棒性。因此不去關心訓練集中的標籤錯誤問題,這一下就減輕了很多工作量。
我們觀察鑑別錯誤的那些樣本,發現其中有一點是標籤錯誤的,將它改正過來,此時一定要記得的是,不僅在鑑別錯誤的樣本中存在標籤錯誤,在鑑別正確的樣本中也會出現標籤錯誤。因此我們要做的是耐心的在開發集和測試集中尋找這種錯誤標籤並改正它。


有的時候我們的測試集和訓練集並不是十分相同,例如在訓練貓鑑別器時,我們的訓練集的數據都是從網絡上爬來的高清圖片,而用戶使用的圖片都是手機拍攝的有些模糊的圖片,如何在訓練模型使用高清圖片的情況下兼顧用戶的那些隨意的圖片呢?
在這種情況下一般我們將用戶上傳的圖片的一半作爲開發集和測試集,另一半混入高清圖片中作爲訓練集使用。


此時又會有新的問題,如果這時我們的訓練誤差是1%,開發集誤差是10%,這在以上正常情況下是模型的方差出了問題,而此時,訓練集與開發集測試集不是來自同一分佈,所以我們如何破判斷到底是什麼導致了1%與10%的差別呢?
在這種情況下,我們要在訓練之前,在訓練集中抽出一小部分作爲訓練-開發集(training-dev set),這個訓練-開發集和訓練集是保持同一分佈的。使用餘下的訓練集做訓練,使用訓練-開發集做測試。如果測試結果如下:

數據集 誤差1 誤差2 誤差3
人類水平 1% 1% 1%
訓練集 1% 1% 10%
訓練-開發集 9% 1.5% 11%
開發集 10% 10% 20%

如果真實情況是表格中誤差1的情況,我們就可以知道,是模型的方差出了問題,模型只在訓練集上有效,在相同分佈的數據集上都無法有效地泛化。
如果真實情況是表格中誤差2的情況,說明模型訓練的不錯,只是因爲開發集合訓練集的分佈不同,才導致了開發集會有10%的誤差,這個叫做數據不匹配問題。
誤差3的情況很好判斷,模型都沒有訓練到位,偏差還很大,同時也存在了數據不匹配問題。


可是現在並沒有系統的解決數據不匹配問題的方法。
使用合成的數據是一個有利有弊的辦法。訓練集和開發集分佈不同,往往因爲開發集和測試集有現實中的噪聲而訓練集是完美的數據,我們可以將訓練集進行合成,加入噪聲,這樣可以提高模型的效果。但是我們人工無法分辨出噪聲的分佈,因此加入的噪聲很可能只是實際噪聲的一個子集,經過多輪的訓練會造成模型對這一小段噪聲的過擬合。


參考資料:吳恩達DeepLearning

發佈了50 篇原創文章 · 獲贊 46 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章