Monday, September 30, 2019

深入淺出 Deep Learning(二):LeNet & BP

深入淺出 Deep Learning(二):LeNet & BP

2018/02/23

前言:

我是讀懂 BP 後再仔細看 LeNet 的。經過幾次實際的講解,我想先講 LeNet 比較適合,所以更新順序,並增加了實例的部分,希望可以更清楚一些!

-----


Fig. The Net(圖片來源:PixaBay)。

-----

Summary:

深度學習 [1], [2] 的核心是 LeNet [3]。

本文從多項式 [4] 出發,詳細地解釋 LeNet [5], [6] 與 Back Propagation [7] 演算法,並指出權重是經由訓練而得這個重點 [8]。最後是 LeNet 的實作 [9] 與更多深度學習論文講解 [10]。

-----

Outline:

一、Introdunction
二、Polynomial
三、LeNet
四、Convolution
五、Activation Function
六、Pooling
七、Back Propagation

-----

一、Introdunction

一年多前,在我剛開始接觸 Deep Learning 的時候,那時 AlphaGo 早就以四勝一負的戰績擊敗韓國的李世石。不過真正引起我關注的是 chatbot:聊天機器人,如果你不深入 AI 的理論,只想呼叫現成的 APIs,那有什麼搞頭呢?

那時我拿到博士學位還沒很久,正規的訓練,要切入一門新領域,可以從集大成的論文開始,我找了幾篇 [1],並且看完其中最重要的 [2]。大體上這並沒有錯,不過真正的奧秘是你必須先精讀某篇論文 [3],這篇其實也藏在 [2] 裡面,不過沒人跟你講,你是很難發現的。

總之,當我不是很懂就開始發表心得時 [1],就有熱心人士來指導了。花了一些時間後,終於看懂了論文 [3] 裡面的 Back Propagation 演算法 [7],以及後續不計其數的論文 [10]。

一年過去了,我試著把這個題目重新寫一遍,看看是不是可以更簡明!

-----

二、Polynomial

LeNet 屬於類神經網路(Artificial Neural Networks, ANN)中的一種,中文叫做卷積神經網路(Convolutonal Neural Networks, CNN)。

類神經網路,一般人可能不容易理解,白話來說,它是一個很複雜的函數,所以我們從簡單的多項式函數開始說明。雖然大家一聽到數學就手軟,不過如果連多項式都跨不過,後面就沒得玩了,就將就一下吧!

圖1 可以看到三張子圖,每個子圖上面的點是一樣的。

假定我們想用一條線來描述這些點,或者說建立一個統計模型,以便從輸入預測輸出,多項式就是一個不錯的選擇。

左邊是一次多項式,是條直線。或者說零次,因為直線是水平的。
中間姑且稱為二次多項式,因為它「近似」拋物線。
右邊是高次的多項式。

大家可以很直觀的看出,中間是我們想要的。左邊誤差很大,右邊模型太複雜。關於多項式,我想我們講到這邊就可以了!


Fig. 1. A high-degree polynomial regression model [4].

-----

三、LeNet

LeNet 是一個 ANN,在這邊你先不過管 ANN 是什麼,你只要知道它是一個函數就可以了。

講到函數,我們會關心它的輸入跟輸出。

LeNet 輸入的部分是一個 32x32 的灰階圖片。輸出的部分是一個十維的向量,如圖2a。講的更仔細一點,輸入是 1024 個點,每個點的值可以是 -128 到 127,或者 0 到 255 等。這張圖片看起來也許是一個阿拉伯數字的「7」,如果「7」寫的很工整,那理想的輸出應該是 (0, 0, 0, 0, 0, 0, 0, 1, 0, 0),如果有點潦草,那你得到的輸出可能是 (0, 0.12, 0, 0, 0, 0, 0, 0.88, 0, 0)。

這個十維向量,是十個正實數或 0,總和為 1。 代表這張圖是零到九某個阿拉伯數字的機率。

如同圖1 的點,我們希望能從這些點(資料)得到多項式的係數。LeNet 則是希望從這些資料(每筆包含 1024 個點)得到一些 CNN 函數的線性部分,也就是一次跟零次的係數,我們把這些係數稱為權重。

LeNet 當然不止這樣,後面我們繼續講解它的三個主要部分,如圖2b。



Fig. 2a. LeNet-5 [5].

-----


Fig. 2b. Three principle parts of LeNet [5]. 

-----

四、Convolution

卷積層主要是提取圖片的特徵。

最基本的特徵就是各種方向的直線,小段的直線可以組成簡單的形狀,譬如、圓、弧、三角形、矩形等,更複雜一點,就可以表現出人臉。

這些可以通過一些 3x3 或 5x5 的矩陣運算達成。比較特別的是,一般影像處理會利用一些現成的矩陣達到濾出線條的目的。在 CNN 中,這些矩陣的係數是要經由大量的資料(圖片),把權重(係數)訓練出來 [8]。 



Fig. 3a. Convolutional kernel [5].

-----

五、Activation Function

激活函數的目的,是要壓縮資料,概念上就是你有十個部下,每人給你五張投影片。但是你要報告給主管時,五十張你要縮成五張:資料量減少,另外,只講重點(也就是提取特徵)。

論文裡面,我們會看到 sigmoid、tanh、ReLU 等。其實這些函數都很像。圖3b 是一個 sigmoid 的函數,它可以把輸出限制在 0 跟 1 之間。tanh 則可以把輸出限制在 -1 跟 1 之間。


Fig. 3b. Activation function [5].

-----

六、Pooling

池化也是要減少資料量。

可以取最大值或平均值。


Fig. 3c. Pooling [5].

-----

經過兩次的「卷積層、激活函數運算、池化層 」[5],再加上兩個全連接層 [6],最後就會輸出一個十維的向量,也就是這張圖片到底是 0 到 9 的可能性。

但這是指訓練好的網路而言。網路要訓練,一開始的權重是隨機指定,結果自然是慘不忍睹。藉由下一節的 Back Propagation 演算法,我們可以把權重慢慢更新到「正確」的值。

所謂「正確」,就是讓誤差很小,譬如 5%,或更小。

-----

七、Back Propagation

圖4 是 BP 演算法的精華,也就是上面講的「更新權重」。

這裡面有幾個符號,大家看到數學符號都會很恐懼,其實數學符號只是希望用「簡單」的符號來描述「複雜」的現象,所以這邊我們先解釋一下每個符號的意義。

W,就是權重。可以想成是多項式的係數。這裡可以是第四節裡卷積核(或者叫做濾波器)的值。

Wk 就是這次的權重,Wk-1 是上次的權重。

ε,是步長,也就是你一次要更新多少。步長要乘以「斜率」,也就是 Error function 在 W 的導數。

∂,是偏微分的符號,這邊可以用常微分來理解就可以。

E,代表一個 error function。

-----


Fig. 4. Training weighting factors [7]. 

-----

講到這邊,大家大概已經昏頭了,所以我們借用圖1中間(後面簡稱圖A)那張來說明一下。

首先是 error function。
上面講到,LeNet 是一個複雜的函數,輸出是一個十維的向量。

在訓練階段,當圖片是變數、參數為固定時,你知道這張圖片「7」的正確值是 (0, 0, 0, 0, 0, 0, 0, 1, 0, 0),但是你得到的輸出可能是 (0, 0.12, 0, 0, 0, 0, 0, 0.88, 0, 0)。

這邊就可以得到誤差,誤差函數你可以用一般的平面距離(二維)推廣到十維。兩兩相減取平方和再開根號。

「假設」這個誤差函數如圖A,從一般橫軸 x 縱軸 y,你現在想成橫軸 W 縱軸 E。

這時參數(W) 是變數。

你目前的誤差值如圖A左邊那點所示,你希望誤差變小,所以 W 要向左移(這時斜率為正),所以舊的權重 Wk-1 要往左移,也就是要減去一個正值(斜率為正)的步長,誤差才會變小。

「反覆進行」,最後所有的權重參數 W 就可以更新到理想值,讓 LeNet 的誤差變小,也就是絕大多數的圖片,都可以「正確」地辨識出來。

這邊的重點,就是為何要「減」一個數乘斜率,而不是「加」一個數乘斜率。想通這點,BP 你應該就可以掌握了。

-----

結論:

當前深度學習的基礎,也就是 LeNet 跟 BP,講完了。可以參考 [9],更多的,可以參考 [10]。
 
-----

出版說明:

2019/09/30

大概每隔一年,我就會把 LeNet 寫一次,本篇是第二次。第三次在十篇經典深度學習論文的導讀,LeNet 作為第一篇,份量也是最大,此外還把 Back Propagation 的演算法作了比較詳細的說明。第二篇的 Gradient Descent 是 Back Propagation 的核心。

卷積網路主要的元素:Conv、Nonlinear、Pooling、Linear、Loss,LeNet 都用上了。另外兩個主要元素,NIN 的 Conv1 與 ResNet 的 Shortcut,後續也會講解。

-----

References

[1] AI從頭學(一):文獻回顧
http://hemingwang.blogspot.tw/2016/12/ai.html

[2] LeCun, Yann, Yoshua Bengio, and Geoffrey Hinton. "Deep learning." nature 521.7553 (2015): 436.
http://pages.cs.wisc.edu/~dyer/cs540/handouts/deep-learning-nature2015.pdf

[3] LeCun, Yann, et al. "Gradient-based learning applied to document recognition." Proceedings of the IEEE 86.11 (1998): 2278-2324.
http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

[4] AI從頭學(三二):Weight Decay
http://hemingwang.blogspot.tw/2017/06/aiweight-decay.html

[5] AI從頭學(一二):LeNet
http://hemingwang.blogspot.tw/2017/03/ailenet.html

[6] AI從頭學(一三):LeNet - F6
http://hemingwang.blogspot.tw/2017/03/ailenet-f6.html

[7] AI從頭學(九):Back Propagation
http://hemingwang.blogspot.tw/2017/02/aiback-propagation.html 

[8] AI從頭學(二三):CNN - Kernel Training
http://hemingwang.blogspot.tw/2017/05/aicnn-filter-kernel-training.html 

[9] LeNet實作團(目錄)
http://hemingwang.blogspot.tw/2017/04/lenet.html 

[10] 深入淺出 Deep Learning(一):Introduction
http://hemingwang.blogspot.tw/2018/01/aideep-learning-in-120-mins.html

No comments: