1. 梯度下降算法概述
如果说在机器学习领域有哪个优化算法最广为认知,用途最广,非梯度下降算法莫属。在模型和决策都已经定义好了之后,我们要做的就是通过一个算法去最优化这个损失函数,也就是让损失函数最小化,其中最常用的一种方法就是梯度下降。
2. 生活实例
梯度下降算法最贴近生活的一个实例就是下山。假设我们在山上的某个位置,我们要如何走才能最快到达山底呢?答案很显然,沿着山腰最陡峭的方向向下走。具体方法步骤如下:
- 确定自己所在的地方
- 查看并找到四周最陡峭的方向
- 朝那个陡峭的方向下山一定距离(learning rate)
- 看是否到达山底,如果没有到达则回到1,否则到达5
- 到达山底,任务结束
3.梯度下降
梯度下降算法实际上和上面的爬山很类似了,我们可以把山体想象成一个三维空间平面,它就是我们要最优化的一个多元函数,我们的目的就是找到函数的最小值,即所谓的山底。上述的下山流程和梯度下降算法也是基本一致的,那个最陡峭的方向实际上就是函数的负梯度方向,因为梯度是函数变化最快的方向,沿着梯度向量的方向会使函数易于找到最大值,反之,沿负梯度方向也就能很快找到函数的最小值。
3.1 导数与偏导数
一般来说,导数是针对一元函数而言的,一元指的是函数只含有一个自变量,例如
f
(
x
)
=
x
2
f(x)=x^2
f(x)=x2,
f
(
x
)
=
l
n
x
f(x)=lnx
f(x)=lnx 等等函数。导数的几何意义是函数在该点的斜率,斜率越大,函数在该点的变化率越大,导函数则代表了函数沿x方向的变化率。
(
x
2
)
′
=
2
x
,
(
l
n
x
)
′
=
1
x
(x^2)'=2x,(lnx)'=\frac{1}{x}
(x2)′=2x,(lnx)′=x1
偏导数一般用于多元函数(自变量个数>=2),对某个自变量求偏导时,把其他自变量看作是常数,单独对这一个自变量求导。偏导数反映的是
函
数
沿
各
自
自
变
量
上
正
方
向
的
变
化
率
\color{red}{函数沿各自自变量上正方向的变化率}
函数沿各自自变量上正方向的变化率。设
f
(
x
,
y
)
=
x
2
y
3
f(x,y)=x^2y^3
f(x,y)=x2y3,那么它的对应偏导数为:
∂
f
(
x
,
y
)
∂
x
=
2
x
y
3
,
∂
f
(
x
,
y
)
∂
y
=
3
x
2
y
2
\frac{\partial f(x,y)}{\partial x}=2xy^3,\frac{\partial f(x,y)}{\partial y}=3x^2y^2
∂x∂f(x,y)=2xy3,∂y∂f(x,y)=3x2y2
3.2 方向导数和梯度
方向导数和梯度一般来说也都是针对多元函数而言的。
-
方向导数
方向导数一般会先选定一个方向 l ⃗ \vec{l} l,设 l ⃗ = { c o s α , c o s β } \vec{l}=\lbrace cos\alpha,cos\beta \rbrace l={cosα,cosβ}为平面的一个单位向量,设 z = f ( x , y ) z=f(x,y) z=f(x,y)在 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的某领域内有定义,若
lim t → 0 f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t ∃ \lim\limits_{t \rightarrow 0} \frac{f(x_0+tcos\alpha,y_0+tcos\beta)-f(x_0,y_0)}{t}\exists t→0limtf(x0+tcosα,y0+tcosβ)−f(x0,y0)∃
则该极限值就是 f ( x , y ) f(x,y) f(x,y)在 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)点沿 l ⃗ \vec{l} l方向的导数。
方向导数有三要素: 1. 函 数 。 2. 点 。 3. 方 向 。 \color{red}{1.函数。2.点。3.方向。} 1.函数。2.点。3.方向。
若 f ( x , y ) f(x,y) f(x,y) 可 微 \color{red}{可微} 可微, ∂ f ∂ l ⃗ = f x ′ ( x 0 , y 0 ) ⋅ c o s α + f y ′ ( x 0 , y 0 ) ⋅ c o s β \color{red}{\frac{\partial f}{\partial \vec{l}}=f_x'(x_0,y_0)\cdot cos\alpha+f_y'(x_0,y_0)\cdot cos\beta} ∂l∂f=fx′(x0,y0)⋅cosα+fy′(x0,y0)⋅cosβ
方向导数是偏导数的推广,偏导数是方向导数的特例。方向导数的几何意义表示 函 数 在 某 个 点 沿 某 条 直 线 方 向 的 变 化 率 \color{red}{函数在某个点沿某条直线方向的变化率} 函数在某个点沿某条直线方向的变化率。 -
梯度
在微积分中,对多元函数的自变量求偏导数,求得的偏导数以向量的形式表示就是梯度。
设二元函数 f ( x , y ) f(x,y) f(x,y)在平面区域D内具有一阶连续偏导数,对任意一点 P ( x , y ) P(x,y) P(x,y)都可以定义出一个向量 { ∂ f ∂ x , ∂ f ∂ y } \lbrace\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\rbrace {∂x∂f,∂y∂f} = f x ′ ( x 0 , y 0 ) ⋅ i ⃗ + f y ′ ( x 0 , y 0 ) ⋅ j ⃗ =f_x'(x_0,y_0)\cdot \vec{i}+f_y'(x_0,y_0)\cdot \vec{j} =fx′(x0,y0)⋅i+fy′(x0,y0)⋅j,该函数就称为 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 P ( x , y ) P(x,y) P(x,y)的梯度,记作 g r a d f ( x , y ) \color{red}{gradf(x,y)} gradf(x,y)或者 ∇ f ( x , y ) \color{red}{\nabla f(x,y)} ∇f(x,y),因此有:
∇ f ( x , y ) = g r a d f ( x , y ) = { ∂ f ∂ x , ∂ f ∂ y } = f x ′ ( x , y ) ⋅ i ⃗ + f y ′ ( x , y ) ⋅ j ⃗ \color{red}{\nabla f(x,y)=gradf(x,y)=\lbrace\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\rbrace=f_x'(x,y)\cdot \vec{i}+f_y'(x,y)\cdot \vec{j}} ∇f(x,y)=gradf(x,y)={∂x∂f,∂y∂f}=fx′(x,y)⋅i+fy′(x,y)⋅j
其中 ∇ \nabla ∇称为(二维的)向量微分算子或者Nabla算子,注意: 梯 度 g r a d f ( x , y ) 是 一 个 向 量 \color{red}{梯度gradf(x,y)是一个向量} 梯度gradf(x,y)是一个向量。 -
梯度和方向导数的关系推导
说了这么多,感觉还是很抽象,那么梯度和方向导数到底有什么关系呢?梯度有什么用呢?请看下面的推导:
∂ f ∂ l ⃗ = f x ′ ( x , y ) ⋅ c o s α + f y ′ ( x , y ) ⋅ c o s β = { f x ′ ( x , y ) , f y ′ ( x , y ) } ⋅ { c o s α , c o s β } = g r a d f ( x , y ) ⋅ l ⃗ = ∣ g r a d f ( x , y ) ∣ ⋅ ∣ l ⃗ ∣ ⋅ c o s θ = ∣ g r a d f ( x , y ) ∣ ⋅ c o s θ \frac{\partial f}{\partial \vec{l}}=f_x'(x,y)\cdot cos\alpha+f_y'(x,y)\cdot cos\beta=\lbrace f_x'(x,y),f_y'(x,y) \rbrace \cdot \lbrace cos\alpha,cos\beta \rbrace =gradf(x,y) \cdot \vec{l}=\mid gradf(x,y) \mid \cdot \mid \vec{l} \mid \cdot cos\theta=\mid gradf(x,y) \mid \cdot cos\theta ∂l∂f=fx′(x,y)⋅cosα+fy′(x,y)⋅cosβ={fx′(x,y),fy′(x,y)}⋅{cosα,cosβ}=gradf(x,y)⋅l=∣gradf(x,y)∣⋅∣l∣⋅cosθ=∣gradf(x,y)∣⋅cosθ
推导了半天,终于得到一个重要的关系( 方 向 导 数 和 梯 度 的 关 系 \color{red}{方向导数和梯度的关系} 方向导数和梯度的关系):
∂ f ∂ l ⃗ = ∣ g r a d f ( x , y ) ∣ ⋅ c o s θ \color{red}{\frac{\partial f}{\partial \vec{l}}=\mid gradf(x,y) \mid \cdot cos\theta} ∂l∂f=∣gradf(x,y)∣⋅cosθ
学过数学的我们都知道, θ = 0 \theta=0 θ=0,即 l ⃗ \vec{l} l和 g r a d f ( x , y ) gradf(x,y) gradf(x,y)方向一致时, z = f ( x , y ) z=f(x,y) z=f(x,y)沿 l ⃗ \vec{l} l方向的方向导数最大,最大值为梯度的模。
∂ f ∂ l ⃗ ∣ m a x = ∣ g r a d f ( x , y ) ∣ = ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 \color{red}{\frac{\partial f}{\partial \vec{l}} \mid _{max}=\mid gradf(x,y) \mid=\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2}} ∂l∂f∣max=∣gradf(x,y)∣=(∂x∂f)2+(∂y∂f)2
∂ f ∂ l ⃗ ∣ m i n = − ∣ g r a d f ( x , y ) ∣ = − ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 \color{red}{\frac{\partial f}{\partial \vec{l}} \mid _{min}=-\mid gradf(x,y) \mid=-\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2}} ∂l∂f∣min=−∣gradf(x,y)∣=−(∂x∂f)2+(∂y∂f)2
因此我们得到了:梯度方向上的方向导数为方向导数的最大值, f ( x , y ) f(x,y) f(x,y)增长最快,负梯度方向上的方向导数为方向导数的最小值, f ( x , y ) f(x,y) f(x,y)减小最快。
3.3 梯度下降算法
有了3.1和3.2的数学知识了,我们就可以学习梯度下降算法了!
学过统计学习方法的我们都知道,
方
法
=
模
型
+
决
策
+
算
法
\color{red}{方法=模型+决策+算法}
方法=模型+决策+算法,在模型和决策都已经确定的情况下,我们就剩下利用算法去最优化损失函数了,而梯度下降算法是一种最为常用的优化极小值算法。
- 梯度下降算法步骤
由于负梯度方向是函数下降最快的方向,于是我们利用梯度下降不断迭代计算模型的参数就可以使函数极小化,选取一个迭代步长(学习率),不断进项迭代,直至收敛即可。
假设需要求 f ( x ) = f ( x 1 , x 2 , ⋯ , x n ) f(x)=f(x_1,x_2,\cdots,x_n) f(x)=f(x1,x2,⋯,xn)的最小值,步骤为:
- 选取一个初始值 x ( 0 ) = [ x 1 ( 0 ) , ⋯ , x n ( 0 ) ] x^{(0)}=[x_1^{(0)},\cdots,x_n^{(0)}] x(0)=[x1(0),⋯,xn(0)],和一个初始值 η > 0 \eta>0 η>0(学习率)
- 迭代更新模型的每一个参数: x 1 ( i + 1 ) = x 1 ( 1 ) − η ⋅ ∂ f ( x ( i ) ) ∂ x 1 x_1^{(i+1)}=x_1^{(1)}-\eta \cdot \frac{\partial f(x^{(i)})}{\partial x_1} x1(i+1)=x1(1)−η⋅∂x1∂f(x(i))
⋯ \cdots ⋯
x n ( i + 1 ) = x n ( 1 ) − η ⋅ ∂ f ( x ( i ) ) ∂ x n x_n^{(i+1)}=x_n^{(1)}-\eta \cdot \frac{\partial f(x^{(i)})}{\partial x_n} xn(i+1)=xn(1)−η⋅∂xn∂f(x(i))- 其中 x ( i ) = [ x 1 ( i ) , ⋯ , x n ( i ) ] x^{(i)}=[x_1^{(i)},\cdots,x_n^{(i)}] x(i)=[x1(i),⋯,xn(i)],一旦达到收敛条件,就停止迭代
梯度下降算法中的学习率
η
\eta
η的选取也很重要,它是每次梯度下降的一个步长,这个步长不能设置太小,更不能设置过大。设置太小可能会迭代速度过慢,到达不了最低点,设置太大容易迭代距离过大,错过了最低点。下图是不同的学习率随着迭代次数的不断增加的造成的损失值的图像
- 梯度下降实例
设函数 f ( x ) = x 1 2 + 25 x 2 2 f(x)=x_1^2+25x_2^2 f(x)=x12+25x22,下面来看看如何利用梯度下降算法去优化函数。
1.首先设定初始值, x 0 = [ 0.5 0.5 ] x_0=\left[\begin{matrix}0.5\\0.5\end{matrix}\right] x0=[0.50.5],学习率 η = 0.01 \eta=0.01 η=0.01
2.求梯度, ∇ f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ] = [ 2 x 1 50 x 2 ] \nabla f(x)=\left[\begin{matrix}\frac{\partial f(x)}{\partial x_1}\\\frac{\partial f(x)}{\partial x_2}\end{matrix}\right]=\left[\begin{matrix}2x_1\\50x_2\end{matrix}\right] ∇f(x)=[∂x1∂f(x)∂x2∂f(x)]=[2x150x2]
3.求迭代初值时的梯度, g 0 = ∇ f ( x ) ∣ x = x 0 = [ 1 25 ] g_0=\nabla f(x)\mid _{x=x_0}=\left[\begin{matrix}1\\25\end{matrix}\right] g0=∇f(x)∣x=x0=[125]
4.梯度下降第一次迭代, x 1 = x 0 − η ⋅ g 0 = [ 0.5 0.5 ] − 0.01 ⋅ [ 1 25 ] = [ 0.49 0.25 ] x_1=x_0-\eta \cdot g_0=\left[\begin{matrix}0.5\\0.5\end{matrix}\right]-0.01\cdot\left[\begin{matrix}1\\25\end{matrix}\right]=\left[\begin{matrix}0.49\\0.25\end{matrix}\right] x1=x0−η⋅g0=[0.50.5]−0.01⋅[125]=[0.490.25]
5.继续计算梯度值, g 1 = ∇ f ( x ) ∣ x = x 1 = [ 0.98 12.5 ] g_1=\nabla f(x)\mid _{x=x_1}=\left[\begin{matrix}0.98\\12.5\end{matrix}\right] g1=∇f(x)∣x=x1=[0.9812.5]
6.第二次迭代为: x 2 = x 1 − η ⋅ g 1 = [ 0.49 0.25 ] − 0.01 ⋅ [ 0.98 12.5 ] = [ 0.4802 0.125 ] x_2=x_1-\eta \cdot g_1=\left[\begin{matrix}0.49\\0.25\end{matrix}\right]-0.01\cdot\left[\begin{matrix}0.98\\12.5\end{matrix}\right]=\left[\begin{matrix}0.4802\\0.125\end{matrix}\right] x2=x1−η⋅g1=[0.490.25]−0.01⋅[0.9812.5]=[0.48020.125]
7.剩下的就是慢慢迭代了,大家懂了如何计算就行了,不再继续演示了!
4. 梯度下降算法分类
- 批量梯度下降(Batch Gradient Descent,BGD):在更新参数时都使用所有的样本来进行更新。
优点:全局最优解,能保证每一次更新权值,都能降低损失函数;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。
- 随机梯度下降(Stochastic Gradient Descent,SGD):在更新参数时都使用一个样本来进行更新。每一次跟新参数都用一个样本,更新很多次。如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将参数迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次,这种方式计算复杂度太高。(上述演示的就是随机梯度下降)
优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。从迭代的次数上来看,随机梯度下降法迭代的次数较多,在解空间的搜索过程看起来很盲目。噪音很多,使得它并不是每次迭代都向着整体最优化方向。
- 小批量梯度下降法(Mini-batch Gradient Descen):在更新每一参数时都使用一部分样本来进行更新。为了克服上面两种方法的缺点,又同时兼顾两种方法的优点。
三种方法使用的情况:如果样本量比较小,采用批量梯度下降算法。如果样本太大,或者在线算法,使用随机梯度下降算法。在实际的一般情况下,采用小批量梯度下降算法。
谢谢你的观看!