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)
可以用来平滑时间序列数据, 减少噪声和浮动
具体做法是使用一个权重
套入公式:
相当于过去多少天的平均:
理解指数加权平均
可以展开为
相当于一个对之前时间的数值进行不断缩减, 直到占比小于 1 / 3 ( 有点疑惑 为什么是 1/3)
使用指数加权平均的优势是不需要保存所需平均天数的所有值, 节约内存和减少计算量, 只需要一个最新值. 这也是导致不精确的原因.
偏差修正(bias correction)
还是看我们之前的那张图, 如果使用 实际上并不会得到绿色的线, 而是紫色的线.
所以使用偏差修正公式
可以修复的你的强迫症, 也可以不修. 因为假设使用0.9 十次迭代之后值就已经变得不重要了
动量梯度下降
就是将 指数加权平均 与用到 w b 的导数更新中, 减缓下降时候的摆动噪声
超参的 一般是选择 0.9
RMSprop (root mean square prop)
也是为了 减缓下降时候的摆动噪声, 为了区分 动量梯度下降 中的 这边使用
为了防止分母变成 0 需要上 通常的值是
Adam (Adaptive Moment Estimation: Moment + RMSprop)
结合了之前的两者
这里面有几个超参可以调整, 但是一般都是使用默认值:
- $ \alpha $: 需要自己调
- $ \beta_{1} $: 一般默认 0.9
- $ \beta_{2} $: 一般默认 0.999
- $ \xi $: 一般默认 $ 10^{-8} $
学习率衰减
因为使用mini-batch 进行训练时, 并不会精确的收敛, 而是会在最小值附近摆动. 因为学习率是固定的值.
而使用衰减二点学习率, 训练的最初阶段还是会快速下降, 但是在接近最小值时, 与固定学习率在大范围摆动不同, 将会在最小值的周围区域小幅度摆动.
因为在开始训练初期你能够接受大范围的摆动,但是接近时需要较小的调整幅度.
有以下集中可供选择:
- $ \alpha = \frac{1}{1 + deacy-rate \cdot epoch-num} \alpha_{0} $
- $ \alpha = 0.95^{epoch-num} \alpha_{0} $
- $ \alpha = \frac{k}{ \sqrt{epoch-num} } \alpha_{0} $
- 还有离散和手动的方式
局部最优的问题
我们在优化过程中可能并不是会到局部最优点, 而可能是鞍点.
因为假设你的参数是有 2W 个, 而你达到一个局部最优点的可能性是 1/2W 所以你更可能遇到的是鞍点
而平稳段则是影响你学习的一个重要因素, 此处的导数可能长时间为 0 , 导致你无法前进