Gradient Descent Optimization Algorithms === ###### tags: `論文、部落格` ## 參考資料 * [機器/深度學習-基礎數學(三):梯度最佳解相關算法(gradient descent optimization algorithms)](https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%B8%89-%E6%A2%AF%E5%BA%A6%E6%9C%80%E4%BD%B3%E8%A7%A3%E7%9B%B8%E9%97%9C%E7%AE%97%E6%B3%95-gradient-descent-optimization-algorithms-b61ed1478bd7) ## Gradient Descent(GD) 原始的 Gradient Descent,Gradient g 是用 Loss 對參數做偏微分算出來的。下面的 f() 就是把 Loss 對參數做偏微分的過程。 \begin{equation} w^{(t+1)}=w^t-η*g^t \end{equation} \begin{equation} g_t = f(w^t) \end{equation} ```python= x = x - lr * g ``` ## Stochastic Gradient Descent(SGD) 把 Training Data 分成很多 Mini-batch,每算完一個 Mini-batch 的 Gradient 就更新一次;或是算完全部 Mini-batch 的 Gradient,平均後更新一次。 ## Momentum 會考慮之前的 Gradient,所以如果之前 Gradient 是負的,而這次是正的,就會達到緩衝的效果。m 通常等於 0.9。 \begin{equation} v^{(t)} = \begin{cases} η*g_t,\ t=0\\ mv^{(t-1)}+η*g^{(t)},\ t>=1 \end{cases}% \end{equation} \begin{equation} w^{(t+1)}=w^{(t)}-v^{(t)} \end{equation} ## Adagrad (Adative Gradient) 調整 Learning Rate,一開始用比較大,越後面越小,避免 Local Minimum。每次都會除以歷屆 Gradient 的平方和開根號,ε 通常等於 1e-7,避免分母為 0。 \begin{equation} w^{(t+1)}_i = w^{(t)} - \dfrac{η}{\sqrt{\sum_{t'=1}^{t}g_{t',1}^2} + ε} * g_{t,1} \end{equation} ## RMSProp 由於擔心 Adagrad 對 Learning Rate 的修正過大,所以改用 Gradient 平方的平均值,ρ 通常等於 0.9。 \begin{equation} w^{(t+1)}_i = w^{(t)} - \dfrac{η}{\sqrt{\sum_{t'=1}^{t}ρE(g_i^2)_{t-1} + (1-ρ)g^2_{t,i}} + ε} * g_{t',1} \end{equation} ## Adam (Adaptive Moment Estimation) Momentum + RMSprop,所以可以同時考慮以前的 Gradient 和調整 Learning Rate。m、v 是初始為 0 的向量,β1 通常等於 0.9,β2 通常等於 0.999。 \begin{equation} m_t = β_1*m_{t-1} + (1-β_1) * g_t \end{equation} \begin{equation} v_t = β_2*v_{t-1} + (1-β_2) * g_t^2 \end{equation} \begin{equation} \hat{m}_t = \dfrac{m_t}{1-β_1^{t}} \end{equation} \begin{equation} \hat{v}_t = \dfrac{v_t}{1-β_2^{t}} \end{equation} \begin{equation} w^{(t+1)}=w^{(t)} - \dfrac{η}{\sqrt{\hat{v_t}} + ε} * \hat{m_t} \end{equation}