3.2.3 如何解决数据不匹配问题
在不同的劃分上進行訓練并測試
深度學習,對于數據的要求量很大。但有時候我們難以收集到足夠的數據,可能一些其他數據要從其他辦法來獲得,這樣就會容易出現不同數據的分布不同的情況。那么我們應該怎么辦呢?
假設你在開發一個手機應用,用戶會上傳他們用手機拍攝的照片,你想識別用戶從應用中上傳的圖片是不是貓。我們真正想要識別的是用戶上傳的圖片。但是關于這些圖片我們手頭的數據量是不夠的。我們也可以從網上下載大量的圖片。但是這兩種圖片的分布是不一樣的,比如說從網上下載的圖片分辨率更高,用戶上傳的圖片分辨率比較低。比如說我們手頭只有1萬張用戶的圖,有20萬張網上下載的圖片。
這里有一種選擇,你可以做的一件事是將兩組數據合并在一起,這樣你就有21萬張照片,你可以把這21萬張照片隨機分配到訓練、開發和測試集中。為了說明觀點,我們假設你已經確定開發集和測試集各包含2500個樣本,所以你的訓練集有205000個樣本。現在這么設立你的數據集有一些好處,也有壞處。好處在于,你的訓練集、開發集和測試集都來自同一分布,這樣更好管理。但壞處在于,這壞處還不小,就是如果你觀察開發集,看看這2500個樣本其中很多圖片都來自網頁下載的圖片,那并不是你真正關心的數據分布,你真正要處理的是來自手機的圖片。
我建議你走另外一條路,就是這樣,訓練集,比如說還是205,000張圖片,我們的訓練集是來自網頁下載的200,000張圖片,然后如果需要的話,再加上5000張來自手機上傳的圖片。然后對于開發集和測試集,這數據集的大小是按比例畫的,你的開發集和測試集都是手機圖。而訓練集包含了來自網頁的20萬張圖片,還有5000張來自應用的圖片,開發集就是2500張來自應用的圖片,測試集也是2500張來自應用的圖片。這樣將數據分成訓練集、開發集和測試集的好處在于,現在你瞄準的目標就是你想要處理的目標,你告訴你的團隊,我的開發集包含的數據全部來自手機上傳,這是你真正關心的圖片分布。我們試試搭建一個學習系統,讓系統在處理手機上傳圖片分布時效果良好。缺點在于,當然了,現在你的訓練集分布和你的開發集、測試集分布并不一樣。但事實證明,這樣把數據分成訓練、開發和測試集,在長期能給你帶來更好的系統性能。我們以后會討論一些特殊的技巧,可以處理 訓練集的分布和開發集和測試集分布不一樣的情況。
不匹配數據劃分的偏差和方差
估計學習算法的偏差和方差真的可以幫你確定接下來應該優先做的方向,但是,當你的訓練集來自和開發集、測試集不同分布時,分析偏差和方差的方式可能不一樣,我們來看為什么。
我們之前講過,如何在不同劃分上進行訓練,并測試。這里我們的訓練集和測試集的分布是不一樣的。因此,如果訓練集的誤差是1%,在測試集的誤差是10%。因為兩個數據集的分布不同。幽靈我們不能下結論,說該算法的泛化能力不夠好。那么我們應該怎么做呢?如何分析到底是什么引起的誤差?
我們要做的是隨機打散訓練集,然后分出一部分訓練集作為訓練-開發集(training-dev),就像開發集和測試集來自同一分布,訓練集、訓練-開發集也來自同一分布。
但不同的地方是,現在你只在訓練集訓練你的神經網絡,你不會讓神經網絡在訓練-開發集上跑后向傳播。為了進行誤差分析,你應該做的是看看分類器在訓練集上的誤差,訓練-開發集上的誤差,還有開發集上的誤差。
比如說這個樣本中,訓練誤差是1%,我們說訓練-開發集上的誤差是9%,然后開發集誤差是10%,和以前一樣。你就可以從這里得到結論,當你從訓練數據變到訓練-開發集數據時,錯誤率真的上升了很多。而訓練數據和訓練-開發數據的差異在于,你的神經網絡能看到第一部分數據并直接在上面做了訓練,但沒有在訓練-開發集上直接訓練,這就告訴你,算法存在方差問題,因為訓練-開發集的錯誤率是在和訓練集來自同一分布的數據中測得的。所以你知道,盡管你的神經網絡在訓練集中表現良好,但無法泛化到來自相同分布的訓練-開發集里,它無法很好地泛化推廣到來自同一分布
我們來看一個不同的樣本,假設訓練誤差為1%,訓練-開發誤差為1.5%,但當你開始處理開發集時,錯誤率上升到10%。現在你的方差問題就很小了,因為當你從見過的訓練數據轉到訓練-開發集數據,神經網絡還沒有看到的數據,錯誤率只上升了一點點。但當你轉到開發集時,錯誤率就大大上升了,所以這是數據不匹配的問題。數據集和測試集的分布不一樣。
如果是訓練誤差是10%,訓練-開發誤差是11%,開發誤差為12%。那就真的存在偏差問題了。存在可避免偏差問題,因為算法做的比人類水平差很多,所以這里的偏差真的很高。
最后一個例子,如果你的訓練集錯誤率是10%,你的訓練-開發錯誤率是11%,開發錯誤率是20%,那么這其實有兩個問題。第一,可避免偏差相當高,因為你在訓練集上都沒有做得很好,而人類能做到接近0%錯誤率,但你的算法在訓練集上錯誤率為10%。這里方差似乎很小,但數據不匹配問題很大。所以對于這個樣本,我說,如果你有很大的偏差或者可避免偏差問題,還有數據不匹配問題。
我們可以把整個分析過程,用一張圖來表示。如上圖所示。這張圖片是以某個個語音識別任務為例的。與某些特定的語音識別任務而言。可能存在數據不夠的問題。所以我們加過一些一般語音識別數據。所以,圖表的左側是一般語音識別的準確度。而右側,是該特定語音識別任務的準確度。
從“Training-dev error”到“Dev/Test error”衡量了數據不匹配的問題。如何處理數據不匹配呢?我們下面介紹一下。
定位數據不匹配
如果您的訓練集來自和開發測試集不同的分布,如果錯誤分析顯示你有一個數據不匹配的問題該怎么辦?這個問題沒有完全系統的解決方案,但我們可以看看一些可以嘗試的事情。如果我發現有嚴重的數據不匹配問題,我通常會親自做錯誤分析,嘗試了解訓練集和開發測試集的具體差異。技術上,為了避免對測試集過擬合,要做錯誤分析,你應該人工去看開發集而不是測試集。
對于數據不匹配問題,最好的解決辦法就是盡可能的把訓練集變得和測試集是同一個分布。當然,有的時候可能不太容易實現。
有一個解決辦法是人工合成。
現在我們要提醒一下,人工數據合成有一個潛在問題,比如說,你在安靜的背景里錄得10,000小時音頻數據,然后,比如說,你只錄了一小時車輛背景噪音,那么,你可以這么做,將這1小時汽車噪音回放10,000次,并疊加到在安靜的背景下錄得的10,000小時數據。如果你這么做了,人聽起來這個音頻沒什么問題。但是有一個風險,有可能你的學習算法對這1小時汽車噪音過擬合。特別是,如果這組汽車里錄的音頻可能是你可以想象的所有汽車噪音背景的集合,如果你只錄了一小時汽車噪音,那你可能只模擬了全部數據空間的一小部分,你可能只從汽車噪音的很小的子集來合成數據。
而對于人耳來說,這些音頻聽起來沒什么問題,因為一小時的車輛噪音對人耳來說,聽起來和其他任意一小時車輛噪音是一樣的。但你有可能從這整個空間很小的一個子集出發合成數據,神經網絡最后可能對你這一小時汽車噪音過擬合。我不知道以較低成本收集10,000小時的汽車噪音是否可行,這樣你就不用一遍又一遍地回放那1小時汽車噪音,你就有10,000個小時永不重復的汽車噪音來疊加到10,000小時安靜背景下錄得的永不重復的語音錄音。這是可以做的,但不保證能做。但是使用10,000小時永不重復的汽車噪音,而不是1小時重復學習,算法有可能取得更好的性能。人工數據合成的挑戰在于,人耳的話,人耳是無法分辨這10,000個小時聽起來和那1小時沒什么區別,所以你最后可能會制造出這個原始數據很少的,在一個小得多的空間子集合成的訓練數據,但你自己沒意識到。
人工數據合成確實有效。在語音識別中。我已經看到人工數據合成顯著提升了已經非常好的語音識別系統的表現,所以這是可行的。但當你使用人工數據合成時,一定要謹慎,要記住你有可能從所有可能性的空間只選了很小一部分去模擬數據。
吳教主深度學習和神經網絡課程總綱
總結
以上是生活随笔為你收集整理的3.2.3 如何解决数据不匹配问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.2.2 快速搭建你的第一个系统所,并
- 下一篇: 3.2.4 迁移学习和多任务学习