卷積神經網絡 + 機器視覺: L4_反向傳播_神經網絡內部構造 (斯坦福CS231n)

完整的視頻課堂鏈接如下:

完整的視頻課堂投影片連接:

前一課堂筆記連結:

 

反向傳播 Backpropagation Function

對於我們人類來說,一個微分的過程無非就是 1. 次方項下移乘以原函數,並且同時次方項數字 -1,但是對於計算機來說這個動作他就不好做了,並且面對一系列樣貌不同的方程式,實在是無法用這種人類的思維去設計代碼,因此 “反向傳播” 的方式因應而生,它把每個方程式細化到一次只有 “一個運算子搭配兩個變量” 的計算關係,把不論再複雜的方程式都簡化到只用同一個微分規則就可以涵蓋的範圍,並且算的過程中使用 “chain rule” ,把上個環節的結果傳遞到下個環節去,於是用代碼實現這個統一的微分規則後,就可以套用在任何的複雜算式內,讓計算機做重複的動作了。

整個反向傳播的發生與肌理是從 “尾” 說起的,下面這張圖可以清楚的描述反向傳播在每個細分環節的計算目的與手段,每次在一個細分環節要做的事情就是 “專注當下” + “經驗總結”。

首先專注當下:
    !!  該環節只對 “該對應的運算子搭配兩個變量的計算關係” 所得到的結果做微分。
第二經驗總結:
    !!  當下微分得到的結果,與前面傳過來的最新一個歷史結果乘在一起做出一個總結。

After knowing two principle above, 不斷重複上面兩個步驟,直到(天荒地老)整個算式的每一個細節運算子都已經被涵蓋,過程就算完結。

 

下面實戰練習一個套入了複雜的 Sigmoid function 後的公式,是如何使用 Backpropagation 的技巧去一層一層剝離複雜的外表,最終算出結果,如下圖:

計算過程永遠貫徹從 “尾”說起的特性:
1. 把整個公式作爲一個整體對着個整體微分,如df/df,結果肯定是 1
2. 令 f(x) = 1/x,df/dx = -1/(x^2),而當下的 x = 1.37 -> -1/(1.37^2) = -0.53,當下專注完了後做總結:-0.53 * 1 = -0.53。
3. 令 f(x) = x + c,df/dx = 1,當下的 0.37 無用武之地,因此直接總結:1 * (-0.53) = -0.53。
4. 令 f(x) = exp(x),df/dx = exp(x),當下的 x = -1.0 -> exp(-1) = 0.368,總結:0.368 * (-0.53)= -0.195。
5. 令 f(x) = cx,df/dx = c,當下的 x = 1 無處使,c = -1 -> 總結:-1 * (-0.195) = 0.195。
6. 來到了 “+” 的分水嶺,令 f(x) = x + y,df/dx = 1,df/dy = 1,所以他們當下的 x 或是 y 值都無用,直接總結:1 * 0.2 = 0.2。適用兩個節點的值。
7. 同理 6. 結果還都是 0.2。
8. 來到了 “*” 的分水嶺,令 f(x) = cx,df/dx = c,c 的值取決於誰與誰相承的那個誰(嗯!)所以就是對家的值,加上總結:-1 * 0.2 = -0.2;2 * 0.2 = 0.4。
9. 同上 8. 的過程,因此直接總結:-3 * 0.2 = -0.6;-2 * 0.2 = -0.4。

最後我們可以用人工的算法直接把算式微分,微分後代入參數驗證:(1 - 0.73) * 0.73 = 0.197,得到了一致的結果,因此我們如果喜歡,可以直接把這一大串包成一個 “黑箱” 讓我們表面上更易於瞭解。

 

而矩陣的反向傳播方法與上面詳細計算的方法基本上是一樣的,照樣造句就可以嘍。

 

Cross Validation, the better way to test a model
把數據集 D 劃分成 k 個大小相似的互斥子集,每次訓練的時候留一個小子集作爲測試用途,其他的部分拿去建模,然後重複做 k 次,並把結果與每次留下來的測試集做對比,最後把對比結果取平均,這個方法就稱作 “k 折交叉驗證” (k-fold cross validation)。

但是這個方法的穩定性和保真性是高度依賴於我們如何切分這些子集的手法,並且一旦達到大規模的數據運算的時候,這個方式非常的消耗運算資源,必須在方法上取得中庸點。

 

自助法 Bootstrapping
基於數據集 D 隨機挑選裏面的元素湊合到一個新的 D‘ 數據集裏面,D 的元素有幾個就重複幾次,就像自助餐一樣菜品隨便挑,並且不在乎是否已經重複被挑選,菜品挑的時候是閉着眼睛選的,機率上算出來會有 36.8% 的元素不會被挑中,剩下的步驟類似於 Cross Validation 一樣的手法,這樣篩選數據的測試結果又稱作 “包外估計” (out-of-bag estimation)。

它比較好的面對數據量比較小的分析,或是那些比較難有效剝離出訓練集與測試集的 dataset。But bootstrapping generates the new dataset changing the distribution of the original generation, which might cause some estimation bias.

 

Neural Network

This is the inspiration coming from the way how a real natural cell works. We receive an input from the external world and react with some combining functions, and finally generate an output as the result.

When we talk about the neural network on a machine, 
    the input is: the dataset came from the collecting work
    the reaction is: the activation function for a judgement
    the output is: the result of the activation function, being the next input layer again.

In practice, neural scientists conclude that the non-linearity function ReLU is the model best fit the reality like a living cell.

The characteristics of true biological neurons:
    o  Many different types
    o  Dendrites can perform complex non-linear computations
    o  Synapses are not a single weight but a complex non-linear dynamical system
    o  Rate code may not be adequate

然而事實上,真實的大腦不是我們想象中的那麼簡單的過程,全部都是非線性的決策手段加上許多我們尚未知道的動態機制。人工的神經網絡架構在電腦裏的話,長下面的樣子:

這個部分後面單元會細說,搭配 “因地制宜” 的激勵函數 activation function,就可以順利有效的把結果傳遞到下一層神經網絡中去做計算,最後得出一個 “什麼是什麼” 的分類結果。如果把這張圖代碼化... 長得下面樣子:

class Neuron():
    # something functional elements here...
    def neuron_tick(inputs):
        # assume that inputs and weights are 1 dimensional numpy array and bias is a number
        cell_body_sum = np.sum(input * self.weights) + self.bias
        firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum))        # this is Sigmoid activation function
        return firing_rate

我們可以有效的運用這個方法很快的計算出單一個 neuron 得出來的結果,並傳送到下一層去繼續運算。

 

下節鏈接:卷積神經網絡 + 機器視覺: L5_卷積層_Pooling Mechanism (斯坦福課堂)

發佈了43 篇原創文章 · 獲贊 33 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章