---
# System prepended metadata

title: 【理論】算法挑選、CNN、RNN、Layers
tags: [機器學習]

---

# 【理論】算法挑選、CNN、RNN、Layers
###### tags: `機器學習`
[TOC]

## 模型的優劣指標
### 理想的模型
* 應該要**把「資料前處理（data preprocessing）」也作為模型的一部分去寫**。
* 承上，**最好自己寫資料前處理用的 code**。假若仰賴現成的 pipeline 去代理這一連串處理，可能會降低模型可攜性。
即，使得在更換程式語言時，碰上使 perofromance 嚴重劣化的功能缺失，甚至害整個模型無法用。
    > The ideal model should expect as input something as close as possible to raw data: an image model should expect RGB pixel values in the [0, 255] range, and a text model should accept strings of utf-8 characters.
    > 
    > --[Introduction to Keras for Engineers](https://keras.io/getting_started/intro_to_keras_for_engineers/)

* 對於無法直接處理「附非數字標籤的資料」的機器學習演算法：
    * Ex. ``'pet':['dog', 'fish', 'fox']``。
    > Many machine learning algorithms cannot operate on label data directly. They require all input variables and output variables to be numeric.
    >
    >In general, this is mostly a constraint of the efficient implementation of machine learning algorithms rather than hard limitations on the algorithms themselves.
    >
    >This means that categorical data must be converted to a numerical form.
    >
    > -- [Why One-Hot Encode Data in Machine Learning?](https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/)
### R-squared
* 意義：某函式 $f$ 所預測的資料關係，可以代表多少 % 的兩筆變數的分佈變化（Variation）。
* 計算方法：
    $$R^2=\frac{\text{Var(mean)-Var($f(x))$}}{\text{Var(mean)}}$$
    * 其中 
        $\text{Var(mean)}=\Sigma(y_i-\bar y)^2$
        $\text{mean}=$ $y$ 軸變數平均值
        $\text{Var(f(x))}=\Sigma(y_i-f(x_i))^2$
        
        （還是有點不太確定！）
    
> 參考：[StatQuest: R-squared explained](https://www.youtube.com/watch?v=2AQKmw14mHM)

:::warning
Q: 為什麼會從其他實作模型的實習生口中聽到 「R-squared 有出現負值」？
Q: 上文的「兩筆變數」是哪兩個？$x$ 和 $y$？
:::

### MAPE
= Mean Abslute Percentage Error

用**百分比**表示 test output 與正解間的偏移量。
    $$\text{MAPE}=\frac{100\%}{n}\sum^n_{i=1}|(y_i-\hat y_i)/y_i|$$
    
其中 $y_i$ 是正解，$\hat y_i$ 是機器所預測出來的解。
> 參考：[Root Mean Square Error (RMSE) Tutorial + MAE + MSE + MAPE+ MPE | By Dr. Ry @Stemplicity](https://www.youtube.com/watch?v=KzHJXdFJSIQ&t=618s)
## 各種 Layers
* 我的感覺：從集合的角度來看，Layers 像函數的分類。
* Ex. 某一函數，若它將所有輸入的向量，用一次式運算為一個值輸出，則我們就 somehow 可以把它歸類到全結合層。



### Dense Layer
aka **全結合層**、**完全連接層**。

* 精神：「**結合所有參數為一個值**」。
Ex. 對於 input 進來的參（變）數們 $x_i$s，列出其一次式：

    $x_1a_1+x_2a_2+...+x_na_n$ 。
- 不過實作上，也可能是把 shape `(None, n)` 的資料再結合成較小的 `(None, m)`，其中 `n`>`m`。

#### 實作例：Keras
```python
input_text = layers.Input(shape=(1,), dtype=tf.string)
embedding = ElmoEmbeddingLayer()(input_text)

dense = layers.Dense(256, activation='relu')(embedding)
pred = layers.Dense(1, activation='sigmoid')(dense)

model = Model(inputs=[input_text], outputs=pred)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(train_text, 
          train_label,
          validation_data=(test_text, test_label),
          epochs=5,
          batch_size=32)

# 中略....

model.save('ElmoModel.h5')
pre_save_preds = model.predict(test_text[0:100]) # predictions before we clear and reload model

# Clear and load model
model = None
model = build_model()
model.load_weights('ElmoModel.h5')

post_save_preds = model.predict(test_text[0:100]) # predictions after we clear and reload model
all(pre_save_preds == post_save_preds) # Are they the same?

```

```
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 1)                 0         
_________________________________________________________________
elmo_embedding_layer_2 (Elmo (None, 1024)              4         
_________________________________________________________________
dense_3 (Dense)              (None, 256)               262400    
_________________________________________________________________
dense_4 (Dense)              (None, 1)                 257       
=================================================================
Total params: 262,661
Trainable params: 262,661
Non-trainable params: 0
_________________________________________________________________
True
```
> 來源：https://towardsdatascience.com/elmo-embeddings-in-keras-with-tensorflow-hub-7eb6f0145440
:::warning
Q: 上例 Keras code 之中，`activation` 參數的 `relu`,`sigmoid` 的設定意義是？ 
- 是指全結合層的線性組合結果，要再用哪一個函數標準化再輸出嗎？
- 這麼想的話，全結合層有一種**負責整個模型訓練的オチ**的感覺。得到了好多個，$n$ 個權重之後，再把它真正套用在 input 資料 $x$（可能有經過數值化、標準化處理）上，產生可供計算 loss 的 $y$ 值的感覺。
:::
### Input Layer
aka **輸入層**。

NN 的第一層，負責接收輸入數據。

### Output Layer
aka **輸出層**。

NN 的最後一層，負責輸出數據。

:::warning
Q: 如果我對全結合層的理解沒有錯，我們難道不能直接用 Dense function 套用它內建的 activation function（如果有），直接 return 數據（$y$）出來嗎？
- 或者 Output Layer 只是一種分類而已，全結合層可以屬於一種輸出層？
- 還是說，這裡的「數據」不是指計算 loss 用的 $y$，而是在計算 loss 之後的東西？
- 或者，是整個模型完成了所有 iteration 後，用以輸出歷經千辛萬苦，以全球暖化為代價所得到的最終 $n$ 個權重？
:::
### Hidden Layer
aka **隠れ層**、隱含層、處理層。

相對於輸出與輸入層，夾在兩者之間，處理數據。

### Convolution Layer
aka **卷積層**。

* Ex. Conv1D、Conv2D、Conv3D

:::warning
CNN 的核心，之類的？
:::
* 資源
    * [哇～ Convolution Neural Network(卷積神經網絡) 這麼特別！](https://medium.com/daai/%E5%93%87-convolution-neural-network-%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E7%B5%A1-%E9%80%99%E9%BA%BC%E7%89%B9%E5%88%A5-36d02ce8b5fe)
        * 基礎概念的解說
        * 乍看蠻詳細，卡住時可以翻看看
### Recurrent Layer
aka **循環神經層**。

* Ex. RNN、LSTM、GRU
* 資源：
    * [Keras - Recurrent layers](https://keras.io/api/layers/recurrent_layers/)

### Max/min Pooling Layer

應用：符號相似度辨識。

* Ex. MaxPooling

## 模型的構成

### 資料前處理
aka **data preprocessing**
* Data **reshape**
    Ex. 
    ```python
    X_train = []   #預測點的前 60 天的資料
    y_train = []   #預測點
    for i in range(60, 1258):  # 1258 是訓練集總數
        X_train.append(training_set_scaled[i-60:i, 0])
        y_train.append(training_set_scaled[i, 0])
    X_train, y_train = np.array(X_train), np.array(y_train)  # 轉成numpy array的格式，以利輸入 RNN
    ```

    -   **Reshape**  
        因為現在 `X_train` 是 2-dimension，將它 reshape 成 3-dimension: `[stock prices, timesteps, indicators]`

    ```python
    X_train = np.reshape(X_train,(X_train.shape[0], X_train.shape[1], 1))
    ```
    :::warning
    Q: Why doing this?
    Q: 如果在做資料重整時，發現原本希望 「row 與 row 為相對應的資料，只是欄位不一樣」，但事實上 row 與 row 沒有相合的話，該怎麼辦？
    :::



### ...

### ...

## 挑選算法
> Refer: [初學者碰上「機器學習」的第一道關卡：我應該使用哪種算法？](https://buzzorange.com/techorange/2017/05/25/which-method-in-ai/)
* 選擇算法時考慮的條件：
    * 準確度
    * 訓練時間
    * 易用性

### 演算法的分類
也順便記下一些關鍵字。

* **回歸直線** v.s. **時間序列** v.s. ？
    * 時間序列
        * 季節性 v.s. 非季節性
    :::warning
    Q: 季節性 とは？

    Q: 「時間序列」、「迴歸直線」 在機器學習領域架構中的地位、維度在哪裡？（我感覺自己像白紙上的螞蟻）

    :::
* **監督式學習** v.s. **非監督式學習** v.s. **參半**
    * 監督式學習
        * SVM 分類、 SVM 迴歸
        * 隨機森林
        * 線性回歸
        * 分類演算法比較
        * 決策樹
        * 羅吉思迴歸
        * ．．．
    * 非監督式學習
        * DBSCAN 群聚演算法
        * 分群、階層式分群
        * 降維
        * 主成分、核心主成分分析
        * 局部線性嵌入
        * k- 平均演算法
        * ．．．
* **線性回歸（Linear Regression）** v.s. **邏輯回歸（Logistic Regression）**
* **Linear SVM** v.s. **Kernel SVM**
    :::warning
    Q: SVM 是什麼？
    > SVM = Support Vector Machine
    :::
* **Tree** v.s. **Ensemble Tree**
    :::warning
    Q: What is ensemble tree?
    :::
* **神經網路（Nerual Network）** v.s. **深度學習（Deep Learning）**
* **K-means / K-modes， 高斯混合模型聚類（GMM clustering）**
* **層級聚類（Hierarchical clustering）**
* 



### 回歸直線 v.s. 時間序列
* 回歸直線
    * 精神：？
想像：在 $x,y$ 平面上，點上資料點，求出一條近似直線。
Ex. 最小平方法。

* 時間序列
    * 精神：每一個資料點都和它自己以外的資料點有關聯（函數關係？）。
    * 目標：？？
    * 學習階段心得：
        * 求「隨時間變化的現象規律」的感覺。
        * 可以引入「動態系統概論」中學到的知識？（可惡，筆記不在手邊）
    * Ex. 
        * ARIMA


### 演算法的侷限
* 凸優化問題
    :::warning
    ?
    :::
* 梯度消失問題（Vanishing gradient problem）
    :::warning
    似乎是在「Loss Function Optimization (minimization)」的步驟時，會因為 activation function 的選擇而引發的問題？
    :::

## Deep Learning 
### What is deep learning ?
> 優質說明（日文）：[【深層学習】ディープラーニングとは関数近似器である【ディープラーニングの世界 vol. 1 】](https://www.youtube.com/watch?v=SyWwoMpP_P4&list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP&index=1)

* Goal：使用演算法，推導（learn）出良率最高的目標函式參數（parameter）。
* Input： data
* Output：funciton

決定鏈：
```mermaid
graph TB;
parameters --> function --> 良率

```

### 深度學習在做什麼？
> Refer: [【深層学習】学習 \- なぜ必要なのか？何をするのか？【ディープラーニングの世界 vol. 2 】](https://www.youtube.com/watch?v=RLlTmbyJORM&list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP&index=2)
1. **決定「報酬函數」**（或「誤差函數」）
    * Goal：決定函數 $\Phi(f)$ 
    * $\Phi$ 會輸出 $f$ 的「良率」（或「不良率」）分數，我們的目標就是將此「良率」最大化。
     
      換句話說，我們想要**最大化（或最小化）函數 $\Phi$ 的值**。
    * Ex. （良率）
        * $\Phi(f_0)=100.\leftarrow$ 這個比較好！ 
        * $\Phi(f_1)=50$

2. **決定要使用的函數$f(a_0, a_1, ...,a_n)$**
    * 要**以什麼函數為模板**，來輸入向量（指大量項目的 data） $v$？
    * 極簡例：一元二次方程式。
    :::warning
    這是我不知道的！按照數學上的直覺，應該有所謂「適合在 a 情況時用的函數模板 A；在 b 情況時用模板 B ...；」。我需要更理解眼前的問題類型。
    * 如果來不及理解，就先搜集好各種函數模板，安裝下來邊實驗邊理解。
    > 推測：此步驟相當於 [5大關鍵步驟！如何構建深度學習模型？](https://read01.com/zh-tw/P5NQ7xM.html) 網站提到的 **定義架構**：
    > 
    > 摘寫其內文：
    >> 1. 計算機視覺任務，如圖像分割、圖像分類、面部識別和其他類似項目：首選 卷積神經網絡（CNNs）或 ConvNets 。
    >> 2. 自然語言處理、與文本數據相關：遞歸神經網絡（RNNs）、長短期記憶（LSTMs）。  
    >
    > 這裡的「架構」＝上述「函數模板」。
    > 
    > 決定基準：**檢視自己的需求**：
    > 1. 順序模型（Sequential Model）
    > 2. 功能性 API
    > 3. 用戶定義的自定義架構
    > 
    > 是上述哪一種。
    > 
    :::
    
3. **找！**（學習）
    * 找「要填進函數模板裡的 parameter」
    * 尋找可以讓 $\Phi$ 輸出最大值（或最小值）的**函數**的 **parameter**。

## NLP
### 資源
* [[NLP] Word Embedding 筆記](https://clay-atlas.com/blog/2019/11/26/nlp-word-embedding-%E7%AD%86%E8%A8%98/)

## CNN
= Convolution Neural Network
aka **卷積神經網路**

* 應用
    * 文字圖形辨識（使用值的分佈特徵為一直線的 Convolution Layer)（大概）

### 原理概述
* 透過用小矩陣去**內積**大矩陣（圖片）中的各個區域，來得到大矩陣中的**局部區域值分佈特徵**。
（Ex. 取 3x3 的一格，其中對角線值特別大，其他值特別小）
* Ex. 對於一個圖像：$X\in \mathbb R^{28\times 28}$（28x28）的矩陣，我們可以用 $C\in\mathbb R^{3\times3}$ 的 convolution layer 去「內積」它，將其套用一個激發函數 $\phi$，排列得到的值，形成另一個矩陣 $Z\in \mathbb R^{26\times26}$。

> 參見：
> [【深層学習】畳み込み層の本当の意味、あなたは説明できますか？【ディープラーニングの世界 vol. 5 】](https://www.youtube.com/watch?v=vU-JfZNBdYU&list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP&index=5)
### VGG
> 參見：[]()

## RNN
= Recurrent Neural Network
aka **循環神經網路**
### LSTM
LSTM = Long Short-Term Memory

#### 相關實作例：
* [[Day27] 認識損失函數](https://ithelp.ithome.com.tw/articles/10227349)
* [[實戰系列] 使用 Keras 搭建一個 LSTM 魔法陣（模型）](https://ithelp.ithome.com.tw/articles/10206312)
* [Day 23：銷售量預測 -- LSTM 的另一個應用](https://ithelp.ithome.com.tw/articles/10195400)

#### 理論講解：
* [人人都能看懂的LSTM](https://zhuanlan.zhihu.com/p/32085405)

#### 其他筆記：
* [【Python】 ARIMA、sklearn、Keras](/j9hxP9hhTaugp2uCFiLnOg)
### GRU
= Gate Recurrent Unit

#### 理論講解：
* [人人都能看懂的GRU](https://zhuanlan.zhihu.com/p/32481747)

## Jargons
筆記下我的理解：
* **feature**: 俗稱的向量 $X$，maybe aka 特徵，即 Input 給模型的變數。
* **Categorical Data**: 有使用標籤分類後的資料。
  如：
`data['運動番']={'sk8 the infinity', 'Haikyuu'}`,
 `data['懸疑番']={'The Promised Neverland'}`, 
`data['戰鬥番']={'Neon Genesis Evangelion'}`
* **Numerical Data**
* Converting Categorical Data to Numerical Data
    * **Integer Encoding/ Label Encoding**: 
        將原本非整數型態（往往是字串？）的標籤編碼為整數。
    * **One-Hot Encoding**
* **Tensor**（張量）