美文网首页
梯度下降算法

梯度下降算法

作者: 罗泽坤 | 来源:发表于2020-04-10 00:11 被阅读0次

    为了证明自己将梯度下降算法搞明白了,必须写篇文章,而且梯度下降算法是神经网络和许多机器学习算法更新权重的核心算法,反向传播与梯度下降算法在卷积神经网络的原理和CNN中是一样的,只是因为卷积神经网络涉及池化层和卷积层结构不同,卷积层向前传播,池化层向前传播到卷积层,这只是形式上不一样算法设计上要考虑到梯度矩阵的布局问题,本质上并没两样,如果将卷积层和池化层降维展平成一个向量,求梯度也就是个对应关系而已,池化层反向传播的处理虽然没有参为了让他适用于误差的反向传播你其实也是可以假想出为0,1的权重连接的,然后对池化层而言也适用反向传播算法。卷积层往前传播那里公式上表示是卷积核旋转180然后与当前层误差进行卷积这个表示也只是为了表示方便,确保对应关系不变,其实推到一下就能明白的了,并没有什么高深的东西,当然我们现在是站在前人的肩膀上搞懂而已,并不是创造,如果问我我能创造出这样的算法吗?你说不高深?那我肯定会说我创造不出。

    先从数学分析的方向导数谈起:

    方向导数反映是函数沿着其自变量空间某个方向变化的快慢程度,众所周知如果沿着某个方向其导数越大说明沿着这个方向函数值变化的越猛烈。
    设若有函数\lambda = f(x,y,z),其自变量的空间是个三维空间,如果我们要求\lambda沿着x,y,z三条坐标轴的变化率直接求其偏导数就可即:
    \dfrac{\partial f(x,y,z)}{\partial x},\dfrac{\partial f(x,y,z)}{\partial y},\dfrac{\partial f(x,y,z)}{\partial z}这个其实就是函数\lambda的梯度,那么方向导数又是什么嘞?
    假设我们沿着f(x,y,z)的自变量所在的三维空间的原点做一条射线l,那么沿着射线这个方向其函数的变化情况有如何?,这里说的沿着这条射线的方向变化是说(x,y,z)在变化之前满足的过点(x,y,z)且平行于l的空间直线方程,其变化之后依旧满足直线方程,这个时候就要用到方向导数
    假设有其自变量一维的函数f(x)那么其导数为:
    f^{\prime}(x) = \lim_{\Delta x \rightarrow 0}\dfrac{f(x+\Delta x)-f(x)}{\Delta x}
    其实导数的本质意义可以从不同的方面去理解,高中我们理解的是切线斜率。大学了当然就应该还有其他的理解,我们现在从导数的结构上去理解,导数就是是用自变量的变化程度去衡量函数的变化程度,两者相比,分子是变量的变化程度,分母是函数的变化程度,那么为什么要去取极限嘞?其实还可以有不同的理解,假设还有一个函数是h(x) 如果我们要比较h(x)和f(x)的函数变化情况的话,显然在全局上我们是不好进行比较的,因为两个函数都变化的很丰富,都是有平坦有陡峭,我们不好去量化函数在某一个取值范围的变化情况,但是当自变量的区间很小的时候我们就有可能能够衡量两函数曲线的变化情况,所以取到极限就是某一点的变化情况,某一点的情况也就可以用斜率的绝对值来衡量了。知道了导数定义的结构,我们也就可以用这样的结构来定义沿着自变量空间或者平面的任何一个方向的函数变化情况了。
    因此我们可以这样来定义自变量n维空间的时候函数的变化情况:
    \dfrac{\partial f}{\partial l}|_{p} = \lim_{\rho \rightarrow 0^+} \dfrac{f(P^{\prime})-f(P)}{\rho}
    l是方向,P,P^{\prime},是变量空间两个点,\rho是两点间的距离
    我们可以推导出上面导数的具体表达式这里以三维变量空间为例子:

    image.png

    \dfrac{\partial f}{\partial l} = \dfrac{\partial f}{\partial x}cos\alpha+\dfrac{\partial f}{\partial y}cos\beta+\dfrac{\partial f}{\partial z}cos\gamma
    这里的(\cos\alpha,\cos\beta,\cos\gamma)是射线l的方向余弦,也就是其方向与三坐标轴夹角的余弦
    (\dfrac{\partial f}{\partial x},\dfrac{\partial f}{\partial y},\dfrac{\partial f}{\partial z})就是梯度,那么接下来我们看看到底沿着那个方向其方向导数最大,也就是说沿着哪个方向其函数的变化最剧烈
    显然\dfrac{\partial f}{\partial l} =(\cos\alpha,\cos\beta,\cos\gamma)*(\dfrac{\partial f}{\partial x},\dfrac{\partial f}{\partial y},\dfrac{\partial f}{\partial z})
    即方向导数等于方向余弦向量与梯度的内积,假设记grad(f)=(\dfrac{\partial f}{\partial x},\dfrac{\partial f}{\partial y},\dfrac{\partial f}{\partial z})l = (\cos\alpha,\cos\beta,\cos\gamma)
    那么\dfrac{\partial f}{\partial l} = |l|*|grad(f)|*cos\theta
    显然当l与梯度向量的方向一致的时候cos\theta=1此时方向导数的取得最大值这时候函数沿着这个方向增大的最快,方向相反的时候取最小值这时候沿着这个方向减小的最快,也即函数在某一点出沿着梯度向量的方向是变化最剧烈的地方,实际上grad(f)=(\dfrac{\partial f}{\partial x},\dfrac{\partial f}{\partial y},\dfrac{\partial f}{\partial z}) 梯度是函数f(x,y,z)在点(x,y,z)的方向余弦,而梯度下降就意味着更新参数的时候是参数 = 参数 - 学习率*方向余弦
    可能有的同学说我用梯度下降就不沿着梯度方向迭代,我想往哪个方向就往哪个方向,理论上是有可能达到最小值和局部极小值,而且达到最小值的时候方向导数也是零,但是只是可能,可能沿着某一个方向下降的时候你无数次和你的命中注定擦肩而过,达不到最小值也达不到极小值,达到的时候还有可能是个伪局部极小值,这时候就麻烦了,而且你还要自己设定方向余弦。
    而用梯度下降的好处就在于没迭代一次他会自动调整迭代的方向,这样就可以保证每次下降的方向都是函数值减小最剧烈的方向,能够保证损失函数值每次的迭代都是在单调不增。保证能够收敛到某个极值点,至于这个极值点是不是最小值点这个另当别论。

    以线性回归为例介绍梯度下降:

    二维参数空间函数的梯度下降

    线性回归的假设函数如下:
    假设有m个样本(x_i,y_i) i=1,2,3\cdots m

    • Hypothesis:
      h_{\theta}(x) = \theta_0 + \theta_1 x
    • Parameters:
      \theta_0,\theta_1
    • Cost Function:
      J(\theta_0,\theta_1) = \dfrac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{i})-y^{i})^2
      也就是平均均方误差最小,分数项有个2是方便求导约去
    • Goal:{minimize}_{\theta_0 \theta_1} J(\theta_0,\theta_1)
    • Gradient descent algorithm
      首先当然是初始化参数
      repeat until convergence{
      \theta_j = \theta_j - \alpha \dfrac{\partial J(\theta_0,\theta_1)}{\partial \theta_j},(for j =0 and j=1)
      }

    这里面的\alpha是学习率也就代表着梯度下降的时候参数调整的幅度是多少,大家如果是刚学梯度下降的时候肯定对参这个式子有疑虑:

    • 为什么沿着梯度的方向下降
    • 学习率的大小怎么取
    • 为什么式子里为什么式减号
      第一个问题为什么沿着梯度的方向下降不沿着其他方向下降,为了回答这个问题且看下面的图:
      image.png
      这是一个凸曲面,假设我们梯度下降的方向下降只沿着一个方向下降,假设是沿着b坐标轴的这个方向下降,这个时候的迭代公式是这样子的:
      repeat until convergence{
      b = b - \alpha \dfrac{\partial J(w,b)}{\partial b}
      w = w
      参数 = 参数 - 学习率*方向余弦
      }
      其实相当就是做一个切平面w = w与损失函数J(w,b)的切线,相当于保持w不变这样损失函数就成了一个一元函数,假设w的选取不好,使得切线没有包含最小值点,那么迭代收敛的时候由于随着越来越接近那条没有包含最小值点的切线的极小值点,他的梯度会消失进而收敛于其伪极小值点,但是这个极小值点并不是原来损失函数J(w,b)的极小值点,而是因为做了且平面与其相交之后产生的伪极小值点
      但是如果是梯度下降的话他不会是一直沿着一个方向迭代到伪极小值点,他没迭代一次更新了一次参数之后,会重新计算梯度,然后沿着哪一点的梯度方向下降,而之前时说过的,梯度下降算法会保证函数的每一次迭代都会沿着函数值变化最剧烈的方向进行参数调整,如果学习率设置的适当的时候是能够收敛到极值点的,因为越是接近极值点其梯度值会越小逼近于零,这时候权重更新就会越来越小,损失函数值会收敛于其极小值或者最小值。
      假设一上面的损失函数图像为例子,沿着另一个方向l其方向余弦为cos\theta,cos\beta那么其梯度下降的迭代函数为如下
      repeat until convergence{
      b = b - \alpha cos\theta
      w = w - \alpha cos\beta
      参数 = 参数 - 学习率*吧方向余弦
      }
      如之前说的沿着b轴进行下降,这里也一样都是沿着一个固定不变的方向更新参数,显然这是不合适的,因为沿着某一个固定的方向,这个方向的平面与损失函数的切线未必会有极小值点,而且 由于方向余弦固定不变,每次参数更新的步长都是一样的,这会导致即便是达到了极小值点也不会收敛会一直迭代下去,甚至会出现死循环。
      所谓某一点的梯度实际上就是函数在这一点变化最猛烈的方向,而这里的方向指的就是,在参数空间中过原点做一条射线,这条射线与参数空间各坐标轴的夹角的余弦,就是方向余弦,梯度在本质上就是参数空间某个射线的方向余弦,而且函数的参数在某一点沿着这条射线l变化(这里指的是过那一点在参数空间中做平行于方向直线的平行线L,变化指的是各参数在变化之后依旧满足L)最猛烈,现在用一个证明式子帮助理解我说的意思,以及帮助大家理解梯度下降的本质之所在:
      假设损失函数为:J(w,b)
      设沿着某一方向l变化其函数变化最猛烈(也就是梯度向量方向),其方向余弦为(cos\theta,cos\beta),那么其在参数空间的直线方程为w=kb,k = \dfrac{sin\theta}{cos\theta}=\dfrac{cos\beta}{cos\theta},然后过一点(w,b)作与l品行的直线L记为:
      w = kb+c
      按照梯度的意义我们知道:
      \dfrac{\partial J(w,b)}{\partial w} = cos\beta
      \dfrac{\partial J(w,b)}{\partial b} = cos\theta
      由梯度下降公式我们迭代一次:
      w^{\prime} = w - \alpha \dfrac{\partial J(w,b)}{\partial w} = w - \alpha cos\beta
      b^{\prime} = b - \alpha\dfrac{\partial J(w,b)}{\partial b} = b - \alpha cos\theta
      然后再把上面两w^{\prime},b^{\prime}带入直线L可以验证w^{\prime} = kb^{\prime}+c这就是梯度下降的原理,总是沿着函数变化最猛烈进行迭代,这样有利于减少迭代次数,而且利用极值点的必要条件偏导数为零,而且梯度会弥散能有效的收敛。

    第二个和第三个问题学习率与梯度下降的关系以及为什么迭代式子为负号的原因为方便解释且看下图

    image.png

    先解释为什么迭代使子为负号

    图中可以了解到极小值点图中也是最小值点的左边其导数为负号,右边其导数为正号。导数为负的时候如果迭代式子w = w - \alpha \dfrac{\partial J(w)}{\partial w}那么意味参数值左移损失函数值远离极小值,导数值取整数也一样是原理,所以取负号的原因就是首先让参数更新之后的值使得损失函数值有靠近极小值点的趋势

    在解释学习率的选取

    学习率的选取并不是固定的,而是要根据具体情况具体分析,学习率过大的话会导致参数迭代之后越过极小值点,如过损失函数是一个关于极小值点对称的话,一次迭代越过极小值,第二次迭代至越过的对称位置,这就很麻烦,收敛的值不是极小值,还会误解为极小值。如果学习率选取过小,很有可能因为迭代步长很小导致迭代次数无限多。


    image.png

    总结:

    梯度下降法迭代更新参数取得的值不一定是极小值(迭代收敛的值,因为迭代至接近极值点出其梯度会消失)或者是最小值,但是梯度下降法的学习率和激活函数以及参数的初始化选取得当是一定会收敛至极小值的也有可能是最小值,正因为如此我们有时候或许可以多选择几个学习率,或者是多选取几批次初始化值,然后得到损失函数值相对最小的就可以了。

    相关文章

      网友评论

          本文标题:梯度下降算法

          本文链接:https://www.haomeiwen.com/subject/paocmhtx.html