**引言:**梯度下降在机器学习中非常重要。机器学习的核心内容就是把数据投入一个设计好的模型中,让模型自动的“学习”,从而优化模型的各种参数,最终使得在某一组参数下该模型能够最佳地匹配该学习任务。这个“学习”的过程就是机器学习算法的关键。梯度下降法(Gradient Descent)就是实现该“学习”过程的一种最常见的方式,尤其是在深度学习(神经网络)模型中。
各种教材中常常使用大雾中下山的例子介绍梯度下降法,梯度下降的方法与下山相似,函数代表着一座山,我们的目标就是找到这个函数的最小值,也就是山底。这个过程中有三个关键词:位置,方向,步长。最快的下山的方式是找到当前位置最陡峭的方向,然后沿着此方向向下走。梯度的方向就是函数变化率最大的方向。梯度的概念就是多个变量求导,例如:(梯度使用∇【读音:nabla】表示)
① 二元函数
f
(
x
,
y
)
=
x
2
+
y
2
∇
f
(
x
,
y
)
=
(
δ
f
δ
x
,
δ
f
δ
y
)
∇
f
(
x
,
y
)
=
(
2
x
,
2
y
)
f(x,y)=x^2+y^2\\ \nabla f(x,y)=(\cfrac{\delta f}{\delta x},\cfrac{\delta f}{\delta y})\\ \nabla f(x,y)=(2x,2y)
f(x,y)=x2+y2∇f(x,y)=(δxδf,δyδf)∇f(x,y)=(2x,2y)
②三元函数
f
(
x
,
y
,
z
)
=
x
2
+
y
2
+
z
3
∇
f
(
x
,
y
,
z
)
=
(
δ
f
δ
x
,
δ
f
δ
y
,
δ
f
δ
z
)
∇
f
(
x
,
y
,
z
)
=
(
2
x
,
2
y
,
3
z
)
f(x,y,z)=x^2+y^2+z^3\\ \nabla f(x,y,z)=(\cfrac{\delta f}{\delta x},\cfrac{\delta f}{\delta y},\cfrac{\delta f}{\delta z})\\ \nabla f(x,y,z)=(2x,2y,3z)
f(x,y,z)=x2+y2+z3∇f(x,y,z)=(δxδf,δyδf,δzδf)∇f(x,y,z)=(2x,2y,3z)
步骤:接着构造一个序列 x1,x2,x3…
并满足
f
(
x
2
)
>
f
(
x
1
)
f
(
x
3
)
>
f
(
x
2
)
⋯
f(x_2)>f(x_1)\\ f(x_3)>f(x_2)\\ \cdots
f(x2)>f(x1)f(x3)>f(x2)⋯
…
不断执行该过程即可收敛到局部极小点,如下图所示
梯度下降数学公式
x
t
+
1
=
x
t
−
α
∇
f
(
x
t
)
α
:
表
示
学
习
率
,
即
梯
度
下
降
的
步
长
∇
f
(
x
t
)
:
梯
度
下
降
的
方
向
x_{t+1}=x_t-\alpha \nabla f(x_t)\\ \alpha {:表示学习率,即梯度下降的步长}\\ \nabla f(x_t) {:梯度下降的方向}
xt+1=xt−α∇f(xt)α:表示学习率,即梯度下降的步长∇f(xt):梯度下降的方向
为什么要梯度要乘以一个负号。
梯度前加一个负号,意味着朝梯度相反的方向前进。梯度的方向实际是函数在此点上升最快的方向。因此需要朝着下降最快的方向走,也就是负的梯度的方向,所以此处需要加上负号。
具体函数实例:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
f=lambda x:(x-2)**2+5*x
x=np.linspace(-4,3,100)
y=f(x)
plt.plot(x,y)
#导数
d=lambda x:2*(x-2)+5
alpha=0.1
min_value=np.random.randint(-2,3,size=1)[0]
min_value_last=min_value-alpha
tol=0.001
while True:
if np.abs(min_value_last-min_value)<tol:
break
min_value_last=min_value
min_value=min_value-alpha*d(min_value)
print('min_value:',min_value)
得出最优解:min_value: -0.5036267774588439