1. 程式人生 > >【原】Coursera—Andrew Ng機器學習—課程筆記 Lecture 17—Large Scale Machine Learning 大規模機器學習

【原】Coursera—Andrew Ng機器學習—課程筆記 Lecture 17—Large Scale Machine Learning 大規模機器學習

Lecture17 Large Scale Machine Learning大規模機器學習

17.1 大型資料集的學習 Learning With Large Datasets

如果有一個低方差的模型, 通常通過增加資料集的規模,可以獲得更好的結果。


但是如果資料集特別大,則首先應該檢查這麼大規模是否真的必要,也許只用 1000個訓練集也能獲得較好的效果,可以繪製學習曲線來幫助判斷。

 

17.2 隨機梯度下降法 Stochastic Gradient Descent

如果必須使用一個大規模的訓練集,則可以嘗試使用隨機梯度下降法(SGD)來代替批量梯度下降法。

隨機梯度下降演算法 則首先對訓練集隨機“洗牌”,然後在每一次計算之後便更新引數 θ

 
在批量梯度下降演算法還沒有完成一次迭代時,隨機梯度下降演算法便已經走出了很遠。但 SGD 不是每一步都是朝著”正確”的方向邁出的。因此雖然會逐漸走向全域性最小值的位置,但可能無法到達最小值點,而是在附近徘徊。不過很多時候這已經足夠了。

17.3 小批量梯度下降 Mini-Batch Gradient Descent

小批量梯度下降演算法,介於批量梯度下降演算法和隨機梯度下降演算法之間,每計算常數b次訓練例項,更新一次引數 θ 。

通常會令 b 在 2-100 之間。小批量梯度下降的好處在於可以用向量化的方式來迴圈b個訓練例項,如果用的線性代數函式庫能支援平行處理,那演算法的總體表現將與隨機梯度下降近似。

17.4 隨機梯度下降演算法的收斂 Stochastic Gradient Descent Convergence

在批量梯度下降中,可以令代價函式 J 為迭代次數的函式,繪製圖表判斷梯度下降是否收斂。但是,在大規模的訓練集下不現實,因為計算代價太大。
當資料集很大時使用隨機梯度下降演算法,這時為了檢查隨機梯度下降的收斂性,我們在每1000次迭代運算後,對最後1000個樣本的cost值求一次平均,將這個平均值畫到圖中。

 下面是可能得到的幾種影象:

圖1:紅色線的學習率比藍色線要小,因此收斂的慢,最後收斂的更好一些。
圖2:紅線通過對5000次迭代求平均,而不是1000個,得到更加平滑的曲線。
圖3:藍線顛簸不平而且沒有明顯減少。可以增大α來使得函式更加平緩,也許能使其像紅線一樣下降;或者可能仍像粉線一樣顛簸不平且不下降,說明模型本身可能存在一些錯誤。
圖4:如果曲線正在上升,說明演算法發散。應該把學習速率α的值減小。

還可以令學習率隨著迭代次數的增加而減小,例如令:

這樣,隨著不斷地靠近全域性最小值,學習率會越來越小,迫使演算法收斂而非在最小值附近徘徊。

但是通常不需要這樣做便能有非常好的效果,對α進行調整所耗費的計算通常不值得。 

17.5 線上學習 Online Learning

有一種大規模的機器學習機制,叫做線上學習機制。讓我們可以模型化問題。它指的是針對資料流,而非針對離線靜態資料集進行學習。例如,許多線上網站都有持續不斷的使用者流,對於每一個使用者,網站希望能不將資料儲存到資料庫中,便順利地進行演算法學習。

線上學習的演算法與隨機梯度下降演算法有些類似,只對單一的例項進行學習,而非對一個提前定義的訓練集進行迴圈:
Repeat forever (as long as the website is running) {
  Get (x, y) corresponding to the current user
  θ: = θj − α(hθ(x) − y)xj
  (for j = 0: n)
}
一旦對一個數據的學習完成,便可以丟棄它,不需要再儲存。這樣的好處在於可以針對使用者當前行為,不斷更新模型以適應該使用者。慢慢地除錯學習到的假設,將其調節更新到最新的使用者行為。

 

17.6 對映化簡和資料並行 Map Reduce and Data Parallelism

對映化簡和資料並行對於大規模機器學習問題而言非常重要。之前提到,批量梯度下降演算法計算代價非常大。如果能將資料集分配給多臺計算機,讓每一臺計算機處理資料集的一個子集,然後將結果彙總求和,這樣的方法叫做對映簡化。

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

如果任何學習演算法能夠表達為對訓練集函式的求和,那麼便能將這個任務分配給多臺計算機(或者同一臺計算機的不同 CPU 核心),以達到加速處理的目的。例如邏輯迴歸:

很多高階的線性代數函式庫能夠利用多核 CPU 的來並行地處理矩陣運算,這也是演算法的向量化實現如此重要的緣故(比呼叫迴圈快)。