處理資料不匹配問題
如果您的訓練集來自和開發測試集不同的分佈,如果錯誤分析顯示有一個資料不匹配的問題該怎麼辦?這個問題沒有完全系統的解決方案,但可以看看一些可以嘗試的事情。如果發現有嚴重的資料不匹配問題,通常會親自做錯誤分析,嘗試瞭解訓練集和開發測試集的具體差異。技術上,為了避免對測試集過擬合,要做錯誤分析,應該人工去看開發集而不是測試集。
但作為一個具體的例子,如果正在開發一個語音啟用的後視鏡應用,可能要看看……想如果是語音的話,可能要聽一下來自開發集的樣本,嘗試弄清楚開發集和訓練集到底有什麼不同。所以,比如說可能會發現很多開發集樣本噪音很多,有很多汽車噪音,這是的開發集和訓練集差異之一。也許還會發現其他錯誤,比如在的車子裡的語言啟用後視鏡,發現它可能經常識別錯誤街道號碼,因為那裡有很多導航請求都有街道地址,所以得到正確的街道號碼真的很重要。當了解開發集誤差的性質時,就知道,開發集有可能跟訓練集不同或者更難識別,那麼可以嘗試把訓練資料變得更像開發集一點,或者,也可以收集更多類似的開發集和測試集的資料。所以,比如說,如果發現車輛背景噪音是主要的錯誤來源,那麼可以模擬車輛噪聲資料。或者發現很難識別街道號碼,也許可以有意識地收集更多人們說數字的音訊資料,加到的訓練集裡。
現在知道這篇部落格只給出了粗略的指南,列出一些可以做的嘗試,這不是一個系統化的過程,想,這不能保證一定能取得進展。但發現這種人工見解,可以一起嘗試收集更多和真正重要的場合相似的資料,這通常有助於解決很多問題。所以,如果的目標是讓訓練資料更接近的開發集,那麼可以怎麼做呢?
可以利用的其中一種技術是人工合成資料(artificial data synthesis),討論一下。在解決汽車噪音問題的場合,所以要建立語音識別系統。也許實際上沒那麼多實際在汽車背景噪音下錄得的音訊,或者在高速公路背景噪音下錄得的音訊。但發現,可以合成。所以假設錄製了大量清晰的音訊,不帶車輛背景噪音的音訊,“The quick brown fox jumps over the lazy dog”(音訊播放),所以,這可能是的訓練集裡的一段音訊,順便說一下,這個句子在AI測試中經常使用,因為這個短句包含了從a到z所有字母,所以會經常見到這個句子。但是,有了這個“the quick brown fox jumps over the lazy dog”這段錄音之後,也可以收集一段這樣的汽車噪音,(播放汽車噪音音訊)這就是汽車內部的背景噪音,如果一言不發開車的話,就是這種聲音。如果把兩個音訊片段放到一起,就可以合成出"the quick brown fox jumps over the lazy dog"(帶有汽車噪聲),在汽車背景噪音中的效果,聽起來像這樣,所以這是一個相對簡單的音訊合成例子。在實踐中,可能會合成其他音訊效果,比如混響,就是聲音從汽車內壁上反彈疊加的效果。
但是透過人工資料合成,可以快速製造更多的訓練資料,就像真的在車裡錄的那樣,那就不需要花時間實際出去收集資料,比如說在實際行駛中的車子,錄下上萬小時的音訊。所以,如果錯誤分析顯示應該嘗試讓的資料聽起來更像在車裡錄的,那麼人工合成那種音訊,然後餵給的機器學習演算法,這樣做是合理的。
現在要提醒一下,人工資料合成有一個潛在問題,比如說,在安靜的背景裡錄得10,000小時音訊資料,然後,比如說,只錄了一小時車輛背景噪音,那麼,可以這麼做,將這1小時汽車噪音回放10,000次,併疊加到在安靜的背景下錄得的10,000小時資料。如果這麼做了,人聽起來這個音訊沒什麼問題。但是有一個風險,有可能的學習演算法對這1小時汽車噪音過擬合。特別是,如果這組汽車裡錄的音訊可能是可以想象的所有汽車噪音背景的集合,如果只錄了一小時汽車噪音,那可能只模擬了全部資料空間的一小部分,可能只從汽車噪音的很小的子集來合成資料。
而對於人耳來說,這些音訊聽起來沒什麼問題,因為一小時的車輛噪音對人耳來說,聽起來和其他任意一小時車輛噪音是一樣的。但有可能從這整個空間很小的一個子集出發合成資料,神經網路最後可能對這一小時汽車噪音過擬合。不知道以較低成本收集10,000小時的汽車噪音是否可行,這樣就不用一遍又一遍地回放那1小時汽車噪音,就有10,000個小時永不重複的汽車噪音來疊加到10,000小時安靜背景下錄得的永不重複的語音錄音。這是可以做的,但不保證能做。但是使用10,000小時永不重複的汽車噪音,而不是1小時重複學習,演算法有可能取得更好的效能。人工資料合成的挑戰在於,人耳的話,人耳是無法分辨這10,000個小時聽起來和那1小時沒什麼區別,所以最後可能會製造出這個原始資料很少的,在一個小得多的空間子集合成的訓練資料,但自己沒意識到。
這裡有人工合成資料的另一個例子,假設在研發無人駕駛汽車,可能希望檢測出這樣的車,然後用這樣的框包住它。很多人都討論過的一個思路是,為什麼不用計算機合成影像來模擬成千上萬的車輛呢?事實上,這裡有幾張車輛照片(下圖後兩張圖片),其實是用計算機合成的,想這個合成是相當逼真的,想透過這樣合成圖片,可以訓練出一個相當不錯的計算機視覺系統來檢測車子。
不幸的是,比如這是所有車的集合,如果只合成這些車中很小的子集,對於人眼來說也許這樣合成影像沒什麼問題,但的學習演算法可能會對合成的這一個小子集過擬合。特別是很多人都獨立提出了一個想法,一旦找到一個電腦遊戲,裡面車輛渲染的畫面很逼真,那麼就可以截圖,得到數量巨大的汽車圖片資料集。事實證明,如果仔細觀察一個影片遊戲,如果這個遊戲只有20輛獨立的車,那麼這遊戲看起來還行。因為是在遊戲裡開車,只看到這20輛車,這個模擬看起來相當逼真。但現實世界裡車輛的設計可不只20種,如果用著20量獨特的車合成的照片去訓練系統,那麼的神經網路很可能對這20輛車過擬合,但人類很難分辨出來。即使這些影像看起來很逼真,可能真的只用了所有可能出現的車輛的很小的子集。
所以,總而言之,如果認為存在資料不匹配問題,建議做錯誤分析,或者看看訓練集,或者看看開發集,試圖找出,試圖瞭解這兩個資料分佈到底有什麼不同,然後看看是否有辦法收集更多看起來像開發集的資料作訓練。
談到其中一種辦法是人工資料合成,人工資料合成確實有效。在語音識別中。已經看到人工資料合成顯著提升了已經非常好的語音識別系統的表現,所以這是可行的。但當使用人工資料合成時,一定要謹慎,要記住有可能從所有可能性的空間只選了很小一部分去模擬資料。