機器學習基礎---大規模機器學習

一:學習大數據集

講述可以處理海量數據的算法html

思考:爲何要使用海量數據集呢?要知道獲取高性能的機器學習系統途徑是採用低誤差的學習算法,並用大數據進行訓練。算法

低誤差:代表指望輸出和真實標記之間偏差小,學習算法擬合能力更強 高誤差:代表指望輸出和真實標記之間偏差大,學習算法擬合能力較差 低方差:代表訓練數據集的變化對目標函數的估計值形成較小的變更 高方差:代表訓練數據集的變化對目標函數的估計值形成較大的變更

這裏拿以前提到過的易混淆詞來舉例,For breakfast I ate __ eggs,這裏填two,而非too或者to,從下面的圖中能夠明確,只要使用大數據對算法進行訓練,它的效果彷佛會更好。服務器

從這樣的結果能夠得出,在機器學習中,「It’s not who has the best algorithm that wins. It’s who has the mostdata.」,意思是決定因素每每不是最好的算法而是誰的訓練數據最多網絡

因此若是你想進行大數據集的學習,至少咱們要可以得到大數據集。機器學習

可是大數據集有它本身的特殊的問題,即計算問題。假設有m等於一億的訓練樣本,想要訓練一個線性迴歸模型或一個邏輯迴歸模型,而後用梯度降低進行更新:函數

能夠看到其中計算梯度的項,當m等於一億時,計算的代價太大了。因此在使用一億個樣本訓練模型以前,咱們應該先試試隨機選取少許樣本(1000個),而後僅用這1000個樣原本訓練咱們的算法。因此在正式使用一億個樣本進行開發前,預先檢查每每是個明智的選擇。(使用少許樣本進行訓練,結果每每是同樣的,這也是繪製學習曲線的經常使用方法)性能

左圖是高方差狀況,增長訓練集樣本每每有效,右圖是高誤差狀況,增長訓練集樣本沒有太大效果。咱們能夠適當增長特徵,使得右圖向左側轉變。學習

因此在大規模計算中,咱們每每但願能找到替代這個算法的算法或尋找更有效的計算這項的方法,接下來,將介紹兩個主要方法:隨機梯度降低和減小映射,用來處理海量的數據集大數據

二: 隨機梯度降低法

對不少機器學習算法,例如線性迴歸、邏輯迴歸和神經網絡,推導算法的方法是提出一個代價函數或提出一個優化目標,而後使用梯度降低這樣的算法求代價函數的最小值,可是當訓練集很大時,使用梯度降低算法的計算量會變得很是大,接下來將討論對梯度降低算法的改進:隨機梯度降低法優化

(一)回顧以前的線性迴歸模型

假設函數與代價函數以下:

使用梯度降低的公式以下:

可是當m很大時,咱們計算求和項(不斷迭代求和),將變得十分困難:

由於咱們每次都要同時考慮全部的訓練樣本,因此咱們稱之爲批量梯度降低法。

(二)隨機梯度降低法(更快)

那麼當訓練集很大時,用這樣的梯度降低的更新,將會很是慢,花費的代價太大,下面來看一下更高效的算法,能夠更好地處理大型數據集。

用另外一種方式寫出代價函數:

這個代價函數其實是衡量假設函數在某個樣本上的表現,所用整體的代價函數爲:

用這種方法應用到線性迴歸模型上,寫出隨機梯度降低的過程:

1.隨機打亂全部的數據集(隨機打亂:將全部m個訓練樣本從新隨機排列)(標準預處理過程);

2.對全部的訓練樣本進行遍歷,進行更新:,這一項實際上是

因此隨機梯度降低其實是遍歷全部的訓練樣本。

首先是第一組訓練樣本,此時只對第一個訓練樣本的代價函數進行梯度降低操做,而後把參數稍微修改一下,使其擬合的更好。

而後以一樣的方式繼續操做後面的訓練樣本,直到完成整個訓練集。

以前梯度降低法是遍歷有所樣本梯度降低一次,這裏隨機梯度降低法是每輸入一個樣本梯度降低一次

隨機梯度降低不同的地方在於不須要對所有m個樣本求和來獲得梯度項,只須要對單個訓練樣本求出這個梯度項,來看一下隨機梯度降低過程的迭代過程:

總的來看,參數是朝着全局最小化的方向移動的,整個過程仍是以隨機迂迴的路徑朝着全局最小值前進,相比於普通梯度降低(紅色的曲線),隨機梯度降低的收斂形式是不一樣的,它所作的是接二連三在某個區域中朝着全局最小值方向徘徊。

三:Mini-Batch梯度降低

將會介紹Mini-Batch梯度降低,它有時比隨機梯度降低法還要更快一些

(一)三種降低法對比

(1)普通梯度降低:每次迭代都要用到全部的m個樣本;

(2)隨機梯度降低:每次迭代只需用到一個樣本;

(3)Mini-Batch梯度降低:它是介於上述二者之間,每次迭代會使用b個樣本(b是稱爲Mini-Batch大小的參數,一般b的範圍2-100)。

例如:假設b=10,獲得10個樣本爲:,而後進行梯度更新:,接着再從i+10開始進行更新,一直進行下去,寫下完整算法以下:

Mini-Batch梯度降低算法的缺點之一是要計算參數b的大小時,可能須要花費些時間,不過若是有優秀的向量化方法(使得b個樣本能夠並行計算),有時它將比隨機梯度降低運行的更快。

四:隨機梯度降低收斂

將介紹確保算法的正確收斂以及調整隨機梯度降低中的學習速率α的值

(一)正確收斂

回顧以前的普通梯度降低法,確保梯度降低已經收斂的一個標準方法就是繪製代價函數;

而對於隨機梯度降低,爲了檢查算法是否已經收斂,能夠進行如下的工做:

1.沿用以前定義的代價函數:

2.當隨機梯度降低法進行學習時,在使用某個樣本更新參數以前,能夠計算出這個訓練樣本對應的假設表現有多好(即計算出代價函數);

3.爲了檢查隨機梯度降低是否收斂,要作的是每1000次迭代,就畫出前一步中所計算出的代價函數,把這前1000個樣本的代價函數的平均值畫出來,經過觀察所畫的圖,就能檢查出隨機梯度降低法是否在收斂。

相比較以前的代價函數,每次都須要遍歷全部的訓練樣本,而隨機梯度降低法,只須要子啊更新θ以前計算這些cost函數。

下面是畫出圖的例子

若是獲得的上述這樣的圖,能夠看出代價函數的值在降低,可以判斷學習算法已經收斂了;(紅線是表示咱們選擇了一個很小的學習速率,效果更好)

若是出現上述這樣的狀況,咱們對1000組樣本(紅線--若是提升樣本數,曲線會更加平滑)取cost函數平均值,看起來代價函數收斂得很好。

若是出現上述這樣的狀況,看起來代價函數徹底沒有在減少,彷佛算法沒有在進行學習。可是若是給出更多的訓練樣本求平均值,出現的曲線結果多是如上圖中紅色的曲線所示,這樣其實能看出代價函數是在減少的,只是求均值的樣本太少的狀況下,致使可能看不出其實是趨向於減小的;

若是獲得上圖粉色線所表示得圖形,不管咱們增大樣本數量,曲線依舊沒有降低,說明了,出於一些緣由,咱們得算法並無進行學習。咱們能夠調節學習速率或者特徵

若是獲得上圖中這樣的曲線,它看起來是在上升的,這樣的狀況就是算法發散的信號,這時要作的是用一個更小的學習速率α。

因此,經過上述所畫的這些圖,能夠知道可能出現的各類狀況,也可以應對不一樣的狀況採起不一樣的措施。

(二)學習速率α

最後,討論說一下關於學習速率α的狀況:

在大多數隨機梯度降低法的典型應用中,學習速率α通常是一個不變的常數,所以最終獲得的結果會在全局最小值附近徘徊,獲得的是一個很是接近全局最小值的值。若是想讓隨機梯度降低更好地收斂到全局最小值,可讓學習速率α的值隨時間變化逐漸減少。

一種典型的方法就是設置的值,讓等於某個常數1除以迭代次數加上某個常數,它的缺點是要肯定兩個常數的值須要花一些時間,可是若是可以找到這兩個常數,得出的效果是很好的。

五:在線學習 

將討論一種新的大規模的機器學習機制:在線學習機制。這個在線學習機制,讓咱們能夠模型化一些問題,就是咱們有連續一波數據或者連續得數據流,想要從中學習得這類問題。

若是你有一個由連續的用戶流引起的連續的數據流,進入你的網站,你能作的是使用一個在線學習機制,從數據流中學習用戶的偏好,而後使用這些信息來優化一些關於網站的決策。

(一)在線學習的案例

假設你提供運輸服務,用戶們向你詢問把包裹從A地運到B地的服務,同時假定你有一個網站,用戶們登陸網站告訴你他們想從哪裏寄出包裹以及寄到哪裏去,而後你的網站開出運輸包裹的服務價格,根據你給用戶的這個價格,用戶有時會接受這個運輸服務(y=1),有時候並不會接受(y=0),這裏想要用一個學習算法幫助優化咱們給用戶開出的價格。

假設已經獲取了描述用戶特色的特徵,好比用戶的人口統計數據、用戶郵寄包裹的起始地以及目的地,咱們要作的是用這些特徵學習用戶將會用咱們的運輸服務來運輸包裹的機率,因此利用這些機率,就能夠在新用戶來的時候提供合適的價格。

考慮邏輯迴歸算法:假定有一個連續運行的網站,如下就是在線學習算法所作的:

報價是咱們的一個特徵,其餘特徵爲距離,起始地點,目標地點以及特定的用戶數據----是特徵X。 用戶接受報價使用咱們的物流服務的可能性y 每次循環,咱們都會利用剛獲得得(x,y)數據對來更新θ

若是真的運行一個大型網站,網站有連續的用戶流,那麼這種在線學習算法就很是適用。(能夠適應變化得用戶偏好)

(二)在線學習的案例二

這是一個產品搜索的應用,咱們想要用一種學習算法來學習,如何反饋給用戶好的搜索列表。假設有一個賣手機的店鋪,有一個用戶界面可讓用戶登陸你的網站並鍵入一個搜索條目,例如「安卓手機、1080p攝像頭」,假定店鋪中有100種手機,因爲網站設計,當用戶鍵入一個搜索命令,會找出10部合適的手機供用戶選擇。這裏想要用一個學習算法幫助咱們找到在這100部手機中哪10部手機是應該反饋給用戶的。

接下來是解決問題的思路:

1.對於每一個手機以及給定的用戶搜索命令,能夠構建特徵向量x,這個特徵向量可能會表示手機的各類特徵,多是:用戶的搜索與這部電話的相似程度有多高、用戶搜索命令中有多少詞能夠與這部手機的名字相配等等。

2.咱們須要作的是估計用戶點擊某一手機連接的機率,因此將y=1定義爲用戶點擊了手機的連接,而y=0是指用戶沒有點擊連接,而後根據特徵x來預測用戶點擊特定連接的機率。、

3.若是可以估計任意一個手機的點擊率,能夠利用這個來給用戶展現10個他們最有可能點擊的手機。

這就是在線學習機制,咱們所使用的這個算法與隨機梯度降低算法很是相似,惟一的區別就是不會使用一個固定的數據集,而是獲取一個用戶樣本,從這個樣本中學習,而後接着處理下一個,並且若是你的某個應用具備連續的數據流,在線學習機制很是值得考慮。

六:減小映射與數據並行

將討論另外一種能夠應用在大規模機器學習上的思想:叫作MapReduce

MapReduce的思想:

對於普通梯度降低法來講:

假定有訓練集以下:

根據MapReduce的思想,把訓練集分割成不一樣的子集,假設m=400(這裏爲了方便介紹,實際處理大規模數據m應該是4億的數量集),有4臺機器能夠處理數據,

第一臺機器用前四分之一的訓練集:

計算求和:

而後接着以此類推處理後面的訓練集:

如今每一個機器作的是四分之一的工做,使得它們能將原來的運行速度提升四倍,它們完成各自的temp計算後,而後把temp發給一箇中心服務器去整合結果,最後更新參數:

下面是MapReduce的示意圖:

若是想把MapReduce的思想應用在某種學習算法上,經過多臺電腦並行計算來實現加速,思考:學習算法是否能表示成對訓練集的一種求和?

實際上不少學習算法均可以表示成對訓練集函數求和,而在大數據集上運行,所消耗的計算量就在於須要對很是大的訓練集進行求和,因此只要學習算法能夠表示爲對訓練集的求和,那麼就能夠用MapReduce將學習算法的使用範圍擴展到很是大的數據集

看下面的例子:

假設想要用一個高級的優化算法,好比L-BFGS、共軛梯度算法等等,假定要訓練一個邏輯迴歸學習算法,須要去計算兩個重要的量:

(1)計算優化目標的代價函數:

(2)高級優化算法須要偏導項的計算過程:

只要學習算法能夠表示成一系列的求和形式或者表示在訓練集上對函數求和的形式,就可使用MapReduce技巧來並行化學習算法,使得其能夠應用於很是大的數據集。

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

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

這就是利用MapReduce來實現數據的並行操做,能有效的提升運行效率,因此經過本章的學習,但願可以對大規模機器學習的方法有所瞭解和掌握。

相關文章
相關標籤/搜索