2.2 清除标注错误的数据-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
| 2.1 誤差分析 | 回到目錄 | 2.3 快速搭建你的第一個系統,并進行迭代 |
清除標注錯誤的數據 (Cleaning Up Incorrectly Labeled Data)
你的監督學習問題的數據由輸入 xxx 和輸出標簽 yyy 構成,如果你觀察一下你的數據,并發現有些輸出標簽 是錯的。你的數據有些標簽是錯的,是否值得花時間去修正這些標簽呢?
我們看看在貓分類問題中,圖片是貓, y=1y=1y=1 ;不是貓, y=0y=0y=0 。所以假設你看了一些數據樣本,發現這(倒數第二張圖片)其實不是貓,所以這是標記錯誤的樣本。我用了這個詞,“標記錯誤的樣本”來表示你的學習算法輸出了錯誤的 yyy 值。但我要說的是,對于標記錯誤的樣本,參考你的數據集,在訓練集或者測試集 yyy 的標簽,人類給這部分數據加的標簽,實際上是錯的,這實際上是一只狗,所以 yyy 其實應該是0,也許做標記的那人疏忽了。如果你發現你的數據有一些標記錯誤的樣本,你該怎么辦?
首先,我們來考慮訓練集,事實證明,深度學習算法對于訓練集中的隨機錯誤是相當健壯的(robust)。只要你的標記出錯的樣本,只要這些錯誤樣本離隨機錯誤不太遠,有時可能做標記的人沒有注意或者不小心,按錯鍵了,如果錯誤足夠隨機,那么放著這些錯誤不管可能也沒問題,而不要花太多時間修復它們。
當然你瀏覽一下訓練集,檢查一下這些標簽,并修正它們也沒什么害處。有時候修正這些錯誤是有價值的,有時候放著不管也可以,只要總數據集總足夠大,實際錯誤率可能不會太高。我見過一大批機器學習算法訓練的時候,明知訓練集里有 xxx 個錯誤標簽,但最后訓練出來也沒問題。
我這里先警告一下,深度學習算法對隨機誤差很健壯,但對系統性的錯誤就沒那么健壯了。所以比如說,如果做標記的人一直把白色的狗標記成貓,那就成問題了。因為你的分類器學習之后,會把所有白色的狗都分類為貓。但隨機錯誤或近似隨機錯誤,對于大多數深度學習算法來說不成問題。
現在,之前的討論集中在訓練集中的標記出錯的樣本,那么如果是開發集和測試集中有這些標記出錯的樣本呢?如果你擔心開發集或測試集上標記出錯的樣本帶來的影響,他們一般建議你在錯誤分析時,添加一個額外的列,這樣你也可以統計標簽 y=1y=1y=1 錯誤的樣本數。所以比如說,也許你統計一下對100個標記出錯的樣本的影響,所以你會找到100個樣本,其中你的分類器的輸出和開發集的標簽不一致,有時對于其中的少數樣本,你的分類器輸出和標簽不同,是因為標簽錯了,而不是你的分類器出錯。所以也許在這個樣本中,你發現標記的人漏了背景里的一只貓,所以那里打個勾,來表示樣本98標簽出錯了。也許這張圖實際上是貓的畫,而不是一只真正的貓,也許你希望標記數據的人將它標記為 y=0y=0y=0 ,而不是 y=1y=1y=1 ,然后再在那里打個勾。當你統計出其他錯誤類型的百分比后,就像我們在之前的視頻中看到的那樣,你還可以統計因為標簽錯誤所占的百分比,你的開發集里的 yyy 值是錯的,這就解釋了為什么你的學習算法做出和數據集里的標記不一樣的預測1。
所以現在問題是,是否值得修正這6%標記出錯的樣本,我的建議是,如果這些標記錯誤嚴重影響了你在開發集上評估算法的能力,那么就應該去花時間修正錯誤的標簽。但是,如果它們沒有嚴重影響到你用開發集評估成本偏差的能力,那么可能就不應該花寶貴的時間去處理。
我給你看一個樣本,解釋清楚我的意思。所以我建議你看3個數字來確定是否值得去人工修正標記出錯的數據,我建議你看看整體的開發集錯誤率,在我們以前的視頻中的樣本,我們說也許我們的系統達到了90%整體準確度,所以有10%錯誤率,那么你應該看看錯誤標記引起的錯誤的數量或者百分比。所以在這種情況下,6%的錯誤來自標記出錯,所以10%的6%就是0.6%。也許你應該看看其他原因導致的錯誤,如果你的開發集上有10%錯誤,其中0.6%是因為標記出錯,剩下的占9.4%,是其他原因導致的,比如把狗誤認為貓,大貓圖片。所以在這種情況下,我說有9.4%錯誤率需要集中精力修正,而標記出錯導致的錯誤是總體錯誤的一小部分而已,所以如果你一定要這么做,你也可以手工修正各種錯誤標簽,但也許這不是當下最重要的任務。
我們再看另一個樣本,假設你在學習問題上取得了很大進展,所以現在錯誤率不再是10%了,假設你把錯誤率降到了2%,但總體錯誤中的0.6%還是標記出錯導致的。所以現在,如果你想檢查一組標記出錯的開發集圖片,開發集數據有2%標記錯誤了,那么其中很大一部分,0.6%除以2%,實際上變成30%標簽而不是6%標簽了。有那么多錯誤樣本其實是因為標記出錯導致的,所以現在其他原因導致的錯誤是1.4%。當測得的那么大一部分的錯誤都是開發集標記出錯導致的,那似乎修正開發集里的錯誤標簽似乎更有價值。
如果你還記得設立開發集的目標的話,開發集的主要目的是,你希望用它來從兩個分類器 AAA 和 BBB 中選擇一個。所以當你測試兩個分類器 AAA 和 BBB 時,在開發集上一個有2.1%錯誤率,另一個有1.9%錯誤率,但是你不能再信任開發集了,因為它無法告訴你這個分類器是否比這個好,因為0.6%的錯誤率是標記出錯導致的。那么現在你就有很好的理由去修正開發集里的錯誤標簽,因為在右邊這個樣本中,標記出錯對算法錯誤的整體評估標準有嚴重的影響。而左邊的樣本中,標記出錯對你算法影響的百分比還是相對較小的。
現在如果你決定要去修正開發集數據,手動重新檢查標簽,并嘗試修正一些標簽,這里還有一些額外的方針和原則需要考慮。首先,我鼓勵你不管用什么修正手段,都要同時作用到開發集和測試集上,我們之前討論過為什么,開發和測試集必須來自相同的分布。開發集確定了你的目標,當你擊中目標后,你希望算法能夠推廣到測試集上,這樣你的團隊能夠更高效的在來自同一分布的開發集和測試集上迭代。如果你打算修正開發集上的部分數據,那么最好也對測試集做同樣的修正以確保它們繼續來自相同的分布。所以我們雇傭了一個人來仔細檢查這些標簽,但必須同時檢查開發集和測試集。
其次,我強烈建議你要考慮同時檢驗算法判斷正確和判斷錯誤的樣本,要檢查算法出錯的樣本很容易,只需要看看那些樣本是否需要修正,但還有可能有些樣本算法判斷正確,那些也需要修正。如果你只修正算法出錯的樣本,你對算法的偏差估計可能會變大,這會讓你的算法有一點不公平的優勢,我們就需要再次檢查出錯的樣本,但也需要再次檢查做對的樣本,因為算法有可能因為運氣好把某個東西判斷對了。在那個特例里,修正那些標簽可能會讓算法從判斷對變成判斷錯。這第二點不是很容易做,所以通常不會這么做。通常不會這么做的原因是,如果你的分類器很準確,那么判斷錯的次數比判斷正確的次數要少得多。那么就有2%出錯,98%都是對的,所以更容易檢查2%數據上的標簽,然而檢查98%數據上的標簽要花的時間長得多,所以通常不這么做,但也是要考慮到的。
最后,如果你進入到一個開發集和測試集去修正這里的部分標簽,你可能會,也可能不會去對訓練集做同樣的事情,還記得我們在其他視頻里講過,修正訓練集中的標簽其實相對沒那么重要,你可能決定只修正開發集和測試集中的標簽,因為它們通常比訓練集小得多,你可能不想把所有額外的精力投入到修正大得多的訓練集中的標簽,所以這樣其實是可以的。我們將在本周晚些時候討論一些步驟,用于處理你的訓練數據分布和開發與測試數據不同的情況,對于這種情況學習算法其實相當健壯,你的開發集和測試集來自同一分布非常重要。但如果你的訓練集來自稍微不同的分布,通常這是一件很合理的事情,我會在本周晚些時候談談如何處理這個問題。
最后我講幾個建議:
首先,深度學習研究人員有時會喜歡這樣說:“我只是把數據提供給算法,我訓練過了,效果拔群”。這話說出了很多深度學習錯誤的真相,更多時候,我們把數據喂給算法,然后訓練它,并減少人工干預,減少使用人類的見解。但我認為,在構造實際系統時,通常需要更多的人工錯誤分析,更多的人類見解來架構這些系統,盡管深度學習的研究人員不愿意承認這點。
其次,不知道為什么,我看一些工程師和研究人員不愿意親自去看這些樣本,也許做這些事情很無聊,坐下來看100或幾百個樣本來統計錯誤數量,但我經常親自這么做。當我帶領一個機器學習團隊時,我想知道它所犯的錯誤,我會親自去看看這些數據,嘗試和一部分錯誤作斗爭。我想就因為花了這幾分鐘,或者幾個小時去親自統計數據,真的可以幫你找到需要優先處理的任務,我發現花時間親自檢查數據非常值得,所以我強烈建議你們這樣做,如果你在搭建你的機器學習系統的話,然后你想確定應該優先嘗試哪些想法,或者哪些方向。
這就是錯誤分析過程,在下一個視頻中,我想分享一下錯誤分析是如何在啟動新的機器學習項目中發揮作用的。
課程板書
| 2.1 誤差分析 | 回到目錄 | 2.3 快速搭建你的第一個系統,并進行迭代 |
總結
以上是生活随笔為你收集整理的2.2 清除标注错误的数据-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.1 进行误差分析-深度学习第三课《结
- 下一篇: 2.3 快速搭建你的第一个系统,并进行迭