---
# System prepended metadata

title: 【機器學習2021】 03~08 機器學習任務攻略和最佳化技巧
tags: [機器學習]

---

20250927 筆記，內容可能有錯，請參考來源影片。

[李宏毅機器學習2021影片](https://www.youtube.com/playlist?list=PLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J)


今天影片內容

[【機器學習2021】機器學習任務攻略](https://youtu.be/WeHM2xpYQpw?si=xGCp2G9BggworXT0)

[【機器學習2021】 類神經網路訓練不起來怎麼辦 (一)： 局部最小值 (local minima) 與鞍點 (saddle point)](https://youtu.be/QW6uINn7uGk?si=R-0U-NqPTgSVWAN8)


[【機器學習2021】  類神經網路訓練不起來怎麼辦 (二)： 批次 (batch) 與動量 (momentum) ](https://youtu.be/zzbr1h9sF54?si=f3SRgjDBS0FMAkie)


[【機器學習2021】  類神經網路訓練不起來怎麼辦 (三)：自動調整學習速率 (Learning Rate)](https://youtu.be/HYUXEeh3kwY?si=878xDHc5Aeo8nDgu)



[【機器學習2021】  類神經網路訓練不起來怎麼辦 (四)：損失函數 (Loss) 也可能有影響](https://youtu.be/O2VkP8dJ5FE?si=6-tC3jWA3tmL4sw9)


[【機器學習2021】類神經網路訓練不起來怎麼辦 (五)： 批次標準化 (Batch Normalization) 也可能有影響](https://youtu.be/BABPWOkSbLE?si=C-IBKbhSf9obDRJ3)




### 【機器學習2021】機器學習任務攻略 簡介大綱

I. 課程作業內容概述
    A. 作業資料格式：X (輸入) 與 Y (標籤)
    B. 具體作業類型：語音、影像、說話者辨識與翻譯

II. 模型訓練的基本流程
    A. 定義帶有參數 $W$ 的函數 $F_W(X)$
    B. 定義損失函數 Loss $L(W)$
    C. 尋找最小化 $L(W)$ 的參數 $W^*$ (Optimization)
    D. 將 $W^*$ 應用於測試資料

III. 訓練過程中的除錯策略 (提升表現的戰略)
    A. **訓練資料損失 (Loss) 過大**
        1. **問題一：模型不匹配 (Model Bias)**
            a. 模型的函數集 $F$ 太小，無法包含最佳函數。
            b. 解決方法：重新設計模型，增加彈性（如增加 Feature、增加模型大小、使用深度學習）。
        2. **問題二：最佳化失敗 (Optimization Failure)**
            a. 最佳函數存在於模型集合中，但演算法無法找到（例如卡在局部最優解）。
            b. 判斷方式：透過比較不同複雜度模型在訓練集上的表現（如 20 層 vs. 56 層網路）。
            c. 解決方法：先嘗試較淺或較簡單的模型，避免最佳化失敗問題。

IV. 訓練資料損失小但測試資料損失大 (Overfitting)
A. **過度擬合 (Overfitting) 的原因**：模型彈性（複雜度）太大，記住訓練資料的雜訊。
B. **解決方法一：增加資料**
    
        1. 增加訓練資料數量，限制模型自由度。
        2. 資料擴增 (Data Augmentation)：例如圖像翻轉，但須根據任務特性合理選擇。
        
C. **解決方法二：限制模型彈性 (Regularization)**

        1. 設定模型的參數限制（例如限制為二次曲線）。
        2. 使用具備內建限制的架構 (如 CNN 相較於 Fully Connected Network)。
        3. 其他方法：Early Stopping、Regularization (如 L1/L2)。

V. 模型選擇的正確方法
    A. **風險**：不應依賴公開測試集 (Public Test Set) 的分數。
    B. **正確方法**：使用驗證集 (Validation Set) 選擇模型。
    C. **進階方法**：交叉驗證 (Cross-Validation)。

VI. 資料分佈不一致 (Data Mismatch)
    A. **定義**：訓練資料與測試資料的分佈不一致。
    B. **特性**：增加訓練資料對此問題幫助不大。
    C. **應用**：多數作業已設計避免此問題，但作業 11 專門針對此問題。


### I. 課程作業與訓練流程

#### A. 作業格式與內容
接下來的課程將講解每個作業的攻略大戰略。
1.  **資料格式**：作業通常包含一堆訓練資料（包含 $X$ 和對應的 $Y$）和測試資料（只有 $X$）。
2.  **作業類型**：
    *   **作業二**：語音訊號辨識 (類似於作業一的延伸)，其中 $X$ 是小段語音訊號，$Y$ 是要判斷該訊號對應到哪一個音。
    *   **作業三**：影像辨識，$X$ 是一張圖片，$Y$ 是判斷圖片裡有什麼東西。
    *   **作業四**：說話者辨識，$X$ 是一段聲音，$Y$ 是判斷是哪一個人在說話（此系統常用於電話客服的身份驗證）。
    *   **作業五**：機器翻譯，$X$ 是某一語言的一句話，$Y$ 是另外一句話。

#### B. 模型訓練流程
訓練的過程與上週講述的步驟相同：
1.  **定義函數**：寫出一個帶有位置參數 $W$ 的函數 $F_W(X)$，其中 $W$ 代表模型內所有參數。
2.  **定義損失函數**：定義損失 $L$（Loss），用來判斷參數 $W$ 的好壞。
3.  **最佳化**：找到一個 $W^*$，使得損失 $L(W)$ 最小。
4.  **測試**：將 $W^*$ 拿來用在測試資料上，計算輸出的結果。

### II. 提升模型表現的策略

當模型在測試集上的表現不佳時，首要步驟是檢查 **訓練資料 (Training Data) 上的損失**。

#### A. 訓練損失 $L_{train}$ 過大 (在訓練集上都沒學好)
這代表模型在訓練集上表現不佳，可能有兩種原因：模型不匹配或最佳化失敗。

1.  **模型不匹配 (Model bias)**
    *   **原因**：你假設的函數集（Function Set）$F$ 太過簡單或太小。即使將所有可能的參數 $W$ 代入，得到的函數集內仍不包含任何一個函數 $F'$ 可以讓損失 $L$ 最小化。
    *   **比喻**：如同在大海裡撈針，但針根本不在海裡。
    *   **解決方法**：
        *   **重新設計模型**。
        *   **增加特徵 (Feature)**：例如，若原本輸入只使用前一天的資訊，現在可增加 5 或 6 天前的資訊。
        *   **增加模型大小**：設計一個更大的模型。
        *   **使用深度學習 (Deep Learning)**：增加模型的彈性。

2.  **最佳化失敗 (Optimization Failure)**
    *   **原因**：模型函數集 $F$ 中確實存在能夠達到低損失的最佳函數，但所使用的最佳化演算法（如梯度下降）無法找到該函數。演算法可能卡在局部最優解，沒辦法找到全域最優解。
    *   **比喻**：針確實在大海裡，但你沒有辦法將它撈出來。
    *   **案例分析**：ResNet 論文中的實驗顯示，56 層的網路在訓練集上的損失反而比 20 層的網路高。
        *   **解釋**：56 層的網路理論上應包含 20 層網路所能達到的所有函數集（因為它可以設定其中 36 層做 Identity Mapping），所以 56 層網路的函數集更大。訓練結果顯示 56 層網路的損失較高，這代表 **56 層網路的最佳化失敗**，而不是模型不匹配或過度擬合。
    *   **解決方法**：
        *   **先嘗試簡單或淺層的模型**：這些模型較不容易有最佳化失敗的問題。
        *   若深層模型 (如 $M_{deep}$) 訓練結果比淺層模型 (如 $M_{shallow}$) 的損失還大，則確認是**最佳化問題**，需要改進最佳化方法（下一階段課程會講述）。

#### B. 訓練損失 $L_{train}$ 小但測試損失 $L_{test}$ 大 (Overfitting)
當你透過努力讓訓練資料的 Loss 變小，但測試資料的 Loss 卻較大時，即發生過度擬合。

1.  **Overfitting 的概念和原因**
    *   **定義**：**訓練損失小但測試損失大** 才叫做 Overfitting。
    *   **原因**：模型的能力或彈性太大。模型可以產生非常奇怪的曲線，雖然能完美通過訓練點（甚至達到 $L_{train}=0$），但在沒有訓練資料限制的地方，其輸出行為高度自由，導致預測在新資料上失準。
    *   **背後原理**：彈性大的模型會學習到訓練資料中的雜訊（如同記住訓練資料的所有 $X$ 和對應的 $Y$）。

2.  **解決 Overfitting 的方法**

    *   **方法一：增加資料 (More Data)**
        *   增加訓練資料的數量，可以限制模型，使其雖然彈性大，但因為限制點多，產生的函數仍然接近真實趨勢。
        *   **資料擴增 (Data Augmentation)**：例如在影像辨識中，將圖片左右翻轉，或擷取部分圖像，使訓練資料數量倍增。
        *   *限制*：資料擴增必須根據問題的特性來選擇。例如，在影像中很少有人做上下顛倒，因為那是不合理的圖像。

    *   **方法二：限制模型彈性 (Regularization)**
        *   **限制函數形式**：例如，直接限制模型 $M$ 只能是一條二次曲線。
        *   **使用更有限制的架構**：例如，卷積神經網絡 (CNN) 相較於一般全連接層 (Fully Connected Network) 是更有限制的架構，因此 CNN 在影像任務上反而表現更好。
        *   **其他限制參數的方法**：例如給予較少的資源（較少的參數）或使用 Early Stopping。
        *   **注意**：限制不能給太多。若限制過大（例如強迫模型為一條直線，而資料分佈是曲線），則可能導致 $L_{train}$ 變大，回到模型不匹配的問題。

### III. 選擇模型的原則

模型複雜度 (彈性) 與 Loss 的關係如下：
*   **訓練集 Loss**：隨著模型複雜度增加，Loss 會持續下降。
*   **測試集 Loss**：隨著模型複雜度增加，Loss 會先下降，但當複雜度超過某個程度後，Overfitting 出現，Loss 反而會上升。
我們期望選擇一個中庸的模型，在測試集上達到最佳結果。

#### A. 選擇模型的大忌：不要用 Public Leaderboard
直覺上，可以將多個模型的結果上傳到 Leaderboard 上，選擇分數最低的。但是，**不建議這樣做**。

*   **原因**：如果模型是隨機的（例如，在訓練集沒看過的資料上隨機輸出），你總是可能找到一個模型，恰好在 Public Testing Data 上給出好的結果。這個模型實際上是 **Overfitting 到 Public Test Set**。
*   在 ML 競賽中，若選擇模型時只參考 Public Leaderboard 的分數，最終結果（在 Private Test Set 上）常常會掉名次。

#### B. 正確的模型選擇方式：Validation Set
為了解決這個問題，資料應該分成三部分：
1.  **訓練集 (Training Set)**：用於訓練模型。
2.  **驗證集 (Validation Set)**：用於評估不同模型的表現，並根據其分數來挑選模型。這部分資料通常佔總資料的 10% 左右。
3.  **測試集 (Testing Set)**：用於最終評估，在模型選定後才使用。

#### C. 交叉驗證 (Cross-Validation)
如果你擔心驗證集分得不好，可以採用 N-fold 交叉驗證：
1.  將資料切成 $N$ 等份（例如切成三等份）。
2.  輪流選擇其中一份當作驗證集，其餘當作訓練集，重複 $N$ 次。
3.  對每個模型，計算其在這 $N$ 種情況下的平均結果。
4.  選擇平均結果最好的模型 $M_{best}$。
5.  將 $M_{best}$ 用在全部的訓練資料上，重新訓練一次，然後再用於最終測試。

### IV. 資料分佈不一致 (Data Mismatch)

#### A. 定義與影響
*   **定義**：訓練資料 (Training Data) 與測試資料 (Testing Data) 的分佈 (Distribution) 不一樣。
*   **案例**：觀看人數預測模型，預測 2 月 26 日的觀看人數（當天實際上是最高峰），但模型認為那天是星期五，過去星期五的觀看人數通常最低，所以預測結果慘敗。
*   **解決困難**：在 Data Mismatch 的情況下，即便增加訓練資料，幫助也不大，因為增加的資料仍然來自舊的分佈。
*   **課程設計**：多數作業（如 COVID-19 案例的資料劃分）都經過精心設計，不會遇到 Data Mismatch 的問題。然而，作業 11 專門就是針對這個問題設計的。

#### B. 如何判斷 Data Mismatch
要判斷是否為 Data Mismatch，需要對測試任務有所理解，並對測試資料的分佈進行分析。


### 【機器學習2021】 類神經網路訓練不起來怎麼辦 (一)： 局部最小值 (local minima) 與鞍點 (saddle point)] 大綱


### I. 訓練優化失敗與臨界點 (Critical Points)

#### A. 訓練停滯 (Optimization Failure) 的現象
1. 參數更新後損失 (Loss) 仍不下降或一開始訓練即卡住。
2. 傳統猜想：走到參數的微分 (Gradient, G) 為零的點。

#### B. 臨界點 (Critical Points) 的定義與分類
1. **臨界點**：導數或微分為零的點。
2. **臨界點類型**：局部極小值 (Local Minimum, L-min), 局部極大值 (Local Maximum, L-max), 鞍點 (Saddle Point, S-point)。
3. **鞍點**：在某些方向上損失增加，在某些方向上損失減少的點。
4. **區分重要性**：若卡在 L-min 則無路可走；若卡在 S-point 則仍有路可讓損失下降。

### II. 判斷臨界點的數學工具：Taylor 展開與 Hessian 矩

#### A. 損失函數的局部近似 (Taylor Expansion)
1. 完整的 L function 很複雜，但在臨界點 $Z$ 附近，可以被近似寫出。
2. **近似式包含三個主要項**：
    *   $L(Z)$：臨界點的損失值。
    *   第二項：與梯度 $G$ (一次微分) 相關。
    *   第三項：與 **Hessian 矩陣** $H$ (二次微分) 相關。

#### B. 臨界點的簡化與分析
1. 在臨界點上，梯度 $G$ 為零，故第二項消失。
2. 損失函數的變化主要由第三項決定：$(Z'-Z)^T H (Z'-Z)$。
3. **Hessian 矩陣 $H$**：L 的二次微分組成的矩陣。

#### C. 判斷臨界點的依據：特徵值 (Eigenvalues)
1. **檢查所有向量 $V$**：
    *   若 $V^T H V$ 永遠大於零：Local Minimum (最低點)。
    *   若 $V^T H V$ 永遠小於零：Local Maximum (最高點)。
    *   若 $V^T H V$ 有時大於零有時小於零：Saddle Point (有些地方高有些地方低)。
2. **利用特徵值判斷 (簡便方法)**：
    *   所有特徵值皆為正：Local Minimum。
    *   所有特徵值皆為負：Local Maximum。
    *   特徵值有正有負：Saddle Point。

### III. 逃離鞍點的策略與實證經驗

#### A. 透過 Hessian 逃離鞍點
1. 若停下來是因 S-point，則可以繼續優化。
2. 在 S-point 處，梯度 $G$ 已經為零，必須看 $H$。
3. **更新方向**：沿著 $H$ 的**負特徵值**所對應的**特徵向量** ($U$) 方向更新參數。
4. 沿著負特徵值的特徵向量方向走，可以保證損失 $L$ 下降。

#### B. 高維度空間與鞍點的普遍性
1. **維度效應**：在低維度 (如二維) 看起來是 L-min 的點，在高維度空間中可能是 S-point。
2. 類比：三維空間封閉的石棺，在四維空間中可能有路徑進入。
3. **神經網路 (NN) 的高維度**：NN 參數數量達百萬千萬級，Error Surface (損失曲面) 維度非常高。
4. **經驗支持**：實際訓練經驗與實驗支持 S-point 比 L-min 更常見。
5. **Minimum Ratio 實驗**：測量特徵值中正值比例。實驗結果顯示，即使在極端情況下，仍有一半的特徵值是負的 (比例約 0.5)，表示仍有路徑可以讓損失下降。


### I. 訓練優化失敗與臨界點 (Critical Points)

#### 訓練停滯現象與梯度為零的猜想
*   在訓練優化過程中，有時會發生訓練失敗，表現為參數不斷更新後損失 (Loss) 仍在下降，但達不到滿意的效果。或者，有時訓練一開始 L 就不下降或很早就停滯。
*   **常見猜想**：訓練走到參數的微分 (梯度, Gradient, G) 為零的地方，導致參數無法再更新，L 無法再下降。
*   **臨界點 (Critical Point)**：導數為零的點統稱為臨界點。
*   **臨界點的類型**：臨界點不只是局部極小值 (Local Minimum)，還包括局部極大值 (Local Maximum) 和鞍點 (Saddle Point)。

#### 鞍點 (Saddle Point) 的特性
*   鞍點 (Saddle Point) 是一種特殊的臨界點，例如圖中紅色的點。
*   在鞍點處，沿著某個方向 (例如左右) 損失 L 會下降，但沿著另一個方向 (例如前後) 損失 L 會上升。
*   **區分臨界點的重要性**：
    *   如果卡在 **Local Minimum**，表示周圍的點損失都比它高，參數沒有路徑可以走，無法再收斂。
    *   如果卡在 **Saddle Point**，鞍點旁邊仍然有路可以走，仍然有路徑可以讓損失繼續下降。因此，判斷走到的是 Local Minimum 還是 Saddle Point 非常重要。

### II. 判斷臨界點的數學工具：Taylor 展開與 Hessian 矩陣

#### 損失函數的局部近似
*   雖然 L function 整體的形狀很複雜，但給定一個參數點 $Z$，該點附近的 L function 樣貌可以被近似寫出來。
*   這個近似式使用了 Taylor 展開。在參數 $Z$ 附近的 $L(Z')$ 可以寫為：
    $$L(Z') \approx L(Z) + (Z'-Z)^T G + \frac{1}{2} (Z'-Z)^T H (Z'-Z) + \dots$$

#### 梯度 $G$ 與 Hessian 矩陣 $H$
*   **$G$ (梯度)**：一個向量，是 L 的一次微分。它描述了 $Z'$ 跟 $Z$ 之間的差距。
*   **$H$ (Hessian 矩陣)**：一個矩陣，裡面存放了 L 的二次微分。

#### 臨界點的判斷依據
*   當我們走到了臨界點 $Z$ 時，L 的一次微分 $G$ 等於零。因此，損失函數的近似式簡化為：
    $$L(Z') \approx L(Z) + \frac{1}{2} (Z'-Z)^T H (Z'-Z)$$
*   我們可以根據紅框中的第三項 $\frac{1}{2} (Z'-Z)^T H (Z'-Z)$ 來判斷 $Z$ 附近的 Error Surface 樣貌。
*   我們將 $V = Z'-Z$ 視為一個移動向量。
    *   **Local Minimum**：若 $V^T H V$ 恆大於零 (不論 $V$ 是正或負)，則 $L(Z')$ 恆大於 $L(Z)$。
    *   **Local Maximum**：若 $V^T H V$ 恆小於零，則 $L(Z')$ 恆小於 $L(Z)$。
    *   **Saddle Point**：若 $V^T H V$ 有時大於零有時小於零，則 $Z$ 附近有些地方 L 高於 $L(Z)$，有些地方 L 低於 $L(Z)$。

#### 特徵值判斷法
*   不需要將所有可能的移動向量 $V$ 帶入檢查，可以透過分析 Hessian 矩陣 $H$ 的特徵值 (Eigenvalue) 來判斷：
    *   如果 $H$ 所有的特徵值都為**正** (Positive Definite)，則為 Local Minimum。
    *   如果 $H$ 所有的特徵值都為**負** (Negative Definite)，則為 Local Maximum。
    *   如果 $H$ 的特徵值有**正有負**，則為 Saddle Point。

#### 範例操作 (簡單神經網路)
*   以一個極簡化的神經網路為例，參數只有 $W_1$ 和 $W_2$。
*   在這個 Loss Surface 上，原點 $(W_1=0, W_2=0)$ 是一個臨界點 (梯度為零)。
*   為了確定原點是 L-min 還是 S-point，需計算 Hessian 矩陣 $H$。
*   $H$ 矩陣包含了 $L$ 對 $W_1$ 和 $W_2$ 的二次微分。
*   將 $W_1=0, W_2=0$ 帶入 $H$ 矩陣，得到 $H = \begin{pmatrix} 2 & 0 \\ 0 & -2 \end{pmatrix}$。
*   計算此 $H$ 的特徵值：分別為 $\lambda = 2$ 和 $\lambda = -2$。
*   因為特徵值有正有負，所以原點被確認是 **Saddle Point**。

### III. 逃離鞍點的策略與實證經驗

#### 逃離鞍點的策略
*   如果訓練卡住的點是 Saddle Point，則有機會逃離。
*   雖然梯度 $G$ 變為零，但可以藉由 $H$ 矩陣來決定參數更新的方向。
*   **方向決定**：應沿著 $H$ 的**負特徵值** ($\lambda < 0$) 所對應的**特徵向量** ($U$) 方向進行更新。
*   沿著此特徵向量方向 ($U$) 更新參數，可以讓 $L(Z')$ 小於 $L(Z)$，即找到讓損失下降的路徑。

#### 鞍點在高維度空間的普遍性
*   在實際的優化訓練中，使用二次微分資訊 (Hessian 矩陣) 的計算量非常大，因此實務上很少直接使用此方法來逃離  Saddle Point 。
*   **Local Minimum 與 Saddle Point 誰更常見？**
    *   有說法認為 Saddle Point 其實更常見。
    *   **高維度解釋**：一個在低維度 (例如二維) 看起來是 Local Minimum 的點，在更高維度的空間中可能是一個 Saddle Point。
    *   神經網路的參數多達百萬甚至千萬，Error Surface 維度非常高。在這個高維度空間中，真正的 Local Minimum 數量可能很少，而 Saddle Point 很多。

#### 實驗驗證：Minimum Ratio
*   **Minimum Ratio (極小值比例)**：定義為正特徵值的數量佔所有特徵值數量的比例。
*   如果 Minimum Ratio $= 1$，代表所有特徵值都是正的，該點為 Local Minimum。
*   實驗結果顯示，在訓練卡住時，即使損失已經很低，Minimum Ratio 往往小於 1。
*   在極端情況下，Minimum Ratio 仍有 0.5 (即有一半的特徵值是負的)。這意味著在大多數情況下，即使訓練看似卡住，仍有一半的維度方向存在路徑，可以讓損失繼續下降，暗示該點是鞍點，而非真正的局部極小值。




### 【機器學習2021】  類神經網路訓練不起來怎麼辦 (二)： 批次 (batch) 與動量 (momentum)大綱 

### I. 批次大小 (Batch Size, B) 與訓練優化

#### A. 批次處理的定義與目的
1. 資料分批 (Batch) 與參數更新 (Update)。
2. 訓練時的資料處理方式：不拿所有資料一起計算，而是拿批次資料計算。
3. 批次隨機重排 (Shuffling)。

#### B. 大批次 vs. 小批次（B=1）特性比較
1. **大批次（Batch size = 訓練資料總數）**：
    *   蓄力時間長：需看完所有資料才能更新參數。
    *   威力強：更新方向較準確穩定。
2. **小批次（Batch size =1）**：
    *   蓄力時間短：看一筆資料即可更新參數。
    *   更新頻繁：一個 Epoch 更新次數多 (如 20 筆資料更新 20 次)。
    *   更新不準確：梯度方向是「亂槍打鳥」。

#### C. 運算效率考量 (GPU 平行運算影響)
1. **單次更新時間**：
    *   由於 GPU 平行運算，B size 在 1 到 1000 之間，計算所需耗費的時間幾乎一樣。
    *   當 Batch size 變得非常巨大時 (例如 1 萬或 6 萬)，單次計算的耗時才會隨 Batch size 增加而增加。
2. **完成一個 Epoch 的總耗時**：
    *   趨勢與單次更新時間相反。
    *   小 B (如 Batch size =1) 雖然單次更新快，但需要進行極多次更新 (例如 6 萬次)，總耗時反而非常長。
    *   大 B (如 Batch size=1000) 更新次數少 (例如 60 次)，完成一個 Epoch 的時間會非常快。

#### D. 批次大小對模型表現的影響 (泛化能力)
1. **實驗結果**：在相同的模型上，小批次 (Small Batch) 往往能得到更好的準確率 (正確率更高)。
2. **機制解釋**：小批次的梯度噪音 (Noising Update)。
    *   小 B 每次更新使用的 Loss function 具有差異性 (L1, L2, L3...)。
    *   如果 L1 卡住 (梯度方向停滯)，L2 可能因形狀不同而不卡住，能繼續更新。
3. **好極小值 (Good Minimum) 與壞極小值 (Bad Minimum)**：
    *   **壞極小值**：位於狹谷 (Canyon) 之中。
    *   **好極小值**：位於寬廣的平原 (Plain) 上。
    *   小 B 的噪音更新使其更容易逃離狹窄的峽谷，最終收斂到寬廣的平原（好極小值），從而獲得更好的泛化能力 (Testing Accuracy)。
    *   大 B 的更新過於穩定 (順著梯度)，容易被困在狹窄、尖銳的極小值中。

### II. 動量 (Momentum) 優化技術

#### A. Momentum 的概念與物理類比
1. 目的：對抗靜止點 (Stuck point) 或找到更好的極小值。
2. 類比：將參數視為一個球，在 Loss function 的斜坡上滾下。
3. 傳統 GD (沒有動量)：球滾到底 (局部極小值) 就停住。
4. 加入 Momentum：球因慣性/動量 (夠大) 不會停在第一個局部極小值，可能會繼續往上或往右走。

#### B. Momentum 的運作機制
1. **傳統 GD 步驟**：計算梯度 (Gradient, G)，沿著梯度的反方向調整參數。
2. **加入 Momentum 步驟**：
    *   更新方向不再只依賴當前的梯度反方向。
    *   更新方向是**梯度的反方向**加上**前一步移動的方向**。
    *   數學上：新的移動量 ($M_t$) 考慮了當前梯度 ($G_t$) 和前一次的移動量 ($M_{t-1}$)。
    *   效果：即使當前梯度為 0 (平坦區域或極小值)，若前一步動量大，參數仍會繼續移動。
    *   動量的移動方向實際上反映了過去所有梯度資訊的累積。



### I. 批次大小 (Batch Size, B) 的討論與影響

#### 訓練數據的分批處理與參數更新
*   在訓練過程中，我們並不是對所有的資料 (d) 算出微分 (Gradient, G)。
*   實際做法是將所有的資料分成若干個批次 (b, batch)，每次只拿大 B 的資料出來計算損失 (L) 並更新參數。
*   工業界常用的做法是進行 **Shuffling** (S 做法)，即在每一個 Epoch 開始之前，會重新打亂並劃分批次 (b)，確保每次 Epoch 哪些資料在同一個批次中都不同。
*   **Epoch** 指的是所有訓練資料都被看過一遍。

#### 大批次 vs. 小批次（B=1）的特性比較
我們以 20 筆訓練資料為例進行比較：

| 特性 | 左側 (無 B/B size=20) | 右側 (B=1) |
| :--- | :--- | :--- |
| **更新條件** | 必須把 20 筆資料都看完才能計算 L 並更新參數。| 只要看一筆資料 (B=1) 即可更新參數。|
| **蓄力時間** | 比較長。 | 比較短。 |
| **單次更新威力** | 比較強/總。 | 比較弱，更新方向容易是「亂槍打鳥」或「不准」。|
| **Epoch 內更新次數**| 1 次。 | 20 次 (總資料數)。|

#### 運算效率與 GPU 平行運算
*   雖然小批次 (B=1) 更新不準確，大批次更新穩定，但單從訓練效率來看，計算速度也需要納入考量。
*   **實驗結果顯示**：當 B size 從 1 增加到 1000 時，單次計算 L 所需耗費的時間幾乎是一樣的。
    *   這是因為 GPU 具備平行運算的能力。
*   只有當 B size 增加到非常巨大時 (例如 1 萬或 6 萬筆資料)，單次計算 L 耗費的時間才會隨之增加。
*   **完成一個 Epoch (看完所有資料)** 的總時間趨勢剛好相反：
    *   假設訓練資料有 6 萬筆。
    *   若 $B=1$，需要 6 萬次更新 (update)。
    *   若 $B=1000$，只需要 60 次更新。
    *   由於單次更新的時間差距不大 (B=1 vs. B=1000)，因此大 B size 完成一個 Epoch 的總時間，比小 B size 要快得多。

#### 批次大小對模型泛化能力的影響
雖然大 B 在運算效率上佔優勢，且更新方向較穩定，但神奇的是，**小批次的梯度 (gradient) 反而可以幫助模型泛化**。

*   **實驗觀察**：在測試集上 (如手寫數字識別 MNIST)，B size 越大，模型的正確率反而越差。小 B size 能夠得到更好的結果。

##### 好極小值 (Good Minimum) 與壞極小值 (Bad Minimum)
小 B 之所以優於大 B，一個可能的解釋是它能找到「好極小值」。
*   在訓練損失 (Training Loss) 曲面上，可能存在多個局部極小值 (Local Minimum)，它們的損失值 L 都很低。
*   **壞極小值 (Bad Minimum)**：處在一個**狹谷 (Canyon)** 裡。
*   **好極小值 (Good Minimum)**：處在一個**平原 (Plain)** 上。
*   **泛化差異**：訓練資料集 (Training) 和測試資料集 (Test) 之間總有差異。
    *   對於狹谷中的壞極小值，參數的微小變動 (因為資料差異) 會使測試損失 (Test Loss) 迅速變大。
    *   對於平原上的好極小值，參數變動對測試損失影響不大，因此泛化能力強。
*   **小 B 的優勢**：小 B 的更新帶有噪音 (Noising Update)。這個噪音使得訓練過程不會被困在狹窄的極小值峽谷中，它會「一個不小心就跳出去了」，最終收斂到更寬廣的平原區域。大 B 的更新過於穩定，會「順著梯度」找到最靠近的尖銳極小值。

---

### II. 動量 (Momentum) 技術

#### Momentum 簡介
*   Momentum 是另一種優化技術，可用於對抗訓練過程中梯度卡住 (Stuck Point) 或局部極小值的問題。
*   **物理類比**：想像一個參數球從斜坡上滾下。
    *   **傳統梯度下降 (GD)**：球滾到局部極小值的谷底就停住了。
    *   **動量 (Momentum)**：如果球有足夠的動量，它可能不會停在局部極小值，而是會繼續往右走或甚至越過小的丘陵。

#### Momentum 的參數更新機制
*   **傳統 GD**：只根據當前梯度的反方向去調整參數。
*   **Momentum 步驟**：每次移動參數時，不只考慮當前梯度的反方向，還要加上「前一步移動的方向」。
    *   **更新方向** = 梯度的反方向 ($G_t$) + 前一步的動量方向 ($M_{t-1}$)。
*   **運作效果**：
    *   在訓練開始時，第一步的動量 ($M_0$) 設為零。
    *   隨後，動量會累積過去的梯度影響。
    *   **逃離極小值**：當參數走到一個梯度很小的位置 (例如局部極小值的底部，梯度 $G \approx 0$)。如果採用傳統 GD 就會停止。但由於 Momentum 包含了前一步的移動方向，它仍然會繼續移動，幫助參數逃離該局部極小值。
    *   動量甚至可能讓參數往與當前梯度相反的方向移動（如果前一步的影響力夠大）。



### 【機器學習2021】  類神經網路訓練不起來怎麼辦 (三)：自動調整學習速率 (Learning Rate)大綱


I. 訓練過程中的常見誤解與挑戰
    A. 臨界點 (Critical Point) 不一定是最大值
    B. Loss 停止下降與梯度大小的關係
    C. Saddle Point (鞍點) 並非主要難題

II. 真正的訓練難題：非等向性 Loss Surface
    A. Convex Surface (凸面) 的挑戰
    B. 梯度下降的限制與 Learning Rate (學習率) 的調整困境

III. 解決方案 (I)：客製化學習率 (Customized Learning Rate)
    A. 客製化原則
    B. Adagrad (Adaptive Gradient Algorithm)
        1. 公式與 $\sigma$ 的定義
        2. Adagrad 的機制與優勢
    C. RMSProp
        1. Adagrad 的問題：需要隨時間變化的學習率
        2. RMSProp 的 $\sigma$ 計算：指數加權平均 (Exponential Moving Average)
        3. RMSProp 的優勢：動態調整能力
    D. Adam (Adaptive Moment Estimation)

IV. 解決方案 (II)：學習率排程 (Learning Rate Scheduling)
    A. Learning Rate Decay (學習率衰減)
    B. Learning Rate Warm-up (學習率熱身)

V. 現代優化策略總結
    A. Momentum (動量) 與 $\sigma$ 的區別
    B. 其他優化方向

### I. 訓練過程中的常見誤解與挑戰

*   **臨界點的定義：** 臨界點（critical point）並不一定是在訓練過程中 Loss 達到最大的點。
*   **Loss 下降與梯度 (Gradient) 的關係：**
    *   隨著參數不斷更新，Loss會越來越小。
    *   多數同學在 Loss 不再下降時，會猜測是卡住了，可能因為梯度等於零而無法再前進。
    *   然而，當 Loss 不再下降時，**梯度（Gradient）的大小（norm/長度）並不一定真的變小**。在某些例子中，即使 Loss 幾乎沒有減少，梯度反而可能變大。
    *   **L 不在下降，不代表已經卡住**（卡到了 critical point）。有時候只是因為在一個平坦的 Loss Surface 上移動。
*   **Saddle Point (鞍點) 的困難性：**
    *   在實際訓練中，要走到 Saddle Point 或走過它其實是很困難的。
    *   **真正應對的對象往往不是 Saddle Point**。

### II. 真正的訓練難題：非等向性 Loss Surface

*   **問題核心：** 即使是簡單的 **Convex Surface** (凸面)，也可能讓梯度下降法（Gradient Descent, GD）卡住。
*   **範例分析：** 考量一個只有兩個參數的 Loss Surface，它是一個**細長的碗狀結構** (arrow service)。
    *   在橫軸方向：等高線很平滑，**梯度（坡度）的變化非常小**。
    *   在縱軸方向：等高線很陡峭，**梯度變化很大**。
*   **梯度下降的表現：**
    *   如果 Learning Rate 太大，參數會在峽谷的兩側不斷震盪。
    *   如果 LR 調得非常小（例如從 $10^{-2}$ 調到 $10^{-7}$），雖然不再震盪，但訓練會變得極慢，**永遠走不到最低點**。這是因為在平滑（梯度小）的地方，極小的 LR 根本無法讓參數移動。
    *   即使對於這種簡單的 Convex Surface，GD 也不一定能做好。
*   **結論：** 由於真實的訓練模型中，GD 是唯一能依賴的工具，因此需要更好的梯度優化方法。

### III. 解決方案 (I)：客製化學習率 (Customized Learning Rate)

*   **基本原則：** 每個參數應該要有特化的 Learning Rate。
    *   **梯度很小（平坦）的方向：** 期望使用**大的 LR**。
    *   **梯度很大（陡峭）的方向：** 期望使用**小的 LR**。
*   **客製化 Learning Rate 的公式化：**
    *   參數 $\theta^i$ 在第 $t$ 次迭代 (iteration) 的更新公式從 $\theta_{t+1}^i = \theta_t^i - \eta \cdot g_t^i$
    *   改為 $\theta_{t+1}^i = \theta_t^i - \frac{\eta}{\sqrt{S_t^i}} \cdot g_t^i$。
    *   $\sigma_t^i$ 是客製化項，它必須是參數依賴 (parameter-dependent) 且迭代依賴 (iteration-dependent) 的。
*   **Adagrad (Adaptive Gradient Algorithm)**
    *   **$\sigma_t$ 的計算：** $\sigma_t$ 是過去所有計算出來的梯度平方的平均，再開根號。
    *   $\sigma_t = \sqrt{\frac{G_0^2 + G_1^2 + \dots + G_{t-1}^2}{t}}$ (公式結構，取平均並開根號)。
    *   **作用機制：**
        *   若參數方向坡度小，算出的梯度 $G$ 值就小，累積的 $\sigma$ 也小。
        *   $\sigma$ 小會導致更新時的 LR ( $\eta / \sqrt{S_t}$ ) 變大，步伐變大。
        *   若參數方向坡度大，算出的梯度 $G$ 值就大，累積的 $\sigma$ 也大。
        *   $\sigma$ 大會導致更新時的 LR 變小，步伐變小。
    *   **限制：** $\sigma$ 項將過去所有看到的梯度都納入，且權重相同。這可能導致 $\sigma$ 累積得過大，使得最終 LR 變得極小，或在某些情況下導致參數爆走（如在縱軸方向累積了太多很小的梯度，導致 $\sigma$ 變大，更新步伐突然噴出去了）。
*   **RMSProp**
    *   **動機：** 即使是同一個參數，所需的 LR 也會隨時間改變。Adagrad 的 $\sigma$ 累積權重固定，無法動態調整。
    *   **RMSProp 的 $\sigma$ 計算：** RMSProp 採用有權重的計算方式。它會賦予新近算出的梯度更大的權重。
    *   $S_t$ 是透過指數加權平均 (Exponential Moving Average) 計算出來的。
    *   公式結構：$S_t = \sqrt{\alpha \cdot S_{t-1}^2 + (1-\alpha) \cdot (g_t)^2}$。
    *   $\alpha$ 決定了新梯度 $g_t$ 相對於過去 $S_{t-1}$ 的重要性。
    *   **優勢：** 可以動態調整 Learning Rate。例如，在平滑區域長時間行進後，若突然遇到陡峭區域，RMSProp 可以快速讓 $\sigma$ 變大，達到「踩剎車」的效果。
*   **Adam (Adaptive Moment Estimation)**
    *   Adam 是目前最常用的優化策略之一。
    *   Adam 結合了 **RMSProp** 和 **Momentum**。

### IV. 解決方案 (II)：學習率排程 (Learning Rate Scheduling)

*   **定義：** 學習率排程是指讓 Learning Rate 成為與時間/迭代次數相關的變數。
*   **Decay (衰減)：**
    *   最常見的策略是隨著時間進行，讓 Learning Rate 越來越小。
    *   **原理：** 訓練初期距離終點較遠，步伐可大；隨著靠近終點，應減小步伐，讓參數更新能夠慢慢按耐下來。
    *   衰減機制可以幫助解決 Adagrad/RMSProp 導致的爆走問題。
*   **Warm-up (熱身)：**
    *   Warm-up 是一種策略，讓 Learning Rate 先變大，然後再變小。
    *   這種技術出現在許多知名的模型論文中，被視為一種「黑科技」。
    *   **可能的解釋：** 像 $\sigma$ 這樣的統計結果，在訓練初期並不精準。小的 LR 讓模型在初始位置先做一些探索，收集有關 Loss Surface 的情報，等到 $\sigma$ 數據更精準後，LR 再變大，讓訓練加速。

### V. 現代優化策略總結

*   **現代優化器的構成 (如 Adam)：** 結合了 **Momentum** 和 **客製化 Learning Rate (S)**。
*   **Momentum 與 $\sigma$ 的區別：** 兩者都考慮過去的梯度，但使用方式不同，因此結果不會抵銷。
    *   **Momentum：** 直接將過去所有梯度的方向加總起來，**考慮梯度的方向和正負號**。
    *   **$\sigma$(客製化 LR 的分母)：** 只考慮**梯度的大小**（透過梯度的平方和）。


### 【機器學習2021】  類神經網路訓練不起來怎麼辦 (四)：損失函數 (Loss) 也可能有影響大綱



I. 分類（Classification）方法的初步討論
    A. 輸出向量 $Y$ 與目標 $T$ 的逼近學習
    B. 數值編號表示的局限性探討

II. 訓練優化與 Batch Normalization 的引入
    A. 優化挑戰：即使是 Convex Surface 也難以訓練
    B. 適應性學習率（Adaptive Learning Rate）的需求
    C. 解決方向：直接修改 Loss Surface
    D. Batch Normalization 作為優化技術的適用性

III. 困難 Loss Surface 的成因分析
    A. 範例模型：簡單的線性模型
    B. 參數 $W$ 對 Loss $L$ 變化的影響
    C. **輸入特徵尺度 (Scale) 差異是關鍵因素**
        1. 輸入 $X$ 值很小時的影響（斜率小）
        2. 輸入 $X$ 值很大時的影響（斜率大）

IV. 解決方案：Normalization（標準化）
    A. 目標：讓不同維度 (dimension) 擁有相同的數值範圍
    B. Standardization (標準化) 的步驟與公式
        1. 計算每個維度的平均值 ($\mu$) 和標準差 ($\sigma$)
        2. 標準化公式：$X' = (X - \mu) / \sigma$
    C. 標準化的結果：新的數值分佈


### I. 分類（Classification）方法的初步討論

*   **輸出與學習目標：** 在分類任務中，網路的輸出是一個向量 $Y$。我們希望這個輸出 $Y$ 能夠與正確的答案 $T$（目標 label）越接近越好。
*   **編號表示的局限：** 如果將 $T$ 標籤（例如 Test 1, Test 2, Test 3）直接用數值編號（如 1, 2, 3）表示，可能會導致模型錯誤地認為 Test 1 跟 Test 2 是比較相似的。

### II. 訓練優化與 Batch Normalization (BN) 的引入

*   **優化問題的嚴重性：** 訓練中不應該小看優化 (optimization) 的問題。有時候，**即使 Loss Surface 是 Convex（凸面），即為碗狀形狀，也不一定容易訓練**。
*   **坡度/斜率 (Slope) 差異的挑戰：**
    *   如果 Loss Surface 上，兩個參數 $W_1$ 和 $W_2$ 對 Loss 的斜率差別非常大。
    *   例如，在 $W_1$ 方向上，斜率變化很小（平坦）；而在 $W_2$ 方向上，斜率變化很大（陡峭）。
    *   在這種情況下，固定的 Learning Rate 難以得到好的結果。因此，我們需要 Adaptive Learning Rate（例如 Adagrad 等較進階的優化方法）。
*   **Batch Normalization 的動機：** 除了調整學習率，另一種解決方案是**直接修改難做的 Loss Surface**，使其變得更容易訓練。
*   **Batch Normalization 的實用性：** Batch Normalization 是一個將 Loss Surface 變好的想法之一。它在作業三中用得上，特別是做 CNN 處理時，能夠帶來很大的幫助。

### III. 困難 Loss Surface 的成因分析

*   **模型範例：** 考慮一個非常簡單的線性模型：$Y = W_1 X_1 + W_2 X_2 + B$。Loss $L$ 是計算 $Y$ 與目標 $\hat{Y}$ 之間的差距，並希望最小化 $L$。
*   **輸入對斜率的影響：** 參數 $W$ 對 $L$ 的影響取決於其對應的輸入 $X$ 的大小。
    *   **$X$ 值很小（如 $X_1$）：** 如果 $X_1$ 的值在不同的訓練樣本中都很小。當 $W_1$ 有一個小的改變時，它對 $Y$、Error $E$ 和 Loss $L$ 的影響也會很小。這會導致在 $W_1$ 方向上，Loss Surface 的**斜率很小，表面平坦**。
    *   **$X$ 值很大（如 $X_2$）：** 如果 $X_2$ 的值都很大。當 $W_2$ 只有一個很小的變化時，因為它乘以了很大的 $X_2$ 值，導致 $Y$ 的變化很大，進而 $E$ 和 $L$ 的變化也會很大。這會導致在 $W_2$ 方向上，Loss Surface 的**斜率很大，表面陡峭**。
*   **結論：** 當輸入特徵 (input feature) 中每個維度 (dimension) 的數值尺度（scale）差距很大時，就會產生這種不同方向坡度非常不同的 Error Surface。

### IV. 解決方案：Normalization（標準化）

*   **目標：** 為了讓訓練變得更容易，我們需要讓特徵（feature）中**不同維度擁有相似或接近的數值範圍**。
*   **Normalization 方法（Standardization）：**
    *   這類方法統稱為 Normalization。以下描述的具體方法其實是**標準化 (Standardization)**。
    *   **步驟：**
        1.  收集所有訓練資料的特徵向量。
        2.  針對**同一個維度** (dimension)，取出所有資料的數值。
        3.  計算該維度的**平均值 ($\mu$)** (用 $m$ 表示)。
        4.  計算該維度的**標準差 ($\sigma$)** (用 $s$ 表示)。
        5.  **執行標準化：** 將該維度的每個數值 $X$，減掉該維度的平均值 $\mu$，再除以該維度的標準差 $\sigma$。
            $$\text{新的數值} X' = \frac{X - \mu}{\sigma} \text{}$$
*   **標準化結果：** 經過這種 Normalization 處理後，該維度上的數值將會滿足**平均值為 0**，**變異數 (variance) 為 1**。


### 【機器學習2021】類神經網路訓練不起來怎麼辦 (五)： 批次標準化 (Batch Normalization) 也可能有影響大綱


I. Batch Normalization (BN) 的目標與位置
    A. 克服 Loss Surface 難題與訓練加速
    B. Normalization 執行的時機與範圍
    C. Normalization 實作位置的建議

II. Batch Normalization 的計算過程
    A. 計算目標：內部特徵 $Z$ 的標準化
    B. 均值 ($M$) 與標準差 ($S$) 的計算
    C. 標準化公式 $Z'$ 的應用

III. 實際應用考量：Batch 的引入 (Batch Normalization)
    A. 龐大資料集與 GPU 限制
    B. 批次 (Batch) 計算的必要性與命名由來
    C. $M$ 與 $S$ 變數之間的關聯性

IV. BN 的可學習參數 ($\gamma$ 與 $\beta$)
    A. $\gamma$ (G) 與 $\beta$ (b) 的引入
    B. 引入 $\gamma$ 與 $\beta$ 的原因：解除限制
    C. $\gamma$ 與 $\beta$ 參數在訓練上的作用

V. BN 在推論 (Inference/Testing) 階段的差異
    A. 推論階段計算 $M$ 與 $S$ 的困難
    B. 解決方案：使用訓練階段的移動平均 (Running Statistics)
    C. 實驗結果：BN 對訓練的幫助


### I. Batch Normalization (BN) 的目標與位置

*   **目標：** 透過 feature normalization (特徵標準化) 來**製造一個比較好的 Loss Surface**，讓訓練的收斂更快一點。
*   **Normalization 的適用性：** Feature normalization 是有幫助的。
*   **BN 的作用範圍：** 即使已經在輸入層 (input layer) 做了 normalization，但通過權重 $W$ 之後，**中間層的 $Z$ 向量**（例如 $Z_1, Z_2, Z_3$）的不同 dimension 之間，其數值分佈可能仍然有很大的差異。
*   **Normalization 實作位置：**
    *   我們可以選擇在 Activation Function 之前或之後做 normalization。
    *   在實作上，這兩種選擇的差異**並不大**。
    *   如果選擇使用  Sigmoid 的 Activation Function，比較推薦在 Activation 之前對 $Z$ 做 normalization。這是因為 S 形狀的 Activation 在兩側的斜率比較大，如果將所有值都挪到 0 附近，計算出的梯度會比較好。

### II. Batch Normalization 的計算過程

*   **計算對象：** 我們將 $Z_1, Z_2, Z_3, \dots$ 視為另一種 feature。
*   **平均值 ($M$) 的計算：** 對於每一個 dimension，把所有資料點的數值**平均起來**，得到 $M$。 $M$ 是一個向量 (vector)。
*   **標準差 ($S$) 的計算：**
    *   計算標準差 (standard deviation)，$S$ 也是一個向量。
    *   計算方式是將 $Z_i$ 減掉 $M$ 後取平方，然後再開根號。
*   **標準化 (Normalization) 公式：**
    *   將每一個 $Z$ 都減掉 $M$，再除以 $S$。
    *   公式結構為 $\frac{Z_i - M}{S}$。由於 $Z_i$、 $M$ 和 $S$ 都是向量，此處的分母 $S$ 是向量，表示**向量中每個元素的分別相除**。
    *   經過標準化後，得到新的 $Z'$ 向量。

### III. 實際應用考量：Batch 的引入 (Batch Normalization)

*   **訓練中的 $M$ 與 $S$ 關聯性：** 當進行 normalization 時，不同 $Z$ 之間會彼此關聯。
    *   當其中一個 $W$ 改變，接下的 $Z$ 值改變，**會導致 $M$ 和 $S$ 改變**。
    *   因此，當你做 normalization 時，你需要將「收集一堆 feature，計算出 $M$ 和 $S$」這件事情，**視為整個 Network 的一部分**。
*   **Batch Normalization 的誕生：**
    *   在處理百萬筆資料的資料集時，GPU 的記憶體無法將整個訓練集載入，無法算出全域的 $M$ 與 $S$。
    *   實作時，我們只能對**一個 Batch 裡面的資料**做 normalization。
    *   如果 Batch 大小是 64 筆，那麼這個巨大的 Network 就是把 64 筆 Data 丟進去，然後計算這 64 筆 Data 的 $M$ 和 $S$。
    *   這就是「Batch Normalization」名稱的由來。

### IV. BN 的可學習參數 ($\gamma$ 與 $\beta$)

*   **加入可學習參數：** 實際應用時，在標準化 $Z'$ 之後，還會再乘上另一個向量 $\gamma$ (G)，並加上另一個向量 $\beta$ (b)。
    *   $Z_{\text{BN}} = G \odot Z' + B$。
    *   $\gamma$ 和 $\beta$ 是**可被訓練的參數**。
*   **引入 $\gamma$ 與 $\beta$ 的原因：**
    *   Normalization 會使 $Z'$ 的平均值變成 0。
    *   強制平均值為 0 是一種**限制**，也許這種限制會帶來負面影響。
    *   引入 $\gamma$ 和 $\beta$ 是為了讓 Network 能夠**自己調整分佈**。如果 Network 認為平均值不是 0 比較好，它會透過調整 $\gamma$ 和 $\beta$ 來實現。

*   **訓練上的幫助：**
    *   有加入 $\gamma$ 和 $\beta$ 的 BN 對訓練是有幫助的。
    *   在訓練開始時，每個分佈會比較接近（因為做了 normalization）。
    *   當訓練足夠長，找到一個比較好的 W 後，網路可能會調整 $\gamma$ 和 $\beta$，使得最終的線（Loss 曲線）表現出好像**沒有做 normalization**一樣。

### V. BN 在推論 (Inference/Testing) 階段的差異

*   **推論階段的困難：**
    *   在推論（Testing 或線上服務）時，資料是**一筆一筆**進來的。
    *   如果只有一筆資料進來，就無法計算一個 Batch 的 $M$ 和 $S$。
*   **實際解法：運行統計量 (Running Statistics)：**
    *   在訓練 (Training) 期間，每一次 Batch 算出來的 $M$ 和 $S$ 都會被拿出來做**移動平均** 。
    *   這個 running mean 和 running standard deviation 是需要被調整的參數。
    *   最終，在推論 (Testing) 或實際應用時，我們**不使用當前 Batch 算出的 $M$ 和 $S$**，而是直接拿**訓練時累積得到的 Running Mean (移動平均 $M$) 和 Running Standard Deviation (移動標準差 $S$)** 來進行 normalization。

[【機器學習2021】01~02 機器學習和深度學習基本概念簡介](https://hackmd.io/@JuitingChen/SyoNXkdslx)
[【機器學習2021】03~08 機器學習任務攻略和最佳化技巧](https://hackmd.io/@JuitingChen/BJ6mXy_slg)
[【機器學習2021】09~11 CNN 和 Self attention](https://hackmd.io/@JuitingChen/r1ahLgUngl)
[【機器學習2021】12~13 Transformer](https://hackmd.io/@JuitingChen/H1tfXy_ige)
[【機器學習2021】14~17 GAN](https://hackmd.io/@JuitingChen/S1adiwvhxg)
[【機器學習2021】18~21 自監督式學習](https://hackmd.io/@JuitingChen/ryQG7J_sgl)
[【機器學習2021】22~23 Auto-encoder](https://hackmd.io/@JuitingChen/r1sLPr92ge)
[【機器學習2021】24~25 Adversarial Attack ](https://hackmd.io/@JuitingChen/HJ6jJIq3ge)
[【機器學習2021】26~28 Explainable ML 和 Domain Adaptation](https://hackmd.io/@JuitingChen/SJZzQkdslg)
[【機器學習2021】29-30 強化學習-1](https://hackmd.io/@JuitingChen/HJYziZR3gx)
[【機器學習2021】31~33 強化學習-2](https://hackmd.io/@JuitingChen/Sy5DoWA3xl)
[【機器學習2021】34~35 機器終身學習](https://hackmd.io/@JuitingChen/BytWmyuilg)
[【機器學習2021】36~37 神經網路壓縮 ](https://hackmd.io/@JuitingChen/Bk7-m1_jlx)
[【機器學習2021】37~40 Meta Learning](https://hackmd.io/@JuitingChen/SkkC6rT2gl)
