使用Numpy進行深度學習中5大反向傳播優化算法的性能比較

2021-01-07 deephub

在本文中,我們將通過計算二次凸函數的最優點來數值比較主要的深度學習優化算法的性能。

簡介

深度學習被稱為人工智慧的未來。現在,神經網絡被稱為通用函數逼近器,也就是說,它們有能力表示這個宇宙中任何複雜的函數。計算這個具有數百萬個參數的通用函數的想法來自優化的基本數學。優化可以通過多種方式完成,但在本文中,我們將重點討論基於梯度下降的優化技術。

非凸函數的優化是研究的主要領域。多年來,不同的科學家提出了不同的優化算法來優化神經網絡的成本函數。這些算法大部分都是基於梯度的方法,稍作修改。在這篇文章中,我們將討論5個專業的下降基於算法-梯度下降,動量,Adagrad, RMSprop, Adam。

方法

為了了解每個算法在實際中是如何工作的,我們將使用一個凸二次函數。我們將對每個算法進行固定次數的迭代(20次),以比較它們在達到最優點時的收斂速度和軌跡。下面給出了為此任務選擇的函數的方程,以及使用Matplotlib繪製的函數的三維圖和級別集。

import matplotlib.pyplot as pltfig = plt.figure(figsize=(13,6))ax = plt.axes(projection="3d") start, stop, n_values = -8, 8, 800x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='winter', edgecolor='none')ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')

首先,我們將從最基本的梯度下降算法開始,然後我們將跟隨它們發展的趨勢來支持每個算法發展背後的想法。所以趨勢是這樣的

1-Gradient Descent

2-Momentum

3-Adagrad

4-RMSprop

5-Adam

因為所有這些算法在更新規則的每次迭代時都需要梯度。因此,下面給出了函數的梯度,用於在每次迭代時更新兩個變量。我們將對所有算法使用固定的學習率值=0.4。

1、Gradient Descent

梯度下降法是求解最優解的最傳統的方法。在這個算法中,使用當前梯度(gt)乘以一些稱為學習率的因子來更新當前權值。更新規則的公式如下所示。

lr=0.4x1=-4x2=-6l1_gd=[]l2_gd=[]for i in range(20):l1_gd.append(x1) l2_gd.append(x2) x1=x1-lr*0.2*x1 x2=x2-lr*4*x2

使用梯度下降的軌跡

fig = plt.figure(figsize=(13,6))left, bottom, width, height = 100, 0.1, 0.8, 0.8ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent")plt.figure(figsize=(15,10))plt.figure(figsize=(15,10))ax.set_title('Level Sets of the Function',size=20)ax.set_xlabel('x (cm)')ax.set_ylabel('y (cm)')ax.legend()plt.show()

正如我們在上面的圖中看到的,梯度下降經歷了很多振蕩,收斂速度非常慢。所以在後面的部分,我們將學習梯度下降的改進,它將幫助我們實現穩定和更快的收斂。

2、Momentum

動量梯度下降是一種常用的優化器,它消除了標準梯度下降引起的振蕩,加速了收斂最優點。當它在水平方向上加速時,它在垂直方向上減速。在這種傑出行為的幫助下,它使我們在學習率的方向上邁出了一大步。此外,動量比標準梯度下降要穩定得多。

下面給出的方程式解釋了更新規則-

v1,v2=0,0gamma,lr=0.5,0.4x1,x2=-4,-6l1_gd_m,l2_gd_m=[],[]for i in range(20):l1_gd_m.append(x1) l2_gd_m.append(x2) v1=gamma*v1+(0.2*x1) v2=gamma*v2+(4*x2) x1=x1-lr*v1 x2=x2-lr*v2

Gradient Descent vs Momentum

import matplotlib.pyplot as pltimport numpy as npfig = plt.figure(figsize=(13,6))left, bottom, width, height = 100, 0.1, 0.8, 0.8ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent")plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)")plt.figure(figsize=(15,10))plt.figure(figsize=(15,10))ax.set_title('Level Sets of the Function',size=20)ax.set_xlabel('x (cm)')ax.set_ylabel('y (cm)')ax.legend()plt.show()

3、Adagrad

自適應梯度下降算法(adaptive gradient descent)是一種學者梯度下降算法。其主要區別在於Adagrad根據網絡中參數的重要性對每個權值利用不同的學習速率。換句話說,用較高的學習率訓練不必要的參數,用較小的學習率訓練重要參數,使其更穩定地收斂。在不允許失真的情況下,實現了算法的加速。更新公式類似於動量,這裡每一步的動量是用之前的動量和梯度的平方來計算的。下面的公式顯示了Adagrad中的更新規則。

Gt是一個對角矩陣組成的平方和過去的漸變和平滑項。此外,表示矩陣-向量積運算。

v1,v2=0,0gamma,lr=0.9,0.4x1,x2=-4,-6l1_adagrad,l2_adagrad=[],[]for i in range(20):l1_adagrad.append(x1) l2_adagrad.append(x2) v1=v1+(0.2*x1)**2 v2=v2+(4*x2)**2 x1=x1-(lr/math.sqrt(v1+c))*0.2*x1 x2=x2-(lr/math.sqrt(v2+c))*4*x2

Momentum vs Adagrad

import matplotlib.pyplot as pltimport numpy as npfig = plt.figure(figsize=(13,6))left, bottom, width, height = 100, 0.1, 0.8, 0.8ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent")plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)")plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad")plt.figure(figsize=(15,10))plt.figure(figsize=(15,10))ax.set_title('Level Sets of the Function',size=20)ax.set_xlabel('x (cm)')ax.set_ylabel('y (cm)')ax.legend()plt.show()

從上圖中可以看出,Adagrad雖然運動平穩無振蕩,但收斂能力不足。為了解決這個問題,Geoffrey Hinton引入了一個更有效的優化器RMSprop。

4、RMSprop

Rmsprop是由著名計算機科學家Geoffrey Hinton (Hinton et al., 2012)提出的另一種高效優化算法。該算法的工作原理與Adagrad相似,只是稍加修改。不像AdaGrad那樣取梯度平方的累積和,我們取這些梯度的指數移動平均值。使用指數平均的原因是為了給最近更新的梯度權重大於最近更新的梯度。下面的方程式顯示了Rmsprop的更新規則。

v1,v2=0,0gamma,lr=0.9,0.4x1,x2=-4,-6l1,l2=[],[]for i in range(20):l1.append(x1) l2.append(x2) v1=gamma*v1+(1-gamma)*(0.2*x1)**2 v2=gamma*v2+(1-gamma)*(4*x2)**2 x1=x1-(lr/math.sqrt(v1+c))*0.2*x1 x2=x2-(lr/math.sqrt(v2+c))*4*x2

Momentum vs Adagrad vs RMSprop

import matplotlib.pyplot as pltimport numpy as npfig = plt.figure(figsize=(13,6))left, bottom, width, height = 100, 0.1, 0.8, 0.8ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent")plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)")plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad")plt.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm")plt.figure(figsize=(15,10))plt.figure(figsize=(15,10))ax.set_title('Level Sets of the Function',size=20)ax.set_xlabel('x (cm)')ax.set_ylabel('y (cm)')ax.legend()plt.show()

顯而易見,當收斂到最優點時,梯度下降算法在垂直方向上產生巨大的振蕩,RMSprop限制了垂直運動,加速了水平方向。此外,雖然動量減小了振蕩,RMSprop提供了更可靠和更快的收斂。

5、Adam

自適應矩估計是另一種計算每個參數的自適應學習率的優化器。與其他優化器相比,它更加健壯和可靠,因為它基本上結合了動量和RMSprop(即。移動類似梯度的動量的平均值,並使用梯度的平方來調整學習速率,如RMSprop)。更精確地說,Adam算法執行如下-

v1,v2,s1,s2=0,0,0,0gamma,beta,lr=0.9,0.999,0.4x1,x2=-6,-6l1_adam,l2_adam=[],[]for i in range(20):l1_adam.append(x1) l2_adam.append(x2) v1=gamma*v1+(1-gamma)*(0.2*x1) v2=gamma*v2+(1-gamma)*(4*x2) s1=beta*s1+(1-beta)*(0.2*x1)**2 s2=beta*s2+(1-beta)*(4*x2)**2 m_hat_v1= v1 / (1 - np.power(gamma, i+1)) m_hat_v2 = v2 / (1 - np.power(gamma, i+1)) s_hat_s1= s1 / (1 - np.power(beta, i+1)) s_hat_s2 = s2 / (1 - np.power(beta, i+1)) x1=x1-(lr)*(m_hat_v1/math.sqrt((s_hat_s1)+c)) x2=x2-(lr)*(m_hat_v2/math.sqrt((s_hat_s2)+c)) print(x1,x2) if abs(x1)<=0.1 and abs(x2)<0.1: break

在收斂期間的軌跡匯總

import matplotlib.pyplot as pltimport numpy as npfig = plt.figure(figsize=(13,6))left, bottom, width, height = 100, 0.1, 0.8, 0.8ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100x_vals = np.linspace(start, stop, n_values)y_vals = np.linspace(start, stop, n_values)X, Y = np.meshgrid(x_vals, y_vals)Z = np.sqrt(0.1*X**2 + 2*Y**2)plt.contourf(X,Y,Z,)plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent")plt.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)")plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad")plt.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm")plt.plot(l1_adam[:20],l2_adam[:20],color="Brown",marker="*",markeredgecolor="pink",linewidth=3,label="Adam")plt.figure(figsize=(15,10))plt.figure(figsize=(15,10))ax.set_title('Level Sets of the Function',size=20)ax.set_xlabel('x (cm)')ax.set_ylabel('y (cm)')ax.legend()plt.show()

正如在最後的圖中所看到的,Adam優化器在直線路徑上導致最快的收斂。在Adam的例子中,它通過累積之前梯度的總和來減弱振蕩,並且由於梯度的平方項,它遵循一條直線,類似於RMSprop。這導致了一個明顯的結論,即Adam是Momentum和RMSprop的結合版本。從上圖中我們可以很容易地看出為什麼Adam是deep learning中最流行的優化器。即使從離最優值(-6,-6)很遠的地方開始,Adam也能以最小的迭代收斂得最快。

作者:Saket Thavanani

相關焦點

  • 離散優化代替反向傳播:Pedro Domingos提出深度學習新方向
    但是,將這些方法擴展至多層比較困難,因為硬閾值單元(hard-threshold unit)無法通過梯度下降進行訓練,這類單元在幾乎所有情況下導數都為 0,且在原點處非連續。因此,研究社區轉向帶有軟激活函數(如 Sigmoid、ReLU)的多層網絡,這樣梯度可以通過反向傳播進行高效計算(Rumelhart et al., 1986)。
  • 用反向傳播算法解釋大腦學習過程?Hinton 等人新研究登上 Nature...
    在學習過程中,大腦會調整突觸以優化行為。在皮層中,突觸嵌入在多層網絡中,這導致我們難以確定單個突觸的調整對整個系統行為的影響。而反向傳播算法在深度神經網絡中解決了上述問題,不過長期以來人們一直認為反向傳播在生物層面上存在問題。儘管如此,神經科學的最新發展和神經網絡的成功激活了人們對反向傳播能否幫助進一步了解皮層學習的興趣。
  • 用反向傳播算法解釋大腦學習過程?Hinton等人新研究登Nature子刊
    在學習過程中,大腦會調整突觸以優化行為。在皮層中,突觸嵌入在多層網絡中,這導致我們難以確定單個突觸的調整對整個系統行為的影響。而反向傳播算法在深度神經網絡中解決了上述問題,不過長期以來人們一直認為反向傳播在生物層面上存在問題。儘管如此,神經科學的最新發展和神經網絡的成功激活了人們對反向傳播能否幫助進一步了解皮層學習的興趣。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    原標題:機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用高級研修班通信和信息技術創新人才培養工程項目辦公室 通人辦〔2018〕 第5號 機器學習、深度學習算法原理與案例實踐暨Python
  • 深度學習中的NumPy基礎
    雖然這看起來似乎是一個負面因素,但它允許 NumPy 操作更快,因為它們在進行計算時可以避免轉換和約束。你為什麼要關心 NumPy,為什麼特別關心深度學習?NumPy 進行算術計算的基本特徵之一是通過廣播。廣播允許不同形狀和大小的 NumPy 數組之間進行操作。廣播是通過比較數組的維度來工作的,廣播的有效性主要有兩個規則。在 NumPy 中執行元素級操作(如向 np.array 添加標量)時,實際上是在進行廣播。
  • 知識卡片 反向傳播中的梯度
    前言:本文介紹神經網絡中通過反向傳播計算梯度的原理,並通過代碼演示計算正向和反向傳播中的矩陣相乘得出梯度。 反向傳播中的梯度 反向傳播(backpropagation)中的梯度
  • 反向傳播算法最全解讀,機器學習進階必看!
    這樣就可以得到f相對於網絡參數的梯度∇f ,有了這個梯度,我們就可以使用梯度下降法對網絡進行訓練,即每次沿著梯度的負方向(−∇f)移動一小步,不斷重複,直到網絡輸出誤差最小。在神經網絡訓練過程中,我們需要注意的是,反向傳播算法不僅需要準確計算梯度。還需要使用一些小技巧對我們的網絡進行訓練。理解反向傳播算法可以幫助我們理解那些在神經網絡訓練過程中使用的小技巧。
  • 反向傳播算法:定義,概念,可視化
    這個方向的流動叫做正向傳播。  在訓練階段,輸入最後可以計算出一個代價標量J(θ)。  反向傳播算法  然後,代價通過反向算法返回到網絡中,調整權重並計算梯度。未完待續……  分析  可能是你們在學校裡做過用代數的方法來分析反向傳播。對於普通函數,這很簡單。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
  • Pedro Domingos深度解析機器學習五大流派中主算法精髓
    所以使用概率來量化這個不確定性,當你看到更多的證據時,不同的假設的概率能夠進一步完善。還可以使用貝葉斯理論來進行這個工作。5.注意新舊知識之間的相似性通過類比來進行推理,在心理學上有證據說人類經常這樣做。當你面臨一個情境時,你在以往的經驗中尋找相似的情境,然後將這兩者連接起來。
  • 要理解深度學習,必須突破常規視角去理解優化
    深度學習算法有一些重要的特性並不總是反映在目標值中。所以,要加深對深度學習的理解,還得超越常規視角。深度學習時代,機器學習通常歸結為首先為手頭的學習任務定義合適的目標/成本函數,然後使用梯度下降的某種變體(通過反向傳播實現)來優化這個函數。難怪每年有數以百計的機器學習論文貢獻給優化的不同領域。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    本文系巴黎高等師範學院在讀博士 Hadrien Jean 的一篇基礎學習博客,其目的是幫助初學者/高級初學者基於深度學習和機器學習來掌握線性代數的概念。掌握這些技能可以提高你理解和應用各種數據科學算法的能力。
  • 前沿| 利用遺傳算法優化神經網絡:Uber提出深度學習訓練新方式
    許多人認為,SGD 算法有效計算梯度的能力對於這種訓練能力而言至關重要。但是,Uber 近日發布的五篇論文表明,神經進化(neuroevolution)這種利用遺傳算法的神經網絡優化策略,也是訓練深度神經網絡解決強化學習(RL)問題的有效方法。
  • 揭秘深度學習成功的數學原因:從全局最優性到學習表徵不變性
    本文的目的正是要揭示深度學習成功的奧秘。通過圍繞著深度學習的三個核心要素——架構、正則化技術和優化算法,並回顧近期研究,作者為深層網絡的若干屬性,如全局最優性、幾何穩定性、學習表徵不變性,提供了一個數學證明。
  • 深度學習鼻祖Geoffrey Hinton幫你入門帶你飛
    辛頓是反向傳播算法和對比散度算法的發明人之一,也是深度學習的積極推動者,目前任職於多倫多大學與Google。作為人工智慧領域的三位奠基人之一,早在30年前,辛頓就已經在深度學習領域留下了自己的烙印。然而,直到計算機的性能達到深度學習的要求,辛頓才開始在學術界以外得到自己應得的廣泛認可,本文是他對於深度學習介紹的演講PPT。
  • 一文概覽深度學習中的五大正則化方法和七大優化策略
    選自arXiv 機器之心編譯 深度學習中的正則化與優化策略一直是非常重要的部分,它們很大程度上決定了模型的泛化與收斂等性能。本文主要以深度卷積網絡為例,探討了深度學習中的五項正則化與七項優化策略,並重點解釋了當前最為流行的 Adam 優化算法。
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    本文從向量的概念與運算擴展到矩陣運算的概念與代碼實現,對機器學習或者是深度學習的入門者提供最基礎,也是最實用的教程指導,為以後的機器學習模型開發打下基礎。在我們學習機器學習時,常常遇到需要使用矩陣提高計算效率的時候。如在使用批量梯度下降迭代求最優解時,正規方程會採用更簡潔的矩陣形式提供權重的解析解法。
  • 利用遺傳算法優化GANs
    遺傳算法是根據大自然中生物體進化規律而設計提出的,是根據大自然中生物體進化規律而設計提出的。是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。在本片文章中,我們嘗試使用遺傳算法來對訓練GANs進行優化,我們的訓練模型是生成手寫數字。什麼是遺傳算法?
  • 圖像識別中的深度學習【香港中文大學王曉剛】
    1986年,魯梅爾哈特(Rumelhart)、欣頓(Hinton)和威廉士(Williams)在《自然》雜誌發表了著名的反向傳播算法用於訓練神經網絡[1],該算法直到今天仍被廣泛應用。例如,為了改進神經網絡的訓練,學者提出了非監督和逐層的預訓練,使得在利用反向傳播算法對網絡進行全局優化之前,網絡參數能達到一個好的起始點,從而在訓練完成時能達到一個較好的局部極小點。  深度學習在計算機視覺領域最具影響力的突破發生在2012年,欣頓的研究小組採用深度學習贏得了ImageNet圖像分類比賽的冠軍[3]。