ml-10-1-規模機器學習( ( Large Scale Machine Learning) )

不洗澡的鯨魚發表於2020-10-14

規模機器學習( ( Large Scale Machine Learning) )

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

如果我們有一個低方差的模型,增加資料集的規模可以幫助你獲得更好的結果。我們應
該怎樣應對一個有 100 萬條記錄的訓練集?

以線性迴歸模型為例,每一次梯度下降迭代,我們都需要計算訓練集的誤差的平方和,
如果我們的學習演算法需要有 20 次迭代,這便已經是非常大的計算代價。

首先應該做的事是去檢查一個這麼大規模的訓練集是否真的必要,也許我們只用 1000
個訓練集也能獲得較好的效果,我們可以繪製學習曲線來幫助判斷。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-LbcluRgh-1602638543853)(http://img-blog.szm2019.cn/github/blog/ml/ml-10-1-01.png)]

隨機梯度下降法Stochastic Gradient Descent

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

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

img

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

img

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

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

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

img

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

Stochastic Gradient Descent Convergence隨機梯度下降收斂

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

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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BZLfAOBS-1602638543898)(http://img-blog.szm2019.cn/github/blog/ml/ml-10-1-05.png)]

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

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

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

img

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

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

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

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

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

img

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

不洗澡的鯨魚?

相關文章