1. 程式人生 > >Machine Learning Yearning 36-43閱讀筆記:訓練測試集分佈不同

Machine Learning Yearning 36-43閱讀筆記:訓練測試集分佈不同

36.什麼時候你應該在不同分佈上做訓練和測試

當你的貓app已經上傳10000張圖,你已經人工標記它們有沒有貓,同時你有200000張網際網路上下載的圖,這時你要怎麼劃分訓練開發測試集呢?
當你訓練深度學習模型時,可能必須用到那200000張圖,那麼訓練和測試集的分佈就不同,這會怎樣影響你的工作呢?
當然將210000張圖片隨機分裂到訓練開發測試集是一種方法,但我(吳恩達)不推薦這種方法,記住選擇開發測試集的推薦方法是:選擇你未來預期會得到的資料來作為開發測試集。
大多數學術文章假設訓練開發測試集的分佈相同,在機器學習的早期,資料稀缺,常常僅有一個服從同一分佈的資料集,所以這一假設能夠滿足。
但在大資料時代,從不同分佈所收集來的資料,我們也希望能利用上,因為它能提供大量資訊。
對於貓檢測這個問題,我們會將貓app上傳的5000張圖放入開發測試集,訓練集大小為205000。
第二個場景,假設你在做一個語音識別系統為一個導航app來轉錄得地址,你有20000個使用者說的街道地址,500000個語音片段使用者說其他的內容,這時你可能用10000個地址樣本作為開發測試集,其他用作訓練集。
我們繼續假設你的開發測試集具有相同分佈,但是必須明白,訓練和開發/測試集分佈不同,會帶來一些特殊的挑戰。
Ps:有些學術研究是訓練測試分佈不同,但理論和實踐中有很大的不同,如果你的訓練測試不同分佈,那麼你的結果很大程度受到運氣的影響。

37.如何決定怎麼使用你的資料

延續上一章所說,早期的機器學習演算法(需要手動設計特徵,用一個簡單的分類器),將20000張互聯圖片納入訓練集是很可能帶來風險的。但到了大型神經網路時期,這一風險大大削減。這一現象依賴於是存在一個對映能在兩種資料上都能表現良好。換句話說,這裡存在一個系統不管輸入是使用者上傳的圖片還是網際網路圖片都能可靠的預測標籤,即使不知道圖片的來源。
加入20000張圖片後有以下影響:
1.它給你神經網路更多貓是怎麼不是怎樣的樣本。因為使用者上傳和網際網路圖片都有共同點,你的神經網路能從網際網路圖片中學到能應用到使用者上傳圖片的知識。
2.它迫使神經網路用一些容量來學習網際網路圖片獨特的特徵。如果這些特點和使用者上傳圖片很不同,那麼因此,它會損傷你的演算法的表現。
幸運的是,如果你有足夠的容量,那麼這可能不是一個重要的問題。如果你沒有足夠大的神經網路,那麼你應該花費更大的精力在你的訓練開發測試集保持同分布上。
如果你有大量的無關資料,它們跟貓毫無關係,那麼就不要把這些資料當做負樣本,因為上面所說的第一條的好處可以忽略不計,學到的東西無法應用到你打開發測試集。

38.如何決定是否包括不一致的資料

假設你要預測紐約的房價,如果你有底特律的房價,房價比紐約低很多,那麼你應該將這些資料加入到你的訓練集中嗎?
房子在底特律還是在紐約會極大影響房價,如果你僅關心紐約的房價,那麼最好不加入底特律的資料。
那麼紐約底特律樣本和手機網際網路貓圖有什麼不同嗎?
貓圖不同點在於,一個系統可以可靠的預測y,不論輸入是來自網際網路圖片還是app圖片,因此網際網路圖片和算法系統一致,而底特律紐約則不一致。
Ps:事實上可以增加一個新的房子所在地的特徵,但是在實際應用中並不常見。

39.給資料權重

在實際應用中,互聯圖片數量是使用者上傳圖片數量的40倍,如果你沒有大量的計算資源,那麼你給網際網路圖片更低的權重作為妥協。這種加權重的方式僅僅當你懷疑新增的資料有不同於開發測試集的分佈,或者新增的資料遠多於和開發測試集相同分佈的資料。

40.從訓練集到開發集的泛化

接著上面的問題討論,如果你的演算法在開發測試集上的誤差比你預期的更大,那麼可能的原因有:
1.在訓練集上的表現也不夠好,偏差較大。
2,在訓練集上表現良好,但是不能很好地泛化到和訓練集同分布的資料集上,方差較大。
3.在和訓練集同分布的資料集上表現良好,但在開發和測試集上表現不好,稱為data mismatch。
例如,假設人類能在貓識別任務上達到近乎完美的表現,你的演算法能達到:

  • 1%的訓練誤差
  • 1.5%的同分布資料集誤差
  • 10%的驗證集誤差

那麼,你可能會嘗試讓訓練資料更接近驗證/測試資料,我們之後會討論一些相關技術。
為了診斷到底是什麼原因,另外構造一個數據集是非常有必要的,即:一個訓練集用作訓練,一個“Training dev”資料集不用做訓練。
那麼現在你有四個資料集:

  1. 訓練集:演算法學習的資料集(來自網際網路的圖片和從手機app上傳的圖片),它不需要服從我們真正在乎的分佈。
  2. 訓練開發集:和訓練集同一分佈,不用很大
  3. 開發集:和測試集同一分佈,反應了我們正在在乎的分佈。
  4. 測試集:和開發集同一分佈。

那麼現在可以評價:

  1. 訓練集誤差
  2. 模型泛化到同分布資料集上的能力
  3. 模型在你真正在乎的分佈上的表現

41.識別偏差、方差和資料不匹配

假設人能在貓識別上達到0%的誤差,假設你的演算法:

  • 1%的訓練誤差
  • 5%的訓練驗證誤差
  • 5%的驗證誤差

這告訴你的演算法高方差。現在假設你的演算法:

  • 10%的訓練誤差
  • 11%的訓練驗證誤差
  • 12%的驗證誤差

這告訴你,你的演算法有高偏差。一個演算法可能同時遭遇到高偏差、高方差和資料不匹配的任意組合,如:

  • 10%的訓練誤差
  • 11%的訓練驗證誤差
  • 20%的驗證誤差

為了更方便的理解各種不同的誤差之間的聯絡,可以把他們畫成一個表
error table
你也可以嘗試將空著的兩個格子填上,也許你能獲得一些演算法在不同分佈上的效果。對於中間第二格,可以將一小部分B類分佈資料加入訓練集,然後單獨將這一部分的訓練誤差拿出來。

42.處理資料不匹配

假設你開發了一個語音識別系統,在訓練集和訓練開發集上表現很好,但是在測試集上表現很差:你的演算法有資料不匹配的問題。那麼我建議你:(i)試著去弄明白訓練和驗證集上什麼屬性有不同(ii)試著去獲取更多的符合開發集分佈的資料
例如,你在驗證集上做錯誤分析,假設你發現你的算法系統表現差是因為大多數驗證集的語音都是在車內獲得的,而訓練集中的例子都是在安靜背景下獲得的,背景音極大的損傷了你演算法的表現。這種情況下,你可能會獲取更多的車內語音來擴充你的訓練集。誤差分析的主要目的就是獲知訓練和開發集的重要不同,就是這個原因導致了資料不匹配。
如果你的訓練和訓練測試集包括了車內語音,你需要再檢查一下你的的算法系統在這一資料子集上的表現。如果它在訓練集的車內語音上表現良好,而在訓練開發集上的車內語音上表現不好,這進一步證實了需要獲取更多的車內語言。
但不幸的是,這一過程沒有保證。例如,如果你沒辦法獲得更多地和驗證集同分布的資料,那麼你可能找不到一個清晰的道路來提升表現。

43.人工資料合成

你的語音系統需要更多類似從車內獲取的資料,那麼人工合成的方法可能更加簡單。
假設你獲取了大量車或者路上的噪音,你可以從網上下載這些資料。假設你也有一個很大的人在安靜背景下說話的訓練集,那麼如果你把這兩個資料“相加”,你將獲得類似人在噪音背景下說話的語音。再例如,你可以發現貓識別器專案中,驗證集中的手機拍攝的圖片很多都有運動模糊,這個時候可以將圖片加上運動模糊,讓他們更像驗證集裡的圖片。
需要注意的是:合成數據的方法,有時創造的資料對人來說是真實的,而不是對電腦來說是真實的。例如你有1000個小時的語音訓練集,而僅有1個小時的車噪音,那麼合成的資料就會反覆使用這段噪音,當人去判斷時,噪音對人來說都差不多,而對電腦而言,它會對這段噪音過擬合,所以它的泛化能力可能會很差。
另外,假設你有1000個小時的車噪音,但它僅從10臺不同的車上提取出來的,那麼,這種情況下,可能演算法會對著10輛車過擬合併對其他車上的語音表現的很差。不幸的是,這些問題很難被發現。
再來一個例子,假設你要做一個計算機視覺系統來識別汽車,假設你和一家遊戲公司有合作,這家遊戲公司有些車的電腦模型,為了訓練你的模型,你用車的電腦模型合成了很多車的圖片,即使合成的圖片看上去很真實,但是可能這種方法也不會有效,這個遊戲可能在整個遊戲裡設計20輛車。構建車的3D模型是很貴的,你可能不會注意到你一直在看同一輛車,只不過顏色不同罷了,但同所有跑在路上的車來說,這只是分佈裡的很小的一部分。因此,如果你訓練集裡100000個樣本都來自20輛車,那麼你的演算法將對這20輛車過擬合,並且很難泛化。
當你合成數據時,必須考慮到是否真的合成了具有代表性的資料。同時避免產生能分辨合成和非合成數據的特性,例如所有車都來自20輛原型,所有噪音都來自1個小時的噪聲,這一建議很難被遵循。
當進行資料合成時,在產生資料前我的團隊經常花費數週的時間在一些細節上,使其接近真實分佈,以便具有顯著效果。但是如果你能能正確的獲得這些細節,你就能一下子獲得一個比原來大很多的資料集。