2.5 数据不匹配时,偏差和方差的分析-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
| 2.4 在不同的劃分上進行訓練并測試 | 回到目錄 | 2.6 定位數據不匹配 |
數據不匹配時,偏差和方差的分析 (Bias and Variance with Mismatched Data Distribution)
估計學習算法的偏差和方差真的可以幫你確定接下來應該優先做的方向,但是,當你的訓練集來自和開發集、測試集不同分布時,分析偏差和方差的方式可能不一樣,我們來看為什么。
我們繼續用貓分類器為例,我們說人類在這個任務上能做到幾乎完美,所以貝葉斯錯誤率或者說貝葉斯最優錯誤率,我們知道這個問題里幾乎是0%。所以要進行錯誤率分析,你通常需要看訓練誤差,也要看看開發集的誤差。比如說,在這個樣本中,你的訓練集誤差是1%,你的開發集誤差是10%,如果你的開發集來自和訓練集一樣的分布,你可能會說,這里存在很大的方差問題,你的算法不能很好的從訓練集出發泛化,它處理訓練集很好,但處理開發集就突然間效果很差了。
但如果你的訓練數據和開發數據來自不同的分布,你就不能再放心下這個結論了。特別是,也許算法在開發集上做得不錯,可能因為訓練集很容易識別,因為訓練集都是高分辨率圖片,很清晰的圖像,但開發集要難以識別得多。所以也許軟件沒有方差問題,這只不過反映了開發集包含更難準確分類的圖片。所以這個分析的問題在于,當你看訓練誤差,再看開發誤差,有兩件事變了。首先算法只見過訓練集數據,沒見過開發集數據。第二,開發集數據來自不同的分布。而且因為你同時改變了兩件事情,很難確認這增加的9%誤差率有多少是因為算法沒看到開發集中的數據導致的,這是問題方差的部分,有多少是因為開發集數據就是不一樣。
為了弄清楚哪個因素影響更大,如果你完全不懂這兩種影響到底是什么,別擔心我們馬上會再講一遍。但為了分辨清楚兩個因素的影響,定義一組新的數據是有意義的,我們稱之為訓練-開發集,所以這是一個新的數據子集。我們應該從訓練集的分布里挖出來,但你不會用來訓練你的網絡。
我的意思是我們已經設立過這樣的訓練集、開發集和測試集了,并且開發集和測試集來自相同的分布,但訓練集來自不同的分布。
我們要做的是隨機打散訓練集,然后分出一部分訓練集作為訓練-開發集(training-dev),就像開發集和測試集來自同一分布,訓練集、訓練-開發集也來自同一分布。
但不同的地方是,現在你只在訓練集訓練你的神經網絡,你不會讓神經網絡在訓練-開發集上跑后向傳播。為了進行誤差分析,你應該做的是看看分類器在訓練集上的誤差,訓練-開發集上的誤差,還有開發集上的誤差。
比如說這個樣本中,訓練誤差是1%,我們說訓練-開發集上的誤差是9%,然后開發集誤差是10%,和以前一樣。你就可以從這里得到結論,當你從訓練數據變到訓練-開發集數據時,錯誤率真的上升了很多。而訓練數據和訓練-開發數據的差異在于,你的神經網絡能看到第一部分數據并直接在上面做了訓練,但沒有在訓練-開發集上直接訓練,這就告訴你,算法存在方差問題,因為訓練-開發集的錯誤率是在和訓練集來自同一分布的數據中測得的。所以你知道,盡管你的神經網絡在訓練集中表現良好,但無法泛化到來自相同分布的訓練-開發集里,它無法很好地泛化推廣到來自同一分布,但以前沒見過的數據中,所以在這個樣本中我們確實有一個方差問題。
我們來看一個不同的樣本,假設訓練誤差為1%,訓練-開發誤差為1.5%,但當你開始處理開發集時,錯誤率上升到10%。現在你的方差問題就很小了,因為當你從見過的訓練數據轉到訓練-開發集數據,神經網絡還沒有看到的數據,錯誤率只上升了一點點。但當你轉到開發集時,錯誤率就大大上升了,所以這是數據不匹配的問題。因為你的學習算法沒有直接在訓練-開發集或者開發集訓練過,但是這兩個數據集來自不同的分布。但不管算法在學習什么,它在訓練-開發集上做的很好,但開發集上做的不好,所以總之你的算法擅長處理和你關心的數據不同的分布,我們稱之為數據不匹配的問題。
我們再來看幾個樣本,我會在下一行里寫出來,因上面沒空間了。所以訓練誤差、訓練-開發誤差、還有開發誤差,我們說訓練誤差是10%,訓練-開發誤差是11%,開發誤差為12%,要記住,人類水平對貝葉斯錯誤率的估計大概是0%,如果你得到了這種等級的表現,那就真的存在偏差問題了。存在可避免偏差問題,因為算法做的比人類水平差很多,所以這里的偏差真的很高。
最后一個例子,如果你的訓練集錯誤率是10%,你的訓練-開發錯誤率是11%,開發錯誤率是20%,那么這其實有兩個問題。第一,可避免偏差相當高,因為你在訓練集上都沒有做得很好,而人類能做到接近0%錯誤率,但你的算法在訓練集上錯誤率為10%。這里方差似乎很小,但數據不匹配問題很大。所以對于這個樣本,我說,如果你有很大的偏差或者可避免偏差問題,還有數據不匹配問題。
我們看看這張幻燈片里做了什么,然后寫出一般的原則,我們要看的關鍵數據是人類水平錯誤率,你的訓練集錯誤率,訓練-開發集錯誤率,所以這分布和訓練集一樣,但你沒有直接在上面訓練。根據這些錯誤率之間差距有多大,你可以大概知道,可避免偏差、方差數據不匹配問題各自有多大。
我們說人類水平錯誤率是4%的話,你的訓練錯誤率是7%,而你的訓練-開發錯誤率是10%,而開發錯誤率是12%,這樣你就大概知道可避免偏差有多大。因為你知道,你希望你的算法至少要在訓練集上的表現接近人類。而這大概表明了方差大小,所以你從訓練集泛化推廣到訓練-開發集時效果如何?而這告訴你數據不匹配的問題大概有多大。技術上你還可以再加入一個數字,就是測試集表現,我們寫成測試集錯誤率,你不應該在測試集上開發,因為你不希望對測試集過擬合。但如果你看看這個,那么這里的差距就說明你對開發集過擬合的程度。所以如果開發集表現和測試集表現有很大差距,那么你可能對開發集過擬合了,所以也許你需要一個更大的開發集,對吧?要記住,你的開發集和測試集來自同一分布,所以這里存在很大差距的話。如果算法在開發集上做的很好,比測試集好得多,那么你就可能對開發集過擬合了。如果是這種情況,那么你可能要往回退一步,然后收集更多開發集數據。現在我寫出這些數字,這數字列表越往后數字越大。
這里還有個例子,其中數字并沒有一直變大,也許人類的表現是4%,訓練錯誤率是7%,訓練-開發錯誤率是10%。但我們看看開發集,你發現,很意外,算法在開發集上做的更好,也許是6%。所以如果你見到這種現象,比如說在處理語音識別任務時發現這樣,其中訓練數據其實比你的開發集和測試集難識別得多。所以這兩個(7%,10%)是從訓練集分布評估的,而這兩個(6%,6%)是從開發測試集分布評估的。所以有時候如果你的開發測試集分布比你應用實際處理的數據要容易得多,那么這些錯誤率可能真的會下降。所以如果你看到這樣的有趣的事情,可能需要比這個分析更普適的分析,我在下一張幻燈片里快速解釋一下。
所以,我們就以語音激活后視鏡為例子,事實證明,我們一直寫出的數字可以放到一張表里,在水平軸上,我要放入不同的數據集。比如說,你可能從一般語音識別任務里得到很多數據,所以你可能會有一堆數據,來自小型智能音箱的語音識別問題的數據,你購買的數據等等。然后你收集了和后視鏡有關的語音數據,在車里錄的。所以這是表格的軸,不同的數據集。在另一條軸上,我要標記處理數據不同的方式或算法。
首先,人類水平,人類處理這些數據集時準確度是多少。然后這是神經網絡訓練過的數據集上達到的錯誤率,然后還有神經網絡沒有訓練過的數據集上達到的錯誤率。所以結果我們上一張幻燈片說是人類水平的錯誤率,數字填入這個單元格里(第二行第二列),人類對這一類數據處理得有多好,比如來自各種語音識別系統的數據,那些進入你的訓練集的成千上萬的語音片段,而上一張幻燈片中的例子是4%。這個數字(7%),可能是我們的訓練錯誤率,在上一張幻燈片中的例子中是7%。是的,如果你的學習算法見過這個樣本,在這個樣本上跑過梯度下降,這個樣本來自你的訓練集分布或一般的語音識別數據分布,你的算法在訓練過的數據中表現如何呢?然后這就是訓練-開發集錯誤率,通常來自這個分布的錯誤率會高一點,一般的語音識別數據,如果你的算法沒在來自這個分布的樣本上訓練過,它的表現如何呢?這就是我們說的訓練-開發集錯誤率。
如果你移到右邊去,這個單元格是開發集錯誤率,也可能是測試集錯誤,在剛剛的例子中是6%。而開發集和測試集,實際上是兩個數字,但都可以放入這個單元格里。如果你有來自后視鏡的數據,來自從后視鏡應用在車里實際錄得的數據,但你的神經網絡沒有在這些數據上做過反向傳播,那么錯誤率是多少呢?
我們在上一張幻燈片作的分析是觀察這兩個數字之間的差異(Human level 4%和Training error 7%),還有這兩個數字之間(Training error 7%和Training-dev error 10%),這兩個數字之間(Training-dev error 10%和Dev/Test dev 6%)。這個差距(Human level 4%和Training error 7%)衡量了可避免偏差大小,這個差距Training error 7%和Training-dev error 10%)衡量了方差大小,而這個差距(Training-dev error 10%和Dev/Test dev 6%)衡量了數據不匹配問題的大小。
事實證明,把剩下的兩個數字(rearview mirror speech data 6%和Error on examples trained on 6%),也放到這個表格里也是有用的。如果結果這也是6%,那么你獲得這個數字的方式是你讓一些人自己標記他們的后視鏡語音識別數據,看看人類在這個任務里能做多好,也許結果也是6%。做法就是,你收集一些后視鏡語音識別數據,把它放在訓練集中,讓神經網絡去學習,然后測量那個數據子集上的錯誤率,但如果你得到這樣的結果,好吧,那就是說你已經在后視鏡語音數據上達到人類水平了,所以也許你對那個數據分布做的已經不錯了。
當你繼續進行更多分析時,分析并不一定會給你指明一條前進道路,但有時候你可能洞察到一些特征。比如比較這兩個數字(General speech recognition Human level 4%和rearview mirror speech data 6%),告訴我們對于人類來說,后視鏡的語音數據實際上比一般語音識別更難,因為人類都有6%的錯誤,而不是4%的錯誤,但看看這個差值,你就可以了解到偏差和方差,還有數據不匹配這些問題的不同程度。所以更一般的分析方法是,我已經用過幾次了。我還沒用過,但對于很多問題來說檢查這個子集的條目,看看這些差值,已經足夠讓你往相對有希望的方向前進了。但有時候填滿整個表格,你可能會洞察到更多特征。
最后,我們以前講過很多處理偏差的手段,講過處理方差的手段,但怎么處理數據不匹配呢?特別是開發集、測試集和你的訓練集數據來自不同分布時,這樣可以用更多訓練數據,真正幫你提高學習算法性能。但是,如果問題不僅來自偏差和方差,你現在又有了這個潛在的新問題,數據不匹配,有什么好辦法可以處理數據不匹配的呢?實話說,并沒有很通用,或者至少說是系統解決數據不匹配問題的方法,但你可以做一些嘗試,可能會有幫助,我們在下一個視頻里看看這些嘗試。
所以我們講了如何使用來自和開發集、測試集不同分布的訓練數據,這可以給你提供更多訓練數據,因此有助于提高你的學習算法的性能,但是,潛在問題就不只是偏差和方差問題,這樣做會引入第三個潛在問題,數據不匹配。如果你做了錯誤分析,并發現數據不匹配是大量錯誤的來源,那么你怎么解決這個問題呢?但結果很不幸,并沒有特別系統的方法去解決數據不匹配問題,但你可以做一些嘗試,可能會有幫助,我們來看下一段視頻。
課程板書
| 2.4 在不同的劃分上進行訓練并測試 | 回到目錄 | 2.6 定位數據不匹配 |
總結
以上是生活随笔為你收集整理的2.5 数据不匹配时,偏差和方差的分析-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.4 使用来自不同分布的数据,进行训练
- 下一篇: 2.6 处理数据不匹配问题-深度学习第三