神經(jīng)元 先來認識下真正的神經(jīng)元。 圖 1: 典型神經(jīng)元的結構(來自維基百科 “樹突” 詞條) 神經(jīng)元大致可以分為樹突、突觸、細胞體和軸突。樹突為神經(jīng)元的輸入通道,其功能是將其他神經(jīng)元的動作電位傳遞至細胞體。其他神經(jīng)元的動作電位借由位于樹突分支上的多個突觸傳遞至樹突上。神經(jīng)細胞可以視為有兩種狀態(tài)的機器,激活時為 “是”,不激活時為 “否”。神經(jīng)細胞的狀態(tài)取決于從其他神經(jīng)細胞接收到的信號量,以及突觸的性質(zhì)(抑制或加強)。當信號量超過某個閾值時,細胞體就會被激活,產(chǎn)生電脈沖。電脈沖沿著軸突并通過突觸傳遞到其它神經(jīng)元。(內(nèi)容來自維基百科 “感知機” 詞條,稍作整理) 我們的視覺系統(tǒng)非常復雜。大致來講,當光線投射到視網(wǎng)膜后,視覺膜上的光感受細胞的突觸直接與雙極細胞相連,雙極細胞突觸則與最外層的節(jié)細胞相連,節(jié)細胞將動作電位傳遞到大腦。我們的視網(wǎng)膜有大約 1 億 3 千萬個光感受細胞接收光信號,然后通過大約 120 萬個節(jié)細胞軸突將信息從視網(wǎng)膜傳遞到大腦。(內(nèi)容來自維基百科 “視覺系統(tǒng)” 詞條) 視覺系統(tǒng)使我們有了視知覺能力,將外部世界的二維投射重構為三維世界。 人類的視覺系統(tǒng)可以毫不費力的識別出下面圖片中的數(shù)字(當然還有文字)。但如果讓計算機來識別,就會明顯感覺到視覺識別的困難。 圖 2: 街道地址(來源于維基百科 “Handwriting recognition” 詞條) 我們不能簡單地把 “數(shù)字 2 像一只水面上的天鵝,數(shù)字 7 像一把鋤頭” 這樣的規(guī)則教給計算機。因此,我們需要把手寫識別的問題表述成計算機可以理解的方式。 圖 3: 水面上的天鵝像極了數(shù)字 2 假設我們有 5x5 像素的圖片來顯示每個數(shù)字,例如數(shù)字 2 表示如下: @@@@@ . . . . . @ @@@@@ @. . . . . @@@@@ 由于我們的神經(jīng)網(wǎng)絡是以數(shù)字組成向量作為輸入的,所以我們將每個圖片轉換成長度為 25 的向量,其元素的值是 1(“這個像素位于該圖像中”)或 0(“這個像素不在該圖像中”) 例如,數(shù)字 2 可以表示為: two_digit=[1,1,1,1,1 0,0,0,0,1 1,1,1,1,1 1,0,0,0,0 1,1,1,1,1] 我們希望神經(jīng)網(wǎng)絡最終的輸出是一個具體的數(shù)字,因此我們需要 10 個不同的輸出結果。例如,對于數(shù)字 2,正確的輸出結果將是: [0,0,1,0,0,0,0,0,0,0] 圖 4: 使用 python 列表解析式建立一個代表 0-9 不同數(shù)字的列表 其中 targets[2] 就是輸出結果數(shù)字 2。 那么,神經(jīng)網(wǎng)絡是如何把信息的輸入轉換成我們想要的輸出的呢? 感知器(Perceptron) 感知器是一種二元分類器,它是神經(jīng)網(wǎng)絡的基石。感知器是對神經(jīng)細胞的模擬,如權量(突觸)、偏置(閾值)及激活函數(shù)(細胞體)。 輸入以向量的形式表示 x=(x_0, x_1, x_2),你可以把它們理解為不同的特征維度,其中的 x_0 是偏置單元(bias unit), 相當于線性回歸中的常數(shù)項。在經(jīng)過 “神經(jīng)元”(激活函數(shù))的計算后,感知器會輸出一個大于 0 或小于 0 的數(shù)。箭頭上的數(shù)字代表每個特征的權量(weights),相當于線性回歸模型的參數(shù),是收集信息的神經(jīng)突觸。 例如,上圖列出了每個特征的權量,于是我們有這樣的模型: hθ(x)=-3+2*x_1+2*x_2 當 x_1 和 x_2 同時為 1 時,輸出為 1,而不同時都將得到負數(shù)。這實際上就是邏輯與或稱為與門。 我們的感知器將根據(jù)輸出大于或小于 0 來對輸入進行分類: 這是一個單層的感知器。通過修改權量,我們也可以建立或門(weights=[2,2], bias=-1)、非門(weights=[-2],bias=1,只有一個輸入端)。但是,無論如何,你都無法通過一個單層的感知器來建立 “異或門”(XOR),即兩個輸入相同時輸出 1,否則輸出 0。這種情況下,我們就需要更復雜的神經(jīng)網(wǎng)絡了,即多層神經(jīng)網(wǎng)絡,也被稱為前饋神經(jīng)網(wǎng)絡(feedforward neural network)。 前饋神經(jīng)網(wǎng)絡 前饋神經(jīng)網(wǎng)絡是多個感知器的組合,這些感知器以不同的方式產(chǎn)生連接,并由不同的激活函數(shù)控制激活。 圖 6: 前饋神經(jīng)網(wǎng)絡示意圖 我們來認識下前饋神經(jīng)網(wǎng)絡:
超越線性 在 “感知器” 中我們談到,單層感知器雖然可以建立與門、或門、非門等,但無法建立更為復雜的異或門(XOR),即兩個輸入相同時輸出 1,否則輸出 0。 為了更為直觀地理解這個問題,我們可以看下圖: 圖 7: 雙輸入感知器的決策空間 模型有兩個輸入(input1 和 input2),我們可以線性地區(qū)分或門的兩類情況:即同時為 0 時在左下角,其它情況在右上角;與門的情況也可以線性地區(qū)分,即輸出同時為 1 時在右上角,其它情況在左下角。但異或門呢?這種情況是無法作出線性區(qū)分的,也就是說,單層感知器無法實現(xiàn)異或門。 多層感知器嗎? 先來分析輸入和輸出的情況。最左邊兩列列出了輸入的 4 種情況。異或門的輸出是最右邊一列的情況,即兩個輸入相同時輸出 1,否則為 0。我們在輸入層和輸出層之間加入兩個單元的隱藏層,那么,它給輸出層的輸入應該是什么呢?答案如下圖。你可以發(fā)現(xiàn),對于隱藏層的 a_1 單元(上標 2 代表這是第 2 層)來說,它實際上是且門(都為 1 時才輸出 1);對 a_2 單元來說,它的邏輯是 (not x_1) and (not x_2),即同時為 0 時才輸出 1。而從隱藏層到輸出層,是邏輯或。前饋神經(jīng)網(wǎng)絡可以實現(xiàn)異或門! 圖 8: 異或門輸入輸出下推導隱藏層 于是我們建立如下的神經(jīng)網(wǎng)絡,但是其輸出并非我們想要。為什么? 圖 9: 線性激活函數(shù)下的前饋神經(jīng)網(wǎng)絡 這是因為上面感知器的激活函數(shù)是線性函數(shù)。這種情況下,神經(jīng)網(wǎng)絡的輸出也只是輸入的某種線性函數(shù),只不過是通過網(wǎng)絡的形式來進行加權。線性函數(shù)的線性組合仍然是線性函數(shù)。也就是說,即便是多層的感知器,激活函數(shù)為線性時也無法實現(xiàn)輸入 00 和輸入 11 時的輸出比輸入 01 和 10 時大,即非線性。 如果激活函數(shù)是線性函數(shù),前饋神經(jīng)網(wǎng)絡將不會比單層感知器強大多少,不管它有多少層。 我們需要 logistic 函數(shù)的幫助。大部分神經(jīng)網(wǎng)絡會使用非線性激活函數(shù),比如 logistic 函數(shù)(也被稱為 Sigmoid 函數(shù),這是就其形狀而言的)。此外,由于訓練神經(jīng)網(wǎng)絡要使用微積分,而要使用微積分,就得使用光滑函數(shù)(在反向傳播時我們會詳細講解)。logistic 函數(shù)也滿足這一要求。 在 logistic 函數(shù)的作用下,線性函數(shù)的輸出值將被轉化到 0 到 1 之間。從下圖右上角的 logistc 曲線可以看到,輸入值越大,輸出越接近 1,輸入為 4 時輸出為 0.99;輸入值越小,輸出越接近 0,輸入值為 - 4 時,輸出為 0.01。 下圖是單層感知器的激活函數(shù)為 logitic 函數(shù)時與門的示例。 圖 10: 激活函數(shù)為 logitic 函數(shù)時的與門單層感知器 綜上,我們可以通過前饋神經(jīng)網(wǎng)絡和 logistic 函數(shù)解決異或門的問題: ![]() 圖 11: 非線性神經(jīng)網(wǎng)絡實現(xiàn)異或門 反向傳播(backpropagation):訓練神經(jīng)網(wǎng)絡 反向傳播是使用數(shù)據(jù)來訓練神經(jīng)網(wǎng)絡的算法,它是神經(jīng)網(wǎng)絡的梯度下降算法。 假設我們有一個訓練集,其中含有輸入向量和相應的目標輸出向量。同時,假定我們的網(wǎng)絡已經(jīng)擁有一組權量(相當于我們知道每個神經(jīng)元的激活函數(shù)),那么接下來,我們就需要使用以下算法來調(diào)整這些權量。 1、利用初始權量,在輸入向量上運行前向傳播,從而得到所有網(wǎng)絡所有神經(jīng)元的輸出。 2、這樣,每個輸出層神經(jīng)元都會得到一個誤差,即輸出值與實際值之差。 3、計算作為神經(jīng)元權量的函數(shù)的誤差的梯度,然后根據(jù)誤差降低最快的方向調(diào)整權量。 4、將這些輸出誤差反向傳播給隱藏層以便計算相應誤差。 5、計算這些誤差的梯度,并利用同樣的方式調(diào)整隱藏層的權量。 不斷迭代,直到網(wǎng)絡收斂。 要理解上述過程,梯度下降算法是關鍵。 ![]() 圖 12: 單個參數(shù)的損失函數(shù)示例 在梯度下降算法中,我們需要損失函數(shù)(即上面提到的作為神經(jīng)元權量的函數(shù)的誤差)。損失函數(shù)衡量了模型的誤差,即神經(jīng)網(wǎng)絡的輸出值與實際值之間的差異,它的參數(shù)是模型的參數(shù),即連接的權量。當損失函數(shù)達到全局最低時,得到最優(yōu)的權權量。在訓練階段,權量不斷被更新,慢慢接近全局最低值。例如,權量是 0.6 時,它就需要向 0.4 變化,這樣才能接近全局最低值。 上圖描述的是只有一個參數(shù)的情況,即模型的誤差取決于一個參數(shù)。然而,神經(jīng)網(wǎng)絡的誤差取決于每一個權量,它的損失函數(shù)也會復雜得多。 其中,i 代表第幾層,k 代表第 i 層的第幾個單元。可見,損失函數(shù)把整個神經(jīng)網(wǎng)絡的誤差都加和了。后面的第二部分是正則化項,暫時不用理睬,不影響后面的理解。 有人可能會問,為什么神經(jīng)網(wǎng)絡的損失函數(shù)是上面的形式?這個問題等價于為什么 logistic 函數(shù)采用上面的形式? 在回歸模型中,損失函數(shù)是平方誤差函數(shù)(最小二乘法): 損失函數(shù)衡量了模型的輸出與實際值之間的誤差: 但對 logistic 函數(shù)而言,平方誤差函數(shù)是一個非凸函數(shù),利用梯度下降算法,它將無法保證找到損失函數(shù)的全局最優(yōu)解。 ![]() 圖 13: 非凸函數(shù) 對 logistic 函數(shù),我們需要其他的損失函數(shù): 圖 14: 圖 15: 如果 y=1,而 h(x)=1 的話,則 cost=0,即圖 14 曲線上(1,0)的位置;如果 h(x)=0,則 cost 函數(shù)輸出值趨向于無窮大,這意味著當我們認為某種情況不會發(fā)生,例如用戶不會成為付費用戶,而事實上是可能的時,這種損失是不可估量的。同理,如果 y=0,而 h(x)=0 的話,則 cost=0,即圖 15 曲線上(0,0)的位置;如果 h(x)=1,則 cost 趨向于無窮大。 可以把兩種情況寫在一個表達式中: 也即: 神經(jīng)網(wǎng)絡衡量整個網(wǎng)絡的誤差,所以在形式上看起來會復雜些,但實質(zhì)是一樣的。 那么,接下來我們要如何更新權量才能使得損失函數(shù)接近全局最低值呢? 在神經(jīng)網(wǎng)絡中,我們使用反向傳播算法來更新神經(jīng)元之間連接的權量。反向傳播的意思是指,我們從輸出層開始計算,計算輸出層與實際值的誤差,然后返回到前面的隱藏層計算其誤差,以此類推,不斷迭代,直到網(wǎng)絡收斂。 在完成第一步的前向傳播后,我們會得到神經(jīng)網(wǎng)絡的輸出值,利用損失函數(shù)可以計算出輸出值與實際值之間的誤差。損失函數(shù)的偏導數(shù)可以告訴我們參數(shù)往哪個方向更新可以得到更小的損失函數(shù)值。導數(shù)的幾何意義為曲線的斜率,例如,對于圖 12 簡單的損失函數(shù)而言,參數(shù)在 0.5 時斜率為正,參數(shù)值需要減少才能得到更小的損失函數(shù)值;而如果參數(shù)值為 0.1,斜率為負,參數(shù)值需要增加才能得到更小的損失函數(shù)值。導數(shù)可以告訴我們?nèi)肿畹偷姆较颍?/p> 為了得到最小的 J(θ),我們需要不斷更新參數(shù)θ,即神經(jīng)網(wǎng)絡連接的權量。每次更新的變化值由下面的公式?jīng)Q定: 其中,為損失函數(shù)的偏導數(shù),前面為負是因為斜率為正時,我們需要減少參數(shù)的值才能 “下山”,而斜率為負時,我們需要增加參數(shù)的值才能 “下山”, 代表學習速率,代表下山的步子有多大,如果步子太小,要走很遠才能走到山底,如果步子太大,容易越過谷底,導致無法收斂;J(θ) 為神經(jīng)元輸出的誤差。 從隱藏層到輸出層的兩個神經(jīng)元之間的權量一旦更新,就可以更新隱藏層神經(jīng)元的輸出,從而得到隱藏層神經(jīng)元新的誤差值(更新后的輸出值和之前前向傳播時得到的輸出值),進而根據(jù)上述公式更新隱藏層和上一層兩個神經(jīng)元之間的權量。依此類推,直到更新完整個神經(jīng)網(wǎng)絡的權量。 利用損失函數(shù)繼續(xù)更新整個網(wǎng)絡的權量,直到神經(jīng)網(wǎng)絡輸出值的誤差達到最小。 所有神經(jīng)元之間的權量確定后,神經(jīng)網(wǎng)絡就完成訓練了。 綜上,讓機器人看到 2 絕非易事。 參考資料:
|
|