梯度下降算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梯度下降算法相关的知识,希望对你有一定的参考价值。
参考技术A 方向导数反映是函数沿着其自变量空间某个方向变化的快慢程度,众所周知如果沿着某个方向其导数越大说明沿着这个方向函数值变化的越猛烈。设若有函数 ,其自变量的空间是个三维空间,如果我们要求 沿着x,y,z三条坐标轴的变化率直接求其偏导数就可即:
这个其实就是函数 的梯度,那么方向导数又是什么嘞?
假设我们沿着 的自变量所在的三维空间的原点做一条射线 ,那么沿着射线这个方向其函数的变化情况有如何?,这里说的沿着这条射线的方向变化是说(x,y,z)在变化之前满足的过点(x,y,z)且平行于 的空间直线方程,其变化之后依旧满足直线方程,这个时候就要用到方向导数
假设有其自变量一维的函数 那么其导数为:
其实导数的本质意义可以从不同的方面去理解,高中我们理解的是切线斜率。大学了当然就应该还有其他的理解,我们现在从导数的结构上去理解,导数就是是用自变量的变化程度去衡量函数的变化程度,两者相比,分子是变量的变化程度,分母是函数的变化程度,那么为什么要去取极限嘞?其实还可以有不同的理解,假设还有一个函数是 如果我们要比较 的函数变化情况的话,显然在全局上我们是不好进行比较的,因为两个函数都变化的很丰富,都是有平坦有陡峭,我们不好去量化函数在某一个取值范围的变化情况,但是当自变量的区间很小的时候我们就有可能能够衡量两函数曲线的变化情况,所以取到极限就是某一点的变化情况,某一点的情况也就可以用斜率的绝对值来衡量了。知道了导数定义的结构,我们也就可以用这样的结构来定义沿着自变量空间或者平面的任何一个方向的函数变化情况了。
因此我们可以这样来定义自变量n维空间的时候函数的变化情况:
我们可以推导出上面导数的具体表达式这里以三维变量空间为例子:
是射线 的方向余弦,也就是其方向与三坐标轴夹角的余弦
而 就是梯度,那么接下来我们看看到底沿着那个方向其方向导数最大,也就是说沿着哪个方向其函数的变化最剧烈
显然
即方向导数等于方向余弦向量与梯度的内积,假设记 记
那么
显然当 与梯度向量的方向一致的时候 此时方向导数的取得最大值这时候函数沿着这个方向增大的最快,方向相反的时候取最小值这时候沿着这个方向减小的最快,也即函数在某一点出沿着梯度向量的方向是变化最剧烈的地方,实际上 梯度是函数 在点(x,y,z)的方向余弦,而梯度下降就意味着更新参数的时候是
可能有的同学说我用梯度下降就不沿着梯度方向迭代,我想往哪个方向就往哪个方向,理论上是有可能达到最小值和局部极小值,而且达到最小值的时候方向导数也是零,但是只是可能,可能沿着某一个方向下降的时候你无数次和你的命中注定擦肩而过,达不到最小值也达不到极小值,达到的时候还有可能是个伪局部极小值,这时候就麻烦了,而且你还要自己设定方向余弦。
而用梯度下降的好处就在于没迭代一次他会自动调整迭代的方向,这样就可以保证每次下降的方向都是函数值减小最剧烈的方向,能够保证损失函数值每次的迭代都是在单调不增。保证能够收敛到某个极值点,至于这个极值点是不是最小值点这个另当别论。
线性回归的假设函数如下:
假设有m个样本
这里面的 也就代表着梯度下降的时候参数调整的幅度是多少,大家如果是刚学梯度下降的时候肯定对参这个式子有疑虑:
图中可以了解到极小值点图中也是最小值点的左边其导数为负号,右边其导数为正号。导数为负的时候如果迭代式子 那么意味参数值左移损失函数值远离极小值,导数值取整数也一样是原理,所以取负号的原因就是首先让参数更新之后的值使得损失函数值有靠近极小值点的趋势
学习率的选取并不是固定的,而是要根据具体情况具体分析,学习率过大的话会导致参数迭代之后越过极小值点,如过损失函数是一个关于极小值点对称的话,一次迭代越过极小值,第二次迭代至越过的对称位置,这就很麻烦,收敛的值不是极小值,还会误解为极小值。如果学习率选取过小,很有可能因为迭代步长很小导致迭代次数无限多。
梯度下降法迭代更新参数取得的值不一定是极小值(迭代收敛的值,因为迭代至接近极值点出其梯度会消失)或者是最小值,但是梯度下降法的学习率和激活函数以及参数的初始化选取得当是一定会收敛至极小值的也有可能是最小值,正因为如此我们有时候或许可以多选择几个学习率,或者是多选取几批次初始化值,然后得到损失函数值相对最小的就可以了。
以上是关于梯度下降算法的主要内容,如果未能解决你的问题,请参考以下文章