梯度下降算法

2020-04-10  本文已影响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

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

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

image.png

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

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

在解释学习率的选取

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


image.png

总结:

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

上一篇 下一篇

猜你喜欢

热点阅读