---
# System prepended metadata

title: Day 2 / Deep Learning 簡介 / 細解 Deep Learning（一） —— Prediction
tags: [Knock Knock! Deep Learning]

---

---
tags: Knock Knock! Deep Learning
---
Day 2 / Deep Learning 簡介 / 細解 Deep Learning（一） —— Prediction
===

前篇很精簡的帶過了什麼是 Neural Network，他的前身、大致的架構、及不同的學習方法。有了粗略的概念之後，接下來要來介紹 Deep Learning 在做預測及訓練時的細節。

## Neural Network 訓練步驟

Neural Network 說到底就是在做函數擬合，試圖找出當前問題的 $f$ 使得 $y = f(x)$。拿預測男女來說，$y$ 是男/女二元結果，$x$ 是對於預測有利的特徵輸入，$x_1 =$ 五官輪廓, $x_2 =$ 聲音高低，等等。

![neural network blackbox](https://i.imgur.com/Qh8zwJn.png)
*—— Neural Network 為函數擬合。*

一個 Neural Network 學習擬合 $f$ 的大致步驟如下：

1. 備好 dataset，也就是好幾筆 **$(x, y) =$（feature, label）** 的 data
2. 對每一筆輸入 feature 進行**prediction（預測）**，得到輸出 $\hat{y}$
3. 計算預測結果 $\hat{y}$ 與正確答案 $y$ 的 **error（誤差）**，或稱 **loss**
4. 將 loss **backpropogate（反向回饋）** 給 network 裡的 parameters以進行修正，目標是減少下次預測的 loss

所以 Deep Learning 學習的成果，就是能準確預測結果的 model parameters。

我們將關鍵步驟分為兩大步：prediction (2.) 和 training (3. & 4.)。本篇的重點會擺在 prediction 這一步。下面會多一些數學，希望不會太難，也為深入理解 Deep Learning 內含的數學做準備。

## Prediction

前篇有介紹過 Perceptron 怎麼被訓練的。由於 Neural Network 是由很多類似 Perceptron 的 Neuron 層層連結而成，大致上的步驟也與之相似。

Prediction 這步基本上就是把資訊往 network 裡送，傳到最後一層取得 output，這動作稱為 **feed forward** 或 **forward propagation**，步驟大致如下：

1. 從上層接收 input $x$
2. 與 weights $w$ 透過 summation and bias 進行加權整合
3. Activation 決定該 neuron 是否被激發
4. 產出 prediction output

### Input & Weights

第一層的輸入訊息是來自大環境的，例如圖片、文字、聲音等各種 feature，而接下來 hidden layer 則是接收前面幾層傳來的分析處理過的訊息來進行整合。

> 你會問，這些層跟層之間的訊息有什麼含意嗎？
> 
> 肯定有，但只有 network 自己懂。人類想理解中途的訊息很困難，因為他是很高程度的 abstraction（抽象概念），而學者們也致力於讓這些訊息變得可理解。這也是為什麼 Neural Network 被稱為**黑盒子**，因為沒人懂他怎麼塞進輸入後就能產生準確預測，也不懂訓練不起來的時候原因出在哪。

讓我們往 engineering 的角度靠近一步。如果圖片、文字、聲音都能當輸入，那我們建立好的 network 要怎麼同時照顧好這麼多不同資料的形式？因此，這些輸入都要先轉化成較為統一的模樣。

#### Vector & Matrix 資料形式

讓我們回顧一下 summation and bias 在做什麼：
$$
\sum^{m-1}_{i=0} w_i \cdot x_i + b
$$

> 後面的 $b$ 是 bias，前篇有提過是讓 activation 的門檻標準變得可訓練。但他在式子裡好像有點礙眼，因為跟前面 $m$ 個 $w$ 走在不同路上！
> 
> 這時候有個小技巧：
> 
> $$
> \sum^{m-1}_{i=0} w_i \cdot x_i + b = \sum^{m-1}_{i=0} w_i \cdot x_i + b \cdot 1 = \sum^m_{i=0} w_i \cdot x_i
> $$
> 
> 這邊 $w_m=b$，$x_m=1$。
> 
> 也就是我們把 $b$ 當成 weights 的一份子（因為 weights 和 bias 同為可訓練的 parameters），並將他對應的 $x$ 設為 $1$，即可合併進入 summation。
> 
> 這個技巧能讓 code 更簡單！

前面的 summation $\sum^{m-1}_{i=0} w_i$，無論是數學上看起來或是 code 寫起來都略顯麻煩。這時候我們可以把他們轉化為 **vector（向量）** 來進行計算：

$$
\sum^{m-1}_{i=0} w_i \cdot x_i
    = \begin{bmatrix}
        w_0 & w_1 & \dots & w_{m-1}
    \end{bmatrix}\begin{bmatrix}
        x_0 \\ x_1 \\ \vdots \\ x_{m-1}
    \end{bmatrix}
    = \mathbf{w} \cdot \mathbf{x}
$$

是不是簡單許多？

這是單個 neuron 的輸出，我們甚至可以用 **matrix（矩陣）** 來一次打包一層的 neurons。請參考下面的例子：

![matrix summation](https://i.imgur.com/XkrAdEL.png)
*—— Matrix 來進行 summation。*

$a$ 是 activation 之後的結果，我們先看 summation 之後的輸出 $z$ 可以怎麼表示：

$$
\mathbf{z} = \begin{bmatrix}
        z_0 \\ z_1 \\ z_2
    \end{bmatrix} = \begin{bmatrix}
        W_{00} & W_{01} & W_{02} \\
        W_{10} & W_{11} & W_{12} \\
        W_{20} & W_{21} & W_{22} \\
    \end{bmatrix}\begin{bmatrix}
        x_0 \\ x_1 \\ x_2
    \end{bmatrix} + \begin{bmatrix}
        b_0 \\ b_1 \\ b_2
    \end{bmatrix} = \mathbf{W}\mathbf{x} + \mathbf{b}
$$

一個簡單的式子就能代表一整層的 feed forward！而利用 matrix 來運算，除了讓數學簡單一點（特別是後面會提到的 gradient descent），也能讓電腦硬體優化運算，訓練更快速。

> 雖然睡前可能不會想做，但有障礙的朋友記得小小複習一下 linear algebra（線性代數），對後面的數學會很有幫助的。

#### Input Pre-processing

回到統一輸入形式這邊。理解 summation and bias 這步基本等於 $\mathbf{W}\mathbf{x} + \mathbf{b}$ 之後，應該就不難理解輸入形式應該統一為 vector $\mathbf{x}$，以利電腦的運算。

也就是在整個 network 開始學習前會進行 pre-processing（前置處理），將圖片轉成 vectors of pixels，文字轉成 word vectors（這個之後會介紹到，將字詞轉化為 vector 形式），聲音轉化成 vectors of frequency 等等，才能進入 network 進行訓練。而怎麼讓轉化為 vectors 的 input 最大限度的保留原本的資訊，也是一件值得深入的話題！

Input 和 weights 整合完後，我們代稱結果為 $z$，i.e. $z = wx + b$。

### Activation

Activation 是根據前面處理好的訊息 $z$，決定激發程度。前篇 Perceptron 提到在 activation 時用 step function 進行激發與否的二元標準判斷。而在 Neural Network 裡，每個 neuron 輸出的是激發程度，也就是不只是 0 或 1，而是更細微的訊息。

在這個步驟我們計算的是上面途中的 $a = g(z)$，$g$ 為 activation function。為了學習 non-linear approximation，activation function 通常是 non-linear function（非線性函數）。

除了是 non-linear function，還有些必備條件：**derivative（導數）容易計算**，且 **derivative 適用於訓練**。例如 step function 雖然是 non-linear function，但因為他的導數不適合用來訓練（兩邊導數都是 0，能提供的回饋也是 0 啊⋯⋯），並不適合被用在 hidden layer 的 activation。

> 微積分從腦中消逝的也麻煩找尋一下記憶。

這些條件跟之後 back propagation 需要用到的 gradient descent 有關，之後會詳細解說。

#### 常見 Activation Functions

常用的 Activation function 很多，簡單示範幾個：

| Sigmoid | Tanh | ReLU |
| -------- | -------- | -------- |
| ![](https://i.imgur.com/VwmAqtK.png) | ![](https://i.imgur.com/DVFEw2I.png) |![](https://i.imgur.com/xiNql0m.png) |
|$\sigma(z) = \frac{1}{1 + e^{-z}}$|$\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$|$\text{rect}(z) = \max(z, 0)$|

$e$ 沒有很可怕，$e$ 只是個常數，$e^x$ 的導數為 $e^x$，很美。

值得注意的是 sigmoid 的輸出範圍介在 0 和 1 之間，呈遞增，且中間為 0.5，很適合把分數化為機率，除了用在 hidden layer 的 activation，也常用在 binary classification 的 output layer 當作預測種類的機率。

而 ReLU 看似簡單，其實經過一些實驗發現效果非常好，而且 derivative 也比 sigmoid 簡單許多，與他的變形們是近幾年的主流選擇。

這些 function 都符合的上述的條件：導數都很優雅（之後會看到他們的 derivative），且適合訓練（例如 ReLU，分數越高激發程度越高，導數能提供的訊息也很清楚）。

#### Softmax Function

最後再介紹一個在 multiclass classification 時，很常用在最後一層的 Softmax function。他的概念是 **normalize（標準化）最後一層得到 $z$ 的分數**，使得可正可負且沒有絕對意義的分數值，變成 probability（機率） 的意義。

例如你在做貓的種類判斷，有三個種類，那麼 Softmax 出來的結果並不是 100% 波斯貓，而是 90% 機率波斯貓、5% 機率英國短毛貓、5% 機率蘇格蘭摺耳貓等等。

Softmax function 表示如下（$C$ 為 number of classes（類別數），$z_i$ 為第 $i$ 種類別的分數）：

$$
\text{softmax}(z_i) = \frac{e^{z_i}}{\sum^C_{c} e^{z_c}}
$$

可以看到分母的 summation 就是在進行 normalization，讓每個類別的分數介於 0，1 之間，且合為 1。而這個分數就代表預測為該類別的機率。所以最後一層要有幾個 neuron 會等於要做判斷的種類數 $C$ 喔！

### Prediction

經由 pre-processing 把 network 的 input 轉化為 vector 形式後，經過一層層的處理，每層統整激發： $\mathbf{a} = f(\mathbf{z}) = f(\mathbf{W}\mathbf{x} + \mathbf{b})$ 並把輸出傳遞下去，直到最後一層激發完後，獲得 prediction $\hat{y}$。Prediction 這步就完成了。

而 predict 完之後，接著把 error 回饋給 network 的參數，便是下一篇的主題。

## Checkpoint

- Neural Network 的終極目標為何？
- 訓練 Neural Network 的大致流程為何？
- 用 vector 和 matrix 來表示 data 有哪些好處？
- 試著從上面 matrix summation 的範例圖，標示每條線對應到 $\mathbf{W}$ 裡的值。
- Activation function 有哪些條件？
- Softmax function 常被應用在哪種任務？

## 參考資料

1. [Wikipedia - Activation Function](https://en.wikipedia.org/wiki/Activation_function) 
2. [CS224n Lecture Notes Part III - Neural Networks, Backpropagation](http://web.stanford.edu/class/cs224n/readings/cs224n-2019-notes03-neuralnets.pdf)
3. [CS224n Lecture 3 Slides - Word Window Classification, Neural Networks, and PyTorch](http://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture03-neuralnets.pdf)
4. [👍 CS229 Lecture Notes - Deep Learning](http://cs229.stanford.edu/summer2020/cs229-notes-deep_learning.pdf)

## 延伸閱讀

1. [CS229 Lecture Notes - Linear Algebra Review and Reference](http://cs229.stanford.edu/summer2020/cs229-linalg.pdf)