1 背景
梯度下降算法是目前最流行的优化算法之一,并且被用来优化神经网络的模型。业界知名的深度学习框架TensorFlow、Caffe等均包含了各种关于梯度下降优化算法的实现。然而这些优化算法经常被用作黑盒优化器,造成对这些算法的优缺点以及适用场景没有一个全面而深刻的认知,可能造成无法在特定的场景使用最优解。
这篇文章主要对各种梯度下降优化算法进行全面成体系的分析,帮助相关的算法开发人员在模型开发的过程中选取合适的算法。相对来说,这块内容较多会分成几个章节进行,以下是章节情况,本章会介绍模型训练的相关难题以及高级优化器的优化方向-冲量、自适应学习率。
梯度下降法的的目标是在梯度的相反方向进行模型参数的更新,从几何学来说,就是沿着斜率的方向(最快)由目标函数创建的曲面一直向下直到山谷,并且通过合理的步长设置加快与稳定算法模型的收敛,训练出泛化更强的模型。基本思想亦可以这样理解:我们从山上的某一点出发,找一个最陡的坡走一步(也就是找梯度方向),到达一个点之后,再找最陡的坡,再走一步,直到我们不断的这么走,走到最“低”点(最小花费函数收敛点)。基于此,相关科研人员针对该算法进行了广泛而深度的研究。
相关符号:
- 模型的代价函数: J ( θ ) J(\theta) J(θ)
- 模型的相关参数: θ ∈ R d \theta \in R^d θ∈Rd
- 参数的梯度: ▽ θ J ( θ ) \bigtriangledown_{\theta}J(\theta) ▽θJ(θ)
- 参数的梯度: η \eta η
本文继续上一个章节《深度学习框架TensorFlow系列之(五》优化器1》进行继续讲解,前面的章节描述了梯度下降及其衍生变体,并且提出了模型训练的挑战与难题,本章将进一步讲解。
2 模型训练遇到的挑战
本节具体的分析下模型训练在梯度更新的过程中,可能遇到的问题,请看下图
上图是一个基于回归模型的梯度更新的示意图,在这个图中,我们可以看到几个关键的点位:
- The Plateau:停滞点位,梯度值近乎于0,所以简单的梯度更新算法十分缓慢。
- Saddle Point:鞍点点位,梯度值等于0,所以简单的梯度更新算法基本无法跳出。
- Local Minima:局部最优解点位,相对于全局最优来说,所以简单的梯度更新算法。
下面我们就仔细分析下这三种方式,看看有没有办法能过跳出来到全局最优,并且保证收敛的速度。
2.1 Local Minima - 局部最优解
其实,工业界对于局部最优解的使用方式大抵如下(前提目前工业界都是比较大的深度神经网络):在需要吹牛的时候,会不断的鼓吹模型的局部最优解,并且进而夸大模型训练的难度,然后说自己采用了xxx高深的技术,跳出了局部最优,达到了全局最优的目标。其实吧,比较扯淡,大家做模型的时候其实根本很少考虑局部最优解的情况(而且很多人也没这个意识),默认都是达到了全局最优解,不收敛的话重新选特征改网络结构,重新再训一次。那么关于局部最优解与全局最优解有没有什么理论支撑呢,在什么情况下发生呢?在下不才,以自己浅薄的知识推导一番,如果不当之处,欢迎各位读者帮忙指正。
首先,无论是全局最优或者是局部最优我们统称为最优解(谷底),都是相对于所有的参数而言,需要在所有参数达到最优(谷底),那么我们假设目前的参数是N个,每个参数取得最优(谷底)的概率是P,则整体达到最优(谷底)的概率是 P N P^N PN,以目前的工业界使用的深度学习模型为例,普遍都是百万级以上(SOTA模型动辄就达到千亿、万亿的参数),那么这个概率出现的是非常小的,所有当出现最优解的时候,很大程度上判断应该不是Local Minima,而是Global Minima。
所以,基本在工业界基本没有人费劲的去解所谓的”Local Minima"的问题,默认最优(谷底)就是全局的。我思故我在,我如果不思那就不在!基本就是不收敛改各种超参与网络重训,通过高级优化器与参数的配合改变梯度路径,上面说过所有参数一致的最优概率非常小,连续两次碰到的情况基本不太可能,进而重训会很大程度上会加快收敛速度与模型泛化能力。
不过这个高级优化器里面的东西就是解决局部最优的重点,引入冲量与自适应学习率,不过很多人不理解,请继续往下看。
2.2 The Plateau & Saddle Point
针对停滞点与鞍点,我把这两个放在一起来说了,主要是有很多相似的地方。
上面的梯度下降图中,其实是一个参数的情况,而Local Minima是所有参数一致达到谷底的情况。但是这个The Plateau & Saddle Point其实是针对每个参数的特征而言的,所以有很大的不同。
针对部分参数出现梯度更新特别小或者是0的情况 ,这个时候普通的梯度下降法就无能为力,因为他只是基于目前的梯度,基本很难走出去,造成模型的不收敛,训练不出一个精确的模型出来。
接下来我们看看如何解决。
2.3 解决办法
基于上面的几种情况,我们是否有一些办法,能够解决呢,其实任何学科都不是孤立的,自然界中很多道理和规律我们都可以相互借鉴,相融相通,比如:
我们很多人都有其自行车下坡的经验,这个过程和梯度下降非常类似,或者开车下陡坡的经验也是类似的,当我们从一个陡坡往下骑车的时候,我们基本不太需要去蹬车,同时车速也会越来越快,所以我们需要不断的捏闸,让车速慢下来。最终安全地到达坡底。
那么,总结一下,我们目前的简单的梯度下降过程中相对于骑车下陡坡缺失的部分
- 前进力-惯性:下坡时候的车速不仅仅取决于目前的力度,也取决于以前积累的加速;
- 回退力-闸:下坡的时候通过闸来调整车的加速比。
那么这两个要素在梯度下降里面,我们采用了两个新名词,动量(亦叫冲量)Momentum,动态自适应学习率 Learning Rate。下面就讲解下这两个技术点。
3 动量(冲量)
动量定义:在经典力学里,物体所受合外力的冲量等于它的动量的增量(即末动量减去初动量),叫做动量定理。 和动量是状态量不同,冲量是一个过程量;在DL中定义如下,在梯度下降算法中,结合以往参数梯度更新的惯性,予以累积,进而影响本次的梯度更新。
**其实这里面有个逻辑问题,不是说使用了动量就一定可以达到最优解,只是有可能,提供了这么一种可能,具体怎么做,还需要算法人员来调参尝试。**说实话,DL的数学严谨度是不够的,很多理论支撑是苍白的,不过行业目前就这样,经常在知乎看到学数学的吐槽这点,很多东西缺乏严谨的理论支撑,但是乱拳打死老师傅,就先这样来吧,配合上面的图,我们从理想态描述下:
- 点位一:梯度下降的红色箭头方向是往右的,假设其是起始点,此时没有冲量(惯性)。所以实际移动的方向就是梯度下降的方向,向右运动。
- 点位二:梯度下降的红色箭头方向是向右的(非常小的梯度),动量的紫色箭头方向也是向右的,所以向右运动。
- 点位三:此处是鞍点,梯度下降等于0,动量的紫色箭头方向也是向右的,所以向右运动。
- 点位四:此处是局部最优,此时我们的梯度下降的红色箭头方向是向左的,这个时候如果我们的动量值 > 梯度的值。就会继续向上走,如果值够大,可以跳出local minima。
从上面的描述,大家可以看到了冲量在梯度下降中的很多关键点位还是有很重要的作用的,如果应用的好,会极大的加快模型收敛的速度和模型的泛化性能。下面接着介绍下另外一个重点的内容Learning Rate。
4 Learning Rate - 学习率
学习率 Learning Rate定义::表示了每次参数更新的幅度大小。 学习率过大:会导致待优化的参数在最小值附近进行波动;
上图左边黑色为损失函数的曲线,假设从左边最高点开始,
- 如果学习率调整的刚刚好,比如红色的线,就能顺利找到最低点。
- 如果学习率调整的太小,比如蓝色的线,就会走的太慢,虽然这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
- 如果学习率调整的有点大,比如绿色的线,就会在上面震荡,走不下去,永远无法到达最低点。
- 如果学习率调整的非常大,比如黄色的线,直接就飞出去了,更新参数的时候只会发现损失函数越更新越大。
解决方法就是上图右边的方案,将参数改变对损失函数的影响进行可视化。虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。(可以考虑分参数可视化,但是这样太费劲了,而且训练的过程不同的样本组合状况千奇百怪,有很多只是理论的方案)
- 比如学习率太小(蓝色的线),损失函数下降的非常慢;
- 学习率太大(绿色的线),损失函数下降很快,但马上就卡住不下降了;
- 学习率特别大(黄色的线),损失函数就飞出去了;
- 红色的就是差不多刚好,可以得到一个好的结果。
如果每次都是对着可视图去观察,不太现实,参数太多了,那么如果希望在工业界应用,我们所以需要一个自适应性的学习率,针对的粒度可能是不同的参数,不同参数的不同时期。
5 梯度下降的高级用法
从上面的描述以及目前行业的主流做法,我们可以知道,高级的优化器算法都是针对动量和学习率,做些智能的自适应的方式(可能不是最优,但是相对原始的已经是巨大的进步),粒度可能是参数级别、不同时间基本的组合。包括:
- NAG
- Adagrad
- Adadelta
- RMSprop
- Adam
- AdaMax
- Nadam等
这些优化器,在后续章节将会进一步介绍,本章内容完毕。
6 番外篇
个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com