Tensorflow2.0筆記
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
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是美好的免費午餐”。你因此必須在訓練的過程中時常在驗證集上監測誤差,在驗證集上如果損失函式不再顯著地降低,那麼應該提前結 束訓練。
-
演算法引數的初始值選擇。 初始值不同,獲得的最小值也有可能不同,因此梯度下降求得的只是區域性最小值;當然如果損失函式是凸函式則一定是最優解。由於有區域性最優解的風險,需要多次用不 同初始值執行演算法,關鍵損失函式的最小值,選擇損失函式最小化的初值。