CS231n課程筆記翻譯:神經網路筆記1(上)

譯者註:本文智能單元首發,譯自斯坦福CS231n課程筆記Neural Nets notes 1,課程教師Andrej Karpathy授權翻譯。本篇教程由杜客翻譯完成,鞏子嘉和堃堃進行校對修改。譯文含公式和代碼,建議PC端閱讀。

原文如下

內容列表:

  • 不用大腦做類比的快速簡介
  • 單個神經元建模
    • 生物動機和連接
    • 作為線性分類器的單個神經元
    • 常用的激活函數 譯者註:上篇翻譯截止處
  • 神經網路結構
    • 層組織
    • 前向傳播計算例子
    • 表達能力
    • 設置層的數量和尺寸
  • 小節
  • 參考文獻

快速簡介

在不訴諸大腦的類比的情況下,依然是可以對神經網路演算法進行介紹的。在線性分類一節中,在給出圖像的情況下,是使用s=Wx來計算不同視覺類別的評分,其中W是一個矩陣,x是一個輸入列向量,它包含了圖像的全部像素數據。在使用資料庫CIFAR-10的案例中,x是一個[3072x1]的列向量,W是一個[10x3072]的矩陣,所以輸出的評分是一個包含10個分類評分的向量。

神經網路演算法則不同,它的計算公式是s=W_2max(0,W_1x)。其中W_1的含義是這樣的:舉個例子來說,它可以是一個[100x3072]的矩陣,其作用是將圖像轉化為一個100維的過渡向量。函數max(0,-)是非線性的,它會作用到每個元素。這個非線性函數有多種選擇,後續將會學到。但這個形式是一個最常用的選擇,它就是簡單地設置閾值,將所有小於0的值變成0。最終,矩陣W_2的尺寸是[10x100],因此將得到10個數字,這10個數字可以解釋為是分類的評分。注意非線性函數在計算上是至關重要的,如果略去這一步,那麼兩個矩陣將會合二為一,對於分類的評分計算將重新變成關於輸入的線性函數。這個非線性函數就是改變的關鍵點。參數W_1,W_2將通過隨機梯度下降來學習到,他們的梯度在反向傳播過程中,通過鏈式法則來求導計算得出。

一個三層的神經網路可以類比地看做s=W_3max(0,W_2max(0,W_1x)),其中W_1,W_2,W_3是需要進行學習的參數。中間隱層的尺寸是網路的超參數,後續將學習如何設置它們。現在讓我們先從神經元或者網路的角度理解上述計算。

單個神經元建模

神經網路演算法領域最初是被對生物神經系統建模這一目標啟發,但隨後與其分道揚鑣,成為一個工程問題,並在機器學習領域取得良好效果。然而,討論將還是從對生物系統的一個高層次的簡略描述開始,因為神經網路畢竟是從這裡得到了啟發。

生物動機與連接

大腦的基本計算單位是神經元(neuron。人類的神經系統中大約有860億個神經元,它們被大約10^14-10^15個突觸(synapses連接起來。下面圖表的左邊展示了一個生物學的神經元,右邊展示了一個常用的數學模型。每個神經元都從它的樹突獲得輸入信號,然後沿著它唯一的軸突(axon產生輸出信號。軸突在末端會逐漸分枝,通過突觸和其他神經元的樹突相連。

在神經元的計算模型中,沿著軸突傳播的信號(比如x_0)將基於突觸的突觸強度(比如w_0),與其他神經元的樹突進行乘法交互(比如w_0x_0)。其觀點是,突觸的強度(也就是權重w),是可學習的且可以控制一個神經元對於另一個神經元的影響強度(還可以控制影響方向:使其興奮(正權重)或使其抑制(負權重))。在基本模型中,樹突將信號傳遞到細胞體,信號在細胞體中相加。如果最終之和高於某個閾值,那麼神經元將會激活,向其軸突輸出一個峰值信號。在計算模型中,我們假設峰值信號的準確時間點不重要,是激活信號的頻率在交流信息。基於這個速率編碼的觀點,將神經元的激活率建模為激活函數(activation functionf,它表達了軸突上激活信號的頻率。由於歷史原因,激活函數常常選擇使用sigmoid函數sigma,該函數輸入實數值(求和後的信號強度),然後將輸入值壓縮到0-1之間。在本節後面部分會看到這些激活函數的各種細節。

————————————————————————————————————————

左邊是生物神經元,右邊是數學模型。

————————————————————————————————————————

一個神經元前向傳播的實例代碼如下:

class Neuron(object):n # ... n def forward(inputs):n """ 假設輸入和權重是1-D的numpy數組,偏差是一個數字 """n cell_body_sum = np.sum(inputs * self.weights) + self.biasn firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid激活函數n return firing_raten

換句話說,每個神經元都對它的輸入和權重進行點積,然後加上偏差,最後使用非線性函數(或稱為激活函數)。本例中使用的是sigmoid函數sigma(x)=1/(1+e^{-x})。在本節的末尾部分將介紹不同激活函數的細節。

粗糙模型:要注意這個對於生物神經元的建模是非常粗糙的:在實際中,有很多不同類型的神經元,每種都有不同的屬性。生物神經元的樹突可以進行複雜的非線性計算。突觸並不就是一個簡單的權重,它們是複雜的非線性動態系統。很多系統中,輸出的峰值信號的精確時間點非常重要,說明速率編碼的近似是不夠全面的。鑒於所有這些已經介紹和更多未介紹的簡化,如果你畫出人類大腦和神經網路之間的類比,有神經科學背景的人對你的板書起鬨也是非常自然的。如果你對此感興趣,可以看看這份評論或者最新的另一份。

作為線性分類器的單個神經元

神經元模型的前向計算數學公式看起來可能比較眼熟。就像在線性分類器中看到的那樣,神經元有能力「喜歡」(激活函數值接近1),或者不喜歡(激活函數值接近0)輸入空間中的某些線性區域。因此,只要在神經元的輸出端有一個合適的損失函數,就能讓單個神經元變成一個線性分類器。

二分類Softmax分類器。舉例來說,可以把displaystylesigma(Sigma_iw_ix_i+b)看做其中一個分類的概率P(y_i=1|x_i;w),其他分類的概率為P(y_i=0|x_i;w)=1-P(y_i=1|x_i;w),因為它們加起來必須為1。根據這種理解,可以得到交叉熵損失,這個在線性分一節中已經介紹。然後將它最優化為二分類的Softmax分類器(也就是邏輯回歸)。因為sigmoid函數輸出限定在0-1之間,所以分類器做出預測的基準是神經元的輸出是否大於0.5。

二分類SVM分類器。或者可以在神經元的輸出外增加一個最大邊界折葉損失(max-margin hinge loss)函數,將其訓練成一個二分類的支持向量機。

理解正則化。在SVM/Softmax的例子中,正則化損失從生物學角度可以看做逐漸遺忘,因為它的效果是讓所有突觸權重w在參數更新過程中逐漸向著0變化。

一個單獨的神經元可以用來實現一個二分類分類器,比如二分類的Softmax或者SVM分類器。

常用激活函數

每個激活函數(或非線性函數)的輸入都是一個數字,然後對其進行某種固定的數學操作。下面是在實踐中可能遇到的幾種激活函數:

————————————————————————————————————————

左邊是Sigmoid非線性函數,將實數壓縮到[0,1]之間。右邊是tanh函數,將實數壓縮到[-1,1]。

————————————————————————————————————————

Sigmoid。sigmoid非線性函數的數學公式是displaystylesigma(x)=1/(1+e^{-x}),函數圖像如上圖的左邊所示。在前一節中已經提到過,它輸入實數值並將其「擠壓」到0到1範圍內。更具體地說,很大的負數變成0,很大的正數變成1。在歷史上,sigmoid函數非常常用,這是因為它對於神經元的激活頻率有良好的解釋:從完全不激活(0)到在求和後的最大頻率處的完全飽和(saturated)的激活(1)。然而現在sigmoid函數已經不太受歡迎,實際很少使用了,這是因為它有兩個主要缺點:

  • Sigmoid函數飽和使梯度消失。sigmoid神經元有一個不好的特性,就是當神經元的激活在接近0或1處時會飽和:在這些區域,梯度幾乎為0。回憶一下,在反向傳播的時候,這個(局部)梯度將會與整個損失函數關於該門單元輸出的梯度相乘。因此,如果局部梯度非常小,那麼相乘的結果也會接近零,這會有效地「殺死」梯度,幾乎就有沒有信號通過神經元傳到權重再到數據了。還有,為了防止飽和,必須對於權重矩陣初始化特別留意。比如,如果初始化權重過大,那麼大多數神經元將會飽和,導致網路就幾乎不學習了。
  • Sigmoid函數的輸出不是零中心的。這個性質並不是我們想要的,因為在神經網路後面層中的神經元得到的數據將不是零中心的。這一情況將影響梯度下降的運作,因為如果輸入神經元的數據總是正數(比如在f=w^Tx+b中每個元素都x>0),那麼關於w的梯度在反向傳播的過程中,將會要麼全部是正數,要麼全部是負數(具體依整個表達式f而定)。這將會導致梯度下降權重更新時出現z字型的下降。然而,可以看到整個批量的數據的梯度被加起來後,對於權重的最終更新將會有不同的正負,這樣就從一定程度上減輕了這個問題。因此,該問題相對於上面的神經元飽和問題來說只是個小麻煩,沒有那麼嚴重。

Tanh。tanh非線性函數圖像如上圖右邊所示。它將實數值壓縮到[-1,1]之間。和sigmoid神經元一樣,它也存在飽和問題,但是和sigmoid神經元不同的是,它的輸出是零中心的。因此,在實際操作中,tanh非線性函數比sigmoid非線性函數更受歡迎。注意tanh神經元是一個簡單放大的sigmoid神經元,具體說來就是:tanh(x)=2sigma(2x)-1

————————————————————————————————————————

左邊是ReLU(校正線性單元:Rectified Linear Unit)激活函數,當x=0時函數值為0。當x>0函數的斜率為1。右邊是從 Krizhevsky等的論文中截取的圖表,指明使用ReLU比使用tanh的收斂快6倍。

————————————————————————————————————————

ReLU。在近些年ReLU變得非常流行。它的函數公式是f(x)=max(0,x)。換句話說,這個激活函數就是一個關於0的閾值(如上圖左側)。使用ReLU有以下一些優缺點:

  • 優點:相較於sigmoid和tanh函數,ReLU對於隨機梯度下降的收斂有巨大的加速作用( Krizhevsky 等的論文指出有6倍之多)。據稱這是由它的線性,非飽和的公式導致的。
  • 優點:sigmoid和tanh神經元含有指數運算等耗費計算資源的操作,而ReLU可以簡單地通過對一個矩陣進行閾值計算得到。
  • 缺點:在訓練的時候,ReLU單元比較脆弱並且可能「死掉」。舉例來說,當一個很大的梯度流過ReLU的神經元的時候,可能會導致梯度更新到一種特別的狀態,在這種狀態下神經元將無法被其他任何數據點再次激活。如果這種情況發生,那麼從此所以流過這個神經元的梯度將都變成0。也就是說,這個ReLU單元在訓練中將不可逆轉的死亡,因為這導致了數據多樣化的丟失。例如,如果學習率設置得太高,可能會發現網路中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被激活)。通過合理設置學習率,這種情況的發生概率會降低。

Leaky ReLU。Leaky ReLU是為解決「ReLU死亡」問題的嘗試。ReLU中當x<0時,函數值為0。而Leaky ReLU則是給出一個很小的負數梯度值,比如0.01。所以其函數公式為f(x)=1(x<0)(alpha x)+1(x>=0)(x)其中alpha是一個小的常量。有些研究者的論文指出這個激活函數表現很不錯,但是其效果並不是很穩定。Kaiming He等人在2015年發布的論文Delving Deep into Rectifiers中介紹了一種新方法PReLU,把負區間上的斜率當做每個神經元中的一個參數。然而該激活函數在在不同任務中均有益處的一致性並沒有特別清晰。

Maxout。一些其他類型的單元被提了出來,它們對於權重和數據的內積結果不再使用f(w^Tx+b)函數形式。一個相關的流行選擇是Maxout(最近由Goodfellow等發布)神經元。Maxout是對ReLU和leaky ReLU的一般化歸納,它的函數是:max(w^T_1x+b_1,w^T_2x+b_2)。ReLU和Leaky ReLU都是這個公式的特殊情況(比如ReLU就是當w_1,b_1=0的時候)。這樣Maxout神經元就擁有ReLU單元的所有優點(線性操作和不飽和),而沒有它的缺點(死亡的ReLU單元)。然而和ReLU對比,它每個神經元的參數數量增加了一倍,這就導致整體參數的數量激增。

以上就是一些常用的神經元及其激活函數。最後需要注意一點:在同一個網路中混合使用不同類型的神經元是非常少見的,雖然沒有什麼根本性問題來禁止這樣做。

一句話:「那麼該用那種呢?」用ReLU非線性函數。注意設置好學習率,或許可以監控你的網路中死亡的神經元占的比例。如果單元死亡問題困擾你,就試試Leaky ReLU或者Maxout,不要再用sigmoid了。也可以試試tanh,但是其效果應該不如ReLU或者Maxout。

神經網路筆記1(上)完。

譯者反饋

  1. 轉載須全文轉載註明原文鏈接,否則保留維權權利;
  2. 請知友們通過評論和私信等方式批評指正,貢獻者均會補充提及;
  3. 感謝張一凡的細節提醒。

推薦閱讀:

我們的視覺神經細胞是怎麼連接在一起的?
知乎讀書周紀念價 Live —— ?? 打開大腦的正確姿勢
【未止科技】最新研究告訴你,女人的大腦到底比男人強在哪裡
Module 22:GLM推斷和T檢驗
人是如何自動過濾信息的?

TAG:机器学习 | 神经网络 | 神经科学 |