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

2020-12-23 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

相關焦點

  • 用反向傳播算法解釋大腦學習過程?Hinton等人新研究登Nature子刊
    在皮層中,突觸嵌入在多層網絡中,這導致我們難以確定單個突觸的調整對整個系統行為的影響。而反向傳播算法在深度神經網絡中解決了上述問題,不過長期以來人們一直認為反向傳播在生物層面上存在問題。儘管如此,神經科學的最新發展和神經網絡的成功激活了人們對反向傳播能否幫助進一步了解皮層學習的興趣。
  • 算法推導:反向傳播算法
    13.3.1 反向傳播算法推導如下圖所示為一個神經網絡的結構圖,由於本文主要探討激活函數在反向傳播過程中的作用,因此不會帶入數值進行計算,而是以兩個權重的更新為案例進行公式的推導,分別為如何通過反向傳播算法更新和的值。
  • 徹底解決梯度爆炸問題,新方法不用反向傳播也能訓練ResNet
    機器之心報導參與:思、一鳴反向傳播是深度學習算法中必不可少的組成部分,但是其固有的梯度爆炸(消失),計算速度慢等問題一直困擾著學界。近日,紐西蘭維多利亞惠靈頓大學的研究者提出了一種新型的算法,可以讓深度學習在不依賴反向傳播的情況下進行收斂,徹底解決了梯度爆炸問題。同時,研究者表示,只需要額外訓練單層的網絡就可以達到圖像分類中的 SOTA 性能。
  • 利用遺傳算法優化GANs
    遺傳算法是根據大自然中生物體進化規律而設計提出的,是根據大自然中生物體進化規律而設計提出的。是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。在本片文章中,我們嘗試使用遺傳算法來對訓練GANs進行優化,我們的訓練模型是生成手寫數字。
  • 工程之道,深度學習推理性能業界最佳優化實踐
    深度學習技術能否最終落地為產品,細粒度滿足不同場景需求,深度學習框架的推理性能優化是一個關鍵變量。針對不同硬體設備對性能的苛刻要求,業界一般做法是開發一套推理專用框架,不足是造成了訓練與推理的分裂。MegEngine(中文名:天元)「訓練推理一體化」的獨特範式,可以實現訓練與推理的精確等價性,避免轉換可能帶來的精度損失。
  • 乾貨丨Pedro Domingos深度解析機器學習五大流派中主算法精髓
    所以使用概率來量化這個不確定性,當你看到更多的證據時,不同的假設的概率能夠進一步完善。還可以使用貝葉斯理論來進行這個工作。5.注意新舊知識之間的相似性通過類比來進行推理,在心理學上有證據說人類經常這樣做。當你面臨一個情境時,你在以往的經驗中尋找相似的情境,然後將這兩者連接起來。
  • 你真的了解深度學習框架Caffe嗎?
    Caffe是由伯克利大學的賈楊清等人開發的一個開源的深度學習框架,採用高效的C++語言實現,並內置有Python和MATLAB接口,以供開發人員使用Python或MATLAB來開發和部署以深度學習為核心算法的應用。Caffe適用於網際網路級別的海量數據處理,包括語音,圖片,視頻等多媒體數據。
  • 深度學習筆記:深層網絡相關
    深度學習和深層神經網絡維基百科定義:一類通過多層非線性變換對高複雜性數據建模算法的合集深度學習特性:多層非線性2. 激活函數實現去線性化神經元結構的輸出為所有輸入的加權和,這使整個神經網絡為線性模型。若將每個神經元(節點)的輸出通過一個非線性函數,則整個網絡模型不再是線性。
  • 一個框架看懂深度學習優化算法
    火小了夾生,火大了易糊,火不勻則半生半糊。機器學習也是一樣,模型優化算法的選擇直接關係到最終模型的性能。有時候效果不好,未必是特徵的問題或者模型設計的問題,很可能就是優化算法的問題。回憶一下上文提到的各大優化算法的學習率:其中,SGD沒有用到二階動量,因此學習率是恆定的(實際使用過程中會採用學習率衰減策略,因此學習率遞減)。AdaGrad的二階動量不斷累積,單調遞增,因此學習率是單調遞減的。因此,這兩類算法會使得學習率不斷遞減,最終收斂到0,模型也得以收斂。
  • 一個框架看懂深度學習優化算法
    火小了夾生,火大了易糊,火不勻則半生半糊。機器學習也是一樣,模型優化算法的選擇直接關係到最終模型的性能。有時候效果不好,未必是特徵的問題或者模型設計的問題,很可能就是優化算法的問題。回憶一下上文提到的各大優化算法的學習率:其中,SGD沒有用到二階動量,因此學習率是恆定的(實際使用過程中會採用學習率衰減策略,因此學習率遞減)。AdaGrad的二階動量不斷累積,單調遞增,因此學習率是單調遞減的。因此,這兩類算法會使得學習率不斷遞減,最終收斂到0,模型也得以收斂。
  • 飛槳& 英特爾聯合,優化AI算法CPU部署性能,推動產業低成本智能化升級
    然而,深度學習算法往往需要較高性能的計算晶片,以滿足大計算量、高推理速度等產業需求。這帶來一個問題,如果對前期大批量投入的低性能設備進行升級甚至更換,都將是一筆非常大的費用,從而提升了產業智能化升級時前期投入的硬體成本。比如,在工業界,產線上已有的工控機大多只配備了CPU,而深度學習涉及海量計算需要運算速度更快的GPU來處理,而GPU的價格非常昂貴,如果全部升級為高性能GPU,成本非常高。
  • 時尚網站吉爾特(GILT)中的深度學習
    對於上述提到的這些自動化認知任務,我們是利用深度學習的科技力量來實現的。最近,由於數學和算法的進步以及現代圖形處理器(GPUs)海量並行處理的能力,深度學習在眾多領域都取得了突破性的成果。吉爾特(GILT)自動化裙子分類功能
  • TensorFlow和Caffe、MXNet、Keras等其他深度學習框架的對比
    它和 Theano 一樣都支持自動求導,用戶不需要再通過反向傳播求解梯度。其核心代碼和 Caffe 一樣是用 C++編寫的,使用 C++簡化了線上部署的複雜度,並讓手機這種內存和CPU資源都緊張的設備可以運行複雜模型(Python 則會比較消耗資源,並且執行效率不高)。
  • 深度學習之父Hinton:下一代神經網絡
    他最早使用反向傳播學習單詞嵌入,對神經網絡研究的其他貢獻包括玻爾茲曼機、分布式表示、時延神經網絡、專家混合、變分學習和深度學習。2018年,Geoffrey Hinton因在深度學習方面的貢獻與Yoshua Bengio、Yann LeCun一同被授予了圖靈獎。以下是演講全文,AI科技評論進行了不改變願意的整理。
  • 讓大規模深度學習訓練線性加速、性能無損,基於BMUF的Adam優化器...
    導語:深度學習領域經典的 Adam 算法在大規模並行訓練的情況下會導致模型性能損失。為了解決這一問題,微軟亞洲研究院採用 BMUF 框架對 Adam 算法進行了並行化,並在微軟大規模 OCR 和語音產品數據集上進行了測試,使其在並行訓練中幾乎實現了線性加速的同時,模型性能基本無損。
  • 實戰入門深度學習,李沐中文新書贈送
    之前,亞馬遜首席科學家李沐等人曾以電子版的形式在 GitHub 上開源了一本深度學習中文書籍——《動手學深度學習》,這是一本深度學習的入門教程類書籍,其英文版被加州大學伯克利分校的「深度學習導論(STAT 157)」課程採用。2019 年李沐等在加州大學伯克利分校教授深度學習課程時使用了這本教程。
  • 「修煉開始」一文帶你入門深度學習
    深度學習就是從有限樣例中通過算法總結出一般性的規律,並可以應用到新的未知數據上。比如,我們可以從一些歷史病例的集合中總結出症狀和疾病之間的規律。深度學習主要由上圖所示的幾個部分組成,想學一個深度學習算法的原理,就看它是什麼樣的網絡結構,Loss 是怎麼計算的,預處理和後處理都是怎麼做的。權重初始化和學習率調整策略、優化算法、深度學習框架就那麼多,並且也不是所有都要掌握,比如深度學習框架,Pytorch 玩的溜,就能應付大多數場景。
  • 國產嵌入式晶片軟體算法優化
    除此之外,還可以使用系統中多進程、多線程機制來並行運行應用軟體,可進一步有效利用CPU資源,從而提高算法性能2、算法優化這裡說的算法優化是相對狹義的算法優化,主要是針對應用程式中某個算法進行優化,主要考慮使用新算法、快速算法替代老算法或算法複雜度較高的算法,這一方法需要對算法原理非常熟悉。
  • 周志華推薦 | 李沐《動手學深度學習》中文版上線!(免費贈書)
    具體來說,應用深度學習需要同時理解:問題的動機和特點;將大量不同類型神經網絡層通過特定方式組合在一起的模型背後的數學原理;在原始數據上擬合極複雜的深層模型的優化算法;有效訓練模型、避免數值計算陷阱以及充分利用硬體性能所需的工程技能;為解決方案挑選合適的變量(超參數)組合的經驗。這就為讀者學習深度學習(尤其是在選擇學習書目的過程中)帶來了一定的挑戰。
  • 在PyTorch中使用DeepLabv3進行語義分割的遷移學習
    當我在使用深度學習進行圖像語義分割並想使用PyTorch在DeepLabv3[1]上運行一些實驗時,我找不到任何在線教程。並且torchvision不僅沒有提供分割數據集,而且也沒有關於DeepLabv3類內部結構的詳細解釋。然而,我是通過自己的研究進行了現有模型的遷移學習,我想分享這個過程,這樣可能會對你們有幫助。