机器学习中,有很多优化方法来试图寻找模型的最优解。比如神经网络中可以采取最基本的梯度下降法。
梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent)。
评价:标准梯度下降法主要有两个缺点:
评价:
评价:
动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。
NAG在Tensorflow中与Momentum合并在同一函数tf.train.MomentumOptimizer中,可以通过参数配置启用。
自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。
目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
思想:
算法描述:
思想:
算法描述:
思想:AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长即:
算法描述:
评价:
思想:
算法描述:
评价:Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
终于结束的漫长的理论分析,下面对各种优化器做一些有趣的比较。
(1) 示例一
上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:
① 下降速度:
② 下降轨迹:
(2) 示例二
上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:
(3) 示例三
上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:
① 在运行速度方面
② 在收敛轨迹方面
Tensorflow中封装了一系列的优化器:
1. tf.train.GradientDescentOptimizer
2. tf.train.AdadeltaOptimizer
3. tf.train.AdagradOptimizer
4. tf.train.AdagradDAOptimizer
5. tf.train.MomentumOptimizer
6. tf.train.AdamOptimizer
7. tf.train.FtrlOptimizer
8. tf.train.ProximalGradientDescentOptimizer
9. tf.train.ProximalAdagradOptimizer
10. tf.train.RMSPropOptimizer
下面采用选取几种优化器应用于UCI数据集iris.data简单的分类问题。为了简单起见,初始代码可以参考机器学习:过拟合、神经网络Dropout中没使用Dropout之前的代码。修改一行调用优化器的代码:
(1) 使用SGD优化器
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
第1个训练周期训练集的准确率为:33.3%, 测试集的准确率为:32.2%
第2个训练周期训练集的准确率为:33.3%, 测试集的准确率为:32.2%
第3个训练周期训练集的准确率为:38.9%, 测试集的准确率为:35.6%
第4个训练周期训练集的准确率为:62.2%, 测试集的准确率为:62.7%
第5个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第6个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第7个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第8个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第9个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第10个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
(2) 使用AdaGrad优化器
train_step = tf.train.AdagradOptimizer(0.01).minimize(loss)
第1个训练周期训练集的准确率为:33.3%, 测试集的准确率为:32.2%
第2个训练周期训练集的准确率为:35.6%, 测试集的准确率为:32.2%
第3个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第4个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第5个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第6个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第7个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第8个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第9个训练周期训练集的准确率为:67.8%, 测试集的准确率为:69.5%
第10个训练周期训练集的准确率为:68.9%, 测试集的准确率为:69.5%
(3) 使用Momentum优化器
train_step = tf.train.MomentumOptimizer(learning_rate=0.01, momentum=0.9).minimize(loss)
第1个训练周期训练集的准确率为:58.9%, 测试集的准确率为:61.0%
第2个训练周期训练集的准确率为:40.0%, 测试集的准确率为:42.4%
第3个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第4个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第5个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第6个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第7个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第8个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第9个训练周期训练集的准确率为:67.8%, 测试集的准确率为:69.5%
第10个训练周期训练集的准确率为:70.0%, 测试集的准确率为:67.8%
(4) 使用NAG优化器
train_step = tf.train.MomentumOptimizer(learning_rate=0.01, momentum=0.9, use_nesterov=True).minimize(loss)
第1个训练周期训练集的准确率为:37.8%, 测试集的准确率为:39.0%
第2个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第3个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第4个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第5个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第6个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第7个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第8个训练周期训练集的准确率为:67.8%, 测试集的准确率为:69.5%
第9个训练周期训练集的准确率为:70.0%, 测试集的准确率为:69.5%
第10个训练周期训练集的准确率为:71.1%, 测试集的准确率为:69.5%
(5) 使用RMSProp优化器
train_step = tf.train.RMSPropOptimizer(0.01).minimize(loss)
第1个训练周期训练集的准确率为:33.3%, 测试集的准确率为:32.2%
第2个训练周期训练集的准确率为:33.3%, 测试集的准确率为:32.2%
第3个训练周期训练集的准确率为:35.6%, 测试集的准确率为:35.6%
第4个训练周期训练集的准确率为:48.9%, 测试集的准确率为:49.2%
第5个训练周期训练集的准确率为:35.6%, 测试集的准确率为:35.6%
第6个训练周期训练集的准确率为:38.9%, 测试集的准确率为:42.4%
第7个训练周期训练集的准确率为:51.1%, 测试集的准确率为:50.8%
第8个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第9个训练周期训练集的准确率为:60.0%, 测试集的准确率为:62.7%
第10个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
(6) 使用Adam优化器
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
第1个训练周期训练集的准确率为:33.3%, 测试集的准确率为:33.9%
第2个训练周期训练集的准确率为:36.7%, 测试集的准确率为:37.3%
第3个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第4个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第5个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第6个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第7个训练周期训练集的准确率为:67.8%, 测试集的准确率为:67.8%
第8个训练周期训练集的准确率为:71.1%, 测试集的准确率为:67.8%
第9个训练周期训练集的准确率为:71.1%, 测试集的准确率为:69.5%
第10个训练周期训练集的准确率为:71.1%, 测试集的准确率为:69.5%
点评:Adam优化器的表现可圈可点,比RMSProp优化器要稳定。
(2) 使用AdaDelta优化器
优化器的代码为:
train_step = tf.train.AdadeltaOptimizer(1).minimize(loss)
第1个训练周期训练集的准确率为:60.0%, 测试集的准确率为:64.4%
第2个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第3个训练周期训练集的准确率为:66.7%, 测试集的准确率为:66.1%
第4个训练周期训练集的准确率为:66.7%, 测试集的准确率为:67.8%
第5个训练周期训练集的准确率为:67.8%, 测试集的准确率为:69.5%
第6个训练周期训练集的准确率为:70.0%, 测试集的准确率为:69.5%
第7个训练周期训练集的准确率为:72.2%, 测试集的准确率为:71.2%
第8个训练周期训练集的准确率为:73.3%, 测试集的准确率为:76.3%
第9个训练周期训练集的准确率为:75.6%, 测试集的准确率为:84.7%
第10个训练周期训练集的准确率为:76.7%, 测试集的准确率为:88.1%
总评:
为什么说随机最速下降法(SGD)是一个很好的方法?
深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
Lan Goodfellow: Deep learning. 深度学习【中文版】
常见优化算法 (caffe和tensorflow对应参数)