目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
在求解機器學習算法模型參數的時候,梯度降低法(gradient descent)和最小二乘法(least squares)是最常用的方法,因爲梯度降低法衍生出的分支較多,因此在這裏對梯度降低法單獨作一個總結。算法
梯度是在微積分中對多元函數的各個參數求偏導數,而且把求得的各個參數的偏導數用向量的形式表達出來。數據結構
例如函數\(L(\omega,b)\),分別對\(\omega\)和\(b\)求偏導數,梯度向量就是\(({\frac{\partial{L}}{\partial{\omega}}},{\frac{\partial{L}}{\partial{b}}})^T\),簡稱\(grad{L(\omega,b)}\)或者\(\nabla{L(\omega,b)}\)。對於某個具體的點\((\omega_i,b_i)\)的具體梯度向量就是\(({\frac{\partial{L}}{\partial{\omega_i}}},{\frac{\partial{L}}{\partial{b_i}}})^T\)或者\(\nabla{L(\omega_i,b_i)}\),若是是多參數的函數則是\(({\frac{\partial{L}}{\partial{x}}},{\frac{\partial{L}}{\partial{y}}},{\frac{\partial{L}}{\partial{z}}})^T\)。機器學習
在機器學習算法中,若是須要最小化目標函數時,則能夠經過梯度降低法一步一步的迭代求解,獲得最小化的目標函數和模型參數值;若是要最大化目標函數時,則能夠經過梯度上升法迭代求解。函數
梯度降低算法和梯度上升法之間也能夠互相轉化,能夠經過梯度降低迭代最小化目標函數,同時也能夠反向梯度上升迭代最小化目標函數;同理也能夠反向梯度降低迭代最大化目標函數。性能
假設咱們處在某座不知名的大山上的某處位置,因爲咱們不知道該怎麼下山,因而決定走一步算一步,即每走到一個位置的時候便求解當前位置的梯度,沿着梯度的負方向即當前最陡峭的位置向下走一步,而後繼續求解當前位置的梯度……直到咱們認爲咱們已經到了山腳才停下來。從下圖能夠看出,經過該方法咱們有可能走到了這座大山的某一個局部的最低處(山腰處),而沒有走到真正的山腳。學習
從下山這個實例中能夠得出:梯度降低不必定可以找到全局的最優解,有可能會找到局部最優解。網站
可是若是代價函數爲凸函數的時候梯度降低獲得的則必定是全局最優解。人工智能
步長決定了梯度降低迭代的時候每一步沿梯度負方向前進的長度,下山實例中則表示每一步的長度。
若是步長過長,則可能會錯過最優解;若是步長太小,迭代速度會變慢,很長時間算法都不會結束。所以能夠從大到小的嘗試步長的大小,若是目標函數值在變小,說明取值有效,不然須要增大步長。
以線性模型舉例,線性模型的假設函數爲預測值的預測函數,即經過輸入特徵\((x_1,x_2,\ldots,x_n)\)輸出一個對應的預測值\(\hat{y}\),線性模型的假設函數爲
\[ \hat{y} = f(x) = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b \]
目標函數經常使用來度量模型擬合的程度,以線性模型舉例,線性模型通常使用均方偏差度量模型性能,線性模型的目標函數爲
\[ J(\omega,b) = \sum_{i=1}^m (y_i - \hat{y_{i}})^2 \]
假設現有一個目標函數\(J(\omega_0,\omega_1,\ldots,\omega_n)\)。
這一部分主要用到了矩陣的基本計算和求導,首先對假設函數和目標函數矩陣化。
假設現有一個假設函數
\[ \hat{y} = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = X^T\omega \]
其中\(X^T\omega\)是假設函數的矩陣表達(把\(b\)看作\(\omega_0x_0, \quad x_0=1\)),其中\(X^T\)是\(m*(n+1)\)維的特徵矩陣(\(m\)爲樣本數,\(n\)爲特徵數),\(\omega\)是\((n+1)*1\)維的向量,則經過矩陣的計算得知\(X^T\omega\)是一個\(m*1\)維的向量。
假設函數的轉換便可得矩陣表達的目標函數,即
\[ J(\theta)={\frac{1}{2}}(X\omega-Y)^T(X\omega-Y) \]
其中\(Y\)是\(m*1\)維的樣本向量。
三種不一樣形式的梯度降低法步驟都是相同的,只是在更新參數的時候選擇的樣本數量不一樣,若是不關心樣本數量,梯度降低法的更新公式爲
\[ \omega_i = \omega_i - \alpha{\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)} \]
接下來的參數更新公式以均方偏差線性迴歸模型舉例,均方偏差線性迴歸模型的目標函數對參數\(\omega\)的求偏導公式爲
\[ \nabla{L(\omega_i)}=\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)} \]
其中\(m\)是樣本數,\({x_j}^{i}\)是第\(j\)個樣本的第\(i\)個特徵。
批量梯度降低法(batch gradient descent)是最經常使用的作法,它使用全部的樣本更新參數,它的參數更新公式爲
\[ \omega_i = \omega_i - \alpha\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)} \]
隨機梯度降低法(stochastic gradient descent)相似於批量梯度降低法,可是它隨機的使用第\(j\)個樣本更新參數,它的參數更新公式爲
\[ \omega_i = \omega_i - \alpha(\hat{y_j}-y_j){x_i}^{(j)} \]
小批量梯度降低法(mini-batch gradient descent)屬於批量降低法和隨機梯度降低法的折中方法,即對於\(m\)樣本,隨機選定\(x\)個樣本更新參數,通常\(x=10\)。假設這\(x\)樣本的集合爲\(D\),它的參數更新公式爲
\[ \omega_i = \omega_i - \alpha\sum_{j\in{D}} (\hat{y_j}-y_j){x_i}^{(j)} \]
批量梯度降低法使用全部的樣本更新參數,計算量大,準確度高,可是更新速度慢。
隨機梯度降低法隨機使用一個樣本更新參數,計算量小,更新速度快,可是準確度不高,而且因爲使用一個樣本更新參數,算法收斂速度慢。
小批量梯度降低法屬於批量梯度降低法和隨機梯度降低法的折中方法,可是採用的錯誤樣本數須要具體問題去分析,不然採用錯誤的樣本數量容易致使更新速度慢並且準確度也不高。