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

2021-01-11 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等用新一代反向傳播算法模擬神經網絡
    隨著更強的計算能力、更大的數據集和更多的技術改進,現在用反向傳播訓練的多層神經網絡已經足以與人類競爭。  問題提出:反向傳播適用於人腦嗎?  因此,很自然的一個問題就是,人腦也是通過修改神經元之間的突觸連結來學習的,那麼深度學習(Deep Learning)中的反向傳播在人腦神經網絡中也存在嗎?反向傳播的引入在神經科學界引起了興奮。
  • 用反向傳播算法解釋大腦學習過程?Hinton等人新研究登Nature子刊
    在皮層中,突觸嵌入在多層網絡中,這導致我們難以確定單個突觸的調整對整個系統行為的影響。而反向傳播算法在深度神經網絡中解決了上述問題,不過長期以來人們一直認為反向傳播在生物層面上存在問題。儘管如此,神經科學的最新發展和神經網絡的成功激活了人們對反向傳播能否幫助進一步了解皮層學習的興趣。
  • 人工智慧-深度學習-代價函數,梯度下降和反向傳播
    構建了損失函數,再用優化算法對損失函數進行優化,找到最優參數。然後每個偏導數乘以預先設定的步長,以此為本次學習的參數調整量。原參數減去參數調整量,則參數可以得到修正。修正之後,本輪學習結束。可再進行前向傳播。
  • 10分鐘帶你了解神經網絡基礎:反向傳播算法詳解
    它像人類的神經系統一樣工作,有助於理解圖像,像人類一樣學習,合成語音等等。什麼是反向傳播(Whatis backpropagation?)我們可以將反向傳播算法定義為在已知分類的情況下,為給定的輸入模式訓練某些給定的前饋神經網絡的算法。當示例集的每一段都顯示給網絡時,網絡將查看其對示例輸入模式的輸出反應。之後,測量輸出響應與期望輸出與誤差值的比較。
  • 使用TensorFlow實現反向傳播算法(三)
    for step in range(200):# 循環優化 200 次 with tf.GradientTape() as tape: #梯度跟蹤 tape.watch([x]) # 加入梯度跟蹤列表 y = himmelblau(x) # 前向傳播 # 反向傳播 grads = tape.gradient
  • 使用粒子群優化(PSO)來訓練神經網絡(Numpy)
    神經網絡是最著名且使用最廣泛的算法之一。在監督學習中,我們標記了輸出數據,我們將預測輸出與實際標籤進行比較,然後計算誤差。在神經網絡中,我們以同樣的方式定義神經網絡體系結構,通過比較實際標籤和預測標籤來計算誤差,然後使用某種優化算法來優化該誤差。
  • 深度學習,讀懂反向傳播
    背景深度學習屬於機器學習,機器學習的三個步驟就是:模型,策略和計算方法。比如LR,模型使用的LR模型(LR是基於伯努利假設,伯努利屬於指數分布族,指數分布族屬於廣義線性模型),策略使用的是聯合概率分布最大,計算方法是梯度下降法或擬牛頓法等。
  • 知識卡片 反向傳播中的梯度
    前言:本文介紹神經網絡中通過反向傳播計算梯度的原理,並通過代碼演示計算正向和反向傳播中的矩陣相乘得出梯度。正向傳播計算出來的結果,誤差較大,因此通過反向傳播不斷迭代修改參數,使得誤差降低。 反向傳播從輸出層傳到輸入層,逐層自頂向下計算損失函數,計算神經元權值的梯度,作為修改神經元的依據。當誤差達到期望值時,或者迭代次數超過預設的閾值時學習結束。
  • MXNet設計筆記之:深度學習的編程模式比較
    筆記的思想不局限於MXNet,也不局限於深度學習,無論對深度學習初學入門還是對高階提升,都具有很好的參考價值。本文是第一篇設計筆記的譯文,深入討論了不同深度學習庫的接口對深度學習編程的性能和靈活性產生的影響。市面上流行著各式各樣的深度學習庫,它們風格各異。那麼這些函數庫的風格在系統優化和用戶體驗方面又有哪些優勢和缺陷呢?
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    原標題:機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用高級研修班通信和信息技術創新人才培養工程項目辦公室 通人辦〔2018〕 第5號 機器學習、深度學習算法原理與案例實踐暨Python
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!
  • 深度學習中的內存管理問題研究綜述
    王孝遠等人從體系結構、系統軟體等多方面對當前面向大數據的異構內存系統進行了分析研究,提出了一系列異構內存系統的優化方法;陳遊旻等人詳細闡述了構建大數據環境下的存儲系統所面臨的挑戰、當前的研究方向以及未來的發展趨勢;李鑫等人則從大數據應用的角度對混合存儲架構進行了深入的探討。本文從深度學習應用的角度,側重於探討深度學習系統中的內存管理問題,與之前的工作有本質的不同。
  • 使用TensorFlow實現反向傳播算法(一)
    反向傳播算法1.激活函數導數下面我們用代碼來實現Sigmoid函數及其導數,並進行可視化# 導入 numpy 庫import numpy as np from matplotlib import pyplot as pltplt.rcParams['font.size'] = 16plt.rcParams['font.family'] = ['
  • 學習深度學習優化算法
    機器學習界有一群煉丹師,他們每天的日常是:拿來藥材(數據),架起八卦爐(模型),點著六味真火(優化算法),就搖著蒲扇等著丹藥出爐了。不過,當過廚子的都知道,同樣的食材,同樣的菜譜,但火候不一樣了,這齣來的口味可是千差萬別。火小了夾生,火大了易糊,火不勻則半生半糊。機器學習也是一樣,模型優化算法的選擇直接關係到最終模型的性能。
  • 深度學習中的優化算法串講
    作者 | 謝文睿來源 | ID:Datawhale本文對深度學習中的優化算法進行了梳理。首先,介紹整個優化算法的基本框架;然後將目前用的主流優化算法進行講解,帶領大家了解優化算法從SGD到Adam及Nadam的轉變。基本框架為什麼這些算法是能串講的呢?因為這些算法都是相通的。為什麼是相通的呢?因為所有的優化算法均基於下面優化算法的基本框架。
  • 《自然綜述-神經科學》:大腦中的反向傳播
    在這裡,我們將一系列看似不盡相同功能的學習算法歸入一個叫做「NGRAD」的算法框架中。NGRAD(neural gradient representation by activity differences)指的是通過活動誤差進行神經梯度表徵的算法。NGRAD框架向我們展示了,我們也許能夠在規避實際應用問題的前提下實現反向傳播。
  • 反向傳播算法最全解讀,機器學習進階必看!
    f ,有了這個梯度,我們就可以使用梯度下降法對網絡進行訓練,即每次沿著梯度的負方向(??f)移動一小步,不斷重複,直到網絡輸出誤差最小。在神經網絡訓練過程中,我們需要注意的是,反向傳播算法不僅需要準確計算梯度。還需要使用一些小技巧對我們的網絡進行訓練。理解反向傳播算法可以幫助我們理解那些在神經網絡訓練過程中使用的小技巧。
  • 機器學習者必知的5種深度學習框架
    然後,計算圖可以並行地在目標GPU中優化和運行。 在這篇文章中,我想向大家介紹推動深度學習發展的5個主力框架。這些框架使數據科學家和工程師更容易為複雜問題構建深度學習解決方案,並執行更複雜的任務。這只是眾多開源框架中的一小部分,由不同的科技巨頭支持,並相互推動更快創新。
  • 基於深度學習的無人機識別算法研究
    比如,無人機飛入禁飛區引發安全問題,由於不正當的使用侵犯公民的隱私等,因此需要構建一個無人機警察系統,對無人機實施監控,遏制亂飛現象。採用傳統的識別方法,靈活性不足,精度也不夠高。為此提出一種基於深度學習的無人機識別算法,通過訓練一個基於卷積神經網絡(CNNs)的學習網絡,得出一個高效的識別模型,實現無人機和非無人機間的分類。模型的測試結果表明,該方法具有較高的識別率。