动态

详情 返回 返回

彩筆運維勇闖機器學習--梯度下降法 - 动态 详情

前言

彩筆運維勇闖機器學習,今天我們來討論一下梯度下降法

梯度

首先要搞明白什麼是梯度,那就要先從導數説起

導數

函數\(y=f(x)\)的自變量\(x\)在一點\(x_0\)上產生一個增量\(\Delta x\)時,函數輸出值的增量\(\Delta y=f(x_0 + \Delta x)-f(x_0)\)與自變量增量\(\Delta x\)的比值在\(\Delta x\)趨於0時的極限\(a\)如果存在,\(a\)即為在\(x_0\)處的導數

\[f'(x) = \frac{\partial y}{\partial x} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} = a \]

gradient_1

(該圖來自於百度百科)

偏導數

偏導數與導數的本質是一樣的,只不過偏導數解決的是多變量的問題

\[\frac{\partial f}{\partial x_i} = \lim_{\Delta x_i \to 0} \frac{f(x_1, \dots, x_i + \Delta x_i, \dots, x_n) - f(x_1, \dots, x_i, \dots, x_n)}{\Delta x_i} \]

比如二元函數\(f(x,y)\)

\(x\)求偏導:

\[\frac{\partial f}{\partial x} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x, y) - f(x, y)}{\Delta x} \]

\(y\)求偏導:

\[\frac{\partial f}{\partial y} = \lim_{\Delta y \to 0} \frac{f(x, y + \Delta y) - f(x, y)}{\Delta y} \]

gradient_2

(該圖來自於百度百科)

超過二元的就畫不出來圖來了

方向導數

導數與偏導數都是自變量相對於某一軸方向(比如x相對於x軸,y相對於y軸)討論變化率,而方向導數討論的則是,自變量可以在其定義域內自由選擇方向

一個多元函數\(f\)和一個方向向量\(u\),方向導數\(D_uf\)表示函數\(f\)\(u\)方向的變化率

\[D_{\mathbf{u}}f(a) = \lim_{h \to 0} \frac{f(a + hu) - f(a)}{h} \]

用二元函數舉例:

\[D_{\mathbf{u}}f(x_0, y_0) = \lim_{h \to 0} \frac{f(x_0 + h u_1, y_0 + h u_2) - f(x_0, y_0)}{h} \]

  • \(u_1 u_2\)表示方向\(u = (u1, u2)\)
  • h表示沿着\(u\)方向的位移

梯度

梯度是多元函數在某一點處所有偏導數構成的向量,表示函數在該點處變化最快的方向及其變化率,對於\(f(x_1,x_2,...,x_n)\),其梯度記為\(\nabla f\)

\[\nabla f = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n}\right) \]

  • 方向:梯度指向函數在該點增長最快的方向
  • 大小:梯度的模表示函數在該方向上的最大變化率

方向導數:梯度與單位方向向量u的點積

\[D_uf=\nabla f⋅u \]

\(u\)\(\nabla f\)同方向時,方向導數最大
\(u\)\(\nabla f\)反方向時,方向導數最小

小結

梯度與方向導數:梯度是方向導數中變化率最大的那一個:梯度的方向是方向導數取最大值的方向,而梯度的模長(大小)等於該最大方向導數的值
方向導數與偏導數:偏導數是方向導數的特例,即\(u=(0,1)\),簡而言之,方向導數在座標軸上移動,就是偏導數

瞭解了梯度的誕生以及概念之後,終於可以來討論一下本文的主題:梯度下降法

梯度下降法

在迴歸任務中,用於評估模型的重要指標是損失函數MSE,提高模型的泛化能力就是設法降低MSE

上述關於梯度的描述,梯度就是函數變化率最快的方向,那梯度下降法就是不斷沿着付梯度方向尋找MSE的最小值。不同於最小二乘法只能用於線性模型,梯度下降法適用於大部分模型,包括線性迴歸、邏輯迴歸等等

核心思想

  • 函數的梯度指向函數值增長最快的方向,負梯度方向則是函數值下降最快的方向
  • 通過不斷沿負梯度方向調整參數,逐步逼近函數的最小值點

步驟

  • 初始化,隨機選擇初始參數或者全部設置為0
  • 迭代更新,每迭代一次都會更新參數的值:$$\theta_{t+1}=\theta_t - \eta ⋅ \nabla f(\theta_t)$$
    • \(\theta_t\):第\(t\)次迭代的參數值
    • \(\eta\):每次更新的幅度,也叫學習率
    • \(\nabla J(\theta_t)\):目標函數\(f\)\(\theta_t\)的梯度
  • 終止迭代的條件:
    • 梯度很小:梯度的模長很小,一般小於\(10^{-6}\)
    • 損失函數變化很小:一般小於\(10^{-6}\)
    • 到達最大迭代次數

計算過程

我們用本系列的第一節:一元線性迴歸中的數據,用梯度下降法詳細演示一次

data = {
    'result': [0.63, 0.72, 0.72, 0.63, 0.57, 0.52, 0.48, 0.47],
    'feature1': [22.48, 19.50, 18.02, 16.97, 15.78, 15.11, 14.02, 13.24]
}

目標是找到一組參數,使得損失函數MSE最小:

\[\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat {y}_i)^2 \]

帶入\(y=\beta_0 + \beta_1 x\)

\[f(\beta_0 , \beta_1) = \frac{1}{n} \sum_{i=1}^{n} (\beta_0 + \beta_1 x_i - \hat {y}_i)^2 \]

首先計算梯度,分別對\(\beta_0\)\(\beta_1\)求偏導

先對\(\beta_0\)求偏導:

\[\frac{\partial f}{\partial β_0} = \frac{1}{n} \sum_{i=1}^{n} 2(β_0 + β_1x_i - \hat {y}_i)⋅(β_0 + β_1x_i - \hat {y}_i)' = \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i) \]

在對\(\beta_1\)求偏導:

\[\frac{\partial f}{\partial β_1} = \frac{1}{n} \sum_{i=1}^{n} 2(β_0 + β_1x_i - \hat {y}_i)⋅(β_0 + β_1x_i - \hat {y}_i)' = \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i)⋅x_i \]

至此得出梯度:

\[\nabla f = (\frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i), \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i)⋅x_i) \]

設置參數,學習率\(\eta=0.001\),迭代次數100次,開始迭代:

1)第一輪迭代,先初始化\(\beta_0\) \(\beta_1\)為0

計算損失函數:

\[\begin{aligned} MSE &= f(\beta_0 , \beta_1) = \frac{1}{n} \sum_{i=1}^{n} (\beta_0 + \beta_1 x_i - \hat {y}_i)^2 \\ &= \frac{1}{8}[(0-0.63)^2+(0-0.72)^2+...+(0-0.47)^2] = 0.35965 \end{aligned} \]

計算梯度:

\[\begin{aligned} \frac{\partial f}{\partial β_0} &= \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i) \\ &= \frac{1}{4}[(0-0.63)+(0-0.72)+...+(0-0.47)] = -1.185 \end{aligned} \]

\[\begin{aligned} \frac{\partial f}{\partial β_1} &= \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i)⋅x_i \\ &= \frac{1}{4}[(0-0.63)·22.48+(0-0.72)·19.50+...+(0-0.47)·13.24] = -20.418025 \end{aligned} \]

\[\nabla f = (-1.185, -20.418025) \]

損失函數與梯度均小於\(10^{-6}\),繼續迭代第二輪

2)第二輪迭代,先初始化\(\beta_0\) \(\beta_1\)

\[\beta_0 ← \beta_0 - \eta · \frac{\partial f}{\partial β_0} = 0 - 0.001·(-1.185) = 0.001185 \]

\[\beta_1 ← \beta_1 - \eta · \frac{\partial f}{\partial β_1} = 0 - 0.001·(-20.418025) = 0.020418025 \]

計算損失函數:

\[MSE = f(\beta_0 , \beta_1) = \frac{1}{n} \sum_{i=1}^{n} (\beta_0 + \beta_1 x_i - \hat {y}_i)^2 = 0.064501 \\ \]

計算梯度:

\[\frac{\partial f}{\partial β_0} = \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i) = -0.492909 \]

\[\frac{\partial f}{\partial β_1} = \frac{2}{n} \sum_{i=1}^{n} (β_0 + β_1x_i - \hat {y}_i)⋅x_i = -8.395268 \]

\[\nabla f = (-0.492909, -8.395268) \]

損失函數與梯度均小於\(10^{-6}\),繼續迭代第三輪...

就這樣不斷迭代下去,直至滿足停止的條件,停止之後,該輪次的\(β_0\) \(β_1\)就是最佳參數

聯繫我

  • 聯繫我,做深入的交流


至此,本文結束
在下才疏學淺,有撒湯漏水的,請各位不吝賜教...

Add a new 评论

Some HTML is okay.