###### tags: `人工智慧` # 3. Optimizer 優化器 --- # 優化器是甚麼? 前面有提過,我們一串資料,輸入進去 Model 要如何找出最好的 Function 呢?可以用 Loss Function 去進行檢測當前參數的好壞。不過檢測後,要怎麼調整參數哩?這時候就是 Optimizer 發功的時候! **Optimizer 簡單來說,就是拿 Loss Function 的運算結果並進行運算,再根據不同的方式來進行參數 (weight, bias) 的更新。** 常見的 Optimizer 有 SGD, RMSprop, adam等等。 ![](https://miro.medium.com/max/786/1*XVFmo9NxLnwDr3SxzKy-rA.gif) ![](https://miro.medium.com/max/1240/1*SjtKOauOXFVjWRR7iCtHiA.gif) # 優化器種類 ## 1. Stochastic Gradient Descent (隨機梯度下降法) 這就是我們常說的 Gradient Descent 也就是梯度下降法。也是最基礎的 optimizer 之一。在 keras 中的 SGD 是支援動量的!所以也可以實現 Momentum 以及 Nesterov Accelerated Gradient 這兩個方法。 缺點 * 容易卡在鞍點。 * 因為更新較為頻繁,所以 loss 常有不穩定的震盪。 ## 2. Adagrad (Adaptive gradient algorithm) Adagrad 針對每個參數客制化的值,對學習率進行約束,依照梯度去調整學習率。 梯度更新規則: ![](https://i.imgur.com/A1dGicp.png) 優點 * 加快訓練速度,在前期梯度較小時(較平坦)能夠放大梯度,後期梯度較大時(陡峭)能約束梯度, 缺點 * 訓練中後段時有可能梯度趨近於 0,而過早结束學習過程。 ## 3. Adadelta 是對 Adagrad 的改進,和 Adagrad 相比,就是分母的 G 換成了過去的梯度平方的衰減平均值,指數衰減平均值 ## 4. RMSprop Geoff Hinton 所提出,可改善 AdaGrad 的缺點。RMSProp 比 AdaGrad 多了一個衰減系統,它會聯繫之前的每一次梯度變化情況來更新學習率。 RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題 ## 5. Adam 是實務上常用的方法,直覺來說 Adam 是 AdaGrad/RMSprop/Adadelta 跟 momentum 的融合,優點主要在於它有做偏置校正,使每次迭代學習率都有個確定範圍,讓參數的更新較為平穩。 --- # 如何選擇優化演算法 如果資料是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。 RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。 Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum, 隨著梯度變的稀疏,Adam 比 RMSprop 效果會好。 整體來講,Adam 是最好的選擇。 很多論文裡都會用 SGD,沒有 momentum 等。SGD 雖然能達到極小值,但是比其它演算法用的時間長,而且可能會被困在鞍點。 如果需要更快的收斂,或者是訓練更深更復雜的神經網路,需要用一種自適應的演算法。 # 參考 * [keras Optimizers](https://keras.io/api/optimizers/) * [[精進魔法] Optimization:優化深度學習模型的技巧(中)- Adaptive Learning Rates](https://ithelp.ithome.com.tw/articles/10204032) * [機器學習入門——常用優化器(Optimizer)的種類與選擇](https://www.796t.com/content/1545433422.html) * [各種優化器(Optimizer) 大車拼實驗](https://ithelp.ithome.com.tw/articles/10270394?sc=iThelpR)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up