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