# [筆記] 機器學習 大規模的機器學習 > It's not who has the best algorithm that wins. It's who has the most data. * 大規模的機器學習是用來處理大數據的算法 * 可以先使用較少的資料,並畫出學習曲線,判斷是否需要用到大數據 * 當資料量較大時,會使梯度下降算法 ( 批量梯度下降 batch gradient descent ) 的計算量非常大,因此必須使用不同的梯度下降算法 ### 隨機梯度下降 ( stochastic gradient descent ) 1. 資料預處理,將資料打亂 2. 循環運算資料 1 到 m,每筆資料做一次迭代 * Repeat ( 整個循環可能循環計算 1 ~ 10 次,取決於資料量大小 ) * for i = 1 to m * $\theta_j$ = $\theta_j - \alpha(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}$ ( for j = 0, 1, ..., n ) * 隨機梯度下降可以運用於各種算法 * 與基本的梯度下降差別 * 基本的梯度下降 : 算完所有資料後做一次迭代 * 隨機梯度下降 : 算完每筆資料做一次迭代 * 隨機梯度下降的下降路徑較迂迴 #### 如何檢查收斂及選擇學習速率 α * 檢查收斂 * $cost(\theta, (x^{(i)}, y^{(i)}))$ = $\dfrac{1}{2}(h_{\theta}(x^{(i)} - y^{(i)}))^2$ * 在更新 θ 前,先計算 $cost(\theta, (x^{(i)}, y^{(i)}))$ * 因為如果使用更新後的 θ,使其在訓練資料上做預測,會比實際效果更好 * 每 1000 次迭代 ( 也能是其他數字 ) 計算 $cost(\theta, (x^{(i)}, y^{(i)}))$ 的平均值並畫出來 * 觀察畫出來的圖,檢查隨機梯度下降是否在收斂 * 可能出現的圖 : ![](https://i.imgur.com/joDFlST.png) * 藍線 : 代表學習算法已經收斂了 * 紅線 : 試試更小的學習速率 α,或許可以收斂到更好的點 ![](https://i.imgur.com/1SFXq3r.png) * 紅線 : 將每 1000 次迭代計算平均改為 5000,可能得到更平滑的曲線 ![](https://i.imgur.com/i0hy8d1.png) * 藍線 : 為 1000 次迭代計算平均,過於陡峭看不出是否收斂 * 紅線 : 改成 5000 後,可以看出其實是有在收斂的 * 紫線 : 若是改成 5000 後,發現並沒有收斂,也許需要改變學習速率 α、特徵、算法... ![](https://i.imgur.com/NNlPUXa.png) * 表示算法正在發散,試著降低學習速率 α * 選擇學習速率 α * 隨機梯度下降並不會真正的收斂,而是一直在最小值附近徘徊 * 若想使隨機梯度下降確實收斂到全局最小值,可以隨時間變化減少學習速率 α * α = $\dfrac{常數 1}{迭代次數 + 常數 2}$ * 雖然可以確實收斂到全局最小值,但並不是很常用,因為多了要選擇 `常數 1` 與 `常數 2` 的工作量,而且收斂到最小值附近其實已經很不錯了 ### 小批量梯度下降 ( mini-batch gradient descent ) * 有時會比隨機梯度下降快上一些 * 算完每 b 筆資料做一次迭代 ( b 通常會是 2 ~ 100 ) * 算法 : ( 假設 b 為 10,m 為 1000 ) * Repeat * for i = 1, 11, 21, 31, ..., 991 * $\theta_j$ = $\theta_j - \alpha\dfrac{1}{10}\sum^{i + 9}_{k = i}(h_{\theta}(x^{(k)}) - y^{(k)})x_j^{(k)}$ ( for j = 0, 1, ..., n ) ### 在線學習機制 ( online learning ) * 在擁有連續的新數據進來時,需要在線學習機制來從中學習 * 可以對正在變化的新數據進行調適 * 算法 : * 根據使用者 Get (x, y) * 使用此 (x, y) 去更新 θ * 然後此 (x, y) 就可以拋棄了 * 使用在線學習機制的例子 : 給不同用戶展示他們可能有興趣的項目 * 事實上使用在線學習機制的問題,都可以被歸類到擁有固定資料集的標準學習算法,但許多大公司偏向以在線學習機制獲取新數據來學習 ### 映射化簡 ( map reduce ) * 一種可以在多台機器上 ( 或多核 ) 學習的算法,加速學習的速率 * 只要機器學習算法可以表示為求和的形式就可以運用映射化簡 * 算法 : ( 假設資料量 m 為 400 ) * 機器 1 使用 (x<sup>(1)</sup>, y<sup>(1)</sup>),...,(x<sup>(100)</sup>, y<sup>(100)</sup>) * $temp_j^{(1)}$ = $\sum^{100}_{i = 1}(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}$ * 機器 2 使用 (x<sup>(101)</sup>, y<sup>(101)</sup>),...,(x<sup>(200)</sup>, y<sup>(200)</sup>) * $temp_j^{(2)}$ = $\sum^{200}_{i = 101}(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}$ * 機器 3 使用 (x<sup>(201)</sup>, y<sup>(201)</sup>),...,(x<sup>(300)</sup>, y<sup>(300)</sup>) * $temp_j^{(3)}$ = $\sum^{300}_{i = 201}(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}$ * 機器 4 使用 (x<sup>(301)</sup>, y<sup>(301)</sup>),...,(x<sup>(400)</sup>, y<sup>(400)</sup>) * $temp_j^{(4)}$ = $\sum^{400}_{i = 301}(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}$ * 結合 : $\theta_j$ = $\theta_j - \alpha\dfrac{1}{400}(temp_j^{(1)} + temp_j^{(2)} + temp_j^{(3)} + temp_j^{(4)})$ ( for j = 0, 1, ..., n ) ![](https://i.imgur.com/e8LjHkw.png) * 將數據分給多台電腦運算 ![](https://i.imgur.com/T6K0saq.png) * 將數據分給多核運算 ( 不須擔心網路延遲 ) * 有些線性代數函式庫會自動利用多核完成運算,這時就不須自己實現映射化簡技術 ###### tags: `筆記` `機器學習` `隨機梯度下降` `小批量梯度下降` `在線學習機制` `映射化簡`