全文共5353字,預計學習時長20分鐘或更長
本文旨在揭開神經網絡的神秘面紗,介紹神經網絡運行的動機和基礎。
神經網絡的動機
未經訓練的神經網絡模型很像新生兒: 他們被創造出來的時候對世界一無所知(如果考慮到認識論理論的話),而且只有通過接觸這個世界,也就是後天的知識,才會慢慢提高它們的認知程度。算法通過數據體驗世界——我們試圖通過在相關數據集上訓練神經網絡,來提高其認知程度。衡量進度的方法是通過監測網絡產生的誤差。
在深入研究神經網絡世界之前,了解這些網絡背後的動機以及它們工作的原因是很重要的。為了做到這一點,我們必須討論一下邏輯回歸分析。
圍繞定量反應變量的建模與預測(例如計程車接送的次數,自行車租賃的次數)的方法被稱為回歸(Ridge回歸,LASSO回歸等)。當因變量是明確的,那麼這個問題不再被稱為回歸問題,而是被標記為一個分類問題。
考慮一個二分類問題,目標是根據一組預測變量 x,嘗試將每個觀察結果分為由 y 定義的類別(例如類別或集群)。
假設我們想根據患者的特徵來預測患者是否患有心臟病。這裡的因變量是絕對的,存在有限的結果,或者更明確地說是二元的,因為只有兩種類型(yes / no)。
這裡有很多特性——在此,我們只使用 MaxHR 變量。
為了做出這個預測,我們將使用一種被稱為邏輯回歸分析的方法。邏輯回歸分析解決了預測一個人患有心臟病概率的問題,P(y=1),給定輸入值X。
邏輯回歸模型使用一個邏輯來對P(y=1)建模 :
因此,該模型將用S形曲線預測 P(y=1) ,S形曲線是邏輯函數的一般形狀。
β使曲線右移或左移 c=-β/ β,而β控制 s 形曲線的陡度。
注意,如果β是正值,那麼預測的P(y=1)範圍為 從0(當x很小時)到1(當x很大時),如果β是負值,則與之相反。
下面以圖表形式對此進行總結。
現在我們知道了如何操縱邏輯回歸曲線,可以利用一些變量來得到想要的曲線。
可以改變β值來移動偏移量。
可以改變β的值來扭曲梯度。
動手完成這個過程是相當乏味的,而且不太可能得到最優值。為了解決這個問題,我們使用損失函數來量化歸屬於當前參數的誤差水平。然後找出使這個損失函數最小的係數。對於這種二進位分類,可以使用一個二進位損失函數來優化我們的邏輯回歸模型。
因此,神經網絡的參數與網絡產生的誤差有關,當參數變化時,網絡產生的誤差也隨之變化。使用一種叫做梯度下降法的優化算法來改變參數,這種算法對於尋找函數的最小值很有用。我們正在尋求最小化的誤差,這也被稱為損失函數或目標函數。
那麼剛剛做的這些有什麼意義呢?這和神經網絡有什麼關係?實際上,剛剛做的實質上和神經網絡算法執行的程序是一樣的。
我們只為之前的模型使用了一個特性。相反,我們可以採用多種特性,並用網絡的形式來說明這些特性。我們有每個特徵的權重,還有一個偏差項,它們共同組成了回歸參數。根據問題是分類問題還是回歸問題,公式將略有不同。
當我們討論神經網絡中的權重時,實際上討論的是各種傳入函數的回歸參數。然後這些信息被傳遞給激活函數,由它來決定結果是否重要到足以「觸發」該節點。
所以現在我們開發了一個非常簡單的網絡,它由多個具有4個功能的邏輯回歸模型組成。
需要從一些任意的數值公式開始,以便更新和優化參數,我們將在每次更新後評估損失函數並使用梯度下降法。
要做的第一件事是隨機設置權重。在心臟數據中,該模型很可能會給出錯誤的答案。
然後通過不良行為處罰的方式來訓練這個模型。
然而,僅僅告訴計算機它的性能是好是壞並不是特別有幫助。你需要告訴它如何更改這些權重,以提高模型的性能。
我們已經知道如何告訴計算機它運行良好,只需要諮詢損失函數。現在,這個過程更複雜了,因為有5個權重要處理。我們將只考慮一個權重,但所有權重的程序是類似的。
理想情況下,我們希望知道給出使(w)取最小值的w的值。
為了找到函數(w)的最優點,可以對權值求導,然後將其設為零。
然後需要找到滿足這個方程的w。有時候沒有明確的解決方案。
一個更靈活的方法是從任何一點開始,然後確定哪個方向去減少損失(在這種情況下是左邊還是右邊)。具體來說,可以計算函數在這一點上的斜率。如果斜率是負的,就向右移動,如果斜率是正的,就向左移動。然後重複這個過程直到收斂。
如果步長與斜率成正比,那麼你就要避免超過最小值。
如何執行此更新?這是通過一種被稱為梯度下降法的方法來完成的,這個方法在前面已經簡要提到過。
梯度下降法
梯度下降法是求函數最小值的迭代法。這篇博文展示了更新權重的不同方法。現在,堅持使用普通的梯度下降法算法,有時也被稱為delta規則。
我們知道想要走與導數相反的方向(因為我們試圖避開誤差) ,並且希望步長與導數成比例。這個步長由一個稱為學習率的參數控制。新權重是舊權重和新步長的和,步長由損失函數以及相關參數對學習率的影響程度決定。
較快的學習速度意味著對導數賦予較大的權重,這樣算法的每次迭代都可以進行較大的步長。較小的學習速度意味著對導數的權重較小,因此每次迭代可以採用較小的步長。
如果步長過小,則算法需要較長時間收斂,如果步長過大,則算法將不斷錯過最優參數的選擇。顯然,建立一個神經網絡時選擇學習率很重要。
使用梯度下降法時有很多考慮因素:
· 仍然需要推導出導數。
· 需要知道學習率是多少或者如何設置它。
· 需要避免局部極小值。
· 最後,全部損失函數包括所有單個"誤差"的總和。這可以是成千上萬的例子。
現在衍生物都是用自動微分來衍生的,所以不太關心這個問題。然而,確定學習速度是一個重要而複雜的問題。
局部極小值對於神經網絡來說是個很大的問題,因為神經網絡的形式並不能保證我們將達到全局最小值。
陷入局部極小值意味著有一個局部良好的參數優化,但有一個更好的優化在損失表面的某個地方。神經網絡的損耗曲面可以有許多這樣的局部優化,這是網絡優化的問題。例如下圖所示的損失表面。
怎樣解決這個問題呢?一方面可以使用批量梯度下降和隨機梯度下降的方法。雖然這聽起來複雜,但事實上很簡單,不要用整個數據集,而是用其中一批(組)數據,在每次迭代過程中,損失平面都會有部分變動。
每一次迭代k都能使用下面的(似然)損失函數來求導數:
這是全部損失函數的近似值,舉例說明一下。首先從全部的(似然)損失平面開始,隨機分配的網絡權值會提供一個初值。
之後選一批數據,比方說全部數據的10%,然後構建一個新的損失平面。
此時位置變了。再次從全部數據中隨機選擇一組數據,然後構建損失平面。
將梯度下降法應用於這組數據,然後進行更新。
選取一組新數據繼續重複以上程序。
然後進行更新。
將上述程序進行多次迭代。
直到網絡開始收斂到全局最小值。
現在有足夠的知識儲備來構建第一個神經網絡。
人工神經網絡(ANN)
既然已經了解了邏輯回歸的原理、評估一個網絡的方法以及如何更新網絡以提高其性能,那麼接下來就可以構建一個神經網絡了。
首先,希望大家能知道神經網絡名稱的由來。也許你已經聽說過了,神經網絡模仿了神經元即神經細胞的結構,雖然這種結構看起來比神經網絡複雜得多,但其實二者的功能是相似的。
實際神經元運作時要積累電勢能,當能量超過特定值時,突觸前神經元會經軸突放電,繼而刺激突觸後神經元。
人類有著數以億計相互連接的神經元,其放電模式無比複雜。哪怕是最先進的神經網絡也難以比擬人腦的能力,因此,神經網絡在短時間內應該還無法模擬人腦的功能。
可以利用示意圖,將神經元結構與神經網絡中的人工神經元進行類比。
鑑於人腦的能力,很明顯人工神經網絡的應用範圍是無限的,尤其是在我們將其連接到傳感器、執行器和網絡資源以後。儘管目前還處於相對不夠成熟的階段,但是由此可以看出神經網絡無處不在。
畢竟,還原論者認為,人類不過是經由各部分神經系統,連接到傳感器和執行器的神經網絡的集合體。
現在,想像我們擁有大量的特徵。每一特徵都要經過仿射變換,大體來說就是加法(減法)和/或乘法,這就像是一個回歸方程。如果在一個多層感知機中有大量節點會聚於一個節點,那麼仿射變換就變得十分重要。
而後,將結果送到激活函數,這會為我們提供某種形式的概率值。這個概率值決定了神經元是否放電。然後可以把該結果代入損失函數,從而評估該算法的性能。
從現在開始,將仿射和激活看作一個模塊。但是要清楚,仿射變換是上遊節點輸出的總和,而後將加和的輸出傳遞給激活函數,從而評估決定該量化值(概率值)是否足以使神經元放電的概率。
現在可以回到第一個心臟病數據的例子。取兩條邏輯回歸曲線加以合併。合併前的曲線如下所示:
由於自由度的提高,將兩個網絡相連接時,所得網絡的靈活性就會增加。
這很好地體現出了神經網絡的強大,我們可以將大量來自與眾多神經元的函數串(加)在一起,這樣就能得到高度非線性函數。有了大量且充足的神經元,就可以得到任意複雜度的連續函數。
這只是神經網絡的一個簡單的例子,但即使是這樣一個簡單的網絡,我們也已經陷入了一個問題之中。要如何更新權值呢?
我們需要計算與這些權值相關的損失函數的導數。為了了解損失的權值w1、w2和w3,需要用到反向傳播算法。
反向傳播算法
反向傳播算法是神經網絡學習的核心機制,它能在預測期間通知網絡是否出現錯誤。反向傳播算法的問世是整個神經網絡研究中最重要的裡程碑之一。
傳播是為了在某個特定方向或者經由特定的媒介來傳送某種事物(如光、聲)。在神經網絡的背景下討論反向傳播算法時,我們談的是信息的傳輸,神經網絡對數據進行預測會產生誤差,而這些信息就與所產生的誤差相關。
預測期間,神經網絡將信號傳播到輸出層並在此處進行決策,之後網絡將誤差信息反向傳播從而修改各項參數。
反向傳播算法用來計算網絡中各項參數的導數,從而才能使用梯度下降法。這是反向傳播算法和梯度下降法的重要區別,不要將二者混淆。首先用到的是反向傳播算法,來獲取梯度下降法所需要的信息。
可能你已經發現仍需計算導數。計算機無法進行微分,但是為了在沒有網絡設計器參與的情況下進行,我們可以建造一個函數庫來實現該過程,這被稱為自動微分,舉例如下。
可以像這樣手算,然後對每個網絡架構和節點進行修改。
或者,可以定義一個連結到網絡結構的函數庫,當網絡架構更新時會自動實現並更新程序。
如果你真想搞清楚這個自動微分過程用處有多大,試著做一個六節點的多層神經網絡,然後編寫代碼來實現反向傳播算法。
更複雜的網絡
雙節點神經網絡對大多數應用都不適用。通常,我們會用神經網絡去逼近一個難以用傳統方法描述的複雜函數。
神經網絡要遵循萬能近似定理,這一點十分特殊。該定理稱,如果一個神經網絡中有無限多個神經元,那麼就可以精確地表示出任意複雜度的連續函數。這一表述非常耐人尋味,它的意思是,如果計算能力足夠大,我們幾乎可以逼近任何函數。
很明顯,這一想法在實際中存在一些問題。首先,可利用的數據有限,這就限制了預測類別或者估值時的精確度。其次,計算能力有限。即使是世界上最強大的超級計算機,想要設計一個遠超其運載能力的神經網絡也不是什麼難事。
我們所要設計的網絡架構,要憑藉最少的數據,用相對較少的計算能力,就能實現高精度。
更令人吃驚的是,僅僅一個隱藏層就足以逼近任意精確度的任意函數。
如果一層就夠了,那人們為什麼還要使用多層神經網絡呢?
多隱藏層神經網絡架構
答案很簡單。由於淺層神經網絡比深層神經網絡需要更多的寬度(指數級),因此神經網絡的架構要非常寬。此外,淺層神經網絡更容易出現過擬合。
這推動了深度學習領域的出現(深度指的是神經網絡的多層架構),影響著當代關於機器學習以及涉及數據分類和預測的多數領域的研究文獻。
總結
這篇文章圍繞神經網絡的初衷以及背景進行了討論,概述了其訓練方法。我們談論了損失函數、誤差傳播、激活函數和網絡架構。下圖很好地總結了以上概念及其相互間的聯繫。
留言 點讚 關注
我們一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」