additive learning rate 技术
- additive learning rate最主要的目的:给learning rate不同的参数
引入
- small gradient不是train network最大stuck的原因:
下图中的loss图的后段显示loss已经不再下降,然而对应的gradient并没有接近0,甚至有波动,这表明model参数进入了“峡谷”的山谷两侧来回震荡,此时并不是遇到critical point的场景。
下图实验是训练model的参数很接近critical point,用一般的gradient decent是做不到的,(因为一般gradient decent是在gradient还很大的时候loss就已经掉不去了),要想解决这个问题是需要其他特别方法training。多数时候的training还没走到critical point就已经停止下来了,故而一般loss不再下降的原因不是因为遇到critical point而是其他问题。
举例分析没遇到critical point,就遇到training卡住(即loss不再下降)的原因:
- 下图的图像解释:
- 下图的等高线是椭圆形,由于短轴过短,长轴过长,所以等高线看起来像是直线
- 等高线的坡度是指等高线的斜率,当坡度大的时候,learning rate大的,梯度下降的更快(如左下角图),当坡度小的时候,learning rate小的,梯度下降的更慢(如右下图)
- 黄色x点是critical point,黑色圆点是起始点
- 左下角的图是learning rate=10的-2次方的gradient decent时候loss图像,loss就是不能抵达critical point所在的loss值的位置
- 右下角的图是learning rate=10的-7次方的gradient decent时候loss图像,loss情形好一些,离critical point所在的loss值的位置近一些,但是loss图像左折之后就难以在往前,在左折部分囤积了10万个updates
综上所述以及观察图像,我们可以得到结论目前的这种learning rate都一样的gradient decent已经“失效”了,我们需要更优化的gradient decent。由此我们引出了特质化的learning rate。
特质化的learning rate的方法--AdaGrad(Adaptive Gradient)
数学过程:
1.将换成
/
(如下图所示)
2.逐步update
- AdaGrad效果:坡度大的时候learning rate就大,坡度小的时候learning rate就小
- AdaGrad能实现该效果的原因:上图中有两个参数:θ1 和 θ2。θ1 坡度小,θ2 坡度大。因为 θ1 坡度小,根据式 上图最后一个式子,θi1 这个参数上面算出来的梯度值都比较小,因为算出来的梯度值(loss)都比较小,所以算出来的 σit 就小,σit 小学习率就大。反过来,θ1 坡度大,所以计算出的梯度都比较大,σit 就比较大,在更新的时候,步伐(参数更新的量)就比较小。
- AdaGrad的问题:就算是同一个参数,其需要的learning rate也会随着时间的变化而变化,同一个参数的gradient大小差不多,实际中,不完全是这个情形,举例说明:
绿色箭头部分坡度大,红色箭头部分坡度小。
为了解决坡度变化的情形,我们提出了更优化的learning rate方法--RMSProp
RMSProp
数学过程:
要自己调,是个超参数,
决定了gi的重要性
- 下图是RMSProp动态调整gi,update的过程
由此,可得最常见的optimization的方法--Adam:RMSProp+Momentum
使用Adam解决引入部分的问题:
一开始优化的时候很顺利,在左转的时候,有 AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到 BC 段时,因为横轴方向的梯度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到下图中红圈的地方,快走到终点的时候突然“爆炸”了。σit 是把过去所有的梯度拿来作平均。在 AB段梯度很大,但在 BC 段,纵轴的方向梯度很小,因此纵轴方向累积了很小的 σit,累积到一定程度以后,步伐就变很大,但有办法修正回来。因为步伐很大,其会走到梯度比较大的地方。走到梯度比较大的地方后,σit 会慢慢变大,更新的步伐大小会慢慢变小,从而回到原来的路线。
解决“爆炸”问题的方法:learning rate scheduling
learning rate scheduling
学习率衰减(learning rate decay)
- 之前的学习率调整方法中 η 是一个固定的值,现在我们让η 跟时间有关
- 让η 跟时间有关的原因(以之前的问题为基础):一开始我们离终点很远,随着不断update,我们离终点越来越近,我们把learning rate减小,让参数的更新踩个“刹车”,让参数的更新慢下来。(如下图所示)
预热
- 变大要变多大,变大的速度要多快,变小要变多小,变小的速度要多块,这些都是要自己调,即也是超参数
- 基本思路:让学习率先变大后变小
- 让学习率先变大后变小的一个可能的原因是:当我们使用 Adam、RMSprop 或 AdaGrad 时,需要计算 σ。而 σ 是一个统计的结果。从 σ 可知某一个方向的陡峭程度。统计的结果需要足够多的数据才精准,一开始统计结果 σ 是不精准的。一开始学习率比较小是用来探索收集一些有关误差表面的情报,先收集有关 σ 的统计数据,等 σ 统计得比较精准以后,再让学习率慢慢爬升。如果读者想要学更多有关预热的东西可参考 Adam 的进阶版———RAdam。
下图是目前优化的完整的版本的过程图
- 动量 mit 和均方根 σit ,不会正好抵消的原因:mit 和 σit 在使用过去所有梯度的方式是不一样的,动量是直接把所有的梯度都加起来,所以它有考虑方向,它有考虑梯度的正负。但是均方根不考虑梯度的方向,只考虑梯度的大小,计算 σit 的时候,都要把梯度取一个平方项,把平方的结果加起来,所以只考虑梯度的大小,不考虑它的方向,所以动量跟 σit 计算出来的结果并不会互相抵消。
Classification
- 把分类当作回归
- 下图的文字描述:让y和目标y的plus越接近越好,所以我们把class数字化,class1=>1,class2=>2,class3=>3,但是这种数字化有瑕疵,当class1=>1,就已经默认class1比较1,和3或者2比较不像。。但该方法在某些状况下会有问题,假设类 1、2、3 有某种关系。比如根据一个人的身高跟体重,预测他的年级,一年级、二年级还是三年级。一年级跟二年级关系比较近,一年级跟三年级关系比较远。用数字来表示类会预设 1 和 2 有比较近的关系,1 和 3 有比较远的关系。但假设三个类本身没有特定的关系,类 1 是 1,类 2 是 2 类 3 是 3。这种情况,比较常见的做法是:引入独热向量来表示类。实际上,在做分类的问题的时候,比较常见的做法也是用独热向量表示类。
引入独热向量来表示类,上述场景就会变成如下图所示:
如果有三个类,标签 y 就是一个三维的向量,比如类 1 是 [1, 0, 0]T,类 2 是 [0, 1, 0]T,类3 是 [0, 0, 1]T。如果每个类都用一个独热向量来表示,就没有类 1 跟类 2 比较接近,类 1 跟类 3 比较远的问题。如果用独热向量计算距离的话,类两两之间的距离都是一样的。
带有 softmax 的分类
- 分类过程中要加上 softmax 函数的原因:一个比较简单的解释是,y 是独热向量,所以其里面的值只有 0 跟 1,但是 yˆ 里面有任何值。既然目标只有 0 跟 1,但 yˆ 有任何值,可以先把它归一化到 0 到 1 之间,这样才能跟标签的计算相似度。、
- classification中的y是向量
- 下图是regression和classification的”泛化“模型
softmax运作的原理
下图的文字描述
softmax 的计算如下图所示,先把所有的 y 取一个指数(负数取指数后也会变成正的),再对其做归一化(除掉所有 y 的指数值的和)得到 y′。图 3.33 是 softmax 的块(block),输入 y1、y2 和 y3,产生 y′1、y′2 和 y′3。比如 y1 = 3,y2 = 1,y3 = −3,取完指数的时候,exp(3) = 20、exp(1) = 2.7 和 exp(−3) = 0.05,做完归一化后,就变成 0.88、0.12 跟 0。−3取完指数,再做归一化以后,会变成趋近于 0 的值。所以 softmax 除了归一化,让 y′1、y′2 和y′3,变成 0 到 1 之间,和为 1 以外,它还会让大的值跟小的值的差距更大。
Loss of Classification
下图是Loss of Classification的过程:
Mean Square Error (MSE),Cross-entropy是就算loss的方法
从optimization角度解释Cross-entropy更常用的原因:
如果选择交叉熵(Cross-entropy),如右下图所示,左上角圆圈所在的点有斜率的,所以可以通过梯度,一路往右下的地方“走”;如果选均方误差,如图左下所示,左上角圆圈就卡住了,均方误差在这种损失很大的地方,它是非常平坦的,其梯度是非常小趋近于 0 的。如果初始时在圆圈的位置,离目标非常远,其梯度又很小,无法用梯度下降顺利地“走”到右下角。