Mini-batch 梯度下降
在以前的训练中, 我们总是将所有的数据一次性加入算法进行计算。 这回导致计算缓慢。
我们可以将训练集分割成不同的小份, 例如每份 1000 个,这样不仅可以加快运算速度, 并且每次mini-batch 计算完成都能对权重进行更新。
Mini-batch 与 batch 损失函数走势区别
当使用 batch 直接训练时, 可以看到损失函数是稳步下降的, 但是使用 mini-batch 时, 可能因为每步使用的数据集的数据差异, 导致很多噪声, 但是总体是向下的趋势的
选择你的 Mini-batch Size
- 与样本数量相同: 这就与普通的 batch 没什么不同, 会稳步往中心点下降
- 指定成 1 : 相当于随机梯度下降, 会出现有时下降有时上升, 趋势是往中心去的, 但是不会收敛, 而且也失去了向量化计算带来的优势
- 选择 1 到 m 之间的数: 兼顾了两者, 但是也像随机梯度下降一样, 接近中心但是可能会出现不收敛, 这时候可以使用衰减学习率来进行
如何选择 batch size 呢
- 如果训练集过小(小于 2000): 直接使用batch
- 通常来说将 mini batch 设置成 64 ~ 512(一般是2的次方), 也需要注意内存是否能够承载
指数加权平均(exponentially weight averages)
可以用来平滑时间序列数据, 减少噪声和浮动
具体做法是使用一个权重 β
套入公式: Vt=βVt−1+(1−β)θt
相当于过去多少天的平均: 11−β
理解指数加权平均
V100=0.9V99+0.1θ100V99=0.9V98+0.1θ99V98=0.9V97+0.1θ98可以展开为
V100=0.9V99+0.1θ100 =0.1∗θ100+0.1∗0.9∗θ99+0.1∗0.92∗θ99相当于一个对之前时间的数值进行不断缩减, 直到占比小于 1 / 3 ( 有点疑惑 为什么是 1/3)
使用指数加权平均的优势是不需要保存所需平均天数的所有值, 节约内存和减少计算量, 只需要一个最新值. 这也是导致不精确的原因.
偏差修正(bias correction)
还是看我们之前的那张图, 如果使用 V0=0 实际上并不会得到绿色的线, 而是紫色的线.
所以使用偏差修正公式
可以修复的你的强迫症, 也可以不修. 因为假设使用0.9 十次迭代之后值就已经变得不重要了
动量梯度下降
就是将 指数加权平均 与用到 w b 的导数更新中, 减缓下降时候的摆动噪声
超参的 β 一般是选择 0.9
RMSprop (root mean square prop)
也是为了 减缓下降时候的摆动噪声, 为了区分 动量梯度下降 中的 β 这边使用 β2
为了防止分母变成 0 需要上 ξ 通常的值是 10−8
Adam (Adaptive Moment Estimation: Moment + RMSprop)
结合了之前的两者
Vdw=0,Sdw=0,Vdb=0,Sdb=0Vdw=β1⋅Vdw+(1−β1)⋅dwVdb=β1⋅Vdb+(1−β1)⋅db→Moment的β1Sdw=β2⋅Sdw+(1−β2)⋅d2wSdb=β2⋅Sdb+(1−β2)⋅d2b→RMSprop的β2Vcurrentdw=Vdw1−βt1Vcurrentdb=Vdb1−βt1Scurrentdw=Sdw1−βt2Scurrentdb=Sdb1−βt2W:=W−αVcurrentdw√Scurrentdw+ξb:=b−αVcurrentdb√Scurrentdb+ξ这里面有几个超参可以调整, 但是一般都是使用默认值:
- α: 需要自己调
- β1: 一般默认 0.9
- β2: 一般默认 0.999
- ξ: 一般默认 10−8
学习率衰减
因为使用mini-batch 进行训练时, 并不会精确的收敛, 而是会在最小值附近摆动. 因为学习率是固定的值.
而使用衰减二点学习率, 训练的最初阶段还是会快速下降, 但是在接近最小值时, 与固定学习率在大范围摆动不同, 将会在最小值的周围区域小幅度摆动.
因为在开始训练初期你能够接受大范围的摆动,但是接近时需要较小的调整幅度.
有以下集中可供选择:
- α=11+deacy−rate⋅epoch−numα0
- α=0.95epoch−numα0
- α=k√epoch−numα0
- 还有离散和手动的方式
局部最优的问题
我们在优化过程中可能并不是会到局部最优点, 而可能是鞍点.
因为假设你的参数是有 2W 个, 而你达到一个局部最优点的可能性是 1/2W 所以你更可能遇到的是鞍点
而平稳段则是影响你学习的一个重要因素, 此处的导数可能长时间为 0 , 导致你无法前进