Machine_Learning_Yearning 翻譯與理解

注:並沒有按原文字面意思翻譯,僅僅是看後按自己的理解來記錄,建議各位過客看英文原版

在模型準確度不夠好時,採用的策略有:

1、更多數據

2、嘗試更大的神經網絡模型

3、嘗試更小的神經網絡模型

4、更多的迭代

5、收集更多樣化的數據集

6、嘗試添加正則化,如L1,L2

7、改變神經網絡結構:激活函數,隱藏單元數量

...

但時間有限,面臨巨大壓力時,如何採用這些策略顯得至關重要。很多的機器學習問題如何優化是有線索可循的,這本書的目的就是學習及解讀這些線索,提高模型的準確度。


爲什麼深度學習現在才火:規模驅動機器學習進展

1、使用電子設備的越來越多,帶來數據的幾何倍數增加

2、計算設備的計算能力增強

3、結合上面兩點,即使有海量數據和超強的計算能力,比較老的算法,比如邏輯迴歸,在性能上提升也是很有限的


而用一個小的神經網絡來完成同樣的任務,可能會得到較好一點的效果


這裏的“小的神經網絡”意思是隻有少量的隱藏層和參數,如果訓練更大的神經網絡,可以得到更好的效果


也就是說在計算能力牛,數據多的情況下大的神經網絡效果會更優越,如果沒啥數據,大家估計就差不多了,搞不好,老的算法還更優。

提高預測效果,還有很多細節也是很重要的,如神經網絡的結構,這裏面是有很多創新的東西的,但目前一個更穩妥的提高模型性能的方案是去訓練更大的網絡,獲取更多的數

據。


建立開發和測試集合

       貓識別的例子:想做個貓識別器在手機app上使用,從各個網站下載了很多貓和非貓的圖片,並且把圖片分割成70%的訓練集,30%的驗證集,使用這些數據,訓練了一個貓識別器,會發現在訓練集合驗證集都work得很好,但當用戶使用app來識別他們的圖片時,效果卻很差。

       這是因爲用戶使用智能機拍攝的圖像可能存在低分辨率,光照不理想,模糊等問題,而構建識別器的數據集是由網絡圖片構成的,因此,算法並沒有生成能夠很好刻畫我們關心的智能機圖像的分佈。

       使用隨機的70%/30%拆分來形成訓練和測試集是機器學習中的一個常見規則,在實際工作中,訓練數據分佈不同於實際我們關心的數據分佈是比較常見的問題,需要有意識避免這樣的錯誤。

       通常定義:

訓練集:在上面跑算法的,我理解的這個數據應該是比較大的,用來跑效果較好的或最終模型的

開發集:用來調整參數,特徵選擇,對學習算法做出其他決定,我理解的這個數據集應該是比較小的,可以快速驗證算法性能,調整模型,特徵選擇等,可以測試很多想法

測試集:用於評估算法的性能

開發集、測試集應該是選擇期望在後續模型使用中能高精度識別的樣本,這樣在測試集ok的識別器在實際中才能表現一致

有了這三個集合,我們就可以得到三個誤差值:


其中,人類水平的誤差(human level error)是人類自己處理這類問題的誤差值;訓練集誤差(training set error)是指在訓練集上跑出來的誤差值;開發集誤差(devset error)是指用開發集跑出來的誤差值。(測試集誤差後面會說)

然而我們關注的並不是這個誤差值本身,而是它們互相之間的差距。人類誤差與訓練集誤差之間的差距稱爲「avoidable bias」(可避免的偏差,可簡稱爲偏差)。之所以說「可避免的(avoidable)」,是因爲這部分誤差可以通過進一步的學習/模型調整優化來避免。而訓練集和開發集之間的差距稱爲「variance(方差)」,它是因爲跑了不同的數據而導致的誤差率變化(比如跑在見過的數據集上和沒見過的數據集上的誤差率之差)這兩種偏差合在一起,就是機器學習領域著名的 bias-variance trade-off(偏差-方差權衡)。

吳恩達給出的解決配方是:

如果訓練誤差高(偏差),就使用更大的模型、訓練更長的時間、採用新的模型架構如果開發誤差高(方差),就使用更多數據、正則化、新的模型架構


    下來問題來了,有時候在系統沒投入使用前是拿不到未來做識別的樣本的,這就構建不了測試集和開發集了,這種情況只能最大程度去模擬、獲取了,在系統投入使用後再更新數據集,實在找不到數據集就只能曲線救國,先使用當前最理想的數據集,例如貓的例子,就只能使用網絡圖片了,但要注意使用這樣的數據集的風險


案例:智能後視鏡,如果我們要做個智能後視鏡(語音操作的車內智能助手),我們的數據該怎麼搞?

    首先,假設我們有 50000 小時的語音資料(隨便在哪裏下載來的)和 10 小時的車內對着後視鏡講話的語音資料(比如,讓客戶假裝他的後視鏡是智能的,然後錄下一些語音指令……)。面對這些數據,我們該如何構造我們的訓練集?

    有人可能會這樣說:50000 小時語料夠大,可以分出一些來做開發集(dev set),其他的用來訓練。而 10 小時珍貴的車內語音則做成測試集。(其實我就是這麼想的!!!)

    錯!這是個非常不好的處理方式,因爲你的開發集和測試集沒能遵從相同的數據分佈(distribution)。換句話說,開發集和測試集的內容「根本就不在同一個宇宙」。這樣的結果就是,你的數據工程師在開發集上花費了很大的精力之後,結果放到測試集上卻發現並沒有什麼用。

    一個比較靠譜的處理方式應該是:把 10 小時的車內語料分成開發集和測試集。同時,你也可以拿出訓練集中的一部分內容作爲訓練-開發集(train-dev set)。這個數據集能幫助你的算法在訓練集上做好優化,再轉移到真實場景中。按照這個構架,我們於是可以得到五種不同的誤差值:人類誤差、訓練集誤差,訓練-開發集誤差、開發集誤差、測試集誤差.其中,人類誤差與訓練集誤差之間的差值還是稱爲 bias(偏差);訓練集誤差與訓練-開發誤差之間的差值稱爲「訓練集的過擬合」(也就是說,它代表了模型單純在訓練集上表現能力);訓練-開發誤差與開發集誤差之間的差值稱爲「data mismatch」(數據不匹配,就是剛纔說的兩組數據不在同一個「宇宙」帶來的偏差);開發集誤差與測試集誤差之間的差值稱爲「開發集過擬合」(同理)。這個時候,擁有的差值就更多了,我們就需要一個新的處理策略:


    用於機器學習的新配方:如果訓練誤差高(偏置),就使用更大的模型、訓練更長時間、使用新的模型架構;如果訓練-開發誤差高(方差),就使用更多數據、正則化、新的模型架構;如果開發誤差高(訓練-測試數據不匹配),就使訓練數據更近似於測試數據、進行數據合成(域適應)、使用新的模型架構。


開發集合測試集應該來自同樣的分佈

     當模型在開發集工作得很好,在測試集卻表現很差時,要考慮是不是開發集合測試集的分佈不一樣。如果是一樣的,估計就是開發集訓練的模型過擬合了,顯而易見的方法

就是增加開發集的數據量,但如果是開發集和測試集不一樣,要定位到具體問題所在就不是那麼清晰明瞭了,有幾個方面會造成這樣的結果:

1、開發集訓練過擬合

2、測試集比開發集要複雜,因此,你的算法可能做得和預期的一樣好,但對於測試集可能沒有進一步的改進

3、測試集可能沒開發集複雜,但模型在開發集上表現很好,在測試集上不行,提升開發集上的模型的性能都是徒勞的

     總之,最好是開發集和測試集來自相同的分佈。研究遷移學習的除外。


開發集和測試集應該多大合適

     開發集應該足夠用於檢測不同算法之間的差異。例如分類器A準確率是90.0%,分類器B準確率是90.1%,一個僅包含100個樣本的開發集是不足以檢測這0.1%的差異的,這種情況推薦1000-10000個樣本的開發集,使用10000的開發集就很可能發現這0.1%的差異了。

     對於一些成熟或重要的應用,例如廣告、搜索引擎、產品推薦等,0.01%的提升也是很重要的,因爲這直接影響到公司的收益,這種情況,爲了檢測出模型間更小的差異,開發集會比10000多得多

     測試集應該多大呢?測試集應該要足夠用於高可信度的評估系統的性能,一個流行的配置的用30%的數據作爲測試集,這在數據適中的情況下工作得很好,即100-10000個樣

本時。但在大數據時代,常常面臨多達上億數據的機器學習問題,30%的比率其實是往下調的,但樣本量是增加的。


爲團隊建立單一的優化指標

      在實際建模過程中算法性能的評估指標有多種,如準確率、召回率、F1score等,如果我們建立一個單一的指標就會方便判斷模型的好壞,如用準確率做爲指標,A分類器的準確度是97%,B分類器的是95%,可以判斷A優於B,但如果我們使用多指標,我們就沒法立即判斷哪個模型更好,如:

在開發過程中團隊會嘗試關於模型結構,模型參數,特徵選擇等的一些想法,建立單一優化指標有助於快速判斷

有時我們可能會即關於準確率又關注召回率,這時我們可以用他們的平均值或者平均值的替代品F1score

有時可能也關注執行效率


如果像Accuracy - 0.5*RunningTime 這樣整合成單一指標,貌似很不自然,這時除了單一指標,還需建立滿意指標,就拿執行效率來說,只要在100ms內就能接受,那我們就建立個執行時間小於100ms的滿意指標,在滿足滿意指標的前提下去優化準確度


有開發集和度量加速迭代

   對於一個沒有研究過的問題,一開始就知道什麼方法有效是很困難的,即使經驗豐富的機器學習研究者在沒有發現有效方法前都需要去嘗試很多的想法,在建立機器學習系統的時候,吳恩達通常是這樣做的:

1、首先就如何構建系統提出一些想法

2、將這些想法編碼

3、進行試驗看看這些想法效果怎麼樣,然後回到第一點又有一些新的想法,這樣一直迭代直達滿意爲止。


從中我們就可以看出爲什麼需要開發集,測試集以及一個評估指標的重要性:每次嘗試一個想法,在開發集和測試集上測試這個想法的性能,而單一指標能快速判斷這個想法的效果,如果沒有設計好上訴的開發集,測試集,單一評估指標,時間上就會慢得多,而且像模型0.1%的提升可能會被忽略掉。


什麼時候應該更改開發集和測試集

    開發集、測試集以及單一評估指標、滿意指標最好在一週內創建,這樣可以使團隊的目標明確。如果在之後發現開發集、測試集以及單一評估指標不再能正確指導建立正確更好的模型時,就需要立即修正了,例如分類器A的評估分高於B的,但發現實際使用時B的效果比A的好,這就是需要改變開發集、測試集或評估指標的信號。

可能有以下幾種可能導致這樣的問題:

1、需要識別的實際的分佈不同於開發測試集的分佈

   比如貓的識別,開發測試集是成年貓,而實際使用是年幼貓,這時需要更新開發/測試集,使其更具代表性

2、在開發集上過擬合,如果開發集上的表現比測試集上好很多,這就是過擬合的信號,如果需要跟蹤團隊的進展,可以有規律的使用測試集評估系統,但不要使用測試集對算

法做出任何決定,包括是否回滾到前一週的系統。如果這樣做了,在測試集上也開始過擬合了,並且再也不能指望它對系統的性能給予完全無偏見的估計

3、制定的單一指標與實際的項目優化的方向不一致,例如項目要求召回率,但指標是準確率。


基本誤差分析



數據合成

    什麼是數據合成?舉個例子,在語音識別領域,用清晰的聲音記錄來做訓練集是不給力的。因爲在應用場景中,不會有那麼安靜的背景環境。所以需要人爲添加一些噪音。這些噪音在人類的眼裏沒什麼大問題,但是對機器學習算法來說,卻是個大大的考驗。

    自動數據合成的例子。OCR:將文本插入隨機背景中;語音識別:將清晰的音頻混入不同的背景噪聲中NLP:語法糾錯:合成隨機的語法錯誤。有時候,一些在人眼看來很好的合成數據實際上對機器學習算法來說是信息不足的,而且只涵蓋了實際數據分佈的一小部分。比如說,從視頻遊戲中提取出來的汽車圖像。


貝葉斯最優誤差

對於人類誤差和機器學習誤差,你會發現一個規律:


當機器學習比人類水平低時,它的準確率的提升是很快的。但是當它超越人類以後,往往準確率提升效率就逐步降低了。並且,在人類水平線的上方,有一個叫 Bayes Optimal Error(貝葉斯最優誤差)的線,這是我們人和機器學習都永遠無法逾越的。

這一切的原因有二:

   1. 機器學習超越人類以後,很快就會靠近貝葉斯最優誤差線,這是一條理論上無法逾越的線。

   2. 數據帶有人類自己做的標籤(label),所以本身就含有人類自己的見解(insight)

   那如果確定人類誤差,下面有個例子:在醫學領域,如果我們想用深度學習來觀察醫學圖像並作出判斷,那麼,以下哪一種應該被我們選作人類的誤差值(human-level error)?

1. 一個普通人 3%

2. 一個普通醫生 1%

3. 一個專家醫生 0.7%

4. 一個醫生專家組 0.5%

答案:選 4.

    因爲 4 是人類能達到的最大限度,也是最靠近 Bayes Error 線的地方。我們做機器學習的目的就是要讓我們的誤差率無限接近於Bayes Error 線。


未來的趨勢

      真正的人工智能未來還是會落在 unsupervised learning(無監督學習)和 reinforcement learning(強化學習)上,其中強化學習飛得慢點,因爲目前大多數強化學習都還僅僅被運用在電子遊戲模擬上,而無監督學習似乎是起點高一點,因爲我們熟知的很多算法就已經是無監督學習了(比如:word2vec),然而,在這一切還沒有成熟之前,他認爲還有一個折中的處理方法:遷移學習(transfer learning)。簡單來說,就是把有標籤或者數據量大的集合用於預訓練(pre-train),然後在此基礎上對真正的目標數據集進行無監督優化。相比於完全的無監督,這條路似乎更有希望.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章