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