[机器学习笔记]Note15--大规模机器学习
繼續是機器學習課程的筆記,本節內容主要是介紹大規模機器學習的內容。
大型數據集的學習
對于一個過擬合的模型,增加數據集的規模可以幫助避免過擬合,并獲得一個更好的結果。
但是對于一個大規模的數據,比如有100萬個數據量的訓練集,其計算量是非常大的。以線性回歸模型為例,每一次梯度下降迭代,我們都需要計算訓練集的誤差的平方和,對于訓練集有上百萬的數據量,如果學習算法需要有20次迭代,這就已經是一個非常大的計算代價。
因此,首先需要確定是否需要有這么大規模的訓練集,也許只用1000個訓練集就能獲得比較好的結果,這一步可以通過繪制學習曲線來幫助判斷,如下所示:
隨機梯度下降法(Stochastic Gradient Descent)
如果一定需要一個大規模的訓練集,我們可以嘗試使用隨機梯度下降法來代替批量梯度下降法。
批量梯度下降算法在每次迭代的時候需要計算整個訓練集的和,其公式如下:
如上公式可以知道,如果訓練集的數量m非常大,那么計算量就非常大。
而在隨機梯度下降法中,我們定義代價函數為一個單一訓練實例的代價:
所以隨機梯度下降算法是:
Repeat(一般迭代1-10次整個訓練集,根據訓練集大小選擇,訓練集越大,迭代次數越小){
for i=1:m{
θj:=θj?α(hθ(x(i))?y(i))x(i)j
(for j = 0:n)
}
}
隨機梯度下降算法在每一次計算之后便更新參數θ,而不需要首先將所有的訓練集求和,在批量梯度下降算法還沒有完成一次迭代時,隨機梯度下降算法便已經走出了很遠。但缺點是,不是每一步都是朝著“正確”的方向邁出的,因此算法雖然會逐步走向全局最小值的位置,但是可能無法站到那個最小值的那一點,而是在最小值點附近徘徊。如下圖所示
微型批量梯度下降(Mini-Batch Gradient Descent)
接下來介紹第三種梯度下降算法--微型批量梯度下降算法,它是介于批量梯度下降算法和隨機梯度下降算法之間的算法,每次迭代使用b個訓練實例,更新一次參數$\theta$,其更新公式如下所示:Repeat{
for i=1:m{
θj:=θj?α1b∑i+b?1k=i(hθ(x(k))?y(k))x(ikj
(for j = 0:n)
i+=10;
}
}
也就是如果令b=10,m=1000,有:
Repeat{
for i=1,11,21,31,…,991{
θj:=θj?α110∑i+9k=i(hθ(x(k))?y(k))x(ikj
(for j = 0:n)
}
}
通常會令b在2~100之間。這樣做的好處是,我們可以用向量化的方式來循環b個訓練實例,如果我們用的線性代數函數庫比較好,能夠支持平行處理,那么算法的總體表現將不受影響(與隨機梯度下降算法相同)。有時甚至可以比隨機梯度下降算法更快。
隨機梯度下降收斂
接下來介紹隨機梯度下降算法的調試,以及學習率α的選取。
在批量梯度下降中,我們可以令代價函數J為迭代次數的函數,繪制圖表,根據圖表來判斷梯度下降是否收斂,但是,在大規模的訓練集的情況下,這是不現實的,因為計算代價太大了。
在隨機梯度下降算法中,我們在每一次更新θ之前都計算一次代價,然后每X次迭代后,求出這X次對訓練實例計算代價的平均值,然后繪制這些平均值與X次迭代的次數之間的函數圖片。比如令X=1000,即每1000次迭代就計算一次代價的平均值,然后繪制圖表。如下圖所示:
當我們繪制這樣的圖表時,可能會得到一個顛婆不平但是不會明顯減少的函數圖象(如上圖中左下圖藍線所示)。我們可以增加X,如令X=5000,來使得函數更平緩,也許便能看出下降的趨勢(如上圖中左下圖的紅線所示);但可能函數圖表仍然是顛婆不平且不下降的(還是左下圖的洋紅色曲線,即上面那條),這可能就是模型本身存在一些錯誤。
而如果得到的曲線是如上圖中右下圖所示,不斷地上升,那么可能需要選擇一個較小的學習率α。
我們可以令學習率隨著迭代次數的增加而減少,如下所示:
隨著不斷地靠近全局最小值,通過減小學習率,我們迫使算法收斂而非在最小值附加徘徊,如下圖所示。
但是通常我們不需要這樣做便能有非常好的效果了,對α進行調整所耗費的計算通常不值得,畢竟這種調整學習率方法需要確定常數const1和const2的值。
在線學習
接下來介紹一種新的大規模機器學習機制–在線學習機制。在線學習算法指的是對數據流而非離線的靜態數據集的學習。許多在線網站都有持續不斷的用戶流,對于每一個用戶,網站希望能在不將數據存儲到數據庫中便順利地進行算法學習。
假設我們正在經營一家物流公司,每當一個用戶詢問從地點A至地點B的快遞費用時,我們給用戶一個報價,該用戶可能選擇接受(y=1)或者不接受(y=0)。
現在,我們希望構建一個模型,來預測用戶接受報價使用我們的物流服務的可能性。因此報價是一個特征,其他特征為距離,起始地點,目標地點以及特定的用戶數據。而模型的輸出是p(y=1)。
在線學習的算法與隨機梯度下降算法有些類似,我們對單一的實例進行學習,而非對一個提前定義的訓練集進行循環。
Repeat forever (as long as the website is running){
對當前用戶獲取對應的(x,y)
θj:=θj?α(hθ(x)?y)xj
(for j= 0:n)
}
一旦對一個數據的學習完成了,我們便可以丟棄該數據,不需要再存儲它了。這種方式的好處是,我們的算法可以很好的適應用戶的傾向性,算法可以針對用戶的當前行為不斷地更新模型以適應該用戶。
其他在線學習的例子有如搜索,比如搜索擁有1080p像素相機的安卓手機等。
映射化簡和數據并行
映射化簡和數據并行對于大規模機器學習問題而言是非常重要的概念。
之前提到,如果我們用批量梯度下降算法來求解大規模數據集的最優解,我們需要對整個訓練集進行循環,計算偏導數和代價,再求和,計算代價非常大。如果我們能夠將我們的數據集分配給多態計算機,讓每一臺計算機處理數據集的一個子集,然后我們將計算的結果匯總再求和,這樣的方法叫做映射簡化。
具體而言,如果任何學習算法能夠表達為,對訓練集的函數的求和,那么便能將這個任務分配給多臺計算機(或者同一臺計算機的不同CPU),以達到加速處理的目的。
例如,我們有400個訓練實例,我們可以將批量梯度下降的求和任務分配給4臺計算機進行處理:
很多高級的線性代數函數庫已經能夠利用多核CPU的多核來平行地處理矩陣運算,這也是算法的向量化實現如此重要的緣故,這比使用循環更快。
小結
本節課內容介紹了如此使用大規模數據集來進行訓練機器學習算法,介紹了兩種新的梯度下降算法–隨機梯度下降和微型批量梯度下降,以及新的大規模機器學習算法機制–在線學習機制,最后介紹了映射化簡和數據并行,也就是使用多臺計算機或者是同一臺計算機的多個CPU分別計算訓練集的一個子集,最后再將結果匯總求和的方法。
總結
以上是生活随笔為你收集整理的[机器学习笔记]Note15--大规模机器学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后端:Java 8 中的 Map 实用操
- 下一篇: java格式化数字 NumberForm