1.导数
一元函数的情况下,导数就是函数的变化率:
f
′
(
x
0
)
=
lim
Δ
x
→
0
Δ
y
Δ
x
=
lim
Δ
x
→
0
f
(
x
0
+
Δ
x
)
−
f
(
x
0
)
Δ
x
f^{\prime}\left(x_{0}\right)=\lim _{\Delta x \rightarrow 0} \frac{\Delta y}{\Delta x}=\lim _{\Delta x \rightarrow 0} \frac{f\left(x_{0}+\Delta x\right)-f\left(x_{0}\right)}{\Delta x}
f′(x0)=limΔx→0ΔxΔy=limΔx→0Δxf(x0+Δx)−f(x0)
是函数f(x)在x轴上某一点处沿着x轴正方向的变化率/变化趋势。直观地看,也就是在x轴上某一点处,如果f’(x)>0,说明f(x)的函数值在x点沿x轴正方向是趋于增加的;如果f’(x)<0,说明f(x)的函数值在x点沿x轴正方向是趋于减少的。
2.偏导数
∂ ∂ x j f ( x 0 , x 1 , … , x n ) = lim Δ x → 0 Δ y Δ x = lim Δ x → 0 f ( x 0 , … , x j + Δ x , … , x n ) − f ( x 0 , … , x j , … , x n ) Δ x \frac{\partial}{\partial x_{j}} f\left(x_{0}, x_{1}, \ldots, x_{n}\right)=\lim _{\Delta x \rightarrow 0} \frac{\Delta y}{\Delta x}\\=\lim _{\Delta x \rightarrow 0} \frac{f\left(x_{0}, \ldots, x_{j}+\Delta x, \ldots, x_{n}\right)-f\left(x_{0}, \ldots, x_{j}, \ldots, x_{n}\right)}{\Delta x} ∂xj∂f(x0,x1,…,xn)=Δx→0limΔxΔy=Δx→0limΔxf(x0,…,xj+Δx,…,xn)−f(x0,…,xj,…,xn)
区别:
导数与偏导数本质是一致 的,都是当自变量的变化量趋于0时,函数值的变化量与自变量变化量比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。
导数,指的是一元函数中,函数
y
=
f
(
x
)
y=f\left(x\right)
y=f(x)在某一点处沿x轴正方向的变化率;
偏导数,指的是多元函数中,函数
y
=
f
(
x
0
,
x
1
,
…
,
x
n
)
y=f\left(x_{0}, x_{1}, \ldots, x_{n}\right)
y=f(x0,x1,…,xn)在某一点处沿某一坐标轴
(
x
0
,
x
1
,
…
,
x
n
)
\left(x_{0}, x_{1}, \ldots, x_{n}\right)
(x0,x1,…,xn)正方向的变化率。
3. 方向导数
∂
∂
l
f
(
x
0
,
x
1
,
…
,
x
n
)
=
lim
ρ
→
0
Δ
y
Δ
x
\frac{\partial}{\partial l} f\left(x_{0}, x_{1}, \ldots, x_{n}\right)=\lim _{\rho \rightarrow 0} \frac{\Delta y}{\Delta x}
∂l∂f(x0,x1,…,xn)=limρ→0ΔxΔy
=
lim
ρ
→
0
f
(
x
0
+
Δ
x
0
,
…
,
x
j
+
Δ
x
j
,
…
,
x
n
+
Δ
x
n
)
−
f
(
x
0
,
…
,
x
j
,
…
,
x
n
)
ρ
=\lim _{\rho \rightarrow 0} \frac{f\left(x_{0}+\Delta x_{0}, \ldots, x_{j}+\Delta x_{j}, \ldots, x_{n}+\Delta x_{n}\right)-f\left(x_{0}, \ldots, x_{j}, \ldots, x_{n}\right)}{\rho}
=ρ→0limρf(x0+Δx0,…,xj+Δxj,…,xn+Δxn)−f(x0,…,xj,…,xn)
ρ = ( Δ x 0 ) 2 + ⋯ + ( Δ x j ) 2 + ⋯ + ( Δ x n ) 2 \begin{aligned} \rho &=\sqrt{\left(\Delta x_{0}\right)^{2}+\cdots+\left(\Delta x_{j}\right)^{2}+\cdots+\left(\Delta x_{n}\right)^{2}} \end{aligned} ρ=(Δx0)2+⋯+(Δxj)2+⋯+(Δxn)2
在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值。
通俗的解释是:
我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率,说白了偏导数其实是方向导数的一种特殊情况。
4. 梯度
grad
f
(
x
0
,
x
1
,
…
,
x
n
)
=
(
∂
f
∂
x
0
,
…
,
∂
f
∂
x
j
,
…
,
∂
f
∂
x
n
)
\operatorname{grad} f\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)
突然看到公式是很懵逼的,大家看到,下图中的这个点有很多的方向,并且,每个方向都是有方向导数的:
梯度:是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数( 函数沿梯度方向有最大的变化率 )。
Q:为什么所有方向导数中会存在并且只存在一个最大值?而不是有多个最大值、或者说没有最大值?
答:梯度的数学定义 :设函数
f
(
x
,
y
)
f(x, y)
f(x,y)在平面区域
D
D
D内具有一阶连续偏导数,则对每一点
P
(
x
0
,
y
0
)
∈
D
P\left(x_{0}, y_{0}\right) \in D
P(x0,y0)∈D都可以定义出一个向量
f
x
(
x
0
,
y
0
)
i
+
f
y
(
x
0
,
y
0
)
j
\boldsymbol{f}_{x}\left(\boldsymbol{x}_{0}, y_{0}\right) i+f_{y}\left(x_{0}, y_{0}\right) j
fx(x0,y0)i+fy(x0,y0)j称为
f
(
x
,
y
)
f(x, y)
f(x,y)在
P
P
P点处的梯度,记做
∇
f
(
x
0
,
y
0
)
\nabla f\left(x_{0}, y_{0}\right)
∇f(x0,y0)
具有一阶连续偏导数,意味着可微。可微意味着函数
f
(
x
,
y
)
f(x,y)
f(x,y)在各个方向的切线都在同一个平面上,也就是切平面:
所有的切线都在一个平面上,就好像光滑的笔直玻璃上,某一点一定有且只有一个(梯度为0的情况除外,可以自己想想为什么?)最陡峭的地方(因为方向导数是切线的斜率,方向导数最大也就意味着最陡峭)。
这就解决了我对于“为什么所有方向导数中会存在并且只存在一个最大值”的疑问。
5.梯度下降算法
既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。
如何沿着负梯度方向减小函数值呢?既然梯度是偏导数的集合,如下:
grad
f
(
x
0
,
x
1
,
…
,
x
n
)
=
(
∂
f
∂
x
0
,
…
,
∂
f
∂
x
j
,
…
,
∂
f
∂
x
n
)
\operatorname{grad} f\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)
同时梯度和偏导数都是向量,那么参考向量运算法则,我们在每个变量轴上减小对应变量值即可,梯度下降法可以描述如下:
R
e
p
e
a
t
{
\ Repeat \{
Repeat{
x
0
:
=
x
0
−
α
∂
f
∂
x
0
…
…
…
x
j
:
=
x
j
−
α
∂
f
∂
x
j
…
…
…
x
n
:
=
x
n
−
α
∂
f
∂
x
n
\begin{array}{l}{x_{0} :=x_{0}-\alpha \frac{\partial f}{\partial x_{0}}} \\ {\ldots \ldots \ldots} \\ {x_{j} :=x_{j}-\alpha \frac{\partial f}{\partial x_{j}}} \\ {\ldots \ldots \ldots} \\ {x_{n} :=x_{n}-\alpha \frac{\partial f}{\partial x_{n}}}\end{array}
x0:=x0−α∂x0∂f………xj:=xj−α∂xj∂f………xn:=xn−α∂xn∂f
}
\}
}
5.1 梯度下降算法的分类
现在有很多类型的梯度下降算法,现在主要有两种分类方式:
On the basis of data ingestion
- Full Batch Gradient Descent Algorithm
- Stochastic Gradient Descent Algorithm
On the basis of differentiation techniques
- First order Differentiation
- Second order Differentiation
5.2 梯度下降算法所面对挑战
5.2.1 数据
- 如果数据的排列方式使其产生非凸优化问题,使用梯度下降会变得非常困难。因为梯度下降仅适用于具有明确定义的凸优化问题。
- 即使面对的是凸优化的问题,也可能存在很多最小点,最低点称为全局最小值,其余点称为局部最小值,我们的目标是在避开局部最小值的同时达到全局最小值。
- 鞍点(Saddle point)问题。鞍点是数据中的一个点,虽然梯度为0,但是并不是最佳点,我们没有特定的方法去避免这个问题,所以这个问题现在还是一个热门的讨论话题。
5.2.2 梯度
如果没有合适地进行梯度下降,可能会导致诸如梯度消失(vanishing gradient)、梯度爆炸( exploding gradient )等问题,当梯度太小或者太大时,会出现这些问题,并且因为这些问题的发生,算法不会收敛。
5.2.3 实现
- 一些神经网络从业者不太关注实现,但是通过网络查看资源利用率非常重要。比如:我们在实现梯度下降算法的时候,主义需要多少资源是很重要的,如果内存对于你的程序来说太小了,那么这个网络将会失败。
- 跟踪浮点因素、硬件/软件先决条件等也很重要。
未完待续…
参考:
1. 马同学高等数学:什么是全导数、偏导数、方向导数?
2. Introduction to Gradient Descent Algorithm (along with variants) in Machine Learning
3. 3Blue1Brown: 深度学习之梯度下降法 Part 2 ver 0.9 beta
4. ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)