訓練神經網絡的五大算法

2021-02-15 CSDN

原文: 5 algorithms to train a neural network 

譯者: KK4SBB 

責編:何永燦,關注人工智慧,投稿請聯繫 heyc@csdn.net 或微信號 289416419

神經網絡模型的每一類學習過程通常被歸納為一種訓練算法。訓練的算法有很多,它們的特點和性能各不相同。

➤問題的抽象

人們把神經網絡的學習過程轉化為求損失函數f的最小值問題。一般來說,損失函數包括誤差項和正則項兩部分。誤差項衡量神經網絡模型在訓練數據集上的擬合程度,而正則項則是控制模型的複雜程度,防止出現過擬合現象。

損失函數的函數值由模型的參數(權重值和偏置值)所決定。我們可以把兩部分參數合併為一個n維的權重向量,記為w。下圖是損失函數f(w)的圖示。

如上圖所示,w*是損失函數的最小值。在空間內任意選擇一個點A,我們都能計算得到損失函數的一階、二階導數。一階導數可以表示為一個向量:

ᐁif(w) = df/dwi (i = 1,…,n)

同樣的,損失函數的二階導數可以表示為海森矩陣( Hessian Matrix ):

Hi,jf(w) = d2f/dwi·dwj (i,j = 1,…,n)

多變量的連續可微分函數的求解問題一直被人們廣泛地研究。許多的傳統方法都能被直接用於神經網絡模型的求解。

➤一維優化方法

儘管損失函數的值需要由多個參數決定,但是一維優化方法在這裡也非常重要。這些方法常常用於訓練神經網絡模型。

許多訓練算法首先計算得到一個訓練的方向d,以及速率η來表示損失值在此方向上的變化,f(η)。下圖片展示了這種一維函數。

f和η*在η1和η2所在的區間之內。

由此可見,一維優化方法就是尋找到某個給定的一維函數的最小值。黃金分段法和Brent方法就是其中兩種廣泛應用的算法。這兩種算法不斷地縮減最小值的範圍,直到η1和η2兩點之間的距離小於設定的閾值。

➤多維優化方法

我們把神經網絡的學習問題抽象為尋找參數向量w*的問題,使得損失函數f在此點取到最小值。假設我們找到了損失函數的最小值點,那麼就認為神經網絡函數在此處的梯度等於零。

通常情況下,損失函數屬於非線性函數,我們很難用訓練算法準確地求得最優解。因此,我們嘗試在參數空間內逐步搜索,來尋找最優解。每搜索一步,重新計算神經網絡模型的參數,損失值則相應地減小。

我們先隨機初始化一組模型參數。接著,每次迭代更新這組參數,損失函數值也隨之減小。當某個特定條件或是終止條件得到滿足時,整個訓練過程即結束。

現在我們就來介紹幾種神經網絡的最重要訓練算法。

❶梯度下降法(Gradient descent)

梯度下降方法是最簡單的訓練算法。它僅需要用到梯度向量的信息,因此屬於一階算法。

我們定義f(wi) = fi and ᐁf(wi) = gi。算法起始於W0點,然後在第i步沿著di = -gi方向從wi移到wi+1,反覆迭代直到滿足終止條件。梯度下降算法的迭代公式為:

wi+1 = wi - di·ηi, i=0,1,…

參數η是學習率。這個參數既可以設置為固定值,也可以用一維優化方法沿著訓練的方向逐步更新計算。人們一般傾向於逐步更新計算學習率,但很多軟體和工具仍舊使用固定的學習率。

下圖是梯度下降訓練方法的流程圖。如圖所示,參數的更新分為兩步:第一步計算梯度下降的方向,第二步計算合適的學習率。

梯度下降方法有一個嚴重的弊端,若函數的梯度變化如圖所示呈現出細長的結構時,該方法需要進行很多次迭代運算。而且,儘管梯度下降的方向就是損失函數值減小最快的方向,但是這並不一定是收斂最快的路徑。下圖描述了此問題。

當神經網絡模型非常龐大、包含上千個參數時,梯度下降方法是我們推薦的算法。因為此方法僅需要存儲梯度向量(n空間),而不需要存儲海森矩陣(n2空間)

❷牛頓算法(Newton’s method)

因為牛頓算法用到了海森矩陣,所以它屬於二階算法。此算法的目標是使用損失函數的二階偏導數尋找更好的學習方向。

我們定義f(wi) = fi, ᐁf(wi) = gi and Hf(wi) = Hi。用泰勒展開式估計函數f在w0值

f = f0 + g0 · (w - w0) + 0.5 · (w - w0)2 · H0

H0是函數f在w0的海森矩陣值。在f(w)的最小值處g = 0,我們得到了第二個等式

g = g0 + H0 · (w - w0) = 0

因此,將參數初始化在w0,牛頓算法的迭代公式為

wi+1 = wi - Hi-1·gi, i = 0,1,…

Hi-1·gi 被稱為牛頓項。值得注意的是,如果海森矩陣是一個非正定矩陣,那麼參數有可能朝著最大值的方向移動,而不是最小值的方向。因此損失函數值並不能保證在每次迭代都減小。為了避免這種問題,我們通常會對牛頓算法的等式稍作修改:

wi+1 = wi - (Hi-1·gi) ·ηi, i=0,1,…

學習率η既可以設為固定值,也可以動態調整。向量d = Hi-1·gi被稱為牛頓訓練方向。

下圖展示的是牛頓法的流程圖。參數的更新也分為兩步,計算牛頓訓練方向和合適的學習率。

牛頓法的性能如下圖所示。從相同的初始值開始尋找損失函數的最小值,它比梯度下降方法需要更少的步驟。

然而,牛頓法的難點在於準確計算海森矩陣和其逆矩陣需要大量的計算資源。

❸共軛梯度法(Conjugate gradient)

共軛梯度法介於梯度下降法與牛頓法之間。它的初衷是解決傳統梯度下降法收斂速度太慢的問題。不像牛頓法,共軛梯度法也避免了計算和存儲海森矩陣。

共軛梯度法的搜索是沿著共軛方向進行的,通常會比沿著梯度下降法的方向收斂更快。這些訓練方向與海森矩陣共軛。

我們將d定義為訓練方向向量。然後,將參數向量和訓練方向訓練分別初始化為w0和d0 = -g0,共軛梯度法的方向更新公式為:

di+1 = gi+1 + di·γi, i=0,1,…

其中γ是共軛參數,計算它的方法有許多種。其中兩種常用的方法分別是Fletcher 和 Reeves 以及 Polak 和 Ribiere發明的。對於所有的共軛梯度算法,訓練方向會被周期性地重置為梯度的負值。

參數的更新方程為:

wi+1 = wi + di·ηi, i=0,1,…

下圖是共軛梯度法訓練過程的流程圖。參數更新的步驟分為計算共軛梯度方向和計算學習率兩步。

此方法訓練神經網絡模型的效率被證明比梯度下降法更好。由於共軛梯度法不需要計算海森矩陣,當神經網絡模型較大時我們也建議使用。

❹柯西-牛頓法(Quasi-Newton method)

由於牛頓法需要計算海森矩陣和逆矩陣,需要較多的計算資源,因此出現了一個變種算法,稱為柯西-牛頓法,可以彌補計算量大的缺陷。此方法不是直接計算海森矩陣及其逆矩陣,而是在每一次迭代估計計算海森矩陣的逆矩陣,只需要用到損失函數的一階偏導數。

海森矩陣是由損失函數的二階偏導數組成。柯西-牛頓法的主要思想是用另一個矩陣G來估計海森矩陣的逆矩陣,只需要損失函數的一階偏導數。柯西-牛頓法的更新方程可以寫為:

wi+1 = wi - (Gi·gi)·ηi, i=0,1,…

學習率η既可以設為固定值,也可以動態調整。海森矩陣逆矩陣的估計G有多種不同類型。兩種常用的類型是Davidon–Fletcher–Powell formula (DFP)和Broyden–Fletcher–Goldfarb–Shanno formula (BFGS)。

柯西-牛頓法的流程圖如下所示。參數更新的步驟分為計算柯西-牛頓訓練方向和計算學習率。

許多情況下,這是默認選擇的算法:它比梯度下降法和共軛梯度法更快,而不需要準確計算海森矩陣及其逆矩陣。

❺Levenberg-Marquardt算法

Levenberg-Marquardt算法又稱為衰減的最小平方法,它針對損失函數是平方和誤差的形式。它也不需要準確計算海森矩陣,需要用到梯度向量和雅各布矩陣。

假設損失函數f是平方和誤差的形式:

f = ∑ ei2, i=0,…,m

其中m是訓練樣本的個數。

我們定義損失函數的雅各布矩陣由誤差項對參數的偏導數組成,

Ji,jf(w) = dei/dwj (i = 1,…,m & j = 1,…,n)

m是訓練集中的樣本個數,n是神經網絡的參數個數。雅各布矩陣的規模是m·n

損失函數的梯度向量是:

ᐁf = 2 JT·e

e是所有誤差項組成的向量。

最後,我們可以用這個表達式來估計計算海森矩陣。

Hf ≈ 2 JT·J + λI

λ是衰減因子,以確保海森矩陣是正的,I是單位矩陣。

此算法的參數更新公式如下:

wi+1 = wi - (JiT·Ji+λiI)-1·(2 JiT·ei), i=0,1,…

若衰減因子λ設為0,相當於是牛頓法。若λ設置的非常大,這就相當於是學習率很小的梯度下降法。

參數λ的初始值非常大,因此前幾步更新是沿著梯度下降方向的。如果某一步迭代更新失敗,則λ擴大一些。否則,λ隨著損失值的減小而減小,Levenberg-Marquardt接近牛頓法。這個過程可以加快收斂的速度。

下圖是Levenberg-Marquardt算法訓練過程的流程圖。第一步計算損失值、梯度和近似海森矩陣。然後衰減參數和衰減係數。

由於Levenberg-Marquardt算法主要針對平方和誤差類的損失函數。因此,在訓練這類誤差的神經網絡模型時速度非常快。但是這個算法也有一些缺點。首先,它不適用於其它類型的損失函數。而且,它也不兼容正則項。最後,如果訓練數據和網絡模型非常大,雅各布矩陣也會變得很大,需要很多內存。因此,當訓練數據或是模型很大時,我們並不建議使用Levenberg-Marquardt算法。

➤內存使用和速度的比較

下圖繪製了本文討論的五種算法的計算速度和內存需求。如圖所示,梯度下降法往往是最慢的訓練方法,它所需要的內存也往往最少。相反,速度最快的算法一般是Levenberg-Marquardt,但需要的內存也更多。柯西-牛頓法較好地平衡了兩者。

總之,如果我們的神經網絡模型有上千個參數,則可以用節省存儲的梯度下降法和共軛梯度法。如果我們需要訓練很多網絡模型,每個模型只有幾千個訓練數據和幾百個參數,則Levenberg-Marquardt可能會是一個好選擇。其餘情況下,柯西-牛頓法的效果都不錯。

相關焦點

  • 從梯度下降到擬牛頓法:詳解訓練神經網絡的五大學習算法
    選自 Neuraldesigner作者:Alberto Quesada機器之心編譯參與:蔣思源在神經網絡中,系統的學習過程一般是由訓練算法所主導。而現如今有許多不同的學習算法,它們每一個都有不同的特徵和表現。因此本文力圖描述清楚五大學習算法的基本概念及優缺點,給讀者們闡明最優化在神經網絡中的應用。
  • 神經網絡分析算法
    他們相互聯繫形成神經網絡,通過感官器官和神經來接受來自身體外的各種信息(在神經網絡算法中我們稱:訓練)傳遞中樞神經,然後經過對信息的分析和綜合,再通過運動神經發出控制信息(比如我在博客園敲文字),依次來實現機體與外部環境的聯繫。神經元這玩意跟其它細胞一樣,包括:細胞核、細胞質和細胞核,但是它還有比較特殊的,比如有許多突起,就跟上面的那個圖片一樣,分為:細胞體、軸突和樹突三分部。
  • 算法的算法:人工神經網絡
    從Logistic回歸到支持向量機,算法層出不窮,毫不誇張的說,神經網絡成為算法的算法,為機器學習的頂峰。它也從最初不斷嘗試中成為機器學習的通用表達形式。存在很多算法來對網絡中可變參數進行訓練。Logistic回歸簡單定義為標準回歸,每個輸入均具有乘法係數,並添加了附加偏移量(截距),然後經過Signmoid型函數傳遞。這可以通過沒有隱藏層的神經網絡來表示, 結果是通過Sigmoid形式的輸出神經元的多元回歸。
  • 人工神經網絡的原理與訓練
    ==============分割線==============最近這段時間,人工智慧、神經網絡算法著實的又火了一把。在金融中,也有了不少的人在試圖合理的運用這套技術。那麼到底什麼是人工神經網絡?它背後的原理又是什麼?這篇文章適合只聽說過人工神經網絡,但沒有了解其原理的人。
  • 「人工神經網絡」人工神經網絡之BP算法
    人工神經網絡(Artificial Neural Network,ANN)是在受到了生物學的啟發後創建的,在某種程度上它是對生物大腦的一種模擬。人們仿照生物神經網絡的結構,使用簡單運算單元模擬神經元,並將大量運算單元按某種形式密集連接,便構成了人工神經網絡。結構如圖:人工神經網絡(ANN)模型帶有權重值(w1,w2,...
  • 什麼是神經網絡算法?
    人工智慧的底層模型是"神經網絡"(neural network)。許多複雜的應用(比如模式識別、自動控制)和高級模型(比如深度學習)都基於它。學習人工智慧,一定是從它開始什麼是神經網絡呢?網上似乎缺乏通俗的解釋。
  • BP神經網絡算法與實踐
    神經網絡有很多種:前向傳輸網絡、反向傳輸網絡、遞歸神經網絡、卷積神經網絡等。本文介紹基本的反向傳輸神經網絡(Backpropagation 簡稱BP),主要講述算法的基本流程和自己在訓練BP神經網絡的一些經驗。
  • 人工神經網絡算法及其簡易R實現
    人工神經網絡(Artificial Neural Network)簡單而言是一種分類算法。作為機器學習的一個龐大分支,人工神經網絡目前大約有幾百種算法,其中包括一些著名的ANN算法:感知器神經網絡(Perceptron Neural Network), 反向傳遞(Back Propagation), Hopfield網絡和自組織映射(Self-Organizing Map, SOM)等等,這篇文章我們只介紹最基本的人工神經網絡算法原理及其簡易的R語言實現方式。
  • 前沿| 利用遺傳算法優化神經網絡:Uber提出深度學習訓練新方式
    許多人認為,SGD 算法有效計算梯度的能力對於這種訓練能力而言至關重要。但是,Uber 近日發布的五篇論文表明,神經進化(neuroevolution)這種利用遺傳算法的神經網絡優化策略,也是訓練深度神經網絡解決強化學習(RL)問題的有效方法。
  • 人工智慧算法:訓練神經網絡中的批量歸一化(附代碼)
    在下一個代碼段中,我們設置並指定優化算法來訓練實現的神經網絡,以及損失函數和超參數(例如學習率和曆元數)。,該工具提供了訓練已實現網絡的工具。利用評估結果,您可以在觀察測試數據集評估的準確性之後,決定微調網絡超參數或進入生產。model.evaluate(test_images,test_labels)在訓練階段,您可能會注意到,與沒有批處理規範化層的網絡訓練相比,每個紀元花費的時間更長。
  • MATLAB優化算法實例——神經網絡
    2.2 BP神經網絡學習算法及流程以三層BP神經網絡為例,它的訓練過程包括以下幾個步驟:步驟1: 網絡初始化。共軛梯度法traingpPowell-Beale共軛梯度法traingb2. train——BP神經網絡訓練函數函數功能:用訓練函數訓練BP神經網絡。
  • 前饋神經網絡——深度學習之神經網絡核心原理與算法
    線性回歸的訓練,其實和基於統計的機器學習訓練很相近。如果你熟悉回歸的話,你會覺得bp神經網絡的訓練很簡單。線性回歸的訓練過程: 一個線性回歸的模型是怎麼學到的,以及它學到了什麼。為理解BP神經網絡的訓練做鋪墊。一元線性回歸是所有機器學習中最簡單的。樣本:
  • 算法之「算法」:所有機器學習算法都可以表示為神經網絡
    但是眾所周知,神經網絡是算法的算法及機器學習的巔峰。我們可以說,神經網絡是對機器學習的普遍概括,而不是僅僅一次嘗試。與其說神經網絡是簡單的算法,不如說是框架和概念,這是顯而易見的,因為在構建神經網絡時有很大的自由度——比如對於隱藏層&節點個數、激活函數、優化器、損失函數、網絡類型(卷積神經網絡、循環神經網絡等)以及特殊層(批歸一化、隨機失活等)。
  • 為什麼深度神經網絡這麼難訓練?
    有了這些多層抽象,深度神經網絡似乎可以學習解決複雜的模式識別問題。正如電路示例所體現的那樣,理論研究表明深度神經網絡本質上比淺層神經網絡更強大。 如何訓練深度神經網絡呢?本章嘗試使用我們熟悉的學習算法——基於反向傳播的隨機梯度下降,來訓練深度神經網絡。但是,這會產生問題,因為我們的深度神經網絡並不比淺層神經網絡的性能強多少。
  • 程式設計師面試常問算法:不用高等數學講明白神經網絡
    生物神經網絡通常神經網絡可以分兩種,一是生物神經網絡,一是人工神經網絡。生物神經網絡:一般指生物的大腦神經元、細胞、觸點等組成的網絡,它產生生物的意識,幫助其進行思考和行動。人工神經網絡:它是一種模仿動物神經網絡行為特徵的算法數學模型。
  • 機器學習算法匯總:人工神經網絡、深度學習及其它
    算法類似性根據算法的功能和形式的類似性,我們可以把算法分類,比如說基於樹的算法,基於神經網絡的算法等等。當然,機器學習的範圍非常龐大,有些算法很難明確歸類到某一類。而對於有些分類來說,同一分類的算法可以針對不同類型的問題。這裡,我們儘量把常用的算法按照最容易理解的方式進行分類。
  • 人工神經網絡算法介紹及其參數講解
    每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重,這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式,權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。人工神經網絡模型主要考慮網絡連接的拓撲結構、神經元的特徵、學習規則等。
  • 深度學習:神經網絡算法的昨天、今天和明天
    而這些應用背後的核心算法就是深度學習(Deep Learning),這也是機器學習(Machine Learning)領域最火熱的一個分支。和其他機器學習算法有很大不同,深度學習依賴大量數據的迭代訓練,進而發現數據中內在的特徵(Feature),然後給出結果。
  • 【乾貨】深度學習需要了解的四種神經網絡優化算法
    【導讀】近日,Vadim Smolyakov發表了一篇博客,針對當前神經網絡的優化算法進行了總結,並利用簡單的CNN網絡在NMIST數據集上進行實驗
  • 為什麼深度神經網絡這麼難訓練?|贈書
    作者以技術原理為導向,輔以貫穿全書的 MNIST 手寫數字識別項目示例,介紹神經網絡架構、反向傳播算法、過擬合解決方案、卷積神經網絡等內容,以及如何利用這些知識改進深度學習項目。學完本書後,讀者將能夠通過編寫 Python 代碼來解決複雜的模式識別問題。