梯度下降TIP1:调整你的学习率
下图左侧为loss曲线和选取学习率对应的情况,红色为选的刚好,蓝色选的比较小,所以需要很长时间来找到最低点,绿色较大导致在一定范围内震荡,黄色太大导致loss反而增大
当然参数不一定是一个维度的,如果是高维度就不能单纯的把所有参数用可视曲线分析,我们这里就把每个参数和loss的影响做一个曲线,同样可以看出关系

我们可以为了找到最小值点,同时又为了保证一定的效率,可以梯度下降迭代的同时改变学习率,比如将学习率和第t次迭代挂钩,,当然调整学习率不能对于所有参数都设置一个学习率,需要对不同参数设置不同学习率

Adagrad
还记得我们上次课程代码段将代码调整,这种方法就是Adagrad,其每次迭代过程见图,除了使用学习率和偏微分外,还是用了,其实过去所有迭代梯度参数的均方差

具体实现可以参照下图

其实学习率和
都有
,可以消去,就成了下图的最终写法

我们为什么这么定制学习率的变化呢,其实是adagrad为了造成反差的效果

以最简单的二次函数为例,我们知道最小点是,如果我们是图中
位置,当然我们最好的一步就是
,所以其实最好的一步是一阶导的绝对值/二阶导

当然我们adagrad下面是平方和开根号,并不是二次导,这里是因为二阶导当参数量大的时候往往是我们不能接受的,所以我们采用计算量小的来近似,比如下面2个曲线,当我们迭代次数多的时候,就会发现二阶导大的其一阶导往往也比较大

梯度下降TIP2 Stochastic Gradient Descent随机梯度下降
我们一般的梯度下降是考虑样本所有误差的平方和,而随机梯度下降呢,是每个样本单独计算梯度,然后执行样本数量,听起来好像很怪,有什么用呢

下图左侧为一般梯度下降,右侧为随机梯度下降,以20个样本为例,左侧执行一次梯度下降时,右侧执行了20次,虽然右侧第一个样本步很小,而且方向往往不会和左侧一致,但是执行了20次后,下降的速度往往比较快

梯度下降TIP3 Feature Scaling特征处理
比如处理2个特征的输入时,x2的分布范围比x1的宽,我们就把x2的范围处理成和x1一致,如果x1分布比较大,那w1与w2相同时,x1,x2相同的改变,w1x1影响y的会比较大

处理的方法很多,下图的方法是将特征标准化

我们都知道梯度下降的迭代过程中,loss函数不一定是严格意义每次都变小
如求下图从开始迭代,我们可以尝试在一个半径d的范围内求出损失函数最小值点

这里应用到了泰勒展开式,损失函数用了a,b点的一阶偏微分

求最小值就是当与u,v向量反向时的值,我们可以得到他们之间是
的关系,当然我们学习率
越小,偏微分计算出的下一点才最准确,所以学习率
不合适可能导致下一点损失函数不一定最小,如果我们引入二阶导(牛顿迭代法),当然模型会更接近,但是计算量往往太大,我们做深度学习的时候承受不了,所以梯度下降还是我们比较主流的做法。

梯度下降的限制
我们知道沿着损失函数梯度下降可能我们会找到一个局部最小点,也可能停留在一个平稳点,甚至是一个较高的位置,比如我们程序设定迭代多少次就<10-6,但是损失函数本身分布就比较低,可能扔不是一个可以停止迭代的位置
