大規模機器學習(Large Scale Machine Learning)
1.大型資料集的學習
處理大資料集的演算法
近年來機器學習技術的發展歸因於我們有極其龐大的資料用來訓練我們的演算法。
處理如此海量資料的演算法?我們為什麼要用大的訓練集呢?
我們已經知道一種獲取高效能的機器學習系統的途徑是採用低偏差的學習演算法,並用大資料進行訓練。即決定效果好壞的往往不是演算法的好壞,而是誰的訓練資料多。如果你想使用大資料進行訓練,至少要能獲得大資料集。

大資料學習的問題:計算問題
如果有一億條訓練資料,可以和從這一億條資料中隨機抽取一千條資料訓練的結果相同,為什麼我們不用一千條進行訓練呢?
增大訓練資料是否能提升演算法的好壞?

高效的計算方法用來處理大資料:
1.隨機梯度下降
2.減少對映
2.隨機梯度下降
對於很多機器學習演算法,例如線性迴歸、邏輯迴歸和神經網路,我們推導演算法的方法是提出一個代價函式,或提出一個優化目標,然後使用梯度下降的演算法求代價函式的最小值。
當我們的訓練集很大時,梯度下降演算法的計算量會變得非常大。對普通梯度下降演算法的改進:隨機梯度下降法。

當訓練資料非常大時,梯度下降變為批量梯度下降。批量這個詞指的是我們每次都需要同時考慮所有的訓練樣本。你要不端的迭代,就需要不斷地求和,三億數量的求和,計算需要花費很長時間。

如果每次迭代時不用考慮全部的樣本,僅僅只需要考慮一個訓練樣本。
1.隨機打亂所有資料
2.代入隨機打亂的的訓練樣本,對代價函式進行優化,直到全域性收斂(不需要代入三億數目就會使代價函式最小化)

換個寫法:

迭代會更快,不需要對所有訓練樣本進行求和
每一次迭代只要保證能擬合某一訓練樣本就行了
兩者相比,收斂方式是不同的,隨機梯度下降法就是連續不斷地在某個區域內朝著全域性最小值徘徊,而不是直接達到全域性最小值。但通常我們使用隨機梯度下降就可以達到一個很好的全域性最小值,這對於演算法的實際效果就已經足夠了。
最後,在隨機梯度下降法中有一個外層迴圈,它決定了內層迴圈的執行次數,所以外層迴圈應該執行多少次呢?這取決於訓練集的大小,通常一次就夠了(1-10次)。
3.Mini-Batch梯度下降
比隨機梯度下降還要快哦!
它的思想是既不使用全部的樣本,也不一次只用一個樣本,而是一次使用b個樣本。
比方說b = 10時:

完整的演算法:

為什麼我們使用b個樣本而不是像隨機梯度下降那樣每次只使用一個樣本呢?
因為在向量化的過程中,Mini-Batch梯度下降法可能要比隨機梯度下降法表現要好,僅當你有一個好的向量化方式。因為包含了b個樣本更向量化的方式執行,將使你在10個樣本內部分並行運算。換句話說,如何使用合適的向量化方式計算餘下的樣本,可以部分使用好的數值代數庫然後對b個樣本進行並行運算。
Mini-Batch梯度下降的缺點之一是:當有一個額外的引數b時,你需要確定Mini-Batch的大小,這可能需要費些時間,不過如果你有優秀的向量化方法,有時它將比隨機梯度下降執行的更快。
4.隨機梯度下降收斂
執行隨機梯度下降法,你怎麼保證除錯過程已經完成,並且已經收斂到合適的位置了呢?你怎麼調整隨機下降梯度中學習速率α的值呢?
確保演算法收斂
選擇合適的學習速率α
回顧之前的批量梯度下降演算法,確保梯度下降已經收斂的一個標準方法就是繪製優化代價函式,這是一個關於迭代次數的函式,要確保代價函式在每一次迭代中都是下降的。
比起之前需要是不是的計算Jtrain,那樣就得遍歷所有的訓練樣本,而隨機梯度下降法的步驟只是在更新θ之前計算這些cost函式,並不需要太大的計算量。我們要做的就是在1000次迭代中,求出前1000個cost函式的平均值,然後把它畫出來,通過觀察所畫的圖我們就能檢查出隨機梯度下降是否在收斂。

畫圖例項:
如果使用一個更小的學習速率,震盪就會變小,最終結果也會變好一點(區別可以忽略)。
增大訓練樣本的數量,得到的曲線更平滑。但是速度會變慢。
樣本太少,噪聲明顯。增大訓練樣本,曲線會變得優化,如果沒有變好,說明你需要調整學習速率或調整特徵或者演算法的其他東西。
曲線上升,需要用更小的學習速率α。

在大多數隨機梯度下降法的典型應用中,一般你最終得到的引數只是一個全域性最小之的接近值,而不是真正的全域性最小值。在大多數,隨機梯度下降法的典型應用中,學習速率α一般是不變的,如果你想要最終的收斂結果達到區域性最小值,你可以做的就是讓學習速率α的值隨著時間變化逐漸減小。

你的最終值會比較接近全域性最小值(每一步都會越精確)。
5.線上學習
線上學習機制讓我們可以模型化一些問題,就是我們有連續一波資料或者連續的資料流,先要用演算法從中學習的這類問題。
網站使用者資料流,就可以用線上學習機制從資料流中學習使用者的偏好,然後用這些資訊優化關於網站的決策。
在線上學習機制中,我們實際上丟棄了固定的資料集這一概念,取而代之是一個演算法,現在我們獲取一個樣本,然後利用那個樣本以這種方式學習。然後我們丟棄這個樣本。因為你有強大的資料流,沒必要反覆使用樣本。
連續的資料流是關鍵。
這種線上學習機制可以適應變化的使用者偏好。

賣手機的選項供使用者選擇;
CTR:點選率
產品搜尋問題,使用線上學習機制線上學習使用者點選情況
網站展示特別優惠;
新聞網站推薦;
商品推薦;
...

這些問題中的任何一個都可以被轉變為標準的,擁有一個固定的樣本集的機器學習問題。或許你可以讓網站執行幾天,然後儲存一個固定的資料集,然後轉變為一個擁有固定資料集的機器學習問題。但是在實際中,大公司的大網站有如此多的資料,所以真的沒必要儲存一個固定的資料集。可以使用線上學習演算法,來連續的學習,從這些使用者不斷產生的資料中來學習。
優點:如果你有一個變化的使用者群,又或者你在嘗試預測的事情在緩慢變化(使用者品味),線上學習演算法可以慢慢地除錯你所學習到的假設,將其調整更新為最新的使用者行為。
6.減少對映與資料並行
應用在大規模機器學習上,MapReduce
你可以將學習演算法應用到隨機梯度下降不能解決的規模更大的問題。
把訓練集分成10份或者100份...計算完成後再返回到一個伺服器上。
這個公式完全等同於批量梯度下降演算法,只是不需要在一臺機器上計算。

示意圖:


只要學習演算法可以表示成一系列的求和形式,或者表示成在訓練集上對函式的求和形式,你就可以使用MapReduce技巧來並行化學習演算法,使得其可以應用於非常大的資料集。
計算機可以有多個CPU,CPU又有多個核心,如果你有很大的資料集,且你有一個四核電腦,可以用MapReduce分共工作,然後每個核心計算四分之一訓練樣本的總和。還不用擔心資料傳輸和網路延遲。有些線性代數庫可以自動在一臺機器上不同核心上進行並行代數運算。而且如果你的學習演算法有非常好的向量化表示,你就可以直接以向量化的形式應用標準學習演算法,不用擔心並行。你的線性代數庫會幫你處理的很好,所以你可以不應用MapReduce。

應用舉例:照片OCR
第一百四十七課:問題描述與OCR pipeline
照片OCR技術:
1.複雜。一個複雜的機器學習系統是如何被組裝起來的。
2.機器學習流水線。如何分配資源來對下一步計劃做出決定
自己開發/團隊開發
3.機器學習中很多有用的想法和概念 。
如何將機器學習應用到計算機視覺問題中!!!
人工資料合成
照片OCR技術:照片光學字元識別(讀取圖片中的文字資訊)

步驟:
1.掃描圖片,找處照片中的文字資訊
2.重點關注文字區域,並對區域中的文字進行識別
3.顯示和記錄文字

文字檢測
字元分割
文字分類
像這樣一個系統,我們稱之為機器學習流水線:

如果你要設計一個機器學習系統,你要作出的最重要的決定之一就是你要怎麼設計這個流水線的各個模組。(如何將這個問題分成一系列不同的模組,這會影響到你演算法的最終表現)
第一百四十八課:滑動視窗
流水線中每個獨立元件的工作原理?
文字識別是長寬不同的矩形,所以先看個行人檢測的例子。

為了建立一個新人檢測系統,我們要做的是從資料集中收集一些正樣本和負樣本(包含行人和不包含行人)。然後你可以在你的網路中訓練,或者使用其他學習演算法,來對y進行分類,來劃分每個圖塊是否包含一個行人。

監督學習
移動綠色滑塊(一定步長移動),每次移動都是用分類器進行分類,遍歷圖片中的不同位置,並且通過分類器進行分類,判斷圖片中是否有行人。

這就是你如何訓練一個監督學習分類器,然後使用一個滑動視窗分類器或者說滑動視窗檢測器找出圖中所有的行人。
回到文字檢測:

正負樣本訓練
滑動視窗檢測
繪製矩形
擴大白色區域
丟棄不適用長寬比

現在獲得了文字區域,轉到流水線下一步:
識別文字
再次使用監督學習演算法
尋找字元分割,訓練分類器,再次使用滑動視窗

訓練26個字母,識別出字母。

第一百四十九課:獲取大量資料和人工資料?
從哪獲取這麼多訓練資料呢?
人工資料合成
假如這個想法適用於你的機器學習模型,有時它能為你的學習演算法輕鬆得到大規模的訓練集。
人工資料合成主要包括兩種形式:
第一種:自己創造資料
第二種:我們已經有小的標籤訓練集,然後以某種方式擴充訓練集(較小的訓練集轉換成一個較大的訓練集)

假如我們收集到了一個大的標籤資料集,我選用了一個正方形的長寬比,目標是輸入一個影象塊然後識別出影象塊中央的字元。
現代計算機有一個龐大的字型庫,任意字型貼上到一個任意的背景中,應用一點模糊運算元或者仿射變換,縮放和旋轉操作就生成了一個人工資料集。
使用合成的資料,你實際上能為你的人工訓練合成提供無限的訓練資料樣本。

使用現有的樣本生成資料:
實際圖片:人工扭曲

語音識別:
人工新增失真,引入不同的背景聲音,就可以擴充樣本數。

人工合成要合理。
當你在決定該新增那種失真時,認真考慮一下,新增什麼樣的失真才是有意義的?怎麼樣才能使你生成的樣本至少有一定的代表性?

1.在合成大量的人工樣本之前,要確保你的分類器偏差較低,這樣的話更多的訓練資料才有意義,標準的做法是繪製一個學習曲線來確保你有一個低偏差、高方差的分類器。如果你的分類器偏差太高,那麼你可以嘗試持續增加分類器的特徵數量或者增加神經網路隱藏單元的數量直到偏差值降低。
2.獲得比我目前的資料量多10倍的資料量,需要花費多少努力?
此外,
自己增加資料/新增標籤
眾包

第一百五十課:天花板分析(下一步工作的pipeline)
上限分析,它通常能夠提供一個很有價值的訊號,很好的指導你,你的工作流中的哪一部分最值得你花時間去研究?
一個有效的方法是對學習系統使用一個數值評估度量(文字識別正確的比例)。
上限分析的主要度量:
首先我們關注這個機器學習工作流中的第一個模組,對於每一個測試樣本,都給它提供一個正確的文字檢測結果(直接給出正確答案)。繼續執行,使用跟之前一樣的評價度量指標,來測量系統的準確率。如果用這個完美的文字檢測系統,準確率提升了。
接著人工輸入其他模組正確標籤。
就能得到它們各自的上升空間是多大。

通過這種分析,你可以知道提升每個模組的潛在效果如何?或者說一個模組近乎完美時,系統性能增益多少?這就像給系統表現加上了一個提升的上限值。


工作流非常常用,卻又很複雜的機器學習應用。上限分析可以用來衡量模組的表現,找到能提升演算法效能的關鍵問題。
第一百五十一課:總結和感謝
我們學了什麼?
監督學習演算法
線性迴歸、邏輯迴歸、神經網路和支援向量機(SVM)
在這些例子中,你會有帶標籤的資料和樣本
無監督學習演算法
K均值演算法、主成分分析法用來降維、異常檢測演算法
在這些演算法中,你只有無標籤的資料和樣本
此外,異常檢測演算法也可以在有標籤的樣本中對演算法進行評估
特定的應用和話題
推薦系統、大規模機器學習系統、並行和對映-化簡演算法
滑動視窗分類器(計算機視覺)
如何構建機器學習系統的建議
什麼東西使得機器學習演算法工作或是不工作?
談論了方差和偏差、如何使用正則化來解決方差問題
如何決定下一步要做什麼?
當你開發一個機器學習系統時應該如何合理分配你的時間?
學習演算法的評估方法?
召回率和F1分數這樣的評價指標
實踐方面的評測方法(訓練集、交叉驗證集和測試集)
如何除錯演算法?
確保演算法能夠正常工作
診斷演算法?
學習曲線、誤差分析、上限分析等
我希望不僅僅認識了這些工具,更重要的是怎麼有效的使用它們來構建強大的機器學習系統。

如果你跟著這麼課學到現在,那麼你可以自信地認為你已經成了機器學習方面的專家。如你所知,機器學習是一門在科學、技術和產業方面都有著深遠影響的學科,現在你已經具備了使用這些機器學習的工具來發揮巨大作用的能力。
希望你們中能有很多人能夠利用這些機器學習工具來構建出色的系統和應用以及出色的產品,並且希望你們能夠利用機器學習,不僅僅是為了自己,更是為了有朝一日能夠造福其他人的生活。
我還想告訴大家,給大家教這門課真的很有趣,所以謝謝你們。最後,在結束之前,我還想多說幾句,在不久之前,我也是一個學生,甚至到了現在,我也儘可能擠出一些時間去上一些課,學一些新的東西,所以我很能體會你們學這門課的辛苦,因為你們可能也是很忙的人,生活中有很多很多事情要處理,即便如此你也還是擠出時間來觀看這些課程視訊。我知道這些視訊長達數個小時,但你還是能夠拿出時間來做這些複習題,並且很多人還願意花時間去做那些程式設計練習題,那些題目都很長而且很難。所以我要對大家說一聲謝謝。我知道,很多人學這門課都非常努力,很多人都在這門課上花了大量時間,很多人把自己整個人都扎進了課程,我希望你們能從中收貨很多知識。在這最後,我要說:感謝你們能來當我的學生。
