'10個梯度下降優化算法+備忘單'

""10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

9. Nadam算法

Nadam一詞由(Dozat,2015)是Nesterov和Adam優化器的名稱拼接而成。Nesterov組件在Nadam算法中對學習率產生了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

Adam優化器也可以寫成:

公式5:Adam優化器的權重更新

Nadam利用Nesterov通過將上面等式中的前一時刻的V_hat替換為當前時刻的V_hat,實現了提前一步更新梯度:

其中

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

9. Nadam算法

Nadam一詞由(Dozat,2015)是Nesterov和Adam優化器的名稱拼接而成。Nesterov組件在Nadam算法中對學習率產生了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

Adam優化器也可以寫成:

公式5:Adam優化器的權重更新

Nadam利用Nesterov通過將上面等式中的前一時刻的V_hat替換為當前時刻的V_hat,實現了提前一步更新梯度:

其中

10個梯度下降優化算法+備忘單

並有

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

9. Nadam算法

Nadam一詞由(Dozat,2015)是Nesterov和Adam優化器的名稱拼接而成。Nesterov組件在Nadam算法中對學習率產生了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

Adam優化器也可以寫成:

公式5:Adam優化器的權重更新

Nadam利用Nesterov通過將上面等式中的前一時刻的V_hat替換為當前時刻的V_hat,實現了提前一步更新梯度:

其中

10個梯度下降優化算法+備忘單

並有

10個梯度下降優化算法+備忘單

V和S初始值置0.

默認值(取自Keras):

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁷

10. AMSGrad算法

Adam算法的另一個變體是AMSGrad算法(Reddi等,2018)。該算法重新訪問Adam中的自適應學習速率組件並對其進行更改以確保當前S始終大於前一時間步長。

其中

此外

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

9. Nadam算法

Nadam一詞由(Dozat,2015)是Nesterov和Adam優化器的名稱拼接而成。Nesterov組件在Nadam算法中對學習率產生了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

Adam優化器也可以寫成:

公式5:Adam優化器的權重更新

Nadam利用Nesterov通過將上面等式中的前一時刻的V_hat替換為當前時刻的V_hat,實現了提前一步更新梯度:

其中

10個梯度下降優化算法+備忘單

並有

10個梯度下降優化算法+備忘單

V和S初始值置0.

默認值(取自Keras):

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁷

10. AMSGrad算法

Adam算法的另一個變體是AMSGrad算法(Reddi等,2018)。該算法重新訪問Adam中的自適應學習速率組件並對其進行更改以確保當前S始終大於前一時間步長。

其中

此外

10個梯度下降優化算法+備忘單

V和S初始值置0.

默認值(取自Keras):

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁷

直覺

我想和你們分享一些直觀的見解,為什麼梯度下降法優化器對梯度部分使用的是指數移動平均值(EMA),對學習率部分使用均方根(RMS)。

為什麼要對梯度取指數移動平均?

我們需要使用一些數值來更新權重。我們唯一有的數值呢就是當前梯度,所以讓我們利用它來更新權重。

但僅取當前梯度值是不夠好的。我們希望我們的更新是(對模型來說,是)“更好的指導”。讓我們考慮(每次更新中)包括之前的梯度值。

將當前梯度值和過去梯度信息的結合起來一種方法是,我們可以對過去和現在的所有梯度進行簡單的平均。但這意味著每個梯度的權重是相等的。這樣做是反直覺的,因為在空間上,如果我們正在接近最小值,那麼最近的梯度值可能會提供更有效的信息。

因此,最安全的方法是採用指數移動平均法,其中最近的梯度值的權重(重要性)比前面的值高。

為什麼要把學習速率除以梯度的均方根呢?

這個目的是為了調整學習的速率。調整為了適應什麼?答案是梯度。我們需要確保的是,當梯度較大時,我們希望更新適當縮小(否則,一個巨大的值將減去當前的權重!)

為了到達這種效果,讓我們學習率α除以當前梯度得到一個調整學習速率。

請記住,學習率成分必須始終是正的(因為學習率成分,當乘以梯度成分,後者應該有相同的符號)。為了確保它總是正的,我們可以取它的絕對值或者它的平方。當我們取當前梯度的平方,可以再取平方根"取消"這個平方。

但是就像動量的思路一樣,僅僅採用當前的梯度值是不夠好的。我們希望我們的訓練中的(每次)更新update都能更好的指導(模型)。因此,我們也需要使用之前的梯度值。正如上面所討論的,我們取過去梯度的指數移動平均值('mean square') ,然後取其平方根('root') ,也就是'均方根'(RMS)。除了 AdaGrad (採用累積的平方梯度之和)之外,本文中所有的優化器都會對學習速率部分進行優化。

備忘單

"10個梯度下降優化算法+備忘單

原標題 | 10 Gradient Descent Optimisation Algorithms + Cheat Sheet

作者 | Raimi Karim in Towards Data Science

譯者 | 斯蒂芬•二狗子(瀋陽化工大學)、intelLigenJ(算法工程師)、星期五、萊特•諾頓、滄海一升

本文編輯:王立魚

英語原文:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9

10個梯度下降優化算法+備忘單

梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。

在這篇文章中,我會總結應用在目前較為流行深度學習框架中的常見梯度下降算法(如TensorFlow, Keras, PyTorch, Caffe)。本文之目的是為了方便理解和掌握這些內容,因為除此之外總結並不多,而且它可以作為你從零基礎入門的“小抄”。

在一個線性迴歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)

梯度下降優化算法功能是什麼?

通過梯度下降,優化算法可以在如下三個主要方面起作用:

1、修改學習率成分,α, 或

2、修改梯度成分 ∂L/∂w

3、或二者兼有

且看如下方程1:

方程1:隨機梯度下降中的各種量

學習率調度器vs梯度下降優化主要的不同在於梯度下降優化讓學習率乘以一個因子,該因子是梯度的函數,以此來調整學習率成分,然而學習率調度器讓學習率乘以一個恆為常數或是關於時間步幅的函數的因子,以此來更新學習率。

第1種方法主要通過在學習率(learning rate)之上乘一個0到1之間的因子從而使得學習率降低(例如RMSprop)。第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為“動量”)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。

10個梯度下降優化算法+備忘單

Fig.2:各類梯度下降優化算法、其發表年份和用到的核心思路。

Fig.3 自上而下展示了這些優化算法如何從最簡單的純梯度下降(SGD)演化成Adam的各類變種的。SGD一開始分別往兩個方向演變,一類是AdaGrad,主要是調整學習率(learning rate)。另一類是Momentum,主要調整梯度(gradient)的構成要素(譯註:原文此處寫反了)。隨著演化逐步推進,Momentum和RMSprop融為一體,“亞當”(Adam)誕生了。你可能覺得我這樣的組織方式抱有異議,不過我目前一直是這樣理解的。

10個梯度下降優化算法+備忘單

Fig.3:各類優化算法的演化圖(gist)

符號表示

  • t - 迭代步數

  • w - 我們需要更新的權重及參數

  • α - 學習率

  • ∂L/∂w - L(損失函數)對於w的梯度

  • 我統一了論文中出現過的希臘字母及符號表示,這樣我們可以以統一的“演化”視角來看這些優化算法

1. 隨機梯度下降(Stochastic Gradient Descend)

最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。

10個梯度下降優化算法+備忘單

2. 動量算法(Momentum)

動量算法使用帶有動量的梯度(梯度的指數滑動平均,Polyak, 1964)而不是當前梯度來對w進行更新。在後續的文章中你會看到,採用指數滑動平均作為動量更新的方式幾乎成為了一個業內標準。

其中

並且V初始化值為0。β一般會被設置為0.9。

值得注意的是,很多文章在引用Momemtum算法時會使用Ning Qian, 1999的文章。但這個算法的原出處為Sutskever et al。而經典動量算法在1964年就被Polyak提出了,所以上文也引用了Polyak的文章。(感謝James指出了這一點)

3.Nesterov加速梯度下降法(NAG)

在Polyak提出了動量法之後(雙關:Polyak勢頭正盛),一個使用Nesterov加速梯度下降法(Sutskever et al., 2013)的類似更新方法也被實現了。此更新方法使用V,即我稱之為投影梯度的指數移動平均值。

其中

且V 初始化為0。

第二個等式中的最後一項就是一個投影梯度。這個值可以通過使用先前的速度“前進一步”獲得(等式4)。這意味著對於這個時間步驟t,我們必須在最終執行反向傳播之前執行另一個前向傳播。這是步驟:

1.使用先前的速度將當前權重w更新為投影權重w*

(等式4)

2. 使用投影權重計算前向傳播

3.獲得投影梯度∂L/∂w*

4.計算相應的V和w

常見的默認值:

  • β = 0.9

請注意,原始的Nesterov 加速梯度下降法論文( Nesterov, 1983 )並不是關於隨機梯度下降,也沒有明確使用梯度下降方程。因此,更合適的參考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在隨機梯度下降中的應用。(再一次,我要感謝James對HackerNews的評論中指出這一點。)

4. 自適應學習率算法(Adagrad)

自適應梯度算法,也稱AdaGrad算法(Duchi等,2011),通過將學習率除以S的平方根來研究學習率分量,其中S為當前和過去平方梯度的累積和(即直到時間t)。請注意,和SGD算法相同,自適應學習率算法中的梯度分量也保持不變。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

請注意,這裡在分母中添加了ε。Keras稱之為模糊因子,它是一個小的浮點值,以確保我們永遠不會遇到除零的情況。

默認值(來自Keras):

  • α = 0.01

  • ε = 10⁻⁷

5. 均方根傳遞算法(RMSprop)

均方根傳遞算法,也稱RMSprop算法(Hinton等,2012),是在AdaGrad算法上進行改進的另一種自適應學習率算法。 它使用指數加權平均計算,而不是使用累積平方梯度和。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並將S的初始值置0.

默認值(來自Keras):

  • α = 0.001

  • β = 0.9 (本文作者推薦)

  • ε = 10⁻⁶

6. 自適應增量算法(Adadelta)

與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是“自適應增量”的縮寫,其中,delta表示當前權重與新更新權重之間的差值。

Adadelta算法和RMSprop算法的區別,在於Adadelta算法中用delta的指數加權平均值D來替代原來在Adadelta算法中的學習率參數。

10個梯度下降優化算法+備忘單

其中,

10個梯度下降優化算法+備忘單

並把D和S的初始值置0. 此外,

默認值(來自Keras):

  • β = 0.95

  • ε = 10⁻⁶

7. 適應性矩估計算法(Adam)

適應矩估計算法,也稱Adam算法(Kingma&Ba,2014),是一種將動量和RMSprop結合使用的算法。它通過

(i) 使用梯度分量V,梯度的指數移動平均值(如動量)和

(ii)將學習率α除以S的平方根,平方梯度的指數移動平均值(如在RMSprop中)來學習率分量而起作用。

其中

10個梯度下降優化算法+備忘單

是偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁸

8. AdaMax算法

AdaMax(Kingma&Ba,2015)是使用無限範圍(因此為'max')的由Adam算法的原作者們對其優化器進行改編的一種算法。V是梯度的指數加權平均值,S是過去p階梯度的指數加權平均值,類似於最大函數,如下所示(參見論文收斂證明)。

其中

10個梯度下降優化算法+備忘單

是對V的偏差修正,並有

10個梯度下降優化算法+備忘單

V和S的初始值置0.

作者推薦的默認值:

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

9. Nadam算法

Nadam一詞由(Dozat,2015)是Nesterov和Adam優化器的名稱拼接而成。Nesterov組件在Nadam算法中對學習率產生了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

Adam優化器也可以寫成:

公式5:Adam優化器的權重更新

Nadam利用Nesterov通過將上面等式中的前一時刻的V_hat替換為當前時刻的V_hat,實現了提前一步更新梯度:

其中

10個梯度下降優化算法+備忘單

並有

10個梯度下降優化算法+備忘單

V和S初始值置0.

默認值(取自Keras):

  • α = 0.002

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁷

10. AMSGrad算法

Adam算法的另一個變體是AMSGrad算法(Reddi等,2018)。該算法重新訪問Adam中的自適應學習速率組件並對其進行更改以確保當前S始終大於前一時間步長。

其中

此外

10個梯度下降優化算法+備忘單

V和S初始值置0.

默認值(取自Keras):

  • α = 0.001

  • β₁ = 0.9

  • β₂ = 0.999

  • ε = 10⁻⁷

直覺

我想和你們分享一些直觀的見解,為什麼梯度下降法優化器對梯度部分使用的是指數移動平均值(EMA),對學習率部分使用均方根(RMS)。

為什麼要對梯度取指數移動平均?

我們需要使用一些數值來更新權重。我們唯一有的數值呢就是當前梯度,所以讓我們利用它來更新權重。

但僅取當前梯度值是不夠好的。我們希望我們的更新是(對模型來說,是)“更好的指導”。讓我們考慮(每次更新中)包括之前的梯度值。

將當前梯度值和過去梯度信息的結合起來一種方法是,我們可以對過去和現在的所有梯度進行簡單的平均。但這意味著每個梯度的權重是相等的。這樣做是反直覺的,因為在空間上,如果我們正在接近最小值,那麼最近的梯度值可能會提供更有效的信息。

因此,最安全的方法是採用指數移動平均法,其中最近的梯度值的權重(重要性)比前面的值高。

為什麼要把學習速率除以梯度的均方根呢?

這個目的是為了調整學習的速率。調整為了適應什麼?答案是梯度。我們需要確保的是,當梯度較大時,我們希望更新適當縮小(否則,一個巨大的值將減去當前的權重!)

為了到達這種效果,讓我們學習率α除以當前梯度得到一個調整學習速率。

請記住,學習率成分必須始終是正的(因為學習率成分,當乘以梯度成分,後者應該有相同的符號)。為了確保它總是正的,我們可以取它的絕對值或者它的平方。當我們取當前梯度的平方,可以再取平方根"取消"這個平方。

但是就像動量的思路一樣,僅僅採用當前的梯度值是不夠好的。我們希望我們的訓練中的(每次)更新update都能更好的指導(模型)。因此,我們也需要使用之前的梯度值。正如上面所討論的,我們取過去梯度的指數移動平均值('mean square') ,然後取其平方根('root') ,也就是'均方根'(RMS)。除了 AdaGrad (採用累積的平方梯度之和)之外,本文中所有的優化器都會對學習速率部分進行優化。

備忘單

10個梯度下降優化算法+備忘單

(上述要點)

如果有什麼不妥之處,或者如果這篇文章中的內容可以再改進,請與我聯繫!?

參考

梯度下降優化算法概述(ruder.io)

為什麼Momentum真的有效這是一個關於動量的流行故事:梯度下降是一個人走在山上。

感謝Ren Jie,Derek,William Tjhi,Chan Kai,Serene和James對本文的想法,建議和更正。

想要繼續查看該篇文章相關鏈接和參考文獻?雷鋒網雷鋒網雷鋒網

點擊【10個梯度下降優化算法+備忘單】即可訪問:

免費贈送課程啦~「好玩的Python:從數據挖掘到深度學習」該課程涵蓋了從Python入門到CV、NLP實踐等內容,是非常不錯的深度學習入門課程,共計9節32課時,總長度約為13個小時。。現AI研習社將此課程免費開放給社區認證用戶,只要您在認證時在備註框裡填寫「Python」,待認證通過後,即可獲得該課程全部解鎖權限。心動不如行動噢~

課程頁面:https://ai.yanxishe.com/page/domesticCourse/37

認證方式:https://ai.yanxishe.com/page/blogDetail/11609

"

相關推薦

推薦中...