前言
彩筆運維勇闖機器學習,今天我們來討論一下梯度下降法
梯度
首先要搞明白什麼是梯度,那就要先從導數説起
導數
函數\(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\)就是最佳參數
聯繫我
![]()
至此,本文結束
在下才疏學淺,有撒湯漏水的,請各位不吝賜教...