Machine Learning Yearning讀書筆記(轉載)

原文鏈接http://blog.csdn.net/qq_24818761/article/details/53465940


首先,非常感謝Andrew NG貢獻的新書,本書總共大概50多章,昨天收到了1-12章(1-2頁/章,總共23頁)的手稿,讓各位讀者一睹爲快。

附上書的下載地址:

1-12章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_01.pdf

13章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_02.pdf

14章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_03.pdf


一、前言

先說說我對於此書的期待,本書作者是Andrew NG,我相信這個名字對於所有做機器學習的朋友來說都不陌生,斯坦福大學計算機科學系和電子工程系副教授,人工智能實驗室主任,Coursera的聯合創始人,14年加入Baidu IDL擔任百度公司首席科學家。或許有許多人跟我一樣,是從NG的機器學習視頻中得到啓蒙的,從此走上了machine learning的道路。在我看來,NG在Teaching方面做的工作爲所有年輕學者、科研工作者以及工業界的研發人員帶來了實實在在進步的力量。看過CS229課程的朋友可能會有很深的體會,NG講的內容既深刻又淺顯,既理論又實際,公佈了大量學習的code以供相關學習,NG無非是想讓機器學習的方法真正應用到實際生活中,讓機器學習不光在學術上,也在工業上產生應有的價值。當然最終也包括本文提到的此書。(以上的囉嗦是本人對於NG的熱衷之言,僅代表本人,勿噴!)



二、《Machine Learning Yearning》

1)Why Machine Learning Strategy

首先,本書列舉了一下機器學習的應用包括:網頁搜索,辣雞郵件分類,語音識別,商品推薦等等等。。。然後,NG舉了一個例子:如果有一個檢測貓的檢測器,當這個檢測器表現不好的時候,你該怎麼辦?

● 收集更多的數據

● 讓數據集更豐富:例如不同姿勢、不同顏色的貓…

● 讓梯度再飛一會兒

● 搞個更大的網絡,多來幾層、多來點神經元,最後加點參數

● 小的網絡也不一定差哦

● 加入正則項 - 像是L2

● 把整個框架都換了(什麼激活函數之類的)

這樣做有一個顧慮,如果沒有找準方向,那麼你可能會白白花掉很多時間,那麼我們該如何下手呢?


2)How to use this book to help your team

NG寫此書的目的就在於,讓讀者瞭解機器學習算法在應用中出了什麼問題,同時如何應對?

此書每一章只有1-2頁,前12章沒有看到一條數學公式,這對於恐懼英語和數學的同學來說是個好消息!


3)Prerequisites and Notation

這裏告訴讀者需要對監督學習有一定了解,如果不熟悉請先花一點時間學習(http://ml-class.org)

這裏我也推薦一個網易公開課的網址:http://open.163.com/special/opencourse/machinelearning.html


4)Scale drives machine learning progress

兩把利刃: ● 海量數據● 計算

我們用不同的算法(邏輯迴歸、小型、中型包括大型神經網絡),隨着數據的增加我們會發現什麼呢?


有了這張圖,你會得到一個結論:想讓我的算法表現的好必須 (i) 搞個大的網絡 (ii) 非常非常多的數據

然後NG潑了一瓢冷水,你想知道怎麼搞定 (i)和 (ii),那太難了,咱們到時候再說,先整點在傳統學習算法上有效的東西吧。


5)Your development and test sets

來咱們回到剛纔那個貓的問題上:你想搞個app把用戶上傳的照片自動地分爲【貓】和【非貓】(先不管誰會用這個app -_-)

然後大家就熱火朝天的幹起來了,去各大搜索引擎下載【貓圖】和【非貓圖】,按照傳統的你7/3比例分成訓練數據和測試數據。

一訓練,嘿!能行。結果放到app上想試試,驚了!結果真是“香菇”。。

到底咋回事,你可能會認爲那些用渣像素手機拍照的人根本不配用這個app,他們照出來的圖跟我們網上下載訓練的數據完全不一樣。我們的算法根本沒有考慮到手機圖像的各種情況,也就是訓練數據與測試數據分佈不一致

這裏有一個定義:

● 訓練集 - 用於算法的訓練;

● 開發集(我更習慣驗證集)- 用於調參、特徵選擇等對你的算法進行調整;

● 測試集 - 用於最終算法結果的評估,不可用於任何算法參數的調整。

當我們定義好這些之後,我們就可以開幹了,我們可以在驗證集測試集上看到各種結果。也就是說,我們整個機器學習系統的好壞完全依賴於這兩個數據集。這裏,NG提到很重要的一點:


大家自我感受一下。


6)Your dev and test sets should come from the same distribution

這裏還是說的驗證集測試集分佈的問題,來張圖大家就能懂了(不帶任何歧視,僅問題分析)


當你的算法在驗證集上表現良好,在測試集上表現很差,大家反應就是過擬合,我們需要通過一系列的手段來防止過擬合(例如收集更多數據,添加正則項等等現在DL中相關的方法五花八門)。但這都是僅僅建立在驗證集和測試集來自同一個分佈的假設上。

假如驗證集和測試集來自不同的分佈,那麼可能有以下可能導致上述現象:

● 在驗證集上過擬合了;

● 測試集的case比驗證集上的case難度高,這不是搞區別對待嗎;

● 測試集的case壓根與驗證集上的case根本不一樣好嗎,你叫我怎麼檢測;

最後NG提到,如果你的目標是在特定的機器學習應用上能表現的好,那麼還是把驗證集和測試集選爲同一個分佈下的case,讓你的工作更輕鬆喲,信我啊!


7)How large do the dev/test sets need to be?

我們到底要多少數據呢,這是個大問題。

驗證集 - 假如我們有2個算法A和B,正確率分別爲90.0%和90.1%,但是我們只有100個驗證數據,那麼我們根本沒法檢測到這0.1%的差別。

下面還舉了一個例子,因爲0.01%結果的提高增加了某公司的收入。細思極恐啊,我當初都幹了什麼!

測試集 - 如果你的數據不多100-10000這個大概範圍,那麼3/7比例還適合你。如果你的數據已經非常龐大了,那麼其實可以減少這個比例。


8)Establish a single-number evaluation metric for your team to optimize

我們還得整一個評估標準吧,分類正確率是個不錯的選擇。不過,如果我關心的指標有2個(Precision、Recall),這就有點糾結了你知道嗎?我該怎麼對一系列的分類器進行性能的排序,最終選出最優的分類器呢?


這裏,我們可以引入一個指標“F1-score”,具體計算請看wiki(https://en.wikipedia.org/wiki/F1_score)。

於是乎,我們得到了下表:


這下舒服多了,我要開始刷分了,別吵我!


9)Optimizing and satisficing metrics

這裏提供另一種結合多種因素評估的方法。假如你又關心正確率又關心運行的效率(事兒咋這麼多呢)


我們可以這樣定義評估標準:

Accuracy - 0.5*RunningTime

或者你可以設置一個運行時間的閾值,例如100ms,那麼這個值就是“條件度量”,然後我們在這個前提條件下優化我們的正確率,正確率稱之爲“優化度量”。

那如果你有N個因素怎麼辦?很簡單,你可以選擇N-1個維“條件度量”,剩下的一個作爲“優化度量”,怎麼樣是不是很有效的方法?


10)Having a dev set and metric speeds up iterations

最終,我們拿到一個新問題,怎麼來不斷的推進我們的工作呢?請看Machine Learning循環大法!


1.首先整點洋氣的點子(idea);

2.然後將這些點子變爲代碼(code);

3.通過實驗(experiment)來評估下能不能行(通常你的第一次。。咳咳咳,回去1重新來吧)。


11)When to change dev/test sets and metrics

NG會很快地選好驗證集/測試集和評估標準,這樣能給團隊一個非常清晰的目標導向(程序猿苦逼臉)。如果在一些更加成熟的應用上,你可能得考慮考慮。如果你發現根據驗證集上的評估結果,分類器A比分類器B表現的要好,但是你的同事認爲B要優於A,這就說明兄弟你可能要更改你的驗證集/測試集或評估標準。

有以下3點可能導致分類器A在驗證集上表現“良好”:

1.想要在實際中表現的好,但是實際中的case跟我的驗證/測試集不是一個“媽”(分佈);

2.在驗證集上過擬合了;

3.評估標準是否和我的目的有些不一致。

整個過程提倡一個“早發現,早治療”!


12)Takeaways: Setting up development and test sets

● 你的驗證集和測試集都的分佈,最好能反應以後想要預測的數據情況;

● 儘量從同樣的分佈中選驗證集和測試集;

● 選擇一個評估標準,別跟我說有好多;

● 多試試不同的辦法,天知道那個管用的;

● 別花太多時間準備數據集和評估(趕緊上車,來不及解釋了);

● 對於新的問題,給你一週時間準備數據和評估標準,經典的問題可以多想想;

● 當你的數據多了以後,老一代的7/3比例不管用了,最好降低一下這個比例;

● 你的驗證集最好大到能檢測到一定的效果提升,但也別太大了,測試集則最好能大到給出一個最終系統的置信估計(不太明瞭)。

● 如果你的驗證集和評估標準不適用了,趕緊換了它們:

(i)在驗證集上過擬合了,收集多一些驗證集 

(ii)如果你實際中的分佈與驗證集/測試集不同,更換驗證集/測試集 

(iii)如果你的評估標準也不行了,也換了吧。


三、後語

哎,收了收了,有點累,到時候再寫!


—————————————————————————————————————————————–

2016.12.8

12.7和12.8 NG又分別發佈了13和14章,在這裏繼續補上。

13)Error analysis: Look at dev set examples to evaluate ideas

這一章主要通過誤差分析來評價我們當前系統的性能,並分析了該如果應對。


當我們發現有時候我們錯把狗判斷成了貓,我們改如何改進我們的系統?NG提議在嘗試一個新方法之前,首先對結果提升的空間做一個評估:

1.你可以從驗證集中取一些分錯的例子(本來是貓,卻被分類器判斷爲狗);

2.然後通過手動的方法標註分類器誤判的比例(本來是貓,分類器判斷爲狗,我通過眼睛能看出是貓)

這個過程就是“誤差分析”,如果這個比例只有5%,無論怎麼改進,都不會超過5%的錯判例子被重新解決。

這個5%稱之爲“上界”,因此如果系統當前的正確率爲90%,那麼改進後最好的性能爲90.5%。

Acc_improve = Acc_original + (1 - Acc_original) * 5%;

如果“上界”的比例爲50%,那麼系統的性能可能從90%提升至95%。

最後,NG提到許多工程師不情願做這樣的誤差分析,以至於浪費掉大量的開發時間。


14)Evaluating multiple ideas in parallel during error analysis

這一章,NG主要從多個角度分析誤差,然後對症下藥

對於一個貓的檢測器,可以從以下幾個方面來提升:

● 修正那些本來是“狗”,誤判成“貓”的例子;

● 修正那些“貓科動物”(獅子,豹子),誤判成家貓的例子;

● 提升在圖像較模糊情況下的系統性能;

爲了效率,你可以同時來評估這些因素,然後把這些錯判的例子列一個表:


由於一張Image可能同時滿足幾個因素,所以最終的比例加起來不一定是100%。

然後我們根據這些圖像,通過人爲的辦法觀察這些圖像,考慮是否在這張表上添加新的因素(列)。

這是一個慢慢分析和調整的過程,可以通過這張表,瞭解到當前錯判例子中的一些信息。或許開始的時候只有幾個因素,但是隨着問題的深入,你會加入更多的因素來分析問題,也會讓你更加了解數據和算法性能。


通過上面,我們可以清晰的瞭解到,解決“狗”錯判爲“貓”的例子最多隻能解決8%的錯誤,集中解決“貓科動物”和“圖像模糊”的問題會提升更多。最後,錯誤分析不是通過嚴謹的數學公式證明,而是通過這種統計能使你知道下一步的方向,並且瞭解到你的應用還能有多大的進步空間。

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