深度学习实战技巧
?
轉載聲明:本文為「頂級程序員」編譯團隊原創文章,轉載請聯系后臺。
?
1. 為什么要學習機器學習策略?
機器學習眾多重要應用的基礎,包括搜索引擎、垃圾郵件過濾、語音識別、商品推薦等。假設你或者你的團隊正在做機器學習應用項目,同時你想獲得快速進步。你可以從這本書中找到滿意的答案。
示例:建立一個識別含有貓圖像的新興公司
你正在建立一個新興公司,該公司將給貓的愛好者提供大量的貓圖片。你計劃使用神經網絡來建立一個計算機視覺系統用于識別圖片中的貓。
但不幸的是,你的學習算法識別準確率不是足夠的好。所以你面臨具大的壓力來提高算法的識別準確率。你應該做些什么呢?
你的團隊有許多好的方法,比如:
l 獲得更多的數據:收集更多貓的圖上。
l 收集大量多樣化的訓練集。例如,貓在不同位置的圖片;不同毛色的貓;多種相機設置拍攝的圖片等。
l 通過加大梯度下降的迭代次數,來增加算法的訓練時間。
l 嘗試更大的神經網絡,擁有更多的層、隱藏單元和參數。
l 嘗試更小的神經網絡。
l 嘗試增加正則化(比如L2正則)。
l 改變神經網絡的架構(激活函數、隱藏層的數量等)。
如果你能夠從以上方法中選擇一個好的方案,你將打造一個領先的貓圖片識別平臺以及帶領你的公司走向成功。如果你選擇了一個差的方案,你有可能要浪費數月時間。
我們應該怎么選擇呢?
這本書將告訴你如何選擇。多數的機器學習問題會留下一些線索,而這些線索會告訴你哪些是有用的嘗試,哪些是無用的嘗試。學會使用這些線索將會節約你數月或數年的開發時間。
2. 怎么使用這本書幫助你的團隊
學習完本書后,你將對如何制定機器學習項目技術方向有一個深刻理解。
你的團隊成員有可能不明白為什么你會建議某一個具體的方向。或者你想你的團隊能夠定義一個單一數量評估指標,但他們并不信服。你應該如何去說服他們?
這就是設置短章節的原因:這樣你能夠將這些章節打印出來并且提供給你的團隊成員你想要團隊成員知道的1-2內容。
在優先次序上做一些調整,對于你團隊的生產率可能會產生巨大的影響。通過幫助你的團隊做出這樣的變化,我希望你能成為你們團隊的超級英雄。
3. 預備知識和符號約定
如果你已經學習了機器學習課程(比如在Coursera上我的機器學習慕課課程)或你有應用監督學習的經驗,你將能夠很容易明白下面的內容。
假設你熟悉監督學習算法:使用標識的訓練樣例(x,y),學習一個從x到y的映射函數。監督學習算法包含線性回歸、邏輯回歸和神經網絡。機器學習的形式有多種,但是機器學習的主要實際應用都是監督學習。
我將會頻繁提及神經網絡(同樣稱為“深度學習”)。你只需要對他們有一個基本了解即可。
如果你對在此提到的概念不熟悉,請到Coursera上觀看機器學習課程的前三周視頻。網址:http://ml-class.org
4. 規模推動機器學習的發展
深度學習(神經網絡)的許多觀點已經存在了十幾年。為什么這些觀點現在才得到重視?
有2個最為重要的因素推動了深度學習的發展:
l 大量可用數據。現在人們花費更多的時間使用數字設備(筆記本電腦、移動設備)。因此我可以將他們使用數字設備產生的大量數據用于學習算法訓練。
l 計算能力提升。僅僅在幾年前,我們才能夠訓練足夠大的神經網絡,以利用我們現在擁有的龐大數據量。
具體來講,即使你收集了足夠多的數據,如果還使用傳統算法(邏輯回歸)來處理數據,依然會出現“停滯”現象。這就意為著即使你給算法在多的數據,算法的學習曲線也會變平,算法效果不會在有所提升。
傳統算法似乎不知道如何處理我們現在擁有的所有數據。
如果你在同一個監督學習任務訓練一個小的神經網絡(NN),有可能獲得稍微好一點的效果:
這里所說的“小型神經網絡”是指一個神經網絡擁有少數的隱藏單元/層/參數。最后,如果你訓練一個大型神經網絡,你能夠獲得更好的性能表現。
因此,如果你想得到最好的性能表現,(i)你可以訓練一個非常大的神經網絡,它性能表現將位于綠色曲線的上方;(ii)擁有更多的數據。
還有許多其它的細節(比如神經網絡的結構)也是非常重要的,這些方面也有很多的創新。現階段提升算法的性能最可靠的方法仍然是(i)訓練更大的網絡和(ii)獲得更多的數據。
怎樣實現(i)和(ii)是非常復雜的。這本書將會詳細討論這些細節。我們將從對傳統學習算法和神經網絡都有用的一般策略開始,并建立對構建深度學習系統的最先進策略。
5. 你的開發集和測試集
讓我們回顧一下前面講過的貓圖像例子:你開發了一款移動APP,用戶可以將多種類型的圖片上傳到APP。你希望APP能夠自動篩選貓的圖片。
你的團隊擁有一個龐大的訓練集,而這個訓練集是通過下載不同網站上含有貓的圖片(正樣本)和不含有貓的圖片(負樣本)組成。他們將該訓練集按照70%作為訓練集、30%作為測試集進行分割。使用這個數據,他們構建了一個在訓練集和測試集都表現很好的貓識別算法。
但是當你將這個識別算法部署到移動APP時,你會發現識別算法表現非常差。
為什么會這樣?
你發現用戶上傳的圖片與你從網站上下載的作為訓練集的圖片有些不同:用戶使用手機拍攝的圖片分辨率低、模糊和光線較差。由于你們訓練集/測試集數據都來自于網站,而你的算法對于手機拍攝的圖片缺乏較好的泛化能力。
在大數據時代之前,人們通常將數據集按照70%:30%隨機進行分割作為機器學習算法的訓練集和測試集。但是在越來越多的應用中這不是一個好的方法,因為訓練集的分布(上面例子中指網站圖像)是不同于最終實際應用場景圖像的分布(手機圖像)。
通常我們的定義:
l 訓練集—用于你的學習算法中。
l 開發集—用于調整學習算法的參數、特征選擇以及做出其他的選擇。有時候將開發集稱為保留交叉驗證集。
l 測試集—用于評估算法的性能,但是不要使用該數據集對學習算法和參數做出任何決定。
當你定義了一個開發集和測試集,你的團隊將會嘗試多種方法(比如選擇不同的學習算法參數)觀察哪種方法最好。開發集和測試集可以讓你的團隊看到你的算法工作的如何。
換句話說,開發集和測試集目的是指導你的團隊對機器學習系統做出最重要的改變。
因此,你應該做到:
選擇開發集和測試集,反映未來你期望獲得的數據并在上面做的更好。
當你的實際數據(智能手機圖像)和測試集(網站圖像)在性質上不一樣時,你的測試集不應該只有可用數據的30%那么簡單。
如果你還沒有發你的APP,也就意味著沒有任何用戶,你將不能獲得使你未來做的更好的數據。但你仍然可以嘗試去接近這一點。例如,請你的朋友們用手機拍攝一些貓的圖像發給你。當你的APP發布后,你可以使用實際用戶數據更新程序的開發集/測試集。
如果你實在是沒有辦法去獲得你想要的數據,也許網站圖像也是一個不錯的開始。但是,你應該關注這個系統缺乏好的泛化能力的風險。
有時候我們需要去決定投資多少去獲獲取發好的開發集和測試集。但是不要假設訓練集與測試集具有相同的分布。嘗試去挑選能夠反映平臺實際應用場景的測試樣本,而不是你使用過的數據。
6. 你的開發集和測試集應該具有相同分布
根據你的市場,你將你的貓APP圖像數據分為四個區域:(i)美國、 (ii)中國、(iii) 印度和(iv)其他。構造一個開發集和一個測試集,我們可以將美國和印度看作開發集;中國和其他看作測試集。換句話說,我們可以隨機的分配2個區域作為開發集,而另外2個區域作為測試集。
一旦你定義了開發集和測試集,你的團隊將專注于提高開發集的表現性能。因此,開發集應該反映你最想提升性能的任務:在四個地區做的最好,而不是二個。
開發集和測試集具有不同的分布導致的第二個問題:你的團隊有可能在測試集上表現很好,而在測試集上表現很差。我曾經在很多的挫折和白費努力中看到過這個結果。應該避免這樣的事情發生在你的身上。
例如,你的開發團隊開發一個系統在開發集上表現很好,而在測試集上表現很差。而你的開發集和測試集都來自同一分布,則你應該明確知道:你的算法在開發集上過擬合了。通過獲得更多的開發集數據可以避免過擬合的產生。
如果開發集和測試集具有不同的分布,則你的選擇就不太清楚了。可能會有以下幾個錯誤:
1. 你的算法已經在開發集上過擬合了
2. 測試集比開發集更難識別。你的算法性能表現達到了你預期的期望,因此沒有可能做出進一步顯著性的改進了。
3. 測試集不一定比開發集難,只是他們來自不同分布。因此在開發集上表現很好的算法在測試集上并不能表現很好。在這種情況下,把大量工作用于提高算法在開發集上的表現性能是無意義的。
機器學習應該方面的工作已經很困難了。開發集和測試集的不匹配增加了額外的不確定性,關于是否改進開發集的分布性能或提高測試集的表現性能。這使得很難找出什么是起作用的和什么不起作用的,因此很難去優先處理誰。
如果你面對的是第三方基準測試問題,他們的開發者有可能提供來自于不同分布的開發集和測試集。在這種情形下,運氣的好壞將會很大程度上影響你算法的表現性能。當然,開發能夠在一個分布上訓練并推廣到另一個分布上仍然表現很好的學習算法是一個重要的研究方向。如果你的目標是做特定機器學習應用而不是學術研究,我建議選擇具有相同分布的開發集和測試集。這會使你的團隊更有效率。
7. 需要多大開發集/測試集?
開發集應該足夠大,大到足以檢測你正在嘗試不同算法之間的差異。例如,如果分類器有90.0%的準確率而分類器B有90.1%的準確率,則有100個樣本的開發集將不能區分0.1%的區別。與我看到的其他機器學習問題相比,一個100個樣本的開發集太小。開發集通常樣本數量應該在1000到10,000之間。在10000個樣本下,你將有可能檢測到0.1%的性能提升。
對于一些成熟和重要的應用(例如,廣告、搜索引擎和商品推薦),我已經看到一些團隊為了提升0.01%的性能而不懈努力,因為這直接影響到公司的利益。在這種情況下,開發集有可能遠遠超過了10000個樣本,為了能夠找到更小的改進空間。
測試集的數量多少合適哪?應該足夠大,大到能夠對于你的系統性能全面評估,擁有足夠高的可靠性。一種流行的啟發式算法使用數據集的30%用作測試集。當你擁有一個適中的數據量(100到10000之間)時,這個測試集將能很好的工作。在大數據時代,現在我們面對的機器學習問題有時候會超過10億樣本量,分配給開發集/測試集的比例一直在減少,雖然開發集/測試集樣本絕對數量在增長。在分配開發集和測試集數據時,開發集和測試集的數量沒必要超過其評估算法性能所需的數據量。
8. 給你的團隊進行算法優化建立單一數值評估指標
分類準確率是單一數字評估指標的示例:當你的算法對開發集(或測試集)進行分類時,會得到一個樣本分類準確性的數字比例。根據這個指標,如果分類器A準確率為97%,分類器B準確率為90%,則分類器A的分類效果更好。
相比之下,查準率和查全率不屬于單一數字評估指標體系:它給出2個數字用于評估你的分類器性能。多數字評估指標使得我們很難去比較算法的優勢。假設你的算法性能指標如下:
在這種情況下,我們無法看出那一個分類器性能更好,因此多數字評估指標無法直觀指導你使用那一個更好的分類器。
在算法開發期間,你的團隊會在算法結構、模型參數調優和特征選擇等方面進行多種方法的嘗試。單一數字評估指標(比如精度)允許你根據算法的準確率將你的模型進行排序,以便于快速決定那一個算法的性能更好。
如果你比較關注查準率和查全率這2個指標,建議你使用一種標準方法將這2個指標組合為單一數字指標。例如,你可以使用查準率和查全率的平均值作為單一數字指標。你也可以計算算法的“F1度量”,它是一種計算二者平均值的改進方法,比簡單計算平均值方法效果要好。
當你正在選擇一個適合的分類算法時,單一數字評價指標可以快速幫助你做出選擇。它給出了一個清晰的算法優先級排序,同時給出了明確的前進方向。
作為最后一個例子,假設你獲得了四個主要市場((i) 美國, (ii)中國, (iii)印度,和(iv) 其他地區)的貓分類器的準確率,會得到四個指標值。通過將這四個指標值求平均值或加權平均值,最后會得到一個單一數字指標。將多指標值合并為單一指標值最常用的方法之一是求多指標值的平均值或加權平均值。
9. 優化指標和滿意指標
這是將多指標值合并為單一數字指標的另一種方法。
假設你比較關注一個學習算法的準確率和運行時間。現在你需要在下面的三個分類器中做出選擇:
如果通過下面的計算公式將準確率和運行時間合并為單一指標,在此看起來有些不自然:
準確率-0.5*運行時間
你可以這樣做:首先,定義一個“可接受”的運行時間范圍。假設我們說算法在100ms內的運行時間是可接受的。則分類器在滿足可接受運行時間內,取最大準確率的算法。在此,運行時間是一個“滿意指標”—你的分類算法只需要在這個指標上做的“足夠好”即可,也就是算法的運行時間滿足最多100ms。準確率是“優化指標”。
如果你正在權衡N個不同的指標,比如模型的二進制文件大小(因為用戶不想下載在大的APP文件)、運行時間和準確率,你可以考慮將其中N-1個值作為“滿足度指標”,也就是說你只需要考慮他們滿足一個特定的值即可。定義最后一個值作為“優化指標”。例如,設置一個閾值作為二進制文件和運行時間的接受范圍,并且在這些限制下去優化算法的準確率。
作為最后一個例子,假設你正在構建一個硬件系統,該系統使用一個麥克風監聽用戶說的特別“喚醒詞”,從而喚醒系統工作。比如Amazon Echo監聽“Alexa”;蘋果Siri監聽“Hey Siri”;安卓監聽“Okay Google”;百度APP監聽“Hello Baidu”。你同時關注假正例的比例—指當沒有人說喚醒詞時,系統被喚醒的頻率和假反例的比例—指當用戶說了喚醒詞時,系統沒有被喚醒的頻率。使這個系統性能達到的一個合理目標是減少負反值的比例(優化指標),在24時工作中沒有出現一個負正例(滿意度指標)。
一旦你的團隊開始對評估指標進行優化,他們將能夠獲得較快的進展。
10. 有一個開發集和度量指標來加速算法的迭代
人們很難事先知道什么方法能夠很好的解決新問題。即使是經驗豐富的機器學習研究者在給出滿意答案之前也需要進行多種方法的嘗試。在構建機器學習系統時,我通常會做以下的思考:
1. 首先想一些構造這個系統的想法。
2. 用代碼實現這些想法。
3. 通過實驗來驗證我的想法如何(通常我前面的一些想法都沒有很好的表現)。
基于以上的學習,在回過頭來產生更多的想法,在進行驗證。以此類推進行不斷的迭代。
這是一個不斷迭代的過程。你迭代的過程越快,你進步的就會越快。這就是為什么擁有開發集/測試集和一個度量指標是如此的重要:每次當你在開發集上驗證你的想法時,評價指標可以快速使你判斷自己是否在朝正確的方向前進。
假設你沒有一個具體的開發集和度量指標。因此你的團隊每次開發新的貓分類器時,你必將新的分類器移值進你的APP中,并親身體驗幾個小時從直觀上判斷新的分類器性能是否有所提升。這樣的開發效率極其低下!同時,如果你的團隊將分類器的準確率從95.0%提高到了95.1%,在你親身體驗過程中有可能無法感受到這0.1%的提升。然而,系統整體的準確率是由許多個0.1%構成的。有一個開發集和度量指標可以快速使你驗證那些成功的想法給你的系統帶來了小(或大)的提升,因此你可快速決定哪些想法還要繼續改進,那些想法可以拋棄。
11.何時更改開發/測試集和評估指標
當開始一個新項目時,我會試圖迅速選好開發/測試集 ,因為這可以給團隊制定一個明確的目標。
我通常會要求我的團隊在不到一周之內(極少多于一周時間)想出一個初始的開發/測試集和評估指標,提出一個不太完美的方案并迅速行動起來往往比過分考慮這些會更好。但是“一周”這個時間表并不適用于成熟的應用。例如,反垃圾郵件就是一個成熟的深度學習應用。我曾經見過一些開發已經成熟的系統的團隊花費數月時間來獲得更好的開發/測試集。
如果你后來發現你初始的開發/測試集或評估指標與你的目標并不完全一致,那么馬上利用一切辦法進行更改。例如,如果在你的開發集和評估指標上分類器A比分離器B表現好,但你的團隊認為在實際應用中分類器B更適合你的產品,那么這就很有可能是一個你需要更改開發/測試集或評估指標的跡象。
有三個主要原因可能會造成開發集/評估指標不正確地把分類器A排得更高:
1. 你需要做得好的實際數據分布和開發/測試集是不同的。
假設你的初始開發/測試集主要是一些成年貓的照片,但是在你實際查看貓app后,發現用戶上傳的小貓的照片比預期多得多。所以,開發/測試集的數據分布并不能代表你需要做得好的實際的數據分布。這種情況下,你需要更新開發/測試集,使其更具代表性。
2. 你已經過擬合了開發集。
在開發集上重復評估不同方法的過程可能導致你的算法逐漸對開發集“過擬合”。當你做完開發后,你會在測試集上評估你的算法。如果你發現算法在開發集上的表現遠好于在測試集上的表現,這可能是你已經過擬合開發集的跡象。這種情況下,你需要更新你的開發集了。
如果你需要跟蹤團隊的進度,你也可以每周或每月用測試集定期評估你的系統。但不要用測試集來做出任何關于改進算法的決定,包括是否回退到上一周的系統。如果這樣做了,你將開始過度擬合測試集,并且不可能再依靠它來給出一個你的系統性能的完全無偏估計(你可能會在發表論文或做出重要商業決策用到這)。
3. 評估指標正在衡量的并不是項目所需要優化的東西。
假設對于你的貓app,你的評估指標是分類準確率。該指標現在把分類器A排在分類器B前面。但是假如你嘗試了這兩種算法,發現分類器A會偶爾允許色情圖片通過。那么即使分類器A準確率更高,偶發的色情圖片所帶來的壞影響也意味著這個分類器的表現是不被接受的。你需要做什么呢?
這里,評估指標不能辨別出對產品而言算法B比算法A更好這一事實。所以,你不能再相信這個評估指標能挑選出最佳算法。現在是改變評估指標的時候了。例如,你可以改變評估指標,加重對色情圖片通過的懲罰。我強烈建議你選擇一個新的評估指標,用這個新的評估指標來為你的團隊明確定義一個新的目標,而不是在沒有可信任的評估指標下一直進行,然后在分類器中手動選擇。
在項目中改變開發/測試集或評估指標是很常見的。擁有一個初始的開發/測試集和評估指標能幫助你快速迭代。如果你發現開發/測試集和評估指標使你的團隊遠離了正確方向,這不是什么大問題!只需要改變它們,并確保你的團隊知道新的方向就可以。
12.結語:建立開發集和測試集
· 你希望在未來獲得什么樣的數據、并且想在上面做得好?從能反映出這個的數據分布中選擇開發集和測試集。這可能不同于你的訓練數據分布。
· 如果可能的話,選擇來自同一分布的開發集和測試集。
· 為你的團隊選擇單一數字評估指標進行優化。如果你關心多個目標,考慮把它們合并到一個公式中(例如平均多個錯誤度量),或設定滿足指標和優化指標。
· 機器學習是一個高度迭代的過程:在你發現滿意的方法之前,你可能需要嘗試很多的想法。
· 具有開發/測試集和單一數字評估指標可以幫助你快速評估算法,然后更快速的迭代。
· 當開始一個全新的應用時,嘗試快速建立開發/測試集和評估指標,最好在一周之內。當然,在成熟的應用程序上花費更長的時間也是可以的。
· 按照70%:30%的舊比例劃分訓練/測試集不適用于你擁有大量數據的情況;開發集和測試集可以占有遠小于30%的數據量。
· 你的開發集應足夠大,大到能檢測出你的算法準確性上的有意義的改變,但沒必要更大。你的測試集也應足夠大,大到能給你系統的最后性能一個有把握的評估。
· 如果你的開發集和評估指標使你的團隊遠離了正確方向,快速改變它:(i)如果你過擬合了開發集,那么就去獲得更多的開發集數據。(ii)如果你所關心的實際分布和開發/測試集的分布不同,那么就去獲得新的開發/測試集數據。(iii)如果你的評估指標不再能衡量對你來說最重要的東西,那么就改變評估指標。
13.快速構建第一個系統,然后迭代
你想建立一個新的反垃圾郵件系統。你的團隊有以下幾個想法:
· 收集一個含有大量垃圾郵件的訓練集。例如,設置一個“蜜罐”:給已知垃圾郵件發送者故意發送虛假的電子郵件地址,這樣就可以自動收集他們發送到這些地址的垃圾郵件。
· 開發理解電子郵件文本內容的功能。
· 開發理解電子郵件信封/標題特性的功能,以顯示消息經過的網絡服務器集。
· 其他。
盡管我在反垃圾郵件上做過大量工作,但我仍然很難選定其中的一個方向。如果你不是該應用領域的專家,那將更難。
所以,開始的時候不要試圖設計和構建完美的系統。相反,應該快速構建和訓練出一個基本系統——也許是在短短的幾天內5。即使這個基本系統與你所能構建的“最佳”系統相去甚遠,研究該基本系統的功能仍然很有價值:你將很快找到最值得你投入時間的方向的線索。接下來的幾章將告訴您如何去解讀這些線索。
5(此建議旨在幫助希望構建AI應用程序的讀者,而不是那些以發表學術論文為目標的讀者。稍后我將會回到學術主題。)
14.偏誤分析:查看開發集樣本來評估想法
當你使用貓app時,你注意到一些狗的圖片被錯誤識別成了貓。一些狗長的像貓!
一個團隊成員建議和第三方軟件合作,使系統可以更好地處理狗樣本。這些改變需要花費一個月的時間,并且團隊成員熱衷于這一方案。你應該要求他們這樣做嗎?
在投資這個任務一個之前,我建議你首先評估一下它實際上會提高多少系統的準確率。然后你才能更加理性地決定這是否值得花費這一個月的開發時間,還是使用這段時間做些別的事情更好。
具體來說,你可以做以下事情:
· 獲取100個系統錯誤分類的樣例。比如,系統出錯的例子。
· 手動查看這些樣本,計算其中有多少比例是狗的圖像。
查看錯誤分類樣本的這一過程被稱為偏誤分析(error analysis)。在該案例中,如果你發現被錯誤分類的圖像中只有5%是狗,那么無論你在狗的圖像上如何改進你的算法,你都不會消除超過5%的錯誤。換句話說,5%是上述建議能夠達到的“天花板”(也就是最大可能的改進上限)。因此,如果整個系統當前的準確率為90%(10%的錯誤率),這一改進最多可能得到90.5%的準確率(或者9.5%的錯誤率,比原來10%的錯誤率少5%)。
相反,如果你發現50%的錯誤圖像都是狗,那么你應該更相信第三方軟件的介入能獲得很大的效果。它能將準確率從90%提升到95%(錯誤率相對減少50%,從10%降到5%)。
這種偏誤分析的簡單計算過程能夠給你一個快速的方法,來決定與第三方機構合作解決“狗”問題是否值得。它為決定是否應該做出這筆投資提供了一個定量的基準。
偏誤分析通常會幫你選出不同的方向中哪些更有前景。我看到許多工程師不愿意進行偏誤分析。相比于考量一個想法是否值得花時間投入,直接進行并實現通常會更讓人感到更刺激。這是一個常見的錯誤:這可能導致你的團隊花費一個月時間只獲得很少的收益。
手動檢查100個樣本不會花費太長時間。即使你每分鐘只看一張圖片,兩小時內就可以完成。這兩個小時比你白白浪費一個月時間劃算多了。
偏誤分析(Error Analysis)是指檢查開發集中被算法錯誤分類的樣本的過程,以便了解錯誤產生的深層原因。它不僅可以幫助你重點發展項目,正如該例子所述,而且還能啟發一些新的方向,下面我們就會討論該內容。接下來的幾個章節還將介紹一些偏誤分析的最佳實踐案例。
15.在偏誤分析過程中并行評估多個想法
你的團隊有以下幾個想法來改進貓檢測器:
· 修復算法將狗錯認為是貓的問題。
· 修復算法將大型貓科類動物(獅子、豹等)被錯認為是家貓(寵物)的問題。
· 提高系統在模糊圖像上的表現。
· ……
你可以并行且有效地評估所有這些想法。我通常會創建一個電子表格,查看100個分類錯誤的開發集樣本并填寫在表格上,同時記下可以幫助我記住具體樣本的注釋。為了演示這個過程,讓我們來看一下你可能生成的一個由4個示例組成的小開發集的電子表格:
表格中圖片3在大型貓科動物和模糊圖片兩列都被勾選了。此外,由于一個例子可能與多個類別相關聯,底部的百分比不一定達得到100%。
盡管你可能將這個過程首先描述為類別分類(狗、大型貓科動物和模糊圖片),然后查看樣例并對它們進行分類。實踐中,當你在查看樣例時,可能受到啟發而提出一些新的錯誤類別。例如,也許查看過十幾張圖像后,你發現許多錯誤的圖片都經過Instagram 過濾器的預處理。你可以返回并在電子表格中添加“Instagram”列。手動查看算法出錯的樣例,并思考人是如何/是否能正確地分類這些樣例,這通常會啟發你想出新的類別和解決辦法。
最有用的錯誤類別是你有改進想法的錯誤類別。例如,如果你有辦法“撤銷” Instagram 過濾器從而恢復原始圖像,那么添加Instagram類別是最有用的。但是你不必只局限于你已經有想法去改進的錯誤類別;這個過程的目標是建立你對最有希望關注的領域的直覺。
偏誤分析是一個迭代的過程。如果開始的時候你在腦海里沒有任何分類,不要擔心!查看一些圖片之后,你就可能會提出一些關于錯誤類別的想法。手動分類一些圖片之后,你就可能會想出一些新的錯誤類別,然后根據新的類別再返回重新檢查這些圖片。以此類推。
假如你完成了對100個錯誤分類的開發集樣本的偏誤分析,并得到以下結果:
現在你知道了,解決狗分類錯誤的項目可以減少最多8%的錯誤。致力于大型貓科動物和模糊的圖片對降低錯誤率幫助更大。所以,你可能會挑選后兩者中的一個來進行處理。如果你的團隊有足夠多的人可以同時展開多個方向,你也可以讓一些工程師處理大型貓科動物圖片,另外一些解決模糊圖像。
偏誤分析并不會有一個明確的數學公式來告訴你什么才是最高優先級的任務。你還必須考慮你希望在不同錯誤類別上取得多少進展,以及處理每個錯誤類別所需要的工作量。
16.清理貼錯標簽的開發和測試集樣本
在偏誤分析中,你可能會注意到開發集中的一些樣本被錯誤標記了。這里所說的“錯誤標記”,是指即使在算法遇到它之前,圖片已經被打標人員貼上了錯誤的標簽。即:樣本 (x,y) 中的類別標簽y的值不正確。例如,也許一些不是貓的圖片被錯貼標簽為包含貓,反之亦然。如果你懷疑錯誤標記的圖像占比很大,添加一個類別來記錄有錯誤標記的樣本的占比:
你應該糾正開發集中的這些標簽嗎?記住,開發集的目的是為了幫你快速評估算法,以便你可以判斷算法A或B哪個更好。如果被錯誤標注的開發集的一小部分妨礙你做出這些判斷,那么花時間去修正錯誤標注的開發集標簽是值得的。
例如,假設你的分類器表現如下:
· 開發集的整體準確率……90%(10%整體錯誤率)
· 樣本貼錯標簽導致的錯誤……0.6%(開發集錯誤率中的6%)
· 其他原因導致的錯誤……9.4%(開發集錯誤率中的94%)
在這里,由于錯誤標注導致的0.6%的不準確性,相對于你可以改進的9.4%的錯誤而言,可能沒有那么重要。手動修復開發集中錯誤標注的圖像并沒有什么壞處,但這樣做并不重要:不知道系統是否有10%還是9.4%的整體錯誤率可能沒什么問題。
假設你不斷改進貓分類器并達到以下性能:
· 開發集的整體準確率……98.0%(2.0%整體錯誤率)
· 樣本貼錯標簽導致的錯誤……0.6%(開發集錯誤率中的30%)
· 其他原因導致的錯誤……1.4%(開發集錯誤率中的70%)
30%的錯誤是由于錯誤標注的開發集圖像造成的,這將會為您的準確率估計增加顯著的錯誤。現在去提高開發集中標簽的質量是有價值的。處理錯誤標注的樣本將幫助您算出分類器的錯誤是接近1.4%還是2%——這是一個相對顯著的差異。
開始容忍一些錯誤標記的開發集樣本并不罕見,只是在系統改進之后才改變主意,這樣錯誤標記的樣本相對于錯誤集的比例就會增加。
最后一章解釋了如何通過算法的提升來改進錯誤類別,例如狗、大型貓科動物和模糊圖片。在本章中你會了解到,你也可以通過改善數據標簽在錯誤標記的類別上工作。
無論你采用什么方法來修正開發集標簽,記得也將其用于測試集標簽,以便開發集和測試集繼續服從統一分布。將開發集和測試集固定在一起可以避免我們在第六章中討論的問題,即你的團隊優化了開發集的性能,只是到后來才意識到他們在根據不同的測試集進行不同的標準判斷。
如果你決定提升標簽的質量,那么請考慮仔細檢查系統錯誤分類的樣本的標簽,以及正確分類樣本的標簽。在一個樣本中,原始標簽和學習算法有可能都是錯的。如果只是修正系統已經錯誤分類的樣本的標簽,可能會在評估中引入誤差。如果你有1000個開發集樣本,并且分類器準確率為98%,那么檢查錯誤分類的20個樣本比檢查正確分類的所有980個樣本要容易的多。因為在實踐中只檢查錯誤分類的樣本比較容易,所以偏差會蔓延到一些開發集中。如果你只對開發產品和應用感興趣,那么這種偏差是可以接受的,但如果你計劃在學術研究論文中使用該結果,或者需要對測試集的準確性進行完全無偏見的測量,這將會是一個問題。
17.如果你有一個大的開發集,將其分成兩個子集,只著眼于其中的一個
假設你有一個含有5000個樣本的大開發集,其中有20%的錯誤率。這樣,算法將對約1000個開發圖片進行錯誤分類。手動檢查1000張圖片會花費很長時間,所以我們可能會決定在偏誤分析中不使用所有圖片。
在這種情況下,我會明確地將開發集分成兩個子集,只看其中一個,另一個不看。你將會很快的過擬合你手動查看的那部分。你可以使用未手動查看的部分來調參。
繼續上面的例子,在該例子中算法將5000個開發集樣本中的1000個進行了錯誤分類。假設我們想手動檢查約100個錯誤樣本(錯誤樣本的10%)進行偏誤分析。你應該隨機選擇10%的開發集,并將其放入我們口中的眼球開發集(Eyeball dev set)中,以提醒我們自己,我們正在用眼睛看它。(對于語音識別項目,你可以在其中聽音頻剪輯,或許可以將這個數據集稱為耳朵開發集)。因此,眼球開發集有500個樣本,其中我們預計算法會錯誤分類約100個。
開發集的第二個子集叫做黑盒開發集(Blackbox dev set),它將擁有剩余的4500個樣本。你可以使用黑盒開發集,通過測量它們的錯誤率來自動評估分類器。也可以使用它來選擇算法或調超參。但是,你應該避免用眼睛去看它。我們使用術語“黑盒”是因為我們只使用數據集的子集來獲得分類器的“黑盒”評估。
為什么我們將開發集明確分為眼球開發集和黑盒開發集呢?因為你會獲得眼球開發集中樣本的直觀認識,你就會開始更快的過擬合眼球開發集。如果你發現眼球開發集比黑盒開發集性能提升的更快,你已經過擬合眼球開發集了。這種情況下,你可能需要丟棄它并找一個新的眼球開發集,可以通過將更多黑盒開發集中的樣本移到眼球開發集中,也可以通過獲取新的標注數據來獲得。
將開發集明確地分為眼球和黑盒可以讓你知道手動偏誤分析過程中什么時候會開始導致數據的眼球部分過擬合。
18.眼球和黑盒開發集應該多大?
你的眼球開發集應該足夠大,大到可以讓你了解到算法的主要錯誤類別。如果你正在從事一項人類表現很好的任務(如識別圖像中的貓),以下是一些粗略的指導方針:
· 一個使你的分類器犯錯10次的眼球開發集將被認為是非常小的。只有10個錯誤,很難準確估計不同錯誤類別的影響。但如果您的數據非常少,并且無法將更多的數據放入眼球開發集,那么有總比沒有好,這將有助于項目的優先順序。
· 如果分類器在眼球開發集上樣本上犯了約20個錯誤,你將會開始大致了解主要的錯誤來源。
· 如果有約50個錯誤,你將會比較好的了解主要的錯誤來源。
· 如果有約100個錯誤,你將會很清楚主要的錯誤來源。我見過有人手動分析更多的錯誤——有時候多達500個。只要你有足夠多的數據,這是沒有壞處的。
假設你的分類器有5%的錯誤率。為了確保在眼球開發集中有約100個錯誤標記的樣本,眼球開發集應該有約2000個樣本(因為0.05 * 2000 = 100)。分類器的錯誤率越低,為了獲得足夠多的錯誤來分析,眼球開發集就需要越大。
如果你正在做一個連人都做不好的任務,那么檢查眼球開發集將不會有什么幫助,因為很難找出算法不能正確分類一個樣本的原因。這種情景下,你可能會忽略眼球開發集。我們將在后續章節中討論這些問題的指導方針。
黑盒開發集該如何?我們之前說過,開發集有約1000-10000個樣本是正常的。為了完善這個表述,盡管更多的數據幾乎沒什么壞處,一個有1000-10000個樣本的黑盒開發集通常會為你提供足夠的數據去調超參和選擇模型。一個含有100個樣本的黑盒開發集比較小,但仍然有用。
如果你有一個小的開發集,那么你可能沒有足夠的數據將其分成足夠大的眼球和黑盒開發集來達到目的。相反,你的整個開發集可能不得不用作眼球開發集——也就是說,你將手動檢查所有的開發集數據。
在眼球和黑盒開發集之間,我認為眼球開發集更重要(假設你正在研究一個人類能夠很好解決的問題,檢查這些樣本能幫你獲得洞察力)。如果你只有一個眼球開發集,你可以在這個開發集上進行偏誤分析、模型選擇和調超參。只有一個眼球開發集的缺點是過擬合開發集的風險更大。
如果你有數據的充足訪問權限,那么眼球開發集的大小將主要取決于你有時間去手動分析的樣本的數量。例如,我很少看到有人手動分析超過1000個錯誤。
19.結語:基本偏誤分析
· 當你開始一個新項目時,尤其是在一個你不是專家的領域,很難正確猜測出最有前景的方向。
· 所以,不要在開始試圖設計和構建一個完美的系統。相反,應盡可能快(可能在短短幾天內)的構建和訓練一個基本系統。然后使用偏誤分析去幫助你識別最有前景的方向,并通過迭代改進你的算法。
· 通過手動檢查約100個算法錯誤分類的開發集樣本來執行偏誤分析,并計算主要的錯誤類別。用這些信息來確定優先修復哪種類型的錯誤。
· 考慮將開發集分為手動檢查的眼球開發集和不手動檢查的黑盒開發集。如果在眼球開發集上的性能比在黑盒開發集上好很多,那么你已經過擬合眼球開發集了,并且應該考慮為其添加更多的數據。
· 眼球開發集應該足夠大,以便于算法有足夠多的錯誤分類樣本供你分析。對很多應用來說,含有1000-10000個樣本的黑盒開發集已經足夠了。
· 如果你的開發集沒有大到可以按照這種方式進行拆分的程度,那么就使用眼球開發集來用于手動偏誤分析、模型選擇和調超參。
20. 偏差和方差:錯誤的兩大來源
假設你的訓練集、開發集和測試集都來自相同的分布。那么你應該試圖去獲取更多的訓練數據,因為這樣能只提高性能,對嗎?
盡管有更多的數據是沒有壞處的,但是也不總是如我們期望的那樣有幫助。獲取更多的數據可能是浪費時間。所以,你需要決定何時該加數據,何時不用這么麻煩。
機器學習中有兩個主要錯誤來源:偏差和方差。理解它們將有助于你決定添加數據以及其他提高性能的策略是否是對時間的良好利用。
假設你希望構建一個5%錯誤率的貓識別器。目前,你的訓練集錯誤率為15%,并且你的開發集錯誤率為16%。在這種情況下,添加訓練數據可能不會有太多幫助。你應該著眼于其他改變。實際上,在你的訓練集上添加更多的樣本只會讓你的算法難以在訓練集上做的更好。(我們會在后面的章節中說明原因。)
如果你在訓練集上的錯誤率是15%(85%的準確率),但是你的目標是5%錯誤率(95%準確率),那么第一個要解決的問題是提高算法在訓練集上的性能。你的開發/測試集上的性能通常比在訓練集上要差。所以,如果算法在見過的樣本上得到85%的準確率,那么是不可能在沒見過的樣本上得到95%的準確率的。
假設如上所述你的算法在開發集上有16%的錯誤率(84%的準確率)。我們將這16%的錯誤分為兩部分:
· 第一,算法在訓練集上的錯誤率。在該例中,它是15%。我們非正式地將此認為是算法的偏差(bias)。
· 第二,算法在開發(或測試)集上比訓練集上差多少。在該例中,開發集比訓練集差1%。我們非正式地將此認為是算法的方差(variance)6。
對學習算法的一些修改能解決錯誤的第1個組成部分——偏差,并且提高算法在訓練集上的性能;一些修改能解決錯誤的第2個組成部分——方差,并幫助算法從訓練集到開發/測試集上更好的泛化7。為了選擇最有希望的改變,了解這兩組錯誤中哪個更亟待解決是很有用的。
開發關于偏差和方差的良好直覺將幫助你為算法選擇有效的改變。
備注:
6(統計領域對偏差和方差有更正式的定義,我們不用擔心這些。粗略地說,偏差是當你有一個非常大的訓練集時,你的算法在訓練集上的錯誤率。方差是與此設置中的訓練集相比,你在測試集上差多少。當你的誤差衡量是均方差(mean squared error)時,你可以寫下指定這兩個量的公式,并證明總誤差 = 偏差 + 方差(Total Error = Bias + Variance)。但是你的目的是如何在機器學習問題上取得進展,這里給出的偏差和方差的更非正式的定義就足夠了。)
7(這里還有一些通過對系統架構做出大的改變的方法,能夠同時減少偏差和方差。但是這些方法往往難以識別和實施。)
21 關于偏差和方差的例子
以我們的貓咪分類任務為例。一個理想的分類器(比如人)可能會用幾乎完美的表現來完成這個任務。
假設你的算法可以達到以下標準:
訓練集誤差 = 1%
開發集錯誤 = 11%
這會帶來什么問題呢?根據之前的章節中我們給出的定義,我們可以估計出偏差為1%,方差為10%(=11%-1%)。因此,這帶來了高方差。該分類器有著很低的訓練誤差,但是它并不能一般化為開發集。我們稱之為過度擬合。
現在再來看看這個:
訓練集誤差 = 15%
開發集錯誤 = 16%
我們可以估計出偏差為15%然后方差為1%。這個分類器對訓練集的擬合很差,誤差為15%,但它在開發集上的誤差和訓練誤差相差無幾。 因此,該分類器具有高偏差低方差。 我們說這個算法是欠擬合的。
我們再來看一個例子:
訓練集誤差 = 15%
開發集錯誤 = 30%
我們可以估計出偏差和方差均為15%。該分類器具有高偏差和高方差:它在訓練集上表現不佳,因此具有高偏差,并且其在開發集上的性能更差,因此它也具有高方差。 過度擬合/欠擬合術語很難應用于此,因為該分類器同時過度擬合和欠擬合。
我們最后再來看一個例子:
訓練集誤差 = 0.5%
開發集錯誤 = 1%
這個分類器做得很不錯,不僅低偏差而且低方差。祝賀你以極佳的表現完成了這個任務。
22 與最佳錯誤率做比較
在我們的貓咪識別的例子中,“理想的”錯誤率——由“最佳”分類器所實現的——將近0%。一個人在看照片的時候幾乎總是可以分辨出來里面是不是有一只貓的;因此我們希望機器也可以做到這個地步。
其他的問題則有點兒難度。舉個例子,假設你正在構建一個語音識別系統,發現14%的音頻片段具有極多的背景噪音或者是非常的難以理解,即使是人類也無法識別所說的內容。在這種情況下,即便是“最佳”語音識別系統也會有14%左右的錯誤。
假設在剛才那個語音識別問題上你的算法可以達到以下標準:
訓練集誤差 = 15%
開發集錯誤 = 30%
訓練集的性能已經接近14%的最佳錯誤率。因此,在偏差或訓練集性能方面沒有太大的改進空間。但是,該算法并沒有很好地推廣到開發集; 因此,由于變化導致的誤差存在很大的改進空間。
這個例子類似于前一章的第三個例子,它的訓練集誤差為15%,開發集誤差為30%。 如果最佳錯誤率為~0%,那么15%的訓練誤差留下了很大的改進空間。 這表明減少偏差的變化可能是富有成效的。 但如果最佳錯誤率為14%,則相同的訓練集性能告訴我們,分類器的偏差幾乎沒有改進的余地。
對于最佳錯誤率和0相差非常多的問題,這里是算法錯誤的更詳細分類。 繼續上面的語音識別例子,30%的總開發集錯誤可以分解如下(類似的分析可以應用于測試集錯誤):
最佳錯誤率(“不可避免的偏差”):14%。假設我們決定,即使世界上最好的語音系統,我們仍然會有14%的錯誤。我們可以將此視為機器學習算法偏差的“不可避免”部分。
可避免的偏差:1%。這是以訓練集誤差和最佳誤差率之間的差值得來的。【注8】
方差:15%。訓練集誤差和開發集誤差的差值。
為了將其與我們之前的定義聯系起來,偏差和可避免偏差的關系如下【注9】:
偏差 = 最佳錯誤率(不可避免偏差)+可避免偏差
“可避免的偏差”反映了算法在訓練集上的表現比“最佳分類器”差多少。
方差的概念與以前一樣。從理論上講,我們總是可以通過訓練大量訓練集將方差減少到接近零。因此,對于足夠大的數據集,所有方差都是“可避免的”,因此不存在“不可避免的方差”。
我們再來考慮一個例子,還是最佳錯誤率為14%,然后我們滿足:
訓練集誤差 = 15%
開發集錯誤 = 16%
在前一章中我們將其稱為高偏差分類器,現在我們可以說它的可避免偏差為1%,方差約為1%。因此,該算法已經做得很好,幾乎沒有改進的余地。它只比最佳錯誤率差2%。
我們從這些例子中看到,了解最佳錯誤率有助于指導我們的后續步驟。在統計中,最佳錯誤率也稱為貝葉斯錯誤率或貝葉斯率。
那我們該怎么才能知道最佳錯誤率是多少呢?對于人類相當擅長的任務,例如識別圖片或抄錄音頻片段,你可以要求人類提供標簽,然后測量人工標記相對于訓練集的準確性。這將給出最佳錯誤率的估計。如果你正在解決甚至人類都難以解決的問題(例如,預測該推薦什么電影或向用戶展示什么樣的廣告),則很難估計最佳錯誤率。
在“與人類績效比較(第33至35章)”一節中,我將更詳細地討論將機器學習算法的性能與人類績效進行比較的過程。
在最后幾章中,你學習了如何通過查看訓練和開發設置錯誤率來估計可避免/不可避免的偏差和方差。下一章將討論如何使用此類分析中的見解來優先考慮減少偏差的技術還是減少方差的技術。根據項目當前的問題是高(可避免)偏差還是高方差,你應該應用不同的技術。讓我們繼續!
【注8】如果此數字為負數,則你在訓練集上的表現優于最佳錯誤率。這意味著你在訓練集上過度擬合,并且該算法已經過度記憶訓練集。你應該關注讓方差減少的方法,而不是進一步減少偏差。
【注9】選擇這些定義是為了傳達有關如何改進學習算法的見解。這些定義與統計學家定義偏差和方差的方式不同。從技術上講,我在這里定義的“偏差”應該被稱為“我們歸因于偏差的錯誤”; 并且“可避免的偏差”應該是“我們歸因于學習算法偏差超過了最佳錯誤率的錯誤”。
23 解決偏差和方差
解決偏差和方差問題最簡單的準則如下:
如果你具有較高的可避免偏差,請增加模型的大小(例如,通過添加網絡層數/神經元來增加神經網絡的大小)。
如果你的方差很大,請為訓練集增加數據。
如果你能夠無限制地增加神經網絡大小并增加訓練數據,那很多機器學習的問題都迎刃而解了。
但是實際上,增加模型的大小最終會導致計算問題,因為訓練非常大的模型很慢。你也可能無法獲得更多的訓練數據。(即使在互聯網上,也只有有限張的貓片!)
不同的模型體系結構——例如,不同的神經網絡體系結構——會針對你的問題具有不同的偏差/方差。最近的許多深度學習研究已經開發出很多創新的模型架構。因此,如果你使用神經網絡,學術文獻可以成為靈感的重要來源。github上還有很多很棒的開源實現。但是,嘗試新架構的結果比我們都簡單準則(增加模型大小和添加數據)更難以預測。
增加模型大小通常會減少偏差,但也可能會增加方差和過度擬合的風險。但是,這種過度擬合問題通常僅在你不使用正則化時出現。如果你有著精心設計的正則化方法,那么通常可以安全地增加模型的大小而不會增加過度擬合。
假設你正在應用具有L2正則化或遺棄的深度學習,其中正則化參數在開發集上表現最佳。如果你增加模型大小,通常你的性能將保持不變或改善;它不太可能顯著惡化。避免使用更大模型的唯一原因是計算成本增加。
24 偏差與方差的權衡
你可能聽說過“偏差與方差權衡”。我們對大多數學習算法做出的改變,有一些可以減少偏差,但代價是增加方差,反之亦然。這在偏差和方差之間產生了“權衡”。
舉個例子,在神經網絡中增加模型添加神經元/層的大小,或這增加輸入的特征——通常會減少偏差,但可能會增加方差。對應的,添加正則化通常會增加偏差但會減少方差。
在現代,我們經常可以訪問大量數據,并且可以使用非常大的神經網絡(深度學習)。因此,我們做權衡的機會比較少,而且現在有更多的選擇來減少偏差而不會損害方差,反之亦然。
舉個例子,你通常可以增加神經網絡大小并調整正則化方法以減少偏差而不會顯著增加方差。通過添加訓練數據,你通常還可以在不影響偏差的情況下減少方差。
如果選擇適合你任務的模型體系結構,則還可以同時減少偏差和方差。但是選擇這樣的架構可能很困難。
在接下來的幾章中,我們將討論用于解決偏差和方差的其他特定技術。
25 降低可避免偏差的技術
如果你的學習算法可避免的偏差非常高,那么可以嘗試以下技術:
增加模型大小(例如神經元/層數):這種技術可以減少偏差,因為它可以讓你更好地適應訓練集。如果你發現這會增加方差,那么就使用正則化,這通常會消除方差的增加。
根據錯誤分析修改輸入特征:假設你的錯誤分析激發你創建其他特征,幫助算法消除特定類別的錯誤。 (我們將在下一章進一步討論這個問題。)這些新特征可能有助于偏見和差異。理論上,添加更多特征可能會增加差異;但如果你發現這種情況,那就使用正則化,這通常會消除方差的增加。
減少或消除正則化(L2正則化,L1正則化,丟失):這將減少可避免的偏差,但會增加方差。
修改模型體系結構(例如神經網絡體系結構),使其更適合你的問題:此技術可以影響偏差和方差。
一種無用的方法:
添加更多訓練數據:此技術有助于解決方差問題,但通常對偏差沒有顯著影響。
26 訓練集的誤差分析
你的算法必須在訓練集上運行良好,才能期望它在開發/測試集上表現良好。
除了前面描述的用于解決高偏差的技術之外,我有時還會根據類似于Eyeball開發套件的錯誤分析的協議對訓練數據進行誤差分析。 如果你的算法具有高偏差,即如果它不能很好地擬合訓練集,則這可能很有用。
舉個例子,假設你正在為應用程序構建語音識別系統,并從志愿者那里收集了一組音頻剪輯。 如果你的系統在訓練集上表現不佳,你可能會考慮了解一組約100個例子,它們會告訴你這些算法很難理解訓練集錯誤的主要類別。 與開發集誤差分析類似,你可以統計不同類別的錯誤:
?
在此示例中,你可能會發現你的算法在使用具有大量背景噪音的訓練示例時會遇到特別的困難。因此,你可以專注于能夠更好地適應具有背景噪聲的訓練示例的技術。
在給定與學習算法相同的輸入音頻的情況下,你還可以仔細檢查一個人是否可以轉錄這些音頻片段。如果有太多的背景噪音,任何人都無法弄清楚所說的內容,那么期望任何算法正確識別這些話語可能是不合理的。我們將在后面的部分討論將算法與人類級別性能進行比較的好處。
27 降低方差的技術
如果你的學習算法存在高方差,你可以嘗試以下技術:
添加更多訓練數據:這是解決方差的最簡單、最可靠的方法,只要你可以訪問更多的數據以及足夠的計算能力來處理數據。
添加正則化(L2正則化,L1正則化,丟失):此技術可減少方差但增加偏差。
添加早期停止(即基于開發設置誤差,提前停止梯度下降):此技術可減少方差但增加偏差。早期停止的行為與正則化方法非常相似,有些作者稱之為正則化技術。
減少輸入要素數量/類型的特征選擇:此技術可能有助于解決方差問題,但也可能會增加偏差。稍微減少特征的數量(比如從1000個特征到900個)不太可能對偏差產生巨大影響。只要你沒有排除太多有用的特征,減少它(例如從1000個特征減少到100個,減少10倍)就更有可能產生重大影響。在現代深度學習中,當數據充足時,關注重點就已經不在特征選擇了,現在我們更有可能給所有特征都賦予算法,并讓算法基于數據選擇使用哪些特征。但是當你的訓練集很小時,特征選擇可能非常有用。
減小模型大小(例如神經元/層的數量):謹慎使用。這種技術可以減少方差,同時可能增加偏差。但我不推薦這種技術來解決方差。添加正則化通常會提供更好的分類性能。減小模型尺寸的優勢在于降低了計算成本,從而加快了訓練模型的速度。如果加速模型訓練很有用,那么一定要考慮減小模型大小。但是,如果你的目標是減少方差,并且你不關心計算成本,請考慮添加正則化。
以下是關于解決偏差的前一章重復的另外兩種策略:
根據錯誤分析修改輸入特征:假設你的錯誤分析激發你創建其他特征,幫助算法消除特定類別的錯誤。這些新特征可能有助于解決偏差和方差的問題。在理論上,增加更多特征可以增加方差;但如果你發現這種情況,那就使用正則化,這通常會消除方差的增加。
修改模型體系結構(例如神經網絡體系結構),使其更適合你的問題:此技術可以影響偏差和方差。
28 診斷偏差和方差:學習曲線
我們已經看到一些方法來估計那些可歸因于可避免偏差與方差的錯誤的數量,我們可以通過估計最佳錯誤率并計算算法的訓練集和開發集錯誤來實現這一目的。現在讓我們討論一種更具信息性的技術:繪制學習曲線。
學習曲線將你的開發集錯誤與訓練示例的數量進行對比。要繪制它,你需要使用不同的訓練集大小運行算法。舉個例子,如果你有1,000個示例,則可以在100,200,300,...,1000示例上訓練算法的單獨副本。 然后你可以繪制開發集誤差如何隨訓練集大小而變化。給大家展示一個例子:
?
隨著訓練集數據的增多,開發集誤差應當下降。
我們經常會有一些“期望的錯誤率”,我們希望我們的學習算法最終能夠實現這個錯誤率。例如:
如果我們希望人類的表現,那么人為錯誤率可能是“期望錯誤率”。
如果我們的學習算法服務于某些產品(例如提供貓片),我們可能會基于直覺地知道需要什么級別的性能來為用戶提供良好的體驗。
如果你長期從事一項重要的應用,那么你可能會基于直覺地知道下一季度/年度可以合理地取得多少進展。
為你的學習曲線加上期望值之后圖像會變成這樣:
?
你可以通過視覺外推延伸紅色“dev error”曲線來猜測通過添加更多數據后能夠有多接近期望值。在上面的示例中,將訓練集大小加倍可能會使你達到所需的性能。
但是,如果開發錯誤曲線已經“平穩”(即變平),那么你可以立即告訴自己,添加再多的數據也無法實現你的目標了:
?
因此,考慮學習曲線可能會幫助你避免花費數月時間收集兩倍的無用訓練數據的情況。
這個過程的一個缺點是,如果你只看開發誤差曲線,哪怕你有更多的數據,也很難推斷和預測紅色曲線的確切位置。 還有一個附加圖可以幫你估計添加數據的影響:訓練誤差。
29 繪制訓練錯誤圖像
隨著訓練集大小的增加,你的開發集(和測試集)誤差應該會減少。但是,隨著訓練集大小的增加,訓練集誤差通常會增加。
讓我們用一個例子說明這種效果。假設你的訓練集只有兩個示例:一個貓圖像和一個非貓圖像。然后,學習算法很容易“記住”訓練集中的兩個示例,并獲得0%的訓練集錯誤。即使其中一個或兩個訓練樣例都被錯誤標記,算法仍然很容易記住兩個標簽。
現在假設你的訓練集有100個例子。可能一些例子甚至被貼錯了標簽,或者含糊不清——有些圖像非常模糊,所以即使是人類也無法判斷是否有貓。可能學習算法仍然可以“記住”大部分或全部訓練集,但現在更難以獲得100%的準確度。通過將訓練集從2個增加到100個,你會發現訓練集的準確度會略有下降。
最后,假設你的訓練集有10,000個示例。在這種情況下,算法更難以完全適合所有10,000個示例,特別是如果有些模糊不清或標注錯誤。因此,你的學習算法在此訓練集上會更糟糕。
讓我們在之前的數據中添加一個訓練誤差圖:
你可以看到藍色“訓練誤差”曲線隨著訓練集的大小而增加。此外,你的算法通常在訓練集上比在開發集上做得更好; 因此,紅色偏差誤差曲線通常嚴格地位于藍色訓練誤差曲線之上。
我們接下來討論如何解釋這些圖。
30 解釋學習曲線:高偏差
假設你的開發錯誤曲線如下圖所示:
?
我們之前曾說過,如果你的開發誤差曲線穩定,你不可能僅通過添加數據來達到預期的性能。
但我們其實很難確切地知道紅色開發誤差曲線的外推是什么樣的。 如果開發集很小,你會更加不確定,因為曲線可能會受很多因素的影響。
假設我們將訓練誤差曲線添加到該圖中并獲得以下圖像:
?
現在,你可以絕對確定添加更多數據絕對不是一個好辦法了。 為什么呢? 記住我們的兩個觀察結果:
隨著我們添加更多訓練數據,訓練誤差只會變得更糟。因此,藍色訓練誤差曲線只能保持相同或更高,因此它只能遠離所需性能的(綠線)水平。
紅色偏差誤差曲線通常高于藍色訓練誤差。因此,即使訓練誤差高于期望的性能水平,添加更多數據也幾乎無法使紅色偏差誤差曲線下降到所需的性能水平。
在相同的圖上檢查開發誤差曲線和訓練誤差曲線使我們能夠更自信地推斷開發誤差曲線。
為了便于討論,假設期望的性能是我們對最佳錯誤率的估計。上圖是具有高可避免偏差的學習曲線的標準“教科書”示例:在訓練集最大的時候——可能與我們所有的訓練數據相對應——訓練誤差與期望值之間存在較大差距,表明可避免的偏差很大。此外,訓練曲線和開發曲線之間的差距很小,表明方差很小。
以前,我們僅在該圖的最右側點測量訓練集和開發集誤差,這對應于使用所有可用的訓練數據。繪制完整的學習曲線,可以更全面地了解算法在不同訓練集大小上的表現。
轉載于:https://www.cnblogs.com/wynlfd/p/9752543.html
總結
- 上一篇: /Symbian/9.2/S60_3rd
- 下一篇: Shell编程--初识shell