概述
梯度下降(Gradient Descent)法是一种最优化算法,用于求解函数的最小值,常用在机器学习中。
数学基础
导数
对于单变量函数 f(x),导数(Derivative,也称为微商)是指函数在某一点切线的斜率,表示函数在该点的变化率。以下图为例,函数在 x = x0 处的导数为(如果 ∆x→0 存在,此条件以下不再赘述):
切线(Tangent Line)指的是一条刚好触碰到曲线上某一点的直线,切线的方向与该点的方向相同。
偏导数
对于多变量函数,情况则复杂地多。如果只考虑一个变量的变化,而其他变量固定不变,就得出多变量函数的偏导数(Partial Derivative),N 个变量的函数就有 N 个偏导数。例如,二元函数 f(x,y) 在 x = x0 处对 x 的偏导数为:
上图中,L1 为变量 x 不变时,函数对变量 y 的导数,即沿 Y 轴方向的变化;L2 为变量 y 不变时,函数对变量 x 的导数,即沿 X 轴方向的变化。
方向导数
导数与偏导数考虑的是函数沿坐标轴方向的变化,如果考虑函数沿任意方向的变化,就是方向导数(Directional Derivative)。
以二元函数 z = f(x,y) 为例,函数曲面上任意一点 (x0,y0,z0) 在 XY 平面的投影点为 (x0,y0),以该点为圆心画一个单位圆,圆上任意一点与点 (x0,y0) 构成的单位向量 u 就可以表示方向。特别地,当方向与坐标轴正方向一致时,方向导数即为偏导数。
梯度
函数值上升最快的方向,也就是方向导数取得最大值的方向,就是梯度(Gradient)的方向。反之,沿着与梯度相反的方向,函数值下降最快。
任意方向的方向导数是偏导数的线性组合。经证明,多元函数 f(x1,x2,...,xn) 的梯度(记作 ∇f)为
链式法则
链式法则(Chain Rule)是复合函数的求导法则:复合函数的导数可以用构成复合函数的各个函数的导数乘积表示。其数学表示为:对于复合函数 f∘g,其导数为
例如,函数 s(x,y) = (2x+y)(y-3) 是函数 f(x,y) = 2x+y 以及 g(y) = y-3 的复合函数,则 s(x,y) 分别对 x 和 y 求偏导(数)如下:
梯度下降法
基本形式
举一个实际生活中的例子:假设我们在一座山上,希望以最快的速度下山。当然,肯定存在着某条最佳路线,但通常找到这条路线的代价很大,更常见的做法是走一步看一步。也就是说,每走到一个位置,计算从该位置下山最快的方向(即梯度),沿着该方向走到下一位置;重复这个过程直到下山。
梯度下降(Gradient Descent)法就是沿着梯度下降的方向求极小值;反之,沿着梯度上升的方向求最大值就是梯度上升(Gradient Ascent)法。
给定函数 J(θ),梯度下降法的基本形式为:
其中,∇J 为函数在 θ 位置的梯度,η 为学习率(Learning Rate)。由于梯度实际上是函数值上升最快的方向,因此 η∇J 前是减号,表示与梯度相反的方向。
学习率是指进行每一步梯度下降时向目标方向移动的长度,在下山的例子中,学习率可以理解为每次移动的步长。
单变量函数示例
以函数 J(θ) = θ2+10 为例,其导数为
假设起始位置为 θ0 = 1,学习率 η = 0.2,根据上述梯度下降公式,接下来的移动轨迹为:
- θ1 = 1 - 2*1*0.2 = 0.6
- θ2 = 0.36
- θ3 = 0.216
- θ4 = 0.1296
- ...
- θ18 = 0.00010156
- ...
随着步数增多,无限逼近使函数到达最小值的 θ = 0。
多变量函数示例
以函数 J(Θ) = θ12+θ22 为例,其梯度为
假设起始位置为 Θ0 = (-1,-2),学习率 η = 0.1,根据上述梯度下降公式,接下来的移动轨迹为:
- Θ1 = ((-1) - 2*(-1)*0.1,(-2) - 2*(-2)*0.1) = (-0.8,-1.6)
- Θ2 = (-0.64,-1.28)
- Θ3 = (-0.512,-1.024)
- Θ4 = (-0.4096,-0.8192)
- ...
- Θ20 = (-0.011529215,-0.02305843)
- ...
随着步数增多,无限逼近使函数到达最小值的 Θ = (0,0)。
机器学习中的梯度下降法
在神经网络模型的学习与训练中,常用一个损失函数 J(Θ) 来衡量模型输出结果与期望结果的误差,梯度下降法则用来最小化这个损失函数,即朝着梯度 ∇J(Θ) 的反方向反复更新模型参数直至收敛,从而达到优化模型的目的。为了权衡计算时间与准确度,实际应用中梯度下降法有一些变形形式,一般有以下几种:
1. 批量梯度下降法(Batch Gradient Descent, BGD)
2. 随机梯度下降法(Stochastic Gradient Descent, SGD)
3. 小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)
示例描述
假设我们用 m 个样本训练一个神经网络模型,样本一般指一个输入值和一个期望的输出值,x(i) 与 y(i)(i=1,2,...,m)分别为第 i 个输入值和期望的输出值。模型的假设函数(Hypothesis)hΘ 如下,其中 x(i) 的下标表示 x(i) 的各个分量:
假设函数是机器学习中描述从输入到输出的映射关系的目标函数。本例中,函数参数 θj(j=0,1,...,n)的改变会导致模型输出值的变化,模型训练的目标就是找到最优的 θj,使得模型输出值尽可能接近期望值。训练开始时,随机初始化 θj。
使用均方误差(Mean Square Error, MSE)作为损失函数(Loss/Cost Function)J(Θ),用于表示各期望值与模型输出值的误差的平均值:
标准的均方误差分母应该是 1/m,机器学习中使用 1/2m 是为了在损失函数求偏导时与平方抵消,消除常数系数以便于后续计算,这样做不会影响计算结果。
批量梯度下降法
批量梯度下降法(BGD)是梯度下降法最原始的形式。
对 θj 求偏导:
更新 θj 的值:
其中 η 为学习率。公式中的求和符号意味着每次迭代更新参数时,全部 m 个样本都参与计算。很显然,当样本数 m 很大时,训练过程会很慢。
随机梯度下降法
随机梯度下降法(SGD)和批量梯度下降法原理类似,区别在于每次迭代时只随机选取一个样本来加快训练速度。
随机选取一个样本计算误差:
对 θj 求偏导:
更新 θj 的值:
SGD 只用一个样本进行梯度计算,省略了求和以及求平均的过程,降低了计算复杂度,因此提升了计算速度,但准确度会有所下降。
小批量梯度下降法
以上两种方法是两个极端,要么考虑全部样本,要么只考虑一个样本,小批量梯度下降法(MBGD)则是一个折衷方法,它随机选择 1 < x < m 个样本进行梯度计算。