Multilayer Perceptron/Fully connected Neural Network 之觀念,與內部運作的意義解析 (一)

序言:
  之前學 MLP (Multilayer Perceptron) 時,總是被灌輸一種觀念說,這個模型是在模擬大腦神經元傳遞訊號的方式,是人工智慧重要的基石。
  但是在我心目中,這個模型一直只和 SVM 差不多等級:MLP 只是個可以在訓練之後,找到某個最佳的運算方式,將資料很好的分成數類的一個工具罷了。當時我也認為,之所以要算梯度下降及 back propagation ,只是因為沒辦法直接代公式求出最佳解,所以只好用梯度下降慢慢逼近最佳解。
  也就是說,我只覺得他是一個資料科學的工具,而和機器「學習」有段距離。但因為之前我還不了解內部運作其代數上的意涵,MLP 對我而言還像個「黑盒子」,所以就對我的想法不那麼肯定。
  但是最近突然對其有更深的理解,發現在某些狀況下其內部運作要如何以代數解釋。所以便將其寫下來,免得日後遺忘。

本篇可以解釋的問題:

  1. 寬而淺的模型 v.s. 窄而深的模型:為什麼之前會有一派說,就算 model 不深,只要隱藏層 neuron 數夠多,一樣可以很好的分類資料?
  2. Neuron 太多會有什麼問題?太少又會有什麼問題?
  3. 為什麼常用梯度下降做訓練?
  4. 為什麼訓練模型常常需要有很多 training data?


本文的假設:

  1. task 為分類任務 (categorical task)
  2. 模型可以將 training data 完美分類
  3. 模型中 activation function 為 sigmoid 函數
  4. neuron 在做伸縮的計算時都「伸」的很大 (下文會說)
3. 4. 可以合併成假設 「模型中 activation function 為 step 函數」


1. 最後一層隱藏層到輸出層的意義


我們先假設模型只有輸入層及輸出層,而輸出層只有一個 neuron,並且資料只有兩種 label:


我們可以將其理解為,將 data 投影到 W 向量上,再對投影後的 data 資料點做伸縮平移 ,使兩種資料可以被分到正負兩邊。(有點像 SVM)
假設資料是可以被完美切割的話,因為 $\Vert W \Vert$ 可以設成很大,資料被做伸縮平移後會有很大的正值或負值,所以經過 activate function 後可以假設資料都大約等於 1 或 0。(activation function 為 step function 的話也可以達到相同效果)

也可以將其看成,將 data 以 $Wx+b=0$ 的 hyperplane 將兩種資料分成兩邊。

現在如果 data 有多種 label,則輸出層也需要多個 neuron。可以以類似概念想成分別以不同的 hyperplane 將某類別與其他類別分隔開。

所以對於一個可以完美分類 training data 的 SVM ,當 data forward propagate 到最後一層隱藏層時,處理後的 data 應該是要和上圖一樣,每個類別都可以有一個 hyperplane 把他們和其他類別分隔開。


2. 輸入層到第一層隱藏層的意義


機器學習的觀點:不同 neuron 代表提取資料的不同「特徵」。
代數觀點:在空間中畫多個 hyperplane 分割出某類別的資料。

假設現在觀察輸入層到第一層隱藏層,現在需要畫 hyperplane 對資料做分割:
對於許多 hyperplane 所分割出來的區域中,每一個區域中的 data x 其 $\{W_1 x + b_1, W_2 x + b_2, \dots\}$ 都會有獨一的一組正負號;在加上 sigmoid function 後,每一個區域中的 data x 其 $\{a_1, a_2, \dots\}$ 都會有獨一的一組 0, 1 值。(假設 $\Vert W \Vert $ 都很大)

另一個例子:

我們可以知道,不管資料如何分布,只要可以分割的 hyperplane 數量夠多,就可以將某個類別完美的分離出來。同樣的,如果資料有多個類別,只要可以分割的 hyperplane 數量夠多,或是只要第一層的隱藏層 neuron 數量夠多,就能將每個類別從其他類別中完美的分離出來。


3. 其他層隱藏層的意義


再以觀察上圖為例子,三角形類別的資料分布在三個 「hyperplanes 分割出來的區域」中,分別以「經過 $W_1 x + b_1、 W_2 x + b_2、 W_3 x + b_3、 W_4 x + b_4$ 運算的正負號」做紀錄的話,其三個區域分別是 (- and + and - and +), (- and + and + and +), (- and - and + and +);再做 activate function 後,三角形類別的資料分布在: { (0 and 1 and 0 and 1) or (0 and 1 and 1 and 1) or (0 and 0 and 1 and 1) }。

也就是說,如果資料 x 經過第一層隱藏層運算之後的 a 為 $[0, 1, 0, 1]^T$ 或 $[0, 1, 1, 1]^T$ 或 $[0, 0, 1, 1]^T$,就可以被分類為三角形。

現在觀察代表第一個區域的 a,$[0, 1, 0, 1]^T$。 其可以用 $[1, -1, 1, -1] a < -2 + 0.5$ 作判別$( a_1 + (1-a_2) + a_3 + (1-a_4) < 0.5 )$ (也就是第二層隱藏層的 ${W_1}'a+{b_1}'$);其他區域也可以比照辦理。因為經過第一層隱藏層的分割後,空間可能會有很多分割區域,所以第二層隱藏層同樣需要足夠多的 neuron 數量才能完美的概括以上的區域。

三角形類別便是以上三個 node 輸出的 "OR",其可以用 $[1, 1, 1] a' < 2.5$ 作判別:

y 接近 0 的話分類為三角形;接近 1 的話分類為圓形。

從以上例子可以發現,其實只要隱藏層數量足夠,就算只有兩層隱藏層,也足以將任何分布、任意數量類別的 training data 完美的分離出來。

從上文中,我們了解 MLP 中的 neuron (先不討論 activate function)其實可以同時有以下涵義:

  1.  以 hyperplane 切割空間,一邊為正區,一邊為負區;分群
  2. 投影到某向量上,並做伸縮平移,並且也分正區負區
  3. 可以做「特徵」歸納、擷取 (如 and、or gate 的判斷)


下圖是以 hyperplane 切割的觀點來看 and gate:
有點像上個例子中,第二層隱藏層到輸出層的運算:我們是設計成 or gate,但是 from 1. 最後一層隱藏層到輸出層的意義,我們知道它同時有以 hyperplane 切割,及投影到某向量上後做伸縮平移的含意。

因此其他層隱藏層的意義,同樣可以想成 1. 原本經過投影之後再投影到別的空間一次 2. 原本投影到某空間之後再以 hyperplane 做切割 3. 投影之後做特徵擷取。


4. 問題解釋


Q: Neuron 太多會有什麼問題?太少又會有什麼問題?
如果 neuron 數太多,雖然同樣可以完美的將資料分類,但是其可能會以很奇怪的形式分割,以至於在 validation 或 test 時表現不佳:
但是相對的,如果 neuron 數太少,就有可能連 training data 都沒辦法分類的很好。比如之前的例子,如果一開始只能用一條線分割,那當然會分不好:
如何將 training data 分類的好,但又同時可以將 validation data 及 test data 分類的好是個課題,所以這也是為何在訓練時會有人在 loss function 中加入 regularization function,就是想在兩者間取得平衡。

Q: 為什麼常用梯度下降做訓練?
我們再以上圖為例,先思考以下和 SVM 相似的任務:找到一個決策線,使其可以最好的分開平面中的兩類資料。(如對 SVM 有興趣可以與此文做比較)
雖然不一定存在一條可以完美分割兩類的線 ,但是不同的分割方式還是有好壞之分。判別分割好壞的方式也有很多種,而我們先以「分割線兩側被正確分類的數量」作為好壞判斷標準:
$score = \sum_{data} q(data), q(data) \in {0,1}$
假設 data 座標為 x,label 為 y;且 y 也為 0 或 1 的數,data 為三角形時 y=0,data 為圓形時 y=1。 q(data) 就能寫成  $(Wx + b < 0$ and $y=0)$ or $(Wx + b > 0$ and $y=1)$

如果要寫成數學式,score 函數可以用 sigmoid 估計:
$score = \sum_{data} ((1-y) ( 1-\sigma(10000(Wx + b)) ) + y \sigma(10000(Wx + b))  )$
(注意 $-score$ 相似於「只有一層隱藏層的 MLP」 之 categorical crossentropy loss function,只是差在有沒有乘 10000、有沒有取 log 而已。categorical crossentropy loss function 與其的差異可以看成是為了加速訓練)

要找最好的分割線,就需要求 score 的最大值。但是 score 並沒有公式解,怎麼辦呢?
這時可以對 $-score$ 使用梯度下降,讓 $\partial (-score) \over \partial W$、 $\partial (-score) \over \partial b$ 慢慢下降至趨近 0。我們知道當${\partial (-score) \over \partial W} = {\partial (-score) \over \partial b} = 0$ 時有極值,但因為之前更新 W, b 時都是往 $-\partial (-score) \over \partial W$、 $-\partial (-score) \over \partial b$ 的方向走,$-score$ 是越來越小的,所以當${\partial (-score) \over \partial W }= {\partial (-score) \over \partial b} = 0$ 時 $-score$ 有極小值,score 有極大值。

訓練 MLP 也是同樣的道理:我們用 loss function 來判斷 MLP 分類的好壞,並且透過梯度下降來求出最好的分割方式。

Q: 為什麼訓練模型常常需要有很多 training data?
看到這裡,應該可以了解為何我會覺得 MLP 和 SVM 很像。因為他們都只是算出某個最佳的分割方法,將資料很好的分割成數類罷了。(只是分割的限制不同,造就了計算方式與分割結果的差異)
所以同樣的,如果 training data 太少,MLP 就有可能隨便分割都可以分割的很好,造成分割方式偏離實際情況,以至於在 validation 或 test 時表現不佳。

(下集待續)



沒有留言:

張貼留言