一、可視化比較
1、示例一
上圖描述了在一個曲面上,6種優化器的表現,從中可以大致看出:
① 下降速度:
三個自適應學習優化器Adagrad、RMSProp與AdaDelta的下降速度明顯比SGD要快,其中,Adagrad和RMSProp齊頭並進,要比AdaDelta要快。
兩個動量優化器Momentum和NAG由於剛開始走了岔路,初期下降的慢;隨着慢慢調整,下降速度越來越快,其中NAG到后期甚至超過了領先的Adagrad和RMSProp。
② 下降軌跡:
SGD和三個自適應優化器軌跡大致相同。兩個動量優化器初期走了“岔路”,后期也調整了過來。
2、示例二
上圖在一個存在鞍點的曲面,比較6個優化器的性能表現,從圖中大致可以看出:
三個自適應學習率優化器沒有進入鞍點,其中,AdaDelta下降速度最快,Adagrad和RMSprop則齊頭並進。
兩個動量優化器Momentum和NAG以及SGD都順勢進入了鞍點。但兩個動量優化器在鞍點抖動了一會,就逃離了鞍點並迅速地下降,后來居上超過了Adagrad和RMSProp。
很遺憾,SGD進入了鞍點,卻始終停留在了鞍點,沒有再繼續下降。
3、示例三
上圖比較了6種優化器收斂到目標點(五角星)的運行過程,從圖中可以大致看出:
① 在運行速度方面
兩個動量優化器Momentum和NAG的速度最快,其次是三個自適應學習率優化器AdaGrad、AdaDelta以及RMSProp,最慢的則是SGD。
② 在收斂軌跡方面
兩個動量優化器雖然運行速度很快,但是初中期走了很長的”岔路”。
三個自適應優化器中,Adagrad初期走了岔路,但后來迅速地調整了過來,但相比其他兩個走的路最長;AdaDelta和RMSprop的運行軌跡差不多,但在快接近目標的時候,RMSProp會發生很明顯的抖動。
SGD相比於其他優化器,走的路徑是最短的,路子也比較正。
二、應用於簡單分類問題的比較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%
點評:從運行結果上可以看出使用AdaGrad優化器相比於SGD似乎沒有較大的提升。
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%
點評:Momentum優化器略優於AdaGrad優化器和SGD,但收斂速度要比后兩者快(第1-2個訓練周期就可以達到60%的准確率)。
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%
點評:NAG和Momentum結果差不多,NAG似乎好那么一點點。
5、使用RMSProp優化器優化器的代碼為:
train_step = tf.train.RMSPropOptimizer(0.01).minimize(loss)
運行結果(RMSProp運行結果不穩定,下面是出現比較多的相近結果)
第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%
點評:RMSProp優化器的效果有點不理想,而且不穩定。
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優化器要穩定。
7、使用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%
點評:AdaDelta優化器似乎能在本例中奪魁。
三、總評:
通過對比10個訓練周期的准確率結果可以看出,其他的優化器(除了RMSProp,有點意外,可能本例不適合)或多或少都優於SGD。從收斂速度上看,兩個動量優化器Momentum和NAG的速度相比於除了AdaDelta之外的優化器要快,1-2個周期就能達到60%的准確率。而本例中表現最好的優化器是AdaDelta,無論是收斂速度還是十周期的准確率都比其他優化器要好的多。
四、優化器的選擇
那種優化器最好?該選擇哪種優化算法?目前還沒能夠達達成共識。Schaul et al (2014)展示了許多優化算法在大量學習任務上極具價值的比較。雖然結果表明,具有自適應學習率的優化器表現的很魯棒,不分伯仲,但是沒有哪種算法能夠脫穎而出。
目前,最流行並且使用很高的優化器(算法)包括SGD、具有動量的SGD、RMSprop、具有動量的RMSProp、AdaDelta和Adam。在實際應用中,選擇哪種優化器應結合具體問題;同時,也優化器的選擇也取決於使用者對優化器的熟悉程度(比如參數的調節等等)。
2. 應用於簡單分類問題的比較
Tensorflow中封裝了一系列的優化器: