# 【類神經網路架構的實務應用】
## 目錄
- 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, ...)