筆記:機器學習——吳恩達 第十週

課程目錄

十七、大規模機器學習(Large Scale Machine Learning)

17.1 大型數據集的學習
17.2 隨機梯度下降法
17.3 小批量梯度下降
17.4 隨機梯度下降收斂
17.5 在線學習
17.6 映射化簡和數據並行

十八、應用實例:圖片文字識別(Application Example: Photo OCR)

18.1 問題描述和流程圖
18.2 滑動窗口
18.3 獲取大量數據和人工數據
18.4 上限分析:哪部分管道的接下去做

十九、總結(Conclusion)

筆記內容


十七、大規模機器學習(Large Scale Machine Learning) 

17.1 大型數據集的學習 
       如果我們有一個 低方差 的模型,增加數據集的規模可以幫助你獲得更好的結果。我們應該怎樣應對一個有 100 萬條記錄的訓練集? 
       以線性迴歸模型爲例,每一次梯度下降迭代,我們都需要計算訓練集的誤差的平方和,如果我們的學習算法需要有 20 次迭代,這便已經是非常大的計算代價。 
      首先應該做的事是去檢查一個這麼大規模的訓練集是否真的必要,也許我們只用 1000 個訓練集也能獲得較好的效果,我們可以繪製 學習曲線 來幫助判斷。 
               

17.2 隨機梯度下降法 

       如果我們一定需要一個大規模的訓練集,我們可以嘗試使用 隨機梯度下降法 來代替 批量梯度下降法 。 

       在隨機梯度下降法中,我們定義代價函數爲一個 單一訓練實例的代價: 

         

       隨機梯度下降算法爲:首先對訓練集隨機“洗牌”,然後: 

         

       隨機梯度下降算法 在每一次計算之後便更新參數 θ,而不需要首先將所有的訓練集求和,在梯度下降算法還沒有完成一次迭代時,隨機梯度下降算法便已經走出了很遠。但是這樣的算法存在的問題是,不是每一步都是朝着”正確”的方向邁出的。因此算法雖然會逐漸走向全局最小值的位置,但是可能無法站到那個最小值的那一點,而是在最小值點附近徘徊。 

             


17.3 小批量梯度下降 

       小批量梯度下降算法 是介於批量梯度下降算法和隨機梯度下降算法之間的算法,每計算 常數 b 次 訓練實例,便更新一次參數 θ。 

                   

      通常我們會令 b 在 2-100 之間。這樣做的好處在於,我們可以用 向量化 的方式來循環 b 個訓練實例,如果我們用的線性代數函數庫比較好,能夠支持平行處理,那麼算法的總體表現將不受影響(與隨機梯度下降相同)。 


17.4 隨機梯度下降收斂 

       現在我們介紹隨機梯度下降算法的調試,以及 學習率 α 的選取。 

       在 批量梯度下降中,我們可以令 代價函數 J 爲迭代次數的函數,繪製圖表,根據圖表來判斷梯度下降是否收斂。但是,在大規模的訓練集的情況下,這是不現實的,因爲計算代價太大了。 

       在 隨機梯度下降中,我們在每一次更新 θ 之前都計算一次代價,然後每 X 次迭代後,求出這 X 次對訓練實例計算代價的平均值,然後繪製這些 平均值與 X 次迭代的次數之間的函數 圖表。 

                

       當我們繪製這樣的圖表時,可能會得到一個顛簸不平但是不會明顯減少的函數圖像(如上面左下圖中藍線所示)。我們可以 增加 X 來使得函數更加平緩,也許便能看出下降的趨勢了(如上面左下圖中紅線所示);或者可能函數圖表仍然是顛簸不平且不下降的(如洋紅色線所示),那麼我們的模型本身可能存在一些錯誤。 

       如果我們得到的曲線如上面右下方所示,不斷地上升,那麼我們可能會需要選擇一個 較小的學習率 α。 

       我們也可以令 學習率隨着迭代次數的增加而減小,例如令:

           

       隨着我們不斷地靠近全局最小值,通過減小學習率,我們迫使算法收斂而非在最小值附近徘徊。 但是通常我們不需要這樣做便能有非常好的效果了,對 α 進行調整所耗費的計算通常不值得 

            

       總結,在本節,我們介紹了一種方法,近似地監測出隨機梯度下降算法在最優化代價函數中的表現,這種方法不需要定時地掃描整個訓練集,來算出整個樣本集的代價函數,而是只需要每次對最後 1000 個,或者多少個樣本,求一下平均值。應用這種方法,你既可以保證隨機梯度下降法正在正常運轉和收斂,也可以用它來調整學習速率α的大小。 


17.5 在線學習 

       在本節,討論一種新的大規模的機器學習機制,叫做 在線學習機制。在線學習機制讓我們可以 模型化問題。 

       今天,許多大型網站或者許多大型網絡公司,使用不同版本的在線學習機制算法,從大批的涌入又離開網站的用戶身上進行學習。特別要提及的是,如果你有一個由連續的用戶流引發的連續的數據流,進入你的網站,你能做的是使用一個在線學習機制,從數據流中學習用戶的偏好,然後使用這些信息來優化一些關於網站的決策。 

       一個算法來從中學習的時候來模型化問題,在線學習算法指的是對數據流而非離線的靜態數據集的學習 。許多在線網站都有持續不斷的用戶流,對於每一個用戶,網站希望能在 不將數據存儲到數據庫中便順利地進行算法學習 。 

       假使我們正在經營一家物流公司,每當一個用戶詢問從地點 A 至地點 B 的快遞費用時,我們給用戶一個報價,該用戶可能選擇接受(y=1)或不接受(y=0)。 

       現在,我們希望構建一個模型,來預測用戶接受報價使用我們的物流服務的可能性。因此報價是我們的一個特徵,其他特徵爲距離、起始地點、目標地點以及特定的用戶數據,模型的輸出是 p(y=1)。 

       在線學習的算法與隨機梯度下降算法有些類似,我們對 單一的實例進行學習,而非對一個提前定義的訓練集進行循環。 

                  

       一旦對一個數據的學習完成了,我們便可以丟棄該數據,不需要再存儲它了。這種方式的好處在於,我們的算法可以很好的適應用戶的傾向性,算法可以針對用戶的當前行爲不斷地更新模型以適應該用戶。 

       每次交互事件並不只產生一個數據集,例如,我們一次給用戶提供 3 個物流選項,用戶選擇 2 項,我們實際上可以獲得 3 個新的訓練實例,因而我們的算法可以一次從 3 個實例中學習並更新模型。 

       這些問題中的任何一個都可以被歸類到標準的、擁有一個固定的樣本集的機器學習問題中。或許,你可以運行一個你自己的網站,嘗試運行幾天,然後保存一個數據集,一個固定的數據集,然後對其運行一個學習算法。但是這些是實際的問題,在這些問題裏,你會看到大公司會獲取如此多的數據,真的沒有必要來保存一個固定的數據集,取而代之的是你可以使用一個在線學習算法來連續的學習,從這些用戶不斷產生的數據中來學習。

       這就是在線學習機制,然後就像我們所看到的,我們所使用的這個算法與隨機梯度下降算法非常類似,唯一的區別 的是,我們 不會使用一個固定的數據集,我們會做的是獲取一個用戶樣本,從那個樣本中學習,然後丟棄那個樣本並繼續下去,而且如果你對某一種應用有一個連續的數據流,這樣的算法可能會非常值得考慮。當然,在線學習的一個優點就是,如果你有一個變化的用戶羣,又或者你在嘗試預測的事情,在緩慢變化,就像你的用戶的品味在緩慢變化,這個在線學習算法,可以慢慢地調試你所學習到的假設,將其調節更新到最新的用戶行爲。 


17.6 映射化簡和數據並行 

       映射化簡 和 數據並行 對於大規模機器學習問題而言是非常重要的概念。之前提到,如果我們用批量梯度下降算法來求解大規模數據集的最優解,我們需要對整個訓練集進行循環,計算偏導數和代價,再求和,計算代價非常大。如果我們能夠將我們的數據集分配給不多臺計算機,讓每一臺計算機處理數據集的一個子集,然後我們將計所的結果彙總在求和,這樣的方法叫做 映射簡化。 

       具體而言,如果任何學習算法能夠表達爲,對訓練集的函數的求和,那麼便能將這個任務分配給多臺計算機(或者同一臺計算機的不同 CPU 核心),以達到加速處理的目的。 

       例如,我們有 400 個訓練實例,我們可以將批量梯度下降的求和任務分配給 4 臺計算機進行處理: 

             

       很多高級的 線性代數函數庫 已經能夠利用多核 CPU 的多個核心來並行地處理矩陣運算,這也是 算法的向量化實現 如此重要的緣故(比調用循環快)。 


十八、應用實例:圖片文字識別(Application Example: Photo OCR) 


18.1 問題描述和流程圖 

        圖像文字識別應用所作的事是,從一張給定的圖片中識別文字。這比從一份掃描文檔中識別文字要複雜的多。 

           

      爲了完成這樣的工作,需要採取如下步驟: 
      1. 文字偵測(Text detection)——將圖片上的文字與其他環境對象 分離 開來 
      2. 字符切分(Character segmentation)——將文字分割成一個個 單一的字符 

      3. 字符分類(Character classification)——確定每一個字符是什麼

      可以用任務流程圖來表達這個問題,每一項任務可以由一個單獨的小隊來負責解決: 

       


18.2 滑動窗口 

       滑動窗口是一項用來 從圖像中抽取對象的技術

      假使我們需要在一張圖片中識別行人,首先要做的是用許多固定尺寸的圖片來訓練一個能夠準確識別行人的模型。然後我們用之前訓練識別行人的模型時所採用的圖片尺寸在我們要進行行 人識別的圖片上進行剪裁,然後將剪裁得到的切片交給模型,讓模型判斷是否爲行人,然後在圖片上滑動剪裁區域重新進行剪裁,將新剪裁的切片也交給模型進行判斷,如此循環直至將圖片全部檢測完。 

      一旦完成後,我們按比例放大剪裁的區域,再以新的尺寸對圖片進行剪裁,將新剪裁的切片按比例縮小至模型所採納的尺寸,交給模型進行判斷,如此循環。 

               

       滑動窗口技術也被用於文字識別,首先訓練模型能夠區分字符與非字符,然後,運用滑動窗口技術識別字符,一旦完成了字符的識別,我們將識別得出的區域進行一些擴展,然後將重疊的區域進行合併。接着我們以寬高比作爲過濾條件,過濾掉高度比寬度更大的區域(認爲單詞的長度通常比高度要大)。下圖中綠色的區域是經過這些步驟後被認爲是文字的區域,而紅色的區域是被忽略的。 

                 

       以上便是 文字偵測 階段。 下一步是訓練一個模型來完成將文字分割成一個個字符的任務,需要的訓練集由單個字符的圖片和兩個相連字符之間的圖片來訓練模型。 

         

       模型訓練完後,我們仍然是使用滑動窗口技術來進行字符識別。

            

       以上便是 字符切分 階段。 最後一個階段是 字符分類 階段,利用神經網絡、支持向量機或者邏輯迴歸算法訓練一個分類器即可。 


18.3 獲取大量數據和人工數據 

      如果我們的模型是低方差的,那麼獲得 更多的數據 用於訓練模型,是能夠有更好的效果的。問題在於,我們怎樣獲得數據,數據不總是可以直接獲得的,我們有可能需要人工地創造一些數據。 

       以我們的文字識別應用爲例,我們可以字體網站下載各種字體,然後利用這些不同的字體配上各種不同的隨機背景圖片創造出一些用於訓練的實例,這讓我們能夠獲得一個無限大的訓練集。這是從零開始創造實例。 

       另一種方法是,利用已有的數據,然後對其進行修改,例如將已有的字符圖片進行一些扭曲、旋轉、模糊處理。只要我們認爲實際數據有可能和經過這樣處理後的數據類似,我們便可以用這樣的方法來創造大量的數據。 

       有關獲得更多數據的幾種方法: 
       1. 人工數據合成 
       2. 手動收集、標記數據 
       3. 衆包 


18.4 上限分析:哪部分管道的接下去做 

      在機器學習的應用中,我們通常需要通過幾個步驟才能進行最終的預測,我們如何能夠知道哪一部分最值得我們花時間和精力去改善呢?這個問題可以通過 上限分析 來回答。 

       回到我們的文字識別應用中,我們的流程圖如下: 

        

       流程圖中每一部分的輸出都是下一部分的輸入,上限分析中,我們選取某一單元,手工提供 100%正確的輸出結果,然後看應用的整體效果提升了多少。假使我們的例子中總體效果爲 72%的正確率。 

       如果我們令文字偵測部分輸出的結果 100%正確,發現系統的總體效果從 72%提高到了 89%。這意味着我們很可能會希望投入時間精力來提高我們的文字偵測部分。 

       接着我們手動選擇數據,讓字符切分輸出的結果 100%正確,發現系統的總體效果只提升了 1%,這意味着,我們的字符切分部分可能已經足夠好了。 

       最後我們手工選擇數據,讓字符分類輸出的結果 100%正確,系統的總體效果又提升了 10%,這意味着我們可能也會應該投入更多的時間和精力來提高應用的總體表現。 

             


十九、總結(Conclusion) 


19.1 總結和致謝

       歡迎來到《機器學習》課的最後一節。在最後這一節,我想快速地回顧一下這門課的主要內容,然後簡單說幾句想說的話。 

     在這門課中,我們花了大量的時間介紹了諸如線性迴歸、邏輯迴歸、神經網絡、支持向量機等等一些監督學習算法,這類算法具有帶標籤的數據和樣本,比如 。 

        然後我們也花了很多時間介紹無監督學習。例如 K-均值聚類、用於降維的主成分分析,以及當你只有一系列無標籤數據時的異常檢測算法。 

       當然,有時帶標籤的數據,也可以用於 異常檢測算法的評估。此外,我們也花時間討論了一些特別的應用或者特別的話題,比如說推薦系統。以及大規模機器學習系統,包括並行系統和映射化簡方法,還有其他一些特別的應用。比如,用於計算機視覺技術的滑動窗口分類算法。 

       最後,我們還提到了很多關於構建機器學習系統的實用建議。這包括了怎樣理解某個機器學習算法是否正常工作的原因,所以我們談到了偏差和方差的問題,也談到了解決方差問題的正則化,同時我們也討論了怎樣決定接下來怎麼做的問題,也就是說當你在開發一個機器學習系統時,什麼工作纔是接下來應該優先考慮的問題。因此我們討論了學習算法的評價法,介紹了評價矩陣,比如:查準率、召回率以及 F1 分數,還有評價學習算法比較實用的訓練集、交叉驗證集和測試集。我們也介紹了學習算法的調試,以及如何確保學習算法的正常運行,於是我們介紹了一些診斷法,比如學習曲線,同時也討論了誤差分析、上限分析等

等內容。 

       所有這些工具都能有效地指引你決定接下來應該怎樣做,讓你把寶貴的時間用在刀刃上。

       但除了這些,我更希望你現在不僅僅只是認識這些工具,更重要的是掌握怎樣有效地利用這些工具來建立強大的機器學習系統。所以,以上就是這門課的全部內容。


                                                                                      ————      Andew Ng 

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