Machine Learning Yearning book draft - 读记(前14章)
本篇文章由作者授權轉載,轉自知乎.
首先,非常感謝Andrew NG對于本書《Machine Learning Yearning》的貢獻,本書總共大概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)如果你的評估標準也不行了,也換了吧。
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%的錯誤,集中解決“貓科動物”和“圖像模糊”的問題會提升更多。最后,錯誤分析不是通過嚴謹的數學公式證明,而是通過這種統計能使你知道下一步的方向,并且了解到你的應用還能有多大的進步空間。
未完待續。
總結
以上是生活随笔為你收集整理的Machine Learning Yearning book draft - 读记(前14章)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy性能优化
- 下一篇: IEEE深度对话Facebook人工智能