深度学习的优化:理论和算法《Optimization for d
5.训练神经网络的通用算法
前面讨论了一些神经网络的特定tricks, 这些小技巧需要结合最优化方法,如SGD。通常我们希望得到一个快速且表现好的方法。然而更快的方法通常表现不是最好的,因此我们设定一个可以接受的速度值,在满足这个速度值的情况下,尽可能的提高模型表现。
5.1 SGD 和学习率的计划
当前,最流行的方法是SGD和他的变种,SGD每次选择一个样本更新权重。在每个EPOCH开始时,进行shuffle操作。
Reasons for SGD: 内存限制和更快的收敛。使用SGD 而不是GD的主要原因是内存限制和更快的收敛速度。单个GPU 或者 CPU不能载入很多的样本来计算梯度。然而即使存在内存限制,也可以通过分batch 然后在所有样本结束后才更新参数。相比与GD,SGD有更快的收敛速度。
Vanilla learning rate schedules
相似的例子是在非线性过程中,选择learning rate 同样非常重要,在简单情况下的SGD,恒定的learning rate 表现的很好,在大多数情况下和大部分数据集中可以实现比较小的训练和测试误差。另一种比较流行的做法是每过几个EPOCH 降低学习率。例如每5-10个 eposchs 学习率减半。
Learning rate warmup
在开始的时候使用非常小的learning rate,然后过几次迭代使用正常的learning rate。 这种方法在ResNet , Large-batch training, Transformer 或 BERT 中使用比较常见。
Cyclical learning rate.
在一个epoch中 让学习率在一个范围内上下波动
5.2 SGD 理论分析
常数vs 下降的学习率: 目前的SGD收敛分析。
使用恒定学习率的SGD 很可能陷入confusion zone 然后不断的在这个区间上跳跃。早期的研究者通常建议使用消失的学习率,如, 但是最近恒定的学习率在很多情况下也表现很好。对于实际操作,在学习率上的错误假设会使得算法收敛更加困难。从理论上看,使用消失的学习率可能会导致更好的表现。
5.3 Momentum and accelerated SGD
另一种带动量SGD或者带Nesterov 动量的SGD,
Momentum 方法比vanilla SGD 更快,但是也会带来凸优化方面的问题。
SGD with momentum 的理论优势
动量方法能否加快收敛速度不是很确定。有两种方法可以得到更快的收敛速度。
1.使用variance reduction ,更高级的优化方法可以提高收敛速率。但是这些方法有些复杂,并不在大量情况下使用
2.考虑问题的结构,简单的SGD变种可以实现加速。
对于非凸问题加速SGD
对于通用的非凸问题,加速算法通常非常困难,即使在batch training,加速梯度算法不能保证比GD得到更好的解。
5.4 Adaptive gradient methods: AdaGrad,RMSProp,Adam and more
第三种流行的方法称为自适应方法,如AdaGrad,RMSProp, Adam.
And 。换句话说 学习率在第k步的时候从标准的SGD变化到了另一个值。
AdaGrad 被证明对于凸优化问题和非凸优化问题。
AdaGrad的缺点是它对待所有的过去的梯度都相同,当我们使用指数衰减过去的权重,变为RMSProp
在RMSProp中,
在Adam中 结合了RMSProp 和 momentum method。
使用自适应方法的经验:
AdaGrad 是用来处理稀疏和高度不平衡数据的。
Adam 是最近非常流行的方法。 Adam 收敛相比于vanilla SGD 和 SGD with momentum 更快,但是泛化能力比较差。之后研究者发现 精细调参的SGD或SGD with momentum 会比Adam 在训练集和测试集的表现更好。但是Adam 对于超参数和初始值不敏感,Adam 是 most tunable 对于大多数问题.
自适应方法的理论结果
虽然Adam被认识在实际中收敛,并且原始的论文有收敛证明。但是最近的研究中Adam 和RMSProp被认为解决凸优化问题会发散。为了修复发散问题,AMSGrad被提议,改变了Adam的更新
5.5 大规模的分布式计算
神经网络重要的主题是使用大规模分布式计算。
规模化的基本分析 通常来说,又K个机器最多可以加速K倍的计算。在实际中,加速比通常有三部分组成:沟通时间,同步时间,收敛速度。忽略沟通时间和同步时间,加速比K可以在机器不分享共同特征的情况下实现。另一种极端情况是数据在不同的机器相同,加速比接近1。实际上,加速比通常在1到K之间,深度学习研究者通常使用缩放销量来表达不同机器之间的加速比。