对于输入xxx,通过某个网络后给出预测的结果yyy,但是其正确结果为y^\hat yy^,预测结果和真实结果之间的差距我们称之为损失 LLL

这里要注意,衡量二者之间的差距的方法有很多,如曼哈顿距离(L1L_1L1范数)、欧氏距离(L2L_2L2范数)等,为考虑一般性,我们设为function CCC,它可以是任意衡量二者之间的差距的函数

显然这个误差值是与网络的参数有关的,因为网络参数决定了网络输出值,即L(θ)=C(y,y^)L(\theta)=C(y,\hat y)L(θ)=C(y,y^),那么此时我们就需要调整网络的参数,我们训练网络的核心思想就是 使网络输出的结果 yyy 能够尽可能接近真实值 y^\hat yy^,即我们的优化目标是:

arg minθ L(θ)\mathop{\mathrm{arg~min}}\limits_{\theta}~{L(\theta)}θarg min L(θ)

简单的说,我们想求能使函数L(θ)L(\theta)L(θ)函数值最小的θ\thetaθ值:

  • 如果它是个一元函数,例如 L(θ)=θ2L(\theta)=\theta^2L(θ)=θ2(这个其实就相当于y(x)=x2y(x)=x^2y(x)=x2,换换表示而已),对于一元函数求最值,一般方法就是对自变量求导使其导函数为0,求出驻点和极值点,对比极值的大小得到最小值
  • 如果它是个多元函数,此时θ\thetaθ就是个向量,例如 L(θ)=θ12+θ22L(\theta)=\theta_1^2+\theta_2^2L(θ)=θ12+θ22(同理,相当于z(x,y)=x2+y2z(x,y)=x^2+y^2z(x,y)=x2+y2),对于多元函数求最值,一般方法就是对多个自变量分别求偏导使其偏导函数为0,求出驻点和极值点,对比极值的大小得到最小值

驻点的定义:使一阶导数等于0的点,这里的导数也就是“导函数”

上面的两种方法都提到了一样东西:导数和梯度,我们需要深入理解一下这到底是个什么东西

首先来看导数,给定函数 f(x)f(x)f(x) 在特定点 x0x_0x0 处的导数定义为 f′(x0)=lim⁡Δx→0f(x0+Δx)−f(x0)Δxf'(x_0)=\lim_{\Delta x\to0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}f(x0)=limΔx0Δxf(x0+Δx)f(x0),表示在该点处的瞬间变化率(也叫瞬间斜率),如果这个值越大,就表明其上升趋势越强劲。当这个值为0时,就达到了这个函数的“强弩之末”,即达到了极值点。

注意导数值反映的是函数的 上升 趋势,那么它所指的方向也就是 能使函数值增长的自变量的变化方向

举一个非常简单的例子:y=x2y=x^2y=x2,是个一元函数,那么xxx变化的方向就是一维的,要么正要么负

在这里插入图片描述

其导函数y′=2xy'=2xy=2x,在x0=1x_0=1x0=1时其导函数值为222,那么其导数方向就是222所指的方向(即xxx轴正半轴),xxx沿着这个方向走的时候函数值是增长的;同理,在x0=−1x_0=-1x0=1时其导函数值为−2-22,那么其导数方向就是−2-22所指的方向(即xxx轴负半轴),xxx沿着这个方向走的时候函数值是增长的。

在这里插入图片描述

当自变量不只有一个时(即多元函数),就引入了梯度这个概念:给定多元函数 f(x1,x2,⋯ ,xn)f(x_1,x_2,\cdots,x_n)f(x1,x2,,xn),在特定点 (x1(0),x2(0),⋯ ,xn(0))(x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)})(x1(0),x2(0),,xn(0)) 处的梯度值为:

∣∣∇f∣∣=(∂f∂x1(x1(0)))2+(∂f∂x2(x2(0)))2+⋯+(∂f∂xn(xn(0)))2||\nabla f||=\sqrt{\bigl(\frac{\partial f}{\partial x_1}(x_1^{(0)})\bigr)^2+\bigl(\frac{\partial f}{\partial x_2}(x_2^{(0)})\bigr)^2+\cdots+\bigl(\frac{\partial f}{\partial x_n}(x_n^{(0)})\bigr)^2}∣∣∇f∣∣=(x1f(x1(0)))2+(x2f(x2(0)))2++(xnf(xn(0)))2

和导数一样,反映了在该点处的瞬间变化率(也叫瞬间斜率),如果这个值越大,就表明其上升趋势越强劲这里我的说法有问题,实际上导数就梯度的特殊情况,我这么写是为了方便理解

梯度方向为:

∇f=(∂f∂x1(x1(0)),∂f∂x2(x2(0)),⋯ ,∂f∂xn(xn(0)))\nabla f=\bigl(\frac{\partial f}{\partial x_1}(x_1^{(0)}),\frac{\partial f}{\partial x_2}(x_2^{(0)}),\cdots,\frac{\partial f}{\partial x_n}(x_n^{(0)})\bigr)f=(x1f(x1(0)),x2f(x2(0)),,xnf(xn(0))),当(x1,x2,⋯ ,xn)(x_1,x_2,\cdots,x_n)(x1,x2,,xn)沿着这个方向走的时候,函数值是增加的

在这里插入图片描述

总结一下:对于函数的某个特定点,它的梯度就表示:从该点出发函数值增长最为迅猛的方向(direction of greatest increase of a function)

既然梯度方向是函数值增加的方向,那么自变量沿着这个方向走下去,函数值就会越来越大。反之,梯度的反方向就是函数值减小的方向,沿着梯度的反方向走下去,函数值就会越来越小

再思考我们一开始提出的优化问题,想要使网络输出的结果 yyy 能够尽可能接近真实值 y^\hat yy^,我们就需要arg minθ L(θ)\mathop{\mathrm{arg~min}}\limits_{\theta}~{L(\theta)}θarg min L(θ),即求能使函数L(θ)L(\theta)L(θ)函数值最小的θ\thetaθ值,但是通常我们的损失函数都极其复杂,想要通过代数方法寻找其解析解是不可能的

那么,我们为θ\thetaθ给定一个初始的特定值,不断求其梯度,并使θ\thetaθ不断沿着梯度方向的反方向(即−∇L-\nabla LL)变化,就能使函数L(θ)L(\theta)L(θ)的值越来越小,直至我们找到我们所需的最小值,这就是所谓的“梯度下降”

梯度下降:让自变量沿着梯度的反方向变化,使损失函数值不断下降

在之前的内容中,只说明自变量沿着梯度方向的反方向变化,就能使函数值越来越小,那么变化的具体大小是多少呢?这就与梯度值和超参数学习率有关。

之前的内容也写到了,没有单位化的梯度方向实际就是函数对各个自变量在某个特定点的偏导数值,那么如何进行梯度下降?

一个最朴素的想法就是让自变量沿着梯度方向下降一个单位长度,即:

θi=θi−1∣∣∇L∣∣∂L∂θi(θi(i−1))\theta_i=\theta_i-\frac{1}{||\nabla L||}\frac{\partial L}{\partial \theta_i}(\theta_i^{(i-1)})θi=θi∣∣∇L∣∣1θiL(θi(i1))

而由于∣∣∇L∣∣||\nabla L||∣∣∇L∣∣对任一θi\theta _iθi都是定值,甚至可以去掉这个用于单位化的定值,方向仍不受影响:

θi(k)=θi(k)−∂L∂θi(θi(k−1))\theta_i^{(k)}=\theta_i^{(k)}-\frac{\partial L}{\partial \theta_i}(\theta_i^{(k-1)})θi(k)=θi(k)θiL(θi(k1)),其中kkk表示第kkk次迭代

然而仔细一想就会有问题,参数过大的变化则会导致训练震荡,而且有可能跳过极小值点,导致发散,比如下图这样

在这里插入图片描述

因此引入学习率 α\alphaα,用以限制每次沿梯度方向走的距离

至此,就有了基本梯度下降方法进行网络参数训练的完全体形态:

  1. 求损失函数关于参数自变量的导数:∂L(θ0,θ1,⋯ ,θn)∂θj\frac{\partial L(\theta_0,\theta_1,\cdots,\theta_n)}{\partial \theta_j}θjL(θ0,θ1,,θn),代入具体的样本值xxx和标签yyy即可求出具体的导数值
  2. 利用上述导数值对参数θj,j=1,2,⋯ ,n\theta_j,j=1,2,\cdots,nθj,j=1,2,,n进行更新:θj=θj−α⋅∂L(θ0,θ1,⋯ ,θn)∂θj\theta_j=\theta_j-\alpha\cdot \frac{\partial L(\theta_0,\theta_1,\cdots,\theta_n)}{\partial \theta_j}θj=θjαθjL(θ0,θ1,,θn)
  3. 重复1和2的过程,直至θj\theta_jθj基本不再变化(此时也意味着∂L(θ0,θ1,⋯ ,θn)∂θj≈0\frac{\partial L(\theta_0,\theta_1,\cdots,\theta_n)}{\partial \theta_j}\approx0θjL(θ0,θ1,,θn)0

总的来说,目标函数的梯度只是指明了下降的方向,而学习率则决定了每次迭代下降的距离多少。过小的学习率,则会导致训练时间过长,收敛慢;而过大的学习率则会导致训练震荡,而且有可能跳过极小值点,导致发散。

当然,以上讲的就是最初版本的梯度下降,在这之后的研究当中,衍生出了许多改进版的梯度下降,这个在以后的内容中详细介绍

Logo

更多推荐