梯度概念是建立在偏导数与方向导数概念基础上的。
偏导数
所谓偏导数,简单来说是对于一个多元函数,选定一个自变量并让其他自变量保持不变,只考察因变量与选定自变量的变化关系。数学上说,是指对于多元函数
y
=
f
(
x
1
,
x
2
,
…
x
n
)
y=f\left(x_{1}, x_{2}, \ldots x_{n}\right)
y=f(x1,x2,…xn),假设其偏导数都存在,则该函数共有
n
n
n个偏导数,可以表示为:
f
x
1
=
∂
y
∂
x
1
,
f
x
2
=
∂
y
∂
x
2
…
f
x
n
=
∂
y
∂
x
n
f_{x_{1}}=\frac{\partial y}{\partial x_{1}}, f_{x_{2}}=\frac{\partial y}{\partial x_{2}} \ldots f_{x_{n}}=\frac{\partial y}{\partial x_{n}}
fx1=∂x1∂y,fx2=∂x2∂y…fxn=∂xn∂y
偏导数只能表示多元函数沿某个坐标轴方向的导数,如对于二元函数 z = x 2 + y 2 z =x^2+y^2 z=x2+y2, ∂ z ∂ x = 2 x \frac{\partial z}{\partial x}=2x ∂x∂z=2x表示函数沿 X X X轴方向的导数; ∂ z ∂ y = 2 y \frac{\partial z}{\partial y}=2y ∂y∂z=2y表示函数沿 Y Y Y轴方向的导数;
方向导数
除了沿坐标轴方向上的导数,多元函数在非坐标轴方向上也可以求导数,这种导数称为方向导数。很容易发现,多元函数在特定点的方向导数有无穷多个,表示函数值在各个方向上的增长速度。一个很自然的问题是:在这些方向导数中,是否存在一个最大的方向导数,如果有,其值是否唯一?为了回答这个问题,便需要引入梯度的概念。
梯度(gradient)
一般来说,梯度可以定义为一个函数的全部偏导数构成的向量(这一点与偏导数与方向导数不同,两者都为标量)。一般将函数
f
f
f的梯度记为
∇
f
\nabla f
∇f,即:
事实上,梯度向量的方向即为函数值增长最快的方向,为什么会如此,可以从几个角度去理解。
在下图中,我们可以看到,为了找到方向导数中的最大值,我们可以将其投影到
x
y
xy
xy平面来理解,这种投影方式对应的便是等高线图。
如对于一个二元函数
z
=
f
(
x
,
y
)
z = f (x,y )
z=f(x,y) ,我们可以画出它的等高线图如下:
该函数的等高线图为圆心在原点的一系列圆,等高线的值由里向外逐渐增加。
点
B
(
x
,
y
)
B (x,y)
B(x,y) 为点
(
x
,
y
,
z
)
( x , y , z )
(x,y,z)在
x
y
xy
xy 平面上的投影,可以看到向量
A
B
→
\overrightarrow{A B}
AB即为函数在点
(
x
,
y
,
z
)
( x , y , z )
(x,y,z)处的梯度向量(梯度向量是一个函数的全部偏导数构成的向量,梯度向量为
u
=
(
f
x
,
f
y
)
u = \left(f_{x}, f_{y}\right)
u=(fx,fy))
根据方向导数的定义,方向导数
D
u
f
=
f
x
cos
θ
+
f
y
sin
θ
D_{u}f=f_{x} \cos \theta+f_{y} \sin \theta
Duf=fxcosθ+fysinθ,其中
θ
\theta
θ为此向量与
X
X
X正方向的夹角。
由于梯度向量为
u
=
(
f
x
,
f
y
)
u = \left(f_{x}, f_{y}\right)
u=(fx,fy),单位向量
w
=
(
cos
θ
,
sin
θ
)
w=(\cos \theta, \sin \theta)
w=(cosθ,sinθ),则方向导数的大小可以表述为梯度向量与此单位向量的数量积,即:
D
u
f
=
f
x
cos
θ
+
f
y
sin
θ
=
u
⃗
⋅
w
⃗
=
∣
u
∣
⋅
∣
w
∣
⋅
cos
α
=
∣
u
∣
⋅
cos
α
D_{u} f=f_{x} \cos \theta+f_{y} \sin \theta=\vec{u} \cdot \vec{w}=|u| \cdot|w| \cdot \cos \alpha=|u| \cdot \cos \alpha
Duf=fxcosθ+fysinθ=u⋅w=∣u∣⋅∣w∣⋅cosα=∣u∣⋅cosα
其中
α
\alpha
α为梯度向量与单位向量之间的夹角,即
∠
B
A
D
\angle B A D
∠BAD。可以看出,方向导数的大小可以看作梯度向量在指示方向导数方向的单位向量上的投影,即线段
A
E
AE
AE的长度。显而易见,线段
A
E
AE
AE的长度小于线段
A
B
AB
AB的长度,也即梯度向量的模总是大于等于方向导数向量的模。这就解释了为什么沿着梯度向量方向是函数值增长最快的方向,而它正是函数所有偏导数构成的向量。
在上图中也可以看出,梯度向量垂直于等高线,这为我们提供了另一个观察梯度向量的角度。如对于函数
f
(
x
,
y
)
=
x
y
f(x,y)=xy
f(x,y)=xy,其等高线图与梯度向量如下(蓝色的线为等高线,紫色的小箭头为梯度向量的方向):
我们可以两个角度考虑:第一,在特定函数点,固定每次移动的步长,向那个方向移动函数值增长最快?第二,固定需要增加的函数值,向哪个方向需要移动的步长最短?
注:上图中大圆是小圆所在区域的放大显示,是为了方便说明
左图:在所有方向给定相同大小的步长,哪个方向函数
f
f
f增加最多?
右图:所有让
f
f
f增加相同值的步长,哪一个最短?
在上面的左图中,固定移动的步长,我们可以看到垂直于等高线图的方向即为函数值增长最快的方向,也就是梯度向量指示的方向。在右图中,假设函数值有一个固定的微小的增长(2到2.1),则明显梯度向量指示的方向所需要的步长最短,而这个向量也是垂直于等高线的。
- 梯度下降或上升法正是基于梯度指示函数值增长最快的方向而产生的,利用这个方法,我们可以使用迭代的方法计算函数的最大或最小值,从而解决机器学习中遇到的最优化问题。
梯度下降法
既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。
如何沿着负梯度方向减小函数值呢?既然梯度是偏导数的集合,如下:
gradf
(
x
0
,
x
1
,
…
,
x
n
)
=
(
∂
f
∂
x
0
,
…
,
∂
f
∂
x
j
,
…
,
∂
f
∂
x
n
)
\operatorname{gradf}\left(x_{0}, x_{1}, \ldots, x_{n}\right)=\left(\frac{\partial f}{\partial x_{0}}, \ldots, \frac{\partial f}{\partial x_{j}}, \ldots, \frac{\partial f}{\partial x_{n}}\right)
gradf(x0,x1,…,xn)=(∂x0∂f,…,∂xj∂f,…,∂xn∂f)
同时梯度和偏导数都是向量,那么参考向量运算法则,我们在每个变量轴上减小对应变量值即可,梯度下降法可以描述如下:
注: := 表示赋值(assignment),也就是对
x
0
x_0
x0,
x
1
x_1
x1,…,
x
n
x_n
xn更新
以上就是梯度下降法的由来,大部分的机器学习任务,都可以利用Gradient Descent来进行优化