【DL-CV】正則化,Dropout<前篇---後篇>【DL-CV】淺談GoogLeNet(咕咕net)segmentfault
全名 Adaptive gradient algorithm ,翻譯過來就是「適應梯度算法」,該算法能根據梯度中偏導數的大小給不一樣的偏導數以不一樣的學習率,偏導數大(小)的給個小(大)的學習率,以此來減小參數更新時的擺動。學習
其核心是引入一個參數對歷次的梯度的平方進行累加,在更新階段,基礎學習率將除以這個參數的開方。這樣大梯度會由於積累大而分得小的學習率,小梯度由於積累小而分得較大的學習率
$$s_{t+1} = s_{t}+\nabla_x L(x_t)^2$$
$$x_{t+1}=x_t-{\alpha\over \sqrt {s_{t+1}}+\epsilon}\nabla_x L(x_t)$$
其中$\epsilon$是一個很小的數,爲了防止除法時分母出現零,通常設爲1e-4到1e-8之間。下面是代碼實現spa
缺點:梯度平方的累計值在訓練過程當中不斷增大,做爲分母被除了之後學習率衰減過快,更新變慢翻譯
RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法,目的是爲了解決 Adagrad 學習率急劇降低的問題。其在對梯度平方進行累加時會進行衰減處理(實際上是指數加權平均),解決學習率急降的問題的同時又保留了 Adagrad 調節學習率的優勢
$$s_{t+1} = \beta s_t +(1-\beta)\nabla_x L(x_t)^2$$
$$x_{t+1}= x_t-{\alpha\over \sqrt {s_{y+1}+}\epsilon}$$
$\gamma$ 一般爲0.9/0.993d
以上兩種方法解決了SGD的問題2️⃣blog
兩種動量方法經過引入「速度」解決了問題1️⃣;Adagrad 和 RMSprop 經過引入「梯度平方」解決了問題2️⃣,各有千秋。爲什麼不把二者結合起來而後一次知足兩個願望呢?這麼一想,Adam就出來了。ip
Adam 至關於 RMSprop + Momentum,他除了像 RMSprop 同樣存儲了過去梯度平方的指數衰減平均值 ,也像 momentum 同樣保持了過去梯度的指數衰減平均值:
$$v_{t+1} = \beta_1v_t + (1-\beta_1)\nabla_x L(x_t)$$
$$s_{t+1} = \beta_2s_t + (1-\beta_2)\nabla_x L(x_t)^2$$
若是 v 和 s 被初始化爲 0 向量,那它們就會向 0 偏置,因此還須要誤差校訂來抵消這些誤差:
$$\hat v_{t+1} = {v_{t+1}\over 1-\beta_1^{t+1}}$$
$$\hat s_{t+1} = {s_{t+1}\over 1-\beta_2^{t+1}}$$
最後的更新就是:
$$x_{t+1}=x_t-{\alpha \hat v_{t+1}\over\sqrt{\hat s_{t+1}}+\epsilon}$$
推薦值$\beta_1=0.9$,$\beta_2=0.99$,$\alpha=10^{-3}/5·10^{-4}$代碼實現:get
Adam真的是一個很是棒的算法,實踐代表,Adam 比其餘適應性學習方法效果要好,幾乎成爲標配默認的算法啦。因此長篇大論了這麼久以後的結論是——推薦首選Adamit