1.导数
一元函数的情况下,导数就是函数的变化率:

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.偏导数
∂xj∂f(x0,x1,…,xn)=Δx→0limΔxΔy=Δx→0limΔxf(x0,…,xj+Δx,…,xn)−f(x0,…,xj,…,xn)
区别:
导数与偏导数本质是一致 的,都是当自变量的变化量趋于0时,函数值的变化量与自变量变化量比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。
导数,指的是一元函数中,函数y=f(x)在某一点处沿x轴正方向的变化率;
偏导数,指的是多元函数中,函数y=f(x0,x1,…,xn)在某一点处沿某一坐标轴(x0,x1,…,xn)正方向的变化率。
3. 方向导数
∂l∂f(x0,x1,…,xn)=limρ→0ΔxΔy
=ρ→0limρf(x0+Δx0,…,xj+Δxj,…,xn+Δxn)−f(x0,…,xj,…,xn)
ρ=(Δx0)2+⋯+(Δxj)2+⋯+(Δxn)2
在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值。
通俗的解释是:
我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率,说白了偏导数其实是方向导数的一种特殊情况。
4. 梯度
gradf(x0,x1,…,xn)=(∂x0∂f,…,∂xj∂f,…,∂xn∂f)
突然看到公式是很懵逼的,大家看到,下图中的这个点有很多的方向,并且,每个方向都是有方向导数的:

梯度:是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数( 函数沿梯度方向有最大的变化率 )。
Q:为什么所有方向导数中会存在并且只存在一个最大值?而不是有多个最大值、或者说没有最大值?
答:梯度的数学定义 :设函数f(x,y)在平面区域D内具有一阶连续偏导数,则对每一点P(x0,y0)∈D都可以定义出一个向量fx(x0,y0)i+fy(x0,y0)j称为f(x,y)在P点处的梯度,记做∇f(x0,y0)
具有一阶连续偏导数,意味着可微。可微意味着函数 f(x,y)在各个方向的切线都在同一个平面上,也就是切平面:

5.梯度下降算法
既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。
如何沿着负梯度方向减小函数值呢?既然梯度是偏导数的集合,如下:
gradf(x0,x1,…,xn)=(∂x0∂f,…,∂xj∂f,…,∂xn∂f)
同时梯度和偏导数都是向量,那么参考向量运算法则,我们在每个变量轴上减小对应变量值即可,梯度下降法可以描述如下:
Repeat{
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)