1. 程式人生 > >筆記:機器學習——吳恩達 第十週

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

課程目錄

十七、大規模機器學習(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