Tensorflow2.0笔记
本博客为Tensorflow2.0学习笔记,感谢北京大学微电子学院曹建老师
6.4 AdaDelta
TensorFlow API:tf.keras.optimizers.Adadelta
代码实现:
# AdaDelta
beta = 0.999
v_w = beta * v_w + (1 - beta) * tf.square(grads[0])
v_b = beta * v_b + (1 - beta) * tf.square(grads[1])
delta_w = tf.sqrt(u_w) * grads[0] / tf.sqrt(v_w)
delta_b = tf.sqrt(u_b) * grads[1] / tf.sqrt(v_b)
u_w = beta * u_w + (1 - beta) * tf.square(delta_w)
u_b = beta * u_b + (1 - beta) * tf.square(delta_b)
w1.assign_sub(delta_w)
b1.assign_sub(delta_b)
6.5 Adam
TensorFlow API: tf.keras.optimizers.Adam
6.5 优化器选择
各优化器来源:
SGD(1952):https://projecteuclid.org/euclid.aoms/1177729392(源自回答)
SGD with Momentum(1999):https://www.sciencedirect.com/science/article/abs/pii/ S0893608098001166
SGD with Nesterov Acceleration(1983):由Yurii Nesterov提出
AdaGrad(2011): http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf RMSProp(2012): http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6. pdf
AdaDelta(2012): https://arxiv.org/abs/1212.5701 Adam:(2014) https://arxiv.org/abs/1412.6980
(对上述算法非常好的可视化:https://imgur.com/a/Hqolp)
很难说某一个优化器在所有情况下都表现很好,我们需要根据具体任务选取优化器。一些优化器在 计算机视觉任务表现很好,另一些在涉及RNN网络时表现很好,甚至在稀疏数据情况下表现更出色。
总结上述,基于原始SGD增加动量和Nesterov动量,RMSProp是针对AdaGrad学习率衰减过快 的改进,它与AdaDelta非常相似,不同的一点在于AdaDelta采用参数更新的均方根(RMS)作为分 子。Adam在RMSProp的基础上增加动量和偏差修正。如果数据是稀疏的,建议用自适用方法,即Adagrad, RMSprop, Adadelta, Adam。RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。随着梯度变的稀疏,Adam 比 RMSprop 效果会好。总的来说,Adam整体上是最好的选择。
然而很多论文仅使用不带动量的vanilla SGD和简单的学习率衰减策略。SGD通常能够达到最小点,但是相对于其他优化器可能要采用更长的时间。采取合适的初始化方法和学习率策略,SGD更加可 靠,但也有可能陷于鞍点和极小值点。因此,当在训练大型的、复杂的深度神经网络时,我们想要快速 收敛,应采用自适应学习率策略的优化器。
如果是刚入门,优先考虑Adam或者SGD+Nesterov Momentum。
算法没有好坏,最适合数据的才是最好的,永远记住:No free lunch theorem。
6.7 优化算法的常用tricks
-
首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑SGD+Nesterov Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam)
-
选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。
-
充分了解你的数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
-
根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进 行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。
-
先用小数据集进行实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size.)因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
-
考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。
-
充分打乱数据集(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。在每一轮迭代后对训 练数据打乱是一个不错的主意。
-
训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数 据的监控是为了避免出现过拟合。
-
制定一个合适的学习率衰减策略。可以使用分段常数衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习 率。
-
Early stopping。如Geoff Hinton所说:“Early Stopping是美好的免费午餐”。你因此必须在训练的过程中时常在验证集上监测误差,在验证集上如果损失函数不再显著地降低,那么应该提前结 束训练。
-
算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不 同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。