天天看點

【CS231n筆記】04 Backpropagation and Neural Networks part 1

主要内容:

1.反向傳播算法

2.神經網絡介紹

1.反向傳播算法

第二節和第三節中已經介紹了分類器的評分函數,兩種常用的損失函數,以及通過梯度下降進行優化的方法,計算梯度,然後沿着梯度相反的方向進行優化,一般用解析梯度來計算,用數值梯度進行檢查。但是,對于複雜的模型來說,求取每個參數的解析梯度也是非常複雜的,是以要通過另外一個角度來解決這個問題,即梯度的反向傳播(Backpropagation)算法。

首先用計算圖的方式來描述模型,對于線性分類器可以表示為

【CS231n筆記】04 Backpropagation and Neural Networks part 1

對于卷積神經網絡(Convolutional Network),以AlexNet為例,可以表示為

【CS231n筆記】04 Backpropagation and Neural Networks part 1

另外還有更加複雜的神經圖靈機(Neural Turing Machine)。

對于這種複雜的模型來說,前向(損失函數值)和反向(梯度值)的計算用表達式來描述是不現實的。

一般以計算圖的方式對模型進行描述,将模型中的子產品抽象成層(layer)的概念,層内實作了初始化、前向傳播和反向傳播,然後将不同功能的層組合,成為一個複雜的模型。這一過程即如搭積木一般

【CS231n筆記】04 Backpropagation and Neural Networks part 1

梯度在層之間從後向前計算,某參數的梯度包含兩個部分,局部梯度和整體梯度,其中整體梯度即損失函數對于該參數後面所有層中相關變量的偏導數。

總結

● 神經網絡模型一般都非常複雜,對每個參數寫出其梯度表達式是不現實的

● 反向傳播就是沿着計算圖的結構遞歸地應用鍊式法則來求取輸入、參數、中間件的梯度

● 用計算圖結構實作模型,其中的結點/層實作了各自的前向和反向

● 前向:計算一個操作的結果,儲存用于計算梯度所需的中間變量

● 反向:計算損失函數相對于輸入的梯度值

2. 神經網絡介紹

【CS231n筆記】04 Backpropagation and Neural Networks part 1

線性分類器評分函數: f=Wx

兩層神經網絡評分函數: f=W2max(0,W1x)

其中 max() 是一種激活函數(Activation),後面會介紹多種常用激活函數。神經網絡的計算過程可以表示如下

【CS231n筆記】04 Backpropagation and Neural Networks part 1

以CIFAR-10資料集為訓練樣本,輸入層為 X ,共3072(32*32*3)維,和參數W1相乘得到隐藏層 h ,隐藏層神經元經過激活函數,然後和參數W2相乘得到最後的評分。隐藏層 h 中的神經元個數是一個超參數,會影響模型性能。

第二節中講到線性分類器可以看作模闆比對,是對訓練圖像的融合,得到各類的模闆,如下圖

【CS231n筆記】04 Backpropagation and Neural Networks part 1

以汽車為例,它需要融合多個朝向多種顔色的車,然而線性分類器的能力并不足以達到區分這麼多特征,是以效果并不好。如果在中間加上一個隐藏層,構成上圖所示的兩層神經網絡模型,那麼隐層神經元就可以對多種特征進行表示,比如某個神經元代表朝向正前,某個神經元表示藍顔色,也就是通過隐藏層進行分類,然後再經過W2的彙總整合,形成最後的評分,如此一來模型的區分能力就會得到極大的提升。神經網絡通過加入隐藏層引入多樣性,提高區分能力。

【學生提問】如果隐層神經元數量少于10,神經網絡的性能是否還優于線性分類器?

答案是應該還是要比線性分類器更好。

擴充神經網絡最簡單的方法就是添加隐層,一般來說中間的隐藏層都具有相同的結構,即包含相同數量的神經元以及使用相同的激活函數,例如擴充到三層神經網絡,則評分函數為 f=W3max(0,W2max(0,W1x)) 。

下面詳細講解神經元的結構。

生物神經元如下圖

【CS231n筆記】04 Backpropagation and Neural Networks part 1

細胞體(cell body)周圍有很多樹突(dendrites),與其他神經元相連,接受其他神經元的信号,即神經元的輸入。另外還有軸突(axon),用來将該神經元的信号傳遞到其他神經元,即神經元的輸出。由此可以構造出一個比較粗糙的神經元模型

【CS231n筆記】04 Backpropagation and Neural Networks part 1

對不同輸入有不同的權重,求和并加偏置之後,通過激活函數,得到最後的輸出。在生物學模型裡習慣使用Sigmoid函數作為激活函數。代碼如下

class Neuron:
  def neuron_tick(inputs):
    """ assume inputs and weights are 1-Dnumpy arrays and bias is a number """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate =  / ( + math.exp(-cell_body_sum)) # sigmoid activation function
    return firing_rate
           

常用的激活函數

●Sigmoid函數

σ(x)=11+e−x

【CS231n筆記】04 Backpropagation and Neural Networks part 1

●雙曲正切函數(tanh)

tanh(x)=ex−e−xex+e−x

【CS231n筆記】04 Backpropagation and Neural Networks part 1

●修正線性單元(Rectified Linear Unit, ReLU)

【CS231n筆記】04 Backpropagation and Neural Networks part 1

●Leaky ReLU

【CS231n筆記】04 Backpropagation and Neural Networks part 1

多種ReLU變種

【CS231n筆記】04 Backpropagation and Neural Networks part 1

●Maxout

max(wT1x+b1,wT2x+b2)

神經網絡架構

用神經元組合成神經網絡,相鄰層間的神經元全部互連,是以被稱為全連接配接層(Fully Connected Layers)

X層神經網絡,這裡的X是有權重的層的數量,是以不包含出入層。

将神經元分層,每層中的所有神經元具有相同的輸入,可以并行運算,是以分層化是一種計算技巧。

以三層神經網絡為例,前向傳播代碼如下

# forward-pass of a 3-layer neural network:
f = lambda x:  / ( + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(, ) # random input vector of three numbers (3*1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4*1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4*1)
out = np.dot(W3, h2) + b3 # output neuron (1*1)
           

Demo:http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html

通過demo可以發現隐藏層神經元數量以及正則項系數對模型的影響。

随着隐藏層神經元數量的增加,模型的區分能力更強。

【CS231n筆記】04 Backpropagation and Neural Networks part 1

随着正則項系數的減小,模型的區分能力變強。

【CS231n筆記】04 Backpropagation and Neural Networks part 1

正則項系數較大時對參數W的懲罰力度較大,那麼W中的值就很小,模型實際使用的變量(輸入)就很少;随着系數減小,參與決策的變量增多,提高模型的區分能力。

總結

● 将神經元組織成全連接配接層

● 層的概念可以利用高效的向量計算編碼實作(例如矩陣相乘)

● 神經網絡并不是真正的(生物)神經元

● 神經網絡bigger=better,但是需要更強的正則化方法,防止過拟合

【學生提問】怎樣權衡神經網絡的深度(層數)和寬度(每層的神經元數量)?

這裡還沒有一個明确的答案,一般對于圖像問題,層數會更重要一些,但是如果資料很簡單的話,網絡深度的作用不大。

繼續閱讀