系列文章目錄
人工智能–機器學習線性回歸數學原理及實作
文章目錄
- 系列文章目錄
- 前言
- 一、什么是梯度下降?
- 二、為什么梯度的方向是下降最快的方向
- 1.偏導數的意義
- 2.方向導數
- 3.實驗證明
- 總結
前言
其實在之前機器學習的章節中我們已經提到了梯度下降的概念,并且用梯度下降解決了實際的最小二乘法求解問題,來完成線性回歸的一個例子,大家知道了梯度下降法能讓最小二乘法的結果每次都趨向更小,但大家可能還是不太清楚他的本質原理,這一章中我就會給大家真真正正的講解梯度下降的演算法,
一、什么是梯度下降?
梯度下降其實是梯度問題里的一種,只是我們用的比較多,但根據實際情況,我們將梯度問題分為:梯度下降和梯度上升,分別用來求解最小值和最大值問題,而梯度的概念其實很簡單,當一個式子的向量由該式子的全部變數的偏導陣列成時,這個向量被稱為梯度(gradient),我們用式子來表達可能會更加形象:
假設我們有物件運算式:
f
(
x
0
,
x
1
)
=
x
0
2
+
x
1
2
f(x_{0},x_{1})=x_{0}^2+x_1^2
f(x0?,x1?)=x02?+x12?
則他的梯度為:
v
e
c
t
o
r
→
=
(
?
f
?
x
0
,
?
f
?
x
1
)
\overrightarrow{vector} = ( \frac{\partial f}{\partial x_{0}}, \frac{\partial f}{\partial x_{1}} )
vector
=(?x0??f?,?x1??f?)
二、為什么梯度的方向是下降最快的方向
1.偏導數的意義
那我們首先要從梯度的組成入手,可以看到梯度是由兩個偏導數 ( ? f ? x 0 , ? f ? x 1 ) (\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}) (?x0??f?,?x1??f?)組成
而其中:
f
x
(
x
0
,
y
0
)
f_{x}(x_0,y_0)
fx?(x0?,y0?)代表曲面被平面
y
=
y
0
y = y_0
y=y0?所截后的曲面在點M出的切線對
x
x
x軸的斜率,
f
y
(
x
0
,
y
0
)
f_{y}(x_0,y_0)
fy?(x0?,y0?)代表曲面被平面
x
=
x
0
x = x_0
x=x0?所截后的曲面在點M出的切線對
y
y
y軸的斜率,
于是我們可以看到由于偏導數的局限性,我們很難進行任意方向的變化率計算,于是我們引入了方向導數的概念,
2.方向導數
因為我們已經有了兩個方向的偏導數
f
x
(
x
0
,
y
0
)
,
f
y
(
x
0
,
y
0
)
f_x(x_0,y_0),f_y(x_0,y_0)
fx?(x0?,y0?),fy?(x0?,y0?),那類似與向量平面可以由兩個向量表達一樣,我們也可以通過這倆個偏導數來表示各個方向,
于是我們提出:
u
?
=
cos
?
θ
i
+
sin
?
θ
j
\vec u = \cos\theta{i}+\sin\theta{j}
u
=cosθi+sinθj
當然由于他是針對二元函式
f
(
x
,
y
)
f(x,y)
f(x,y)的,所以這個方向還需要一個前置條件:
lim
?
t
→
0
f
(
x
0
+
t
cos
?
θ
,
y
0
+
t
sin
?
θ
)
t
\lim_{t\to0} \frac{f(x_0+t\cos\theta,y_0+t\sin\theta)} {t}
t→0lim?tf(x0?+tcosθ,y0?+tsinθ)?這條運算式的極限值如果存在,則可以說我們的方向向量成立,我們將其記為
D
u
f
(
x
,
y
)
D_uf(x,y)
Du?f(x,y)
由于我們已知
D
u
f
(
x
,
y
)
=
f
x
(
x
,
y
)
cos
?
θ
+
f
y
(
x
,
y
)
sin
?
θ
D_uf(x,y)=f_x(x,y)\cos\theta+f_y(x,y)\sin\theta
Du?f(x,y)=fx?(x,y)cosθ+fy?(x,y)sinθ成立,
設:
P
=
(
f
x
(
x
,
y
)
,
f
y
(
x
,
y
)
)
P = (f_x(x,y),f_y(x,y))
P=(fx?(x,y),fy?(x,y))
W
=
(
cos
?
θ
,
sin
?
θ
)
W = (\cos\theta,\sin\theta)
W=(cosθ,sinθ)
則:
D
u
f
(
x
,
y
)
=
P
?
W
=
∣
P
∣
?
∣
W
∣
cos
?
α
D_uf(x,y)=P·W =\left\vert P\right\vert·\left\vert W\right\vert \cos\alpha
Du?f(x,y)=P?W=∣P∣?∣W∣cosα
這樣原理一下子就清晰了,想要
D
u
f
(
x
,
y
)
D_uf(x,y)
Du?f(x,y)最大也就是
cos
?
α
\cos\alpha
cosα取1,也就是
W
W
W和
P
P
P平行,其中P是我們的梯度,而W是我們在嘗試的方向,所以當然是讓W和我們的P相同時
D
u
f
(
x
,
y
)
D_uf(x,y)
Du?f(x,y)最大,也就是這個方向幅度最大,
3.實驗證明
首先畫出我們的函式影像
X0 = np.arange(-6, 6, 0.25)
X1 = np.arange(-6, 6, 0.25)
X0, X1 = np.meshgrid(X0, X1)
Z = np.power(X0,2)+np.power(X1,2)

可以添加一點投影,更加直觀的從每個維度觀察變化趨勢,

然后求我們的梯度
先做一個求導的函式
def _numerical_gradient_no_batch(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val # 還原值
return grad
再生成我們的函式 f ( x 0 , x 1 ) = x 0 2 + x 1 2 f(x_0,x_1)=x_0^2+x_1^2 f(x0?,x1?)=x02?+x12?
def function_2(x):
if x.ndim == 1:
return np.sum(x ** 2)
else:
return np.sum(x ** 2, axis=1)
最后進行求導
def numerical_gradient(f, X):
if X.ndim == 1:
return _numerical_gradient_no_batch(f, X)
else:
grad = np.zeros_like(X)
for idx, x in enumerate(X):
grad[idx] = _numerical_gradient_no_batch(f, x)
return grad
grad = numerical_gradient(function_2, np.array([X, Y]))
然后向量圖
plt.quiver(X, Y, -grad[0], -grad[1], angles="xy", color="#666666")
得出結果
我們可以看到對應上面我們 f ( x 0 , x 1 ) f(x_0,x_1) f(x0?,x1?)的z方向投影圖,每個方向的梯度都在向著最低點匯聚,
總結
所以綜上所述,梯度下降法在求解很多函式上都有起效,也就是我們前面在解決最小二乘法的時候選擇他的原因,同時,梯度的求解方法在后面神經網路的學習中是非常重要的,可以說是一個核心思想,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227157.html
標籤:AI
下一篇:為藝術而生的驚艷演算法
