假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理:
如图所示,我们以1000为单位,将数据进行划分,令\(x^{\{1\}}=\{x^{(1)},x^{(2)}……x^{(5000)}\}\), 一般地用\(x^{\{t\}},y^{\{t\}}\)来表示划分后的mini-batch。
注意区分该系列教学视频的符号标记:
假设我们有5,000,000个数据,每1000作为一个集合,计入上面所提到的\(x^{\{1\}}=\{x^{(1)},x^{(2)}……x^{(5000)}\},……\)
for i in range(5000):
注意,mini-batch相比于之前一次性计算所有数据不仅速度快,而且反向传播需要计算5000次,所以效果也更好。
如上面所提到的,我们以1000位单位对数据进行划分,但是这只是为了更方便说明问题才这样划分的,那么我们在实际操作中应该如何划分呢?
首先考虑两个极端情况:
如图示,蓝色收敛曲线表示mini-batch size=m,比较耗时,但是最后能够收敛到最小值;而紫色收敛曲线表示mini-batch size=1,虽然速度可能较快,但是收敛曲线十分曲折,并且最终不会收敛到最小点,而是在其附近来回波动。
说了这么多,那么mini-batch size该如何选择呢?以下是选择的原则:
为了理解后面会提到的各种优化算法,我们需要用到指数加权平均,在统计学中也叫做指数加权移动平均(Exponentially Weighted Moving Averages)。
首先我们假设有一年的温度数据,如下图所示
我们现在需要计算出一个温度趋势曲线,计算方法如下:
\(V_0=0\)
\(V_1=β*V_0+(1-β)θ_1\)
\(……\)
\(V_t=β*V_{t-1}+(1-β)θ_t\)
上面的\(θ_t\)表示第t天的温度,β是可调节的参数,\(V_t\)表示\(\frac{1}{1-β}\)天的每日温度。
我们将上面的公式\(V_t=β*V_{t-1}+(1-β)θ_t\)展开可以得到 (假设β=0.9)
\[V_t=0.1θ_t+0.1*0.9θ_{t-1}+0.1*0.9^2θ_{t-2}+…\]
可以看到在计算第t天的加权温度时,也将之前的温度考虑进来,但是都有一个衰减因子β,并且随着天数的增加,衰减幅度也不断增加。(有点类似于卷积计算)
为什么需要修正呢?我们仔细分析一下就知道了
首先我们假设的是\(β=0.98, V_0=0\),然后由\(V_t=βV_{t-1}+(1-β)θ_t\)可知
\(V_1=0.98V_0+0.02θ_1=0.02θ_1\)
\(V_2=0.98V_1+0.02θ_2=0.0196θ_1+0.02θ_2\)
假设\(θ_1=40℃\),那么\(V_1=0.02*40=0.8℃\),这显然相差太大,同理对于后面的温度的计算也只会是变差越来越大。所以我们需要进行偏差修正,具体方法如下:
\[V_t=\frac{βV_{t-1}+(1-β)θ_t}{1-β^t}\]
注意!!!上面公式中的 \(V_{t-1}\)是未修正的值。
为方便说明,令\(β=0.98,θ_1=40℃,θ_2=39℃\),则
当\(t=1,θ_1=40℃\)时,\(V_1=\frac{0.02*40}{1-0.98}=40\),哇哦~有没有很巧的感觉,再看 当\(t=2,θ_2=39℃\)时,\(V_2=\frac{0.98*V_{t-1}+0.02*θ_2}{1-0.98^2}=\frac{0.98*(0.02*θ_1)+0.02*39}{1-0.98^2}=39.49\)
所以,记住你如果直接用修正后的\(V_{t-1}\)值代入计算就大错特错了
首先介绍一下一般的梯度算法收敛情况是这样的
可以看到,在前进的道路上十分曲折,走了不少弯路,在纵向我们希望走得慢一点,横向则希望走得快一点,所以才有了动量梯度下降算法。
Momentum算法的第t次迭代:
最终得到收敛的效果如下图的红色曲线所示。
该算法中涉及到的超参数有两个,分别是 \(α,β\),其中一般\(β=0.9\)是比较常取的值。
该算法全称叫Root Mean Square Prop(均方根传播)
这一节和上一节讲的都比较概括,不是很深入,所以就直接把算法记录下来吧。
在第t次迭代:
收敛效果(原谅色)
Adam其实是Momentum和RMSprop两个算法的结合,具体算法如下:
该算法中的超参数有\(α,β_1,β_2,ε\),一般来说\(β_1=0.9,β_2=0.999,ε=10^{-8}\)
之前算法中提到的学习率α都是一个常数,这样有可能会一个问题,就是刚开始收敛速度刚刚好,可是在后面收敛过程中学习率偏大,导致不能完全收敛,而是在最低点来回波动。所以为了解决这个问题,需要让学习率能够随着迭代次数的增加进行衰减,常见的计算公式有如下几种:
\[α=\frac{1}{1+decay_rate*epoch_num}α_0\]
decay_rate:衰减率 epoch_num: 迭代次数
举个栗子: 假设\(α_0\)初始化为0.2,decay_rate=1,则α的衰减过程如下:
Epoch | α |
---|---|
1 | 0.1 |
2 | 0.067 |
3 | 0.05 |
…… | …… |
图左中有很多局部最优点。 图右用青色标记出来的点称为鞍点(saddle point),因为和马鞍相似,所以称为鞍点。
鞍点相比于局部最优点要更加棘手,因为从横向上看似乎是最低点,但是纵向上看却不是最低点,所以收敛过程有点缓慢,原因如下:
横向收敛只能沿着红线方向收敛,直到鞍点,而到了鞍点后才能往两边收敛,所以收敛的比较缓慢。
但是momentum和Adam等算法因为能够加速学习,所以收敛速率更快,能够更快地收敛。