1. 程式人生 > >機器學習之線性迴歸

機器學習之線性迴歸

目錄

  • 線性迴歸
    • 模型表示
    • 模型評估
    • 模型學習
    • 模型總結
      • 演算法流程
      • 存在的問題
      • 演算法優化

線性迴歸

輸出是一個連續的數值。

模型表示

對於一個目標值,它可能受到多個特徵的加權影響。例如寶可夢精靈的進化的 cp 值,它不僅受到進化前的 cp 值的影響,還可能與寶可夢的 hp 值、型別、高度以及重量相關。因此,對於寶可夢進化後的 cp 值,我們可以用如下線性公式來表示:

\[y=b+\sum_{i=1}^n{\theta_ix_i}\tag{1}\]

上述的線性函式就是我們的模型,學習目標就是去根據觀察的值去擬合權重引數 \(\theta\) 和偏置 \(b\) 。為了簡化模型表示,可以令 \(x_0=1\) ,和 \(\theta_0 = b\) ,則可以將線性函式表示為如下形式:

\[y=\sum_{i=0}^n{\theta_ix_i}\tag{2}\]
表示為矩陣相乘的形式,則我們的目標就是期望學習得到函式 \(h_{\theta}(x_i)=\theta^Tx_i\) 。


模型評估

上述的線性函式表示的是一個包含無數個可能的模型的假設空間,每一組 \(\theta\) 值都會確定一個模型,所以我們需要根據樣本空間來找到最佳的模型。

首先,我們需要對模型的好壞進行定義。即什麼樣的模型是一個好的模型,而什麼樣的模型是一個壞的模型。模型的好壞的最直觀的定義就是預測的值和真實的值之間的差距,如下圖所示,黑色的直線是我們學習到的模型,紅色的 × 是真實的值,則模型的誤差就可以用真實值和預測值之間的歐氏距離來進行評估。距離越小,表示預測的越準確,反之,則表示預測的效果越差。

我們用 \(x^{(i)}\) 表示第 \(i\) 個樣本的特徵,\(h_{\theta}(x^{(i)})\) 表示對該樣本的預測值,而 \(y^{(i)}\) 則表示對應的真實值。因此,對於模型的誤差,我們可以用所有樣本的平均誤差來表示,即:

\[L(\theta)=\frac{1}{2m}\sum_{i=1}^m{(h_{\theta}(x^{(i)})-y^{(i)}})^2\tag{3}\]

這裡的 \(i\) 和模型表示中的 \(i\) 是不同的含義,前者表示第 \(i\) 個樣本,後者表示樣本的第 \(i\) 個特徵。

上述誤差函式又叫做代價函式或損失函式,線上性迴歸中,通常用均方誤差來作為代價函式。

計算代價函式的Python程式碼如下:

def compute_cost(X, y, theta):
  inner = np.power(((X * theta.T) - y), 2)
  return np.sum(inner) / (2 * len(X))

模型學習

有了上述的代價函式之後,我們的學習目標就十分清晰了。我們的目標就是學習到一個模型,使得代價函式的值最小。學習模型其實就是等價於學習權重引數向量 \(\theta\) ,因此,我們的目標函式也應該是關於引數 \(\theta\) 的函式。令 \(\theta^*\) 表示我們的目標模型,則目標函式可以表示為:

\[ \begin{align} \theta^*&=\arg\;\min_{\theta}L(\theta)\tag{4}\\ &=\arg\;\min_{\theta}{\frac{1}{2m}\sum_{i=1}^m{(h_{\theta}(x^{(i)})-y^{(i)}})^2}\tag{5} \end{align} \]
該目標函式我們可以用梯度下降的方法來求解,即每次都往函式的負梯度的方向去進行搜尋。我們知道,一個函式的最小值一般會出現在該函式的極值點上,前提是該函式是凸函式(這裡先不對凸函式做過多的闡述)。因此對於一個初始權重引數 \(\theta^{(0)}\) ,我們可以計算函式在該引數位置的導數,如果導數大於0,則表示目標函式在該點是遞增的,則我們需要降低我們的 \(\theta\) 值。反之,如果當前的導數小於0,則表示目標函式在該點是遞減的,為了找到更小的值,我們應該增加我們的 \(\theta\) 值。過程如下圖所示:

圖片來源於李巨集毅《機器學習》2017,\(w\) 等價於 \(\theta\)。

很顯然,該方法最終會落入到一個極值點,但是該極值點不一定是全域性最小值,而可能是區域性最小值。因為梯度下降方法在導數為0的點就不會對引數進行更新了,所以當遇到區域性最小值點時,由於目標函式的導數為0,所以權重引數會收斂,學習到的模型就不再是一個最佳的模型,找到的這種解叫做區域性最優解。

後續在介紹如何解決梯度下降過程中的區域性最優解的問題...

現在我們知道了線性迴歸模型的完整學習過程,其目標就是最小化代價函式來學習得到一組權重引數,而且我們也知道可以利用梯度下降的方法來尋找最佳的權重引數。接下來將介紹如何去更新我們的權重引數。

權重引數 \(\theta\) 是一個向量,它與樣本的特徵數目是相對應的,如果樣本含有 n 個特徵,則權重引數的維度為 n+1 ,注意,還包含一個偏置。對引數向量的求導,實質上就是對各個方向進行偏微分。依然假設我們初始的權重引數向量為 \(\theta^{(0)}\) ,現在我們求第 \(j\) 個權重引數的梯度:

\[ \begin{align} \frac{\partial L}{\partial \theta_j}&=\frac{1}{2m}\sum_{i=1}^m{2\cdot (h_{\theta}{x^{(i)}-y^{(i)})\cdot x_j^{(i)}}}\tag{6}\\ &=\sum_{i=1}^m{(h_{\theta}{x^{(i)}-y^{(i)})\cdot x_j^{(i)}}}\tag{7} \end{align} \]

此處也很好的解釋了為什麼目標函式要增加一個 1/(2m) ,這是為了最後更新權重引數時更方便計算。同時,乘以一個正數也不會影響函式的極小值點。

前面分析了,權重引數的更新應該是超該引數的負梯度方向更新。所以對於引數 \(\theta_j\) ,其在下一輪的更新值為:

\[ \begin{align} \theta_j^{(1)}&=\theta_j^{(0)}-\alpha\cdot\frac{\partial L}{\partial \theta_j}\tag{8}\\ &=\theta_j^{(0)}-\alpha\cdot\sum_{i=1}^m{(h_{\theta}{x^{(i)}-y^{(i)})\cdot x_j^{(i)}}}\tag{9} \end{align} \]

其它的引數更新與上述的更新方式相同,注意:上述式子需要同時更新一組引數 \((\theta_0,\theta_1,\cdots,\theta_n)\) 後再進行下一次迭代。\(\alpha\) 是學習率。

上述的更新方式叫做批量梯度下降,即每次根據所有樣本的綜合誤差來更新引數。相對應的被稱為隨機梯度下降,即每計算一個樣本的值就更新權重引數。兩者的區別和優缺點後續再進行介紹。梯度下降在很多機器學習演算法中都有使用,包括大部分的深度學習,所以一定要理解其原理。

模型總結

現在我們已經對線性迴歸的原理和問題解決方法都有了一定的瞭解,接下來將對整個演算法的流程進行總結,並分析線性迴歸存在的一些問題,以及優化的方法。

演算法流程

  1. 根據特徵維度隨機初始化一組引數 \((\theta_0,\theta_1,\cdots,\theta_n)\) ;
  2. 根據該引數計算所有樣本的預測值 \(h_{\theta}(x)\);
  3. 根據公式(9)更新權重引數;
  4. 重複執行步驟2和步驟3,直到權重引數收斂或者達到一定的迭代次數。

存在的問題

  • 只適用於解決線性可分的問題,因為目標函式是多種變數的線性組合;
  • 對異常值敏感

演算法優化

包括嶺迴歸和Lasso迴歸