本笔记系列参照吴恩达深度学习课程的视频和课件,并在学习和做练习过程中从CSDN博主何宽分享的文章中得到了帮助,再此表示感谢。
本周主要学习的内容有:
mini-batch梯度下降法、指数加权平均和偏差修正、动量梯度下降法、RMSprop、Adam优化算法、学习率衰减、局部最优的问题
本周学习的主要疑难点:
1.指数加权移动平均(exponentially weighted moving average)
这是这周的学习过程中遇到的目前为止最难懂的一个知识点,花了几十个小时去理解这个概念,虽然它不是很会晦涩难懂的算法,但我就是花了那么多时间…等我把思维缕清后,往前看的时候,发现我其实犯了一个很大的错误,那就是首先我没有这样的思维概念,那就是吴老师为什么在这周的课程里讲到“指数加权移动平均”,所以下面我将从为什么深度学习需要“指数加权移动平均”的角度出发来解释这个知识点。
图
1
图1
图1
图1展示使用梯度下降算法的模型训练过程的效果图,中间红点就是模型代价函数的最小值(最优解)。因此我们可以看到以下几点:
- 在训练的过程中,代价函数在纵轴上上下波动,横轴上不停的往最优解移动。
- 纵轴上下波动太大导致我们在横轴上的移动速度不是很快。
为了加快横轴上的移动速度,我们可以调大学习速率,但这样也同样加大了纵轴摆动,因而会加大误差,或者我们不改变学习速率,增加迭代次数,模型也是会达到最优解,但那样就增加了训练时间。所以我们能不能不改变学习速率也不改变迭代次数,减少模型的训练时间了?想到这儿,我们就发现了问题的根源是要解决梯度下降算法中的纵轴上下摆动!
图
2
图2
图2
图2显示了伦敦地区上半年每天的温度分布图,看着很混乱,无法看出该地区的温度变化趋势,因此我们需要拟合一条相对平滑的曲线,使其在垂直方向波动不大,而指数加权移动平均就可以满足这样的要求。
指数加权移动平均是指:给定超参数
0
≤
β
<
1
0≤\beta<1
0≤β<1,当前时间步t的变量
y
t
y_t
yt是上一时间步t-1的变量
y
t
−
1
y_{t-1}
yt−1和当前时间步另一变量
x
t
x_t
xt的线性组合:
y
t
=
β
y
t
−
1
+
(
1
−
β
)
x
t
(1)
y_t=\beta y_{t-1}+(1-\beta)x_t\tag{1}
yt=βyt−1+(1−β)xt(1)
将指数加权移动平均运用到图2的示例中,我们可以设置当前时间步t的预测温度
v
t
v_t
vt与上一时间步t-1的预测温度值
v
t
−
1
v_{t-1}
vt−1和当前时间t的温度实际值
x
t
x_t
xt的表达式为:
v
t
=
β
v
t
−
1
+
(
1
−
β
)
x
t
(2)
v_t=\beta v_{t-1}+(1-\beta)x_t\tag{2}
vt=βvt−1+(1−β)xt(2)
令
v
0
=
0
v_0=0
v0=0
v
1
=
β
v
0
+
(
1
−
β
)
θ
1
v_1=\beta v_0+(1-\beta)\theta_1
v1=βv0+(1−β)θ1
v
2
=
β
v
1
+
(
1
−
β
)
x
2
v_2=\beta v_1+(1-\beta)x_2
v2=βv1+(1−β)x2
v
3
=
β
v
2
+
(
1
−
β
)
x
3
v_3=\beta v_2+(1-\beta)x_3
v3=βv2+(1−β)x3
⋮
\vdots
⋮
v
t
=
(
1
−
β
)
(
θ
t
+
β
θ
t
−
1
+
β
2
θ
t
−
2
+
.
.
.
+
β
t
−
1
θ
1
)
(3)
v_t=(1-\beta)(\theta_t+\beta\theta_{t-1}+\beta^2\theta_{t-2}+...+\beta^{t-1}\theta_1)\tag{3}
vt=(1−β)(θt+βθt−1+β2θt−2+...+βt−1θ1)(3)
可以看到
v
t
v_t
vt是前面所有时刻实际值
θ
\theta
θ加权后的值,但在实际处理过程中,我们不需要给那么多数据加权,因为
令
n
=
1
1
−
β
n=\frac{1}{1-\beta}
n=1−β1,所以
β
n
=
(
1
−
1
n
)
n
\beta^n=(1-\frac{1}{n})^n
βn=(1−n1)n,当
β
→
1
\beta \rightarrow 1
β→1,
n
→
∞
n \rightarrow \infty
n→∞,
β
n
=
(
1
−
1
n
)
n
=
e
−
1
≈
0.3679
\beta^n=(1-\frac{1}{n})^n = e^{-1}\approx0.3679
βn=(1−n1)n=e−1≈0.3679,在统计学中把
e
−
1
e^{-1}
e−1当作很小的权重,可以忽略不计,所以公式(3)中指数
t
≥
1
1
−
β
t≥\frac{1}{1-\beta}
t≥1−β1的项可以忽略不计。至此,我们叫这种方法为指数加权移动平均法。比如当
β
=
0.9
\beta=0.9
β=0.9,
v
t
v_t
vt取其前面10个值加权平均得到,而当
β
=
0.98
\beta=0.98
β=0.98,
v
t
v_t
vt取其前面50个值加权平均得到。
在吴老师的课件上我们可以看到,当
β
=
0.9
\beta=0.9
β=0.9时,拟合的函数图像如图3中红色曲线所示:
图
3
图3
图3
当
β
=
0.98
\beta=0.98
β=0.98时,拟合的函数图像如图4中绿色曲线所示,当
β
=
0.5
\beta=0.5
β=0.5时,拟合的函数图像如图4中黄色曲线所示
图
4
图4
图4
很明显,我们从图3和图4中可以看到,随着
β
\beta
β增大,拟合曲线在垂直方向的摆动逐渐减小(垂直方向的摆动黄色曲线>红色曲线>绿色曲线),但会出现延迟(实时性:黄色曲线>红色曲线>绿色曲线)。因此指数加权移动平均可以有效减少曲线在垂直方向上的摆动,一般建议
β
取
0.9
\beta取0.9
β取0.9。
讲到这儿,我们回到上面提到的问题,想到这儿,我们就发现了问题的根源是要解决梯度下降算法中的纵轴上下摆动!,采用指数加权移动平均可以有效地降低梯度在纵轴上的上下摆动。
2.动量梯度下降算法
动量梯度下降算法是指计算梯度的指数加权平均数,并利用该梯度更新我们模型的权重。
第t次迭代时,在mini-batch上计算梯度
d
W
,
d
b
dW,db
dW,db,使用动量梯度下降法的公式如下:
v
d
W
=
β
v
d
W
+
(
1
−
β
)
d
W
(4)
v_{dW}=\beta v_{dW}+(1-\beta)dW\tag{4}
vdW=βvdW+(1−β)dW(4)
v
d
b
=
β
v
d
b
+
(
1
−
β
)
d
b
(5)
v_{db}=\beta v_{db}+(1-\beta)db\tag{5}
vdb=βvdb+(1−β)db(5)
W
=
W
−
α
v
d
W
,
b
=
b
−
α
v
d
b
(6)
W=W-\alpha v_{dW},b=b-\alpha v_{db}\tag{6}
W=W−αvdW,b=b−αvdb(6)
v
d
W
,
v
d
b
v_{dW},v_{db}
vdW,vdb初始化为维度与
d
W
,
d
b
dW,db
dW,db相同的0矩阵。
结合上面的分析,理解公式(4)(5)(6)就不难了吧,下面解释下为什么叫“动量梯度下降”,初始化时
β
v
d
W
\beta v_{dW}
βvdW为0,我们可以看成动量,而
(
1
−
β
)
d
W
(1-\beta)dW
(1−β)dW微分项可以看成是一个加速度,这样,动量梯度下降就像是在碗里放一个小球,我们的微分项就相当于不断地给这个小球加速度,让它下降的越来越快,但因为
β
<
1
\beta<1
β<1,相当于下降过程中摩擦力的作用,所以动量
β
v
d
W
\beta v_{dW}
βvdW不会越来越大,而梯度下降算法,每次更新都只是基于前一次梯度值,没有加速趋势,所以动量梯度下降会比梯度下降快。
参考:
http://zh.gluon.ai/chapter_optimization/momentum.html
https://zhuanlan.zhihu.com/p/32335746