10.优化器(下)


本课程来自深度之眼deepshare.net,部分截图来自课程视频。

内容简介

learning rate学习率

梯度下降的更新思想 :wi+1=wig(wi)w_{i+1}=w_i-g(w_i)
下面通过一个例子来观察梯度更新的过程:
函数:y=f(x)=4x2y=f(x)=4*x^2
一阶导数:y=f(x)=8xy'=f'(x)=8*x
图像:
10.优化器(下)
x0=2x_0=2这个点,y0=16,f(x0)=16y_0=16,f'(x_0)=16
采用梯度下降来更新x得到:x1=x0f(x0)=216=14,y1=784,f(x1)=112x_1=x_0-f'(x_0)=2-16=-14,y_1=784,f'(x_1)=-112
再次梯度更新: x2=x1f(x1)=14+112=98,y2=38416x_2=x_1-f'(x_1)=-14+112=98,y_2=38416
一直往下…
可以看到y并没有减小(梯度爆炸了)
10.优化器(下)
因此要改进梯度下降的公式 :wi+1=wiLRg(wi)w_{i+1}=w_i-LR*g(w_i)
LR=0.5:
10.优化器(下)
LR=0.2,4个迭代:
10.优化器(下)
LR=0.2,20个迭代:
10.优化器(下)
LR=0.1,20个迭代:
10.优化器(下)
LR=0.125,20个迭代:其实第一步就直接到达零点,但是这个最佳学习率事先我们不可能知道。
10.优化器(下)
查看LR从0.01到0.5,10个学习率分别使得损失函数的变化,发现前面几个曲线对应的学习率过大,造成了梯度爆炸。
10.优化器(下)
查看LR从0.01到0.2,10个学习率分别使得损失函数的变化,蓝色曲线对应学习率为0.01,它的收敛速度最慢,到了30多次迭代才收敛,但是不是学习率在一定范围内越大收敛越快,而是紫色0.136的曲线收敛最快,因为它最靠近0.125,因此在设置LR的时候通常比较保守先设置一个比较小的值,先保证整体的收敛,时间上不做要求。
10.优化器(下)
学习率(learning rate)控制更新的步伐

Momentum动量

Momentum(动量,冲量):结合当前梯度与上一次更新信息,用于当前更新
例如:下面图中黑色是普通的梯度更新,每个步长都是一样的(学习率是一样的嘛)
红色的带动量的梯度更新,第一个箭头和黑色箭头一样长,学习率不变,但是第二个箭头(梯度)结合了前面的梯度方向,所以变大了,多出了蓝色的1部分,第三个也一样,但是变得更大了,多出了蓝色2部分。
10.优化器(下)
指数加权平均:vt=βvt1+(1β)θtv_t=\beta*v_{t-1}+(1-\beta)*\theta_t
vtv_t是当前时刻的平均值,θt\theta_t是当前时刻参数,β\beta属于超参数,但是有常用取值范围(ng的课有讲)。vt1v_{t-1}是上一时刻的平均值。
整个公式的意思就是说当前时刻的平均值,除了要考虑当前的时刻的参数之外,还要考虑之间的均值对当前时刻的均值的影响,这个影响考虑过程中,是有规律的,即:越靠近当前时刻的历史参数,影响越大,之前的历史参数对当前参数的影响因子呈指数变化。
10.优化器(下)
求第100天的指数加权平均温度:
v100=βv99+(1β)θ100v_{100}=\beta*v_{99}+(1-\beta)*\theta_{100}
(1β)θ100+β(βv98+(1β)θ99)(1-\beta)*\theta_{100}+\beta*(\beta*v_{98}+(1-\beta)*\theta_{99})
(1β)θ100+(1β)βθ99+(β2v98)(1-\beta)*\theta_{100}+(1-\beta)*\beta*\theta_{99}+(\beta^2*v_{98})
(1β)θ100+(1β)βθ99+(1β)β2v98+(β3v97)(1-\beta)*\theta_{100}+(1-\beta)*\beta*\theta_{99}+(1-\beta)*\beta^2*v_{98}+(\beta^3*v_{97})
把每项的参数前面的β重新用带指数的β表示,其中第一项相当于β0=1\beta^0=1
(1β)β0θ100+(1β)β1θ99+(1β)β2v98+(β3v97)(1-\beta)*\beta^0*\theta_{100}+(1-\beta)*\beta^1*\theta_{99}+(1-\beta)*\beta^2*v_{98}+(\beta^3*v_{97})
=iN(1β)βiθNi=\sum_i^N(1-\beta)*\beta^i*\theta_{N-i}
由于β小于1,所以,参数前面的权重βi\beta^i是呈指数下降的。绘制出来就是下面的形状(β=0.9),说明了距离当前时刻越近,权重越大,影响越大,反之亦然:
10.优化器(下)
不同β曲线形状如下,表明β越小,记忆越短,例如红色曲线在20个时刻前的权重已经无法对当前的参数造成什么影响了。通常beta设置为0.9,也就是影响时刻约10个(11β\frac{1}{1-\beta})时间步。
10.优化器(下)
原理明白后,下面看PyTorch中动量梯度下降的公式:
vi=mvi1+g(wi)v_i=m*v_{i-1}+g(w_i)
wi+1=wilrviw_{i+1}=w_i-lr*v_i
其中:
wi+1w_{i+1}:第i+1次更新的参数
IrIr:学习率
viv_i:更新量
mm:momentum系数
g(wi)g(w_i)wiw_i的梯度
例子:
10.优化器(下)
下面看图说话:
LR分别为0.01和0.03,没有动量
10.优化器(下)
LR分别为0.01和0.03,0.01动量为0.9
10.优化器(下)
LR分别为0.01和0.03,0.01动量为0.63,看到0.01的曲线比0.03的收敛要快。
10.优化器(下)

torch.optim.SGD

1.optim.SGD主要参数:
·params:管理的参数组
·Ir:初始学习率
·momentum:动量系数,贝塔
·weight_decay:L2正则化系数
·nesterov:是否采用NAG,默认是false
NAG参考文献:《On the importance of initialization and momentum in deep learning》

PyTorch的十种优化器

1.optim.SGD:随机梯度下降法(适用90%模型上)
2.optim.Adagrad:自适应学习率梯度下降法
3.optim.RMSprop:Adagrad的改进
4.optim.Adadelta:Adagrad的改进
5.optim.Adam:RMSprop结合Momentum
6.optim.Adamax:Adam增加学习率上限
7.optim.SparseAdam:稀疏版的Adam
8.optim.ASGD:随机平均梯度下降
9.optim.Rprop:弹性反向传播(所有样本直接参与计算的时候用,分batch时不用)
10.optim.LBFGS:BFGS的改进(L代表limit)
参考文献:
1.optim.SGD:《On the importance of initialization and momentum in deep learning》
2.optim.Adagrad:《Adaptive Subgradient Methods for Online Learning and Stochastic
Optimization》
3.optim.RMSprop:
http://www.cs.toronto.edu/-tijmen/csc321/slides/lecture_slides_lec6.pdf
4.optim.Adadelta:《AN ADAPTIVE LEARNING RATE METHOD》
5.optim.Adam:《Adam:A Method for Stochastic Optimization》
6.optim.Adamax:《Adam:A Method for Stochastic Optimization》
7.optim.SparseAdam
8.optim.ASGD:《Accelerating Stochastic Gradient Descent using Predictive Variance
Reduction》
9.optim.Rprop:《Martin Riedmiller und Heinrich Braun》
10.optim.LBFGS:BDGS的改进