---
# System prepended metadata

title: 【類神經網路架構的實務應用】
tags: [Data Analysis]

---

# 【類神經網路架構的實務應用】

## 目錄
- Part1: 類神經評估的方法
- Part2: 類神經訓練完輸出的成果
- Part3: 類神經訓練的實例介紹
- Part4: 補充資料

<br><br>

## Part1: 類神經評估的方法
### I. 過去評估方法
1. 使用者自行轉寫最佳解的版本 (例如：實驗測試 300 次，選擇其中最好的 1 次發表)
2. 實驗數據易造假 (例如：時序資料中，挑選特定效果較好的時段做呈現) 
    <center>
            <img src="https://hackmd.io/_uploads/SJxl3hNoC.png",        
                 style="
                        width: 50%; 
                        height: auto;">
            <div style="
                    border-bottom: 3px solid #d9d9d9;
                    display: inline-block;
                    color: #999;
                    padding: 3px;">
            </div>
    </center>

<br>

### II. 現在評估方法
1. 資料集固定，做 300 次測試取平均的結果，做盒須圖信賴區間分析。
2. 資料集做 K-Fold ，常用於時序資料。
<center>
        <img src="https://hackmd.io/_uploads/rJX2T2NjR.png",        
             style="
                    width: 50%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>

:::success
**重點筆記** : 對 $mean$  - 對 $\sigma$ > our $mean$ + our $\sigma$
:::

<br>

### III. 類神經網路效能不好時的檢查與要點
- 在意個別的變動，不在意整體數值。
- 觀察新的變動，是否是往對的方向移動或是偏向錯誤方向。
<center>
        <img src="https://hackmd.io/_uploads/Bk8A6aNjA.png",        
             style="
                    width: 80%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>

:::success
**補充資料**: Training 最差情況，訓練次數 $\times$ 步伐數 $= 2$ 
- 例如：訓練次數等於 10,000 時，步伐數則可以設成 0.002。
:::



### IV. 訓練時 Epoch 和 Batch 的選擇問題
<center>
        <img src="https://hackmd.io/_uploads/HyoInCXN1e.png",        
             style="
                    width: 90%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>


Batch 設成 n 代表一次跑 n 筆資料 (Forward)，然後求這 n 筆資料的平均 error ，最後透過平均 error 來 update 參數 (Backward)

#### Batch 早期使用方法
Batch 大多設置為 1，每跑一筆數據更新一次參數。
- 優點：update 快，很快就收斂。
- 缺點
    1. 很容易受到單一雜訊影響。(例如：當其中一筆資料複雜度特別大，容易造成 error 大，訓練好參數又跑掉。)
    2. 會被資料排列順序影響。(例如：資料為 0, 0, 0, 1, 1, 1, 1, 1，結果容易偏向 1)，因此資料訓練前會先習慣打亂順序。

#### Batch 現在使用方法
Batch 大多依記憶體大小設定或者資料集大小設定。(例如：假設 GPU 有 6000 Chip，最大計算量為 6 次。因此同時做 10000 筆資料最能充分使用 GPU。)
- 優點：參數調整不會太敏感。
- 缺點：訓練時間易拉長。

#### Epoch 使用方法

- epoch threshold 到 (定值)
- error threshold 到 (直到小於某數為止) (不推薦)
- early stop (給大的epoch定值，但若出現連續 n 次 error 不下降時，則停止計算) (能有效避免 overfitting)

#### 模型訓練中的崩潰
- 模型全重跑 -1 ~ +1 的範圍 (例如: Nan, inf)
- 造成的原因:
    1. Update 程式寫錯
    2. 資料集有大錯誤，誤差不合理
- 造成後果:
<center>
        <img src="https://hackmd.io/_uploads/SyBS0aFpC.png",        
             style="
                    width: 50%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>

- 處理方式: 每一個訓練步驟皆紀錄數值，找到跑掉之原因

### V. 隱藏層神經元數量 (最佳解)
<center>
        <img src="https://hackmd.io/_uploads/rJhx114Vkl.png",        
             style="
                    width: 90%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>

:::success
**重點筆記**: 維度升高太多
- 問題難度太高。
- 需要來搭配硬體。
:::

### VI. 學習步伐
過去經驗，能讓整個變數區間走過 1-2 次
- 有限 training 次數下，多個 model 少 epochs
- 能走過整個變數區間，少 model 多個 epoch 才有可能找到最佳解。


<br><br>

## Part2: 類神經訓練完輸出的成果
**量化驗證**: 以數值方式評估 NN 效能: MSE、MAPE、Accuracy。
**質化驗證**: 
- 解釋模型的合理性。去了解模型訓練後的參數，例如 Fuzzy NN 各個區塊展示
- 使用 Case Study 說明合理性。目前流行的方法是，好的 Case 有許多個，不好的 Case 有一兩個，用來說 model 的限制。

:::success
**重點筆記**: 消融實驗
- 你提出 a, b, c 三個優化方法。
- 因此不只是做 a, b, c ，而是 a, b, c, ab, bc, ac 都要做。
:::

### I. 迴歸問題
- 量化驗證：重點為取值。(MSE, Error Histogram)
    1. 訓練前判斷使否高斯混合模型，可以用 GMM 檢查。
    2. 神經訓練後的誤差必須是高斯分佈才算是訓練成功
    3. 檢查是否有特殊錯誤資料：刪除不合理資料或模型設計錯誤
    4. Error Histogram：
    <center>
        <img src="https://hackmd.io/_uploads/SJIQZJE41e.png",        
             style="
                    width: 50%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>
    
    :::success
    **重點筆記**:
    - 訓練前的資料分佈驗證: 正常分佈
    - 訓練後的資料分佈驗證: 如果你資料訓練後的 error histogram 是正常分佈，代表你的 NN 有訓練成功。
    - 訓練失敗的案例: 
        <center>
            <img src="https://hackmd.io/_uploads/SyhN4kVEJx.png",        
                 style="
                        width: 90%; 
                        height: auto;">
            <div style="
                    border-bottom: 3px solid #d9d9d9;
                    display: inline-block;
                    color: #999;
                    padding: 3px;">
            </div>
        </center>
    :::
- 質化驗證：個人感官實務理論。(Case study)
    1. 普通情況：通常誤差小。
    2. 極限情況：通常誤差大，但可以解釋其原因就好。
<center>
    <img src="https://hackmd.io/_uploads/SJIz-T4jA.png",        
         style="
                width: 50%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

### II. 時序預測
- 量化驗證：MSE、Error histogram、 時序實際與預測對照差異
    <center>
        <img src="https://hackmd.io/_uploads/r1KRG6NoR.png",        
             style="
                    width: 90%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>
:::success
**重點筆記** : 可以關注波峰、波谷是否有追理想的曲線。並注意是否預測線條是否有時間延遲現象，代表沒有訓練好。
:::

- 質化驗證：區段時間討論。
    1. Case Study 1: 理論 $\rightarrow$ 資料。 (例如：中興大學平日、假日、特殊日人流）
    3. Case Study 2: 資料 $\rightarrow$ 理論。 (討論人數最多10次與最少的10次)

<br>

### III. 分類問題
```mermaid
graph LR
A((input))--->D[Hidden];
B((input))--->D;
C((input))--->D;
D--->E((output));
```
output: $x>0.25: class\;1,\;-0.25<x\leq0.25:class\;2,\;x\leq-0.25: class\;3$

<center>
    <img src="https://hackmd.io/_uploads/Sk-lj0ujA.png",        
         style="
                width: 90%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

- 量化驗證：
    1. MSE、Accuracy
    <center>
        <img src="https://hackmd.io/_uploads/rybiHaEoC.png",        
             style="
                    width: 100%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>

    2. Confusion Matrix
    <center>
        <img src="https://hackmd.io/_uploads/Sk3tF6NsA.png",        
             style="
                    width: 70%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>

    :::success
    **重點筆記**
    1. 格子數值超大：可能是資料標記錯誤 or 代表兩類資料相近，可以合併一類後，再進行切割
    2. 某一類所有格子都有數值，代表此類沒有被模型抓到資料的特徵
    :::

- 質化驗證：每個格子 Confusion Matrix 狀況拿出來討論。探討每類可能發生原因，再做模型的校正。
<center>
        <img src="https://hackmd.io/_uploads/ryp8lRFpA.png",        
             style="
                    width: 50%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>

<br><br>


## Part3: 類神經訓練的實例介紹

### 解決實務問題的思考邏輯如下
1. 判斷目標問題是迴歸、時序預測，還是分類問題: 輸入、輸出、activation function
2. 決定模型的輸入型態為何: 從題目的資料格式
3. 決定模型的輸出型態為何: 從題目的資料格式

<br><br>

### 實例一: 宿舍電量預估
- 問題類型: Regression(迴歸問題)
- 資料: 
    1. 學校給的: 歷史用電量、宿舍人數、男女人數、月份、用電量
    2. 自己補充的: 氣溫、月假日(寒暑假、連假)、期中考週
<center>
    <img src="https://hackmd.io/_uploads/rJu_W1toR.png",        
         style="
                width: 70%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

:::success
**重點筆記**: 
- activation 是嚴格遞增函數， X 數值每變動一個月，必然會造成 y 的數值有正向影響
- 居住人數轉換成人次：例如週一 95% 、週二 100%、...、週日 30%
- 月份對應下雨和氣溫：轉換成溫度對應下雨天數的圖
:::

- 資料要標準化: 輸入、輸出在 NN 中必然得是 [0, 1] or [-1, 1] 的情況。
    1. 輸入 scale 不同要統一
    2. 對於不同維度的數據差距過大，類神經評估會失準
    3. 類神經權重在 [-1, +1] 之間。(每個維度的正規化規模不一樣)
    4. 如果輸入是 0 ~ 5 之間，輸出是 15000 ~ 100000 之間，則 NN 訓練時，參數只會追此倍數差，而不會學變動趨勢。
<center>
    <img src="https://hackmd.io/_uploads/ry7nKyYsA.png",        
         style="
                width: 90%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>


- 氣溫的處理: 氣溫分佈改為氣溫對發生日數做圖。

    :::info
    **注意事項**: 數值型資料與類別型資料在類神經建模的差別?
    - 數值型資料: 數值本身與數值間的差異是有意義的。 (例如: 氣溫差一倍與差兩倍有差異)
    - 類別型資料: 數值本身數值差異無意義，需要額外處理，不可以直接套在NN。常用 One-Hot vector來表示。 (例如: 男女代號各自無意義)
        1. 優點: 探討每個類別的影響性。
        2. 缺點：類別多，模型變大 (類別數量多的改善格式) 
    <center>
        <img src="https://hackmd.io/_uploads/HkOSXJKjC.png",        
             style="
                    width: 70%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>
    
    <center>
        <img src="https://hackmd.io/_uploads/Sy2pN6FpA.png",        
             style="
                    width: 70%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>
    :::

<br>

### 實例二: 0~9 手寫辨識 (MNIST)
- 問題類型: 分類。
- 資料: 
<center>
    <img src="https://hackmd.io/_uploads/S1WfA1FiC.png",
         style="
                width: 70%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

- 缺點: 不准、常出錯。機率可能因為 offeset 造成判斷錯誤，由於輸出的多維度互相拉扯。
- 除了 CNN 的新解決思維：NN 重點在觀察資料，然後把對分析的狀況最有效的特徵丟到 NN 當中。(把原本 25 個格子，壓縮到周邊 10 個)
:::success
**重點筆記**: 當看到一篇論文用 A 資料集設計一個 model，現在有 B 資料集（也可是環境 or 條件），因此可以找出 AB 資料集的不同處，修正模型即可。
:::

/ 放到分類問題
- 解決方法: 
    1. 單一模型: 2015年以後，學術界將模型最後一層加入 softmax 解決此問題。(強迫所有輸出只有一個獨大，其他很小)
    3. 多模型: 2015年以前，MIMO $\rightarrow$ MISO，模型動作專責化，Performance 易上升。（將手寫辨識變成每個字各自設計一個模型)
        <center>
        <img src="https://hackmd.io/_uploads/Sk-lj0ujA.png",        
             style="
                    width: 80%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
    </center>
    
    :::success
    **重點筆記**: 以 2024 角度來看，Softmax 可以取代此，但分類問題類別數太多，仍要使用此方法。
    :::
    3. 樹狀結構: 
        - 由於數值 [0, 3, 6, 8, 9], [1, 4, 7] 常搞混，因此使用視覺化呈現：
            <center>
                    <img src="https://hackmd.io/_uploads/HyJFJPG9A.png",        
                         style="
                                width: 40%; 
                                height: auto;">
                    <div style="
                            border-bottom: 3px solid #d9d9d9;
                            display: inline-block;
                            color: #999;
                            padding: 3px;">
                    </div>
            </center>
        - 第一輪先分出好分的特徵值，第二輪再切開分比較難分的。使用 Decision tree,  Divide and Conquer (辨識度高，成本低)。 
    <center>
            <img src="https://hackmd.io/_uploads/ryzICJYoA.png",        
                 style="
                        width: 90%; 
                        height: auto;">
            <div style="
                    border-bottom: 3px solid #d9d9d9;
                    display: inline-block;
                    color: #999;
                    padding: 3px;">
            </div>
    </center>
    

:::info
**Discussion**  
取特徵值重點: 只要能找出一組特徵能充分表達不同數字的差異即可
:::

<br>

### 實例三: 高速公路車流量
- 問題類型: 時序預測
- 資料: 車流量、ETC閘門、時間
<center>
        <img src="https://hackmd.io/_uploads/H1PNqoKoA.png",        
             style="
                    width: 90%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>
    
- 使用高度相關資料做預測: 把所有可能資料輸入 $\to$ 模型變超大 $\to$ 減少要輸入欄位。常見方法如下
    1. cosine similarity (統計)
    2. 皮爾森相關係數 (統計)
    3. Auto encoder(deep learning)
- ETC 資料問題 (需要資料清洗)
    1. ETC 門會壞掉，會出現超長缺值 $\to$ 假設今天車流狀況與前後幾天相同
    2. ETC 深夜數值不穩定 $\to$ 超過統計三倍標準差的極端值去除，使用內插法校正超出的數值

<br>

### 實例四: Ubike站點受雨量影響?
- 問題類型: 迴歸
- 資料:
<center>
        <img src="https://hackmd.io/_uploads/HJt7Aotj0.png",        
             style="
                    width: 90%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>

- 預估的可行性
    1. 大流量 $\rightarrow$ 可預估。不會受到個人行為影響才可以。
    2. 小流量 $\rightarrow$ 每個小時 0~2 台，不可預估。只要有一個路人去借會打亂順序、比較偏隨機狀況。
    3. 下雨的天數不多，造成資料不平衡，Performance 變差。
- 增進效能的快速小技巧: 
    1. 有時取特徵值時，不同時間的差距也要納入考量。
    2. 根據不同類型站點建立NN模型。(拿雨量資料的迴歸線 相似度分析、k-means 分模型)
        - 個別站點分別建模: 沒有分群前用。
        - 同一類站點一起建模: 已經建好分群，可減少成本。

<br>

### 實例五: 太陽能發電量預測
- 問題類型: 迴歸問題! ($\because\;$發電量不跟之前的發電量有關，電子與當下光子量有關係。)
- 從天氣狀況評估，並非由過去發電量時間序列預測感測器資料。
- 藉由天空影像(雲) + 風向：先預測雲的位置，在預測發電量。

<br><br>

## Part4: 補充資料
### I. 模型本身的運算效能: 類神經的維運
<center>
        <img src="https://hackmd.io/_uploads/rks8n14E1e.png",        
             style="
                    width: 100%; 
                    height: auto;">
        <div style="
                border-bottom: 3px solid #d9d9d9;
                display: inline-block;
                color: #999;
                padding: 3px;">
        </div>
</center>


<br>

### II. 模型本身的抗噪問題: 強健性(Robust)
- 如何避免輸入誤差對模型輸出的影響，為強健性的定義。
- 類神經 Strong 的假設: 所有輸入都是無誤差的，此在實務上是不可能的。

<br>

### IV. LLM
學習收集資料集 (文件) 的文字順序
<center>
    <img src="https://hackmd.io/_uploads/SJzE30Es0.png",        
         style="
                width: 50%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

<br>

### V. 網路的演進：以自走車為例
<center>
    <img src="https://hackmd.io/_uploads/SyXpekHsA.png",        
         style="
                width: 50%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

#### 以前的電腦架構
- 純硬體設備：把攝影機控制器的晶片功能做強大，然後放在車子上。
- 軟體：負責實踐車輛的運行。
<center>
    <img src="https://hackmd.io/_uploads/r14BWkBiC.png",        
         style="
                width: 30%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>


#### 雲端計算(5G, 6G)
- 極簡化硬體設備：網路 5G 晶片 + 控制晶片
- 軟體：大數據時代來臨
<center>
    <img src="https://hackmd.io/_uploads/H1jrzJBj0.png",        
         style="
                width: 50%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

#### 雲端計算+硬體折衷
- 邊緣運算、分級運算 : 透過使用即時運算。因為繼續使用晶片功能不強，同時可壓低價格。
<center>
    <img src="https://hackmd.io/_uploads/H11JEkSs0.png",        
         style="
                width: 70%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

<br>

### VI. 聯邦學習
- 類神經最被人詬病的地方：要有全部的資料才能建模，以醫療影像為例。 (例如：資料分佈在各區醫院，無法整合起)
- 聯邦學習協助在此狀況下進行 Neural Network 訓練
<center>
    <img src="https://hackmd.io/_uploads/S1j3PkBjR.png",        
         style="
                width: 100%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

<br>

### VII. 類神經與其他領域結合

#### 類神經 + 資料結構
- Example 1：增加參數進入模型。
<center>
    <img src="https://hackmd.io/_uploads/Hyy45yBjC.png",        
         style="
                width: 100%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>


- Example 2：網格問題討論。
<center>
    <img src="https://hackmd.io/_uploads/H1lsnyrjC.png",        
         style="
                width: 70%; 
                height: auto;">
    <div style="
            border-bottom: 3px solid #d9d9d9;
            display: inline-block;
            color: #999;
            padding: 3px;">
    </div>
</center>

- 方法一：原本做法是每個網路都建立一個 DNN 。
- 方法二：中間 DNN ，外圍使用小型模型，可以大幅降低成本。(例如： DNN+A, DNN+B, ...)