李宏毅机器学习(五)梯度下降

梯度下降TIP1:调整你的学习率

下图左侧为loss曲线和选取学习率对应的情况,红色为选的刚好,蓝色选的比较小,所以需要很长时间来找到最低点,绿色较大导致在一定范围内震荡,黄色太大导致loss反而增大

当然参数不一定是一个维度的,如果是高维度就不能单纯的把所有参数用可视曲线分析,我们这里就把每个参数和loss的影响做一个曲线,同样可以看出关系

插图1

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

插图2

Adagrad

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

插图3

具体实现可以参照下图

插图4

其实学习率\eta ^t \sigma ^t都有\frac{1}{\sqrt{t+1} } ,可以消去,就成了下图的最终写法

插图5

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

插图6

以最简单的二次函数为例,我们知道最小点是x=-\frac{b}{2a} ,如果我们是图中x_{0} 位置,当然我们最好的一步就是\vert x_{0} +\frac{b}{2a}  \vert =\frac{\vert 2ax_{0}+b  \vert }{2a} ,所以其实最好的一步是一阶导的绝对值/二阶导

插图7

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

插图8

梯度下降TIP2  Stochastic Gradient Descent随机梯度下降

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

插图9

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

插图10

梯度下降TIP3  Feature Scaling特征处理

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

插图11

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

插图12

我们都知道梯度下降的迭代过程中,loss函数不一定是严格意义每次都变小

如求下图从\theta _{1} 开始迭代,我们可以尝试在一个半径d的范围内求出损失函数最小值点

插图13

这里应用到了泰勒展开式h(x)=\sum_{0}^∞ \frac{h^k (x)}{k!}(x-x_{0} ) ^k,损失函数用了a,b点的一阶偏微分

插图14

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

插图15

梯度下降的限制

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

插图16
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容