###### tags: `人工智慧`
# 3. Optimizer 優化器
---
# 優化器是甚麼?
前面有提過,我們一串資料,輸入進去 Model 要如何找出最好的 Function 呢?可以用 Loss Function 去進行檢測當前參數的好壞。不過檢測後,要怎麼調整參數哩?這時候就是 Optimizer 發功的時候!
**Optimizer 簡單來說,就是拿 Loss Function 的運算結果並進行運算,再根據不同的方式來進行參數 (weight, bias) 的更新。**
常見的 Optimizer 有 SGD, RMSprop, adam等等。


# 優化器種類
## 1. Stochastic Gradient Descent (隨機梯度下降法)
這就是我們常說的 Gradient Descent 也就是梯度下降法。也是最基礎的 optimizer 之一。在 keras 中的 SGD 是支援動量的!所以也可以實現 Momentum 以及 Nesterov Accelerated Gradient 這兩個方法。
缺點
* 容易卡在鞍點。
* 因為更新較為頻繁,所以 loss 常有不穩定的震盪。
## 2. Adagrad (Adaptive gradient algorithm)
Adagrad 針對每個參數客制化的值,對學習率進行約束,依照梯度去調整學習率。
梯度更新規則:

優點
* 加快訓練速度,在前期梯度較小時(較平坦)能夠放大梯度,後期梯度較大時(陡峭)能約束梯度,
缺點
* 訓練中後段時有可能梯度趨近於 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)