---
# System prepended metadata

title: 第一章：機器學習與深度學習的基本概念
tags: [機器學習]

---

# 第一章：機器學習與深度學習的基本概念
>上課筆記

* 影片連結
    * ==[**機器學習基本概念簡介 (上)**](https://youtu.be/Ye018rCVvOo)==
    * ==[**機器學習基本概念簡介 (下)**](https://youtu.be/bHcJCp2Fyxs)==

---

## 機器學習概論

### 機器學習 $\approx$ 尋找函式 (Looking for Function)
*   機器學習的目標是讓機器具備**尋找一個函式**的能力。
*   這個函式可以做很多事情，例如：
    *   **語音辨識**：輸入聲音訊號，輸出對應的文字。
    *   **影像辨識**：輸入圖片，輸出圖片中的內容。
    *   **下圍棋 (Playing Go)**：輸入棋盤上的黑白棋子位置，輸出下一步應該落子的位置。
### 不同類型的函式
*   **迴歸 (Regression)**：函式的**輸出是一個數值 (scalar)**。
    *   **範例**：預測明天中午的 PM2.5 數值，輸入可能是今天的 PM2.5、溫度、臭氧濃度等。
*   **分類 (Classification)**：給定一些**選項 (類別/classes)**，函式的**輸出是正確的選項之一**。
    *   **範例**：垃圾郵件偵測，輸入是一封電子郵件，輸出是「是垃圾郵件」或「不是垃圾郵件」. AlphaGo 也是一個多選項的分類問題，選項是棋盤上的每一個可落子的位置 (19x19 個類別)。
*   **結構化學習 (Structured Learning)**：機器不只是做選擇題或輸出數值，而是**產生一個有結構的物件**，例如圖片或文章. 可以擬人化地說，是讓機器學會創造。

---

## 如何找到一個函式？一個案例研究：預測 YouTube 頻道觀看人數

機器學習尋找函式的過程分為三個步驟：

### 步驟一：寫出一個帶有未知參數的函式 (Function with Unknown Parameters / Model)
*   先**猜測**想要找的函式 *f* 的數學式。
*   **範例模型 (最初步的猜測)**：  $$y = b + wx_1$$
    *   $y$ ：我們準備預測的目標，例如 2/26 的總觀看人數.
    *   $x_1$ ：已知的資訊 (Feature)，例如 2/25 的總觀看人數。
    *   $w$ ：**權重 (weight)**，是一個未知的參數，與 Feature 相乘。
    *   $b$ ：**偏差 (bias)**，是一個未知的參數，直接加到結果上。
*   **未知參數 (Unknown Parameters)**：$w$ 和 $b$，需要透過資料找出來. 這些參數統稱為 **Parameter**。
*   **模型 (Model)**：帶有未知參數的函式。
*   **領域知識 (Domain knowledge)**：對問題本質的了解，通常用於猜測帶有未知參數的函式。

### 步驟二：從訓練資料定義損失 (Define Loss from Training Data)
*   **損失函式 (Loss Function, $L$)**：一個以模型中的**參數 $(b, w)$ 為輸入**的函式，輸出一個數值，代表**現在這組參數的好壞**。Loss 越小，代表這組參數越好。
*   **訓練資料 (Training Data)**：用來計算 Loss 的資料，例如 2017/01/01 到 2020/12/31 的頻道點閱次數。
*   **標籤 (Label)**：訓練資料中正確的數值，例如實際的觀看次數。
*   **計算損失**：將訓練資料的輸入 ($x_1$) 代入模型，得到預測值 ($y$)，然後計算預測值與真實值 (標籤, $\hat{y}$) 之間的**誤差 ($e$)**。
*   **常見的誤差計算方式**：
    *   **平均絕對誤差 (Mean Absolute Error, MAE)**：計算 $y$ 與 $\hat{y}$ 之間**差距的絕對值**，然後取平均。
    *   **均方誤差 (Mean Square Error, MSE)**：計算 $y$ 與 $\hat{y}$ 之間**差距的平方**，然後取平均。[[第三章]](https://hackmd.io/@Jaychao2099/imrobot3#%E5%9D%87%E6%96%B9%E8%AA%A4%E5%B7%AE-Mean-Squared-Error-MSE)
    *   **交叉熵 (Cross-entropy)**：若 $y$ 和 $\hat{y}$ 都是機率分佈時使用。[[第三章]](https://hackmd.io/@Jaychao2099/imrobot3#%E4%BA%A4%E5%8F%89%E7%86%B5-Cross-entropy)
*   **誤差曲面 (Error Surface)** 將不同的參數組合 ($w$, $b$) 對應的 Loss 值繪製成等高線圖，越偏紅色代表 Loss 越大 (參數越差)，越偏藍色代表 Loss 越小 (參數越好)。
![image](https://hackmd.io/_uploads/HkL_W6Rsyl.png)


### 步驟三：最佳化 (Optimization)
*   **目標**：找到一組**最佳的參數** $(w, b)$，使得 Loss 的值**最小**。這組最佳參數記為 $w$* 和 $b$*。
*   **梯度下降 (Gradient Descent)**：一種常用的最佳化方法。
    *   **簡化假設 (只有一個參數 $w$)**：先隨機選取一個初始值 $w^0$
    *   **計算梯度 (微分)**：計算在 $w = w^0$ 時，Loss 對 $w$ 的**微分** (斜率)
    *   **更新參數**:
        *   若斜率為負，表示右邊 Loss 較低，應**增加 $w$** 的值。
        *   若斜率為正，表示左邊 Loss 較低，應**減少 $w$** 的值。
        *   **更新公式**：$$w^1 ← w^0 - \left.\eta \frac{\partial L}{\partial w}\right|_{w=w^0}$$$$b^1 ← b^0 - \left.\eta \frac{\partial L}{\partial b}\right|_{b=b^0}$$
            *   *$\eta$* (eta)：**學習率 (learning rate)**，是一個**超參數 (hyperparameter)**，由人為設定，決定每次參數**更新的幅度**。學習率過大可能導致學習過快而錯過最佳值，學習率過小則學習緩慢。
    *   **停止條件**：通常設定最大更新次數，或當微分值接近 0 時停止。但在實務上，微分值很難正好為 0，通常是達到設定的迭代次數就停止。
    *   **局部最小值 (Local minima) 與全域最小值 (Global minima)**：梯度下降可能會陷入局部最小值而無法找到全域最小值，但實際上在深度學習中，局部最小值可能不是主要問題。
    *   **擴展到兩個參數 ($w, b$)**：同樣的概念，分別計算 Loss 對 $w$ 和 $b$ 的偏微分，然後同時更新 $w$ 和 $b$。
    *   **實作**：深度學習框架 (如 PyTorch) 可以自動計算微分。
*   **最佳參數範例**：針對 YouTube 觀看人數預測，使用梯度下降算出的最佳參數可能為 $w$* = 0.97，$b$* = 0.1k，此時在 2017-2020 的訓練資料上的 Loss 約為 0.48k。

---

## 在未見過的資料上進行評估

*   使用訓練好的模型 (最佳參數 $w$* 和 $b$*) 來預測**未在訓練過程中見過的資料**。
*   通常在訓練資料上的 Loss 會比在未見過的資料上的 Loss **小**.
    *   **範例結果**：在 2021 年的資料上，使用 $y = 0.1k + 0.97x_1$ 預測的平均誤差 *L'* 約為 0.58k，比訓練 Loss 0.48k 高。
*   **線性模型的限制 (Limitation of Linear Models)**：線性模型 (如 $y = b + wx_1$ 太過簡單，無法捕捉資料中複雜的關係，例如 YouTube 觀看人數的**週期性模式 (每隔七天有兩天觀看人數特別低)**. 這種來自模型本身的限制稱為 **模型偏差 (Model Bias)**。

---

## 更具彈性的模型 (More Flexible Models)

為了減少模型偏差，需要使用**更複雜、更有彈性的**帶有未知參數的函式。
### 分段線性曲線 (Piecewise Linear Curves)：
任何連續曲線都可以用足夠多的分段線性曲線來逼近。
![image](https://hackmd.io/_uploads/Bk7xMaCokg.png)
### 硬S型函式 (Hard Sigmoid)：
分段線性曲線可以看作是一個常數加上許多具有特定形狀的「Hard Sigmoid」函式的疊加。
### S型函數：
一種 **S 型 (Sigmoid)** 的函式，可以用來**逼近Hard Sigmoid**.
*   數學式：$$ y = \color{red}{c} \ \text{sigmoid}(\color{green}{b} + \color{blue}{w}x_1)$$$$(其中 \ \text{sigmoid}(z) = \frac{1}{1 + e^{-z}})$$
*   透過調整 $w$ (斜率)、$b$ (左右移動)、$c$ (高度)，可以產生不同形狀的 Sigmoid 函式。
*   將多個具有不同參數的 Sigmoid 函式疊加起來，可以逼近各種分段線性曲線，進而逼近各種連續函式。
![image](https://hackmd.io/_uploads/r1jHMpRsye.png)

### 新的模型：
$$ y = b + \sum_{i} \color{red}{c_i} \ \text{sigmoid}(\color{green}{b_i} + \color{blue}{w_i}x_i)$$其中 $b$, *c~i~*, *b~i~*, *w~i~* 都是未知的參數. 可以擴展到多個 Feature：$$ y = b + \sum_{i} \color{red}{c_i} \ \text{sigmoid}(\color{green}{b_i} + \sum_{j} \color{blue}{w_{ij}}x_j)$$

---

## 模型結構的視覺化與數學表示

*   使用圖示化的方式展示具有多個 Sigmoid 函式和多個 Feature 的模型結構。
*   引入**矩陣和向量**的表示方式，使模型表達更簡潔。
    *   輸入 Feature 向量：$x$
    *   權重矩陣：$W$
    *   偏差向量：$b$
    *   中間輸出向量：$r = Wx + b$
    *   通過 Sigmoid 函式得到向量：$a = \text{sigmoid}(r)$ (對 $r$ 的每個元素應用 $\text{Sigmoid}$).
    *   常數向量：$c$
    *   最終輸出：$$ y = c^Ta + \text{b}$$ $$(注意此處的\ \text{b}\ 與之前的偏差向量不同，是另一個常數)$$
*   將所有未知的參數 (權重矩陣 $w$、偏差向量 $b$、常數向量 $c$、常數 $\text{b}$) 整理成一個長的向量 $\theta$。
![image](https://hackmd.io/_uploads/ByFhGp0iyx.png)

---

## 重新定義機器學習的步驟

*   **步驟一：帶有未知參數的函式**：使用更彈性的模型，參數統稱為 $\theta$。
*   **步驟二：定義損失函式**：Loss 仍然是參數 $\theta$ 的函式 $L(\theta)$，計算方式不變。
*   **步驟三：最佳化**：仍然使用**梯度下降**來尋找使 $L(\theta)$ 最小的 $\theta^*$。

---

## 梯度下降的細節

*   對參數向量 $\theta$ 中的每一個參數 $(\theta_1, \theta_2, \theta_3, ...)$ 計算 Loss *L* 的**偏微分 (梯度)**。
*   將所有偏微分彙集成一個**梯度向量** $g$。
*   **參數更新**：$\theta^1 \leftarrow θ^0 - \eta g^0 \ (其中g^0 = \nabla L^1(\theta^0) \ 是在 \ θ^0 \ 計算出的梯度)$。
*   **小批量梯度下降 (Mini-batch Gradient Descent)**：實際操作中，通常將訓練資料分成多個**批次 (Batch)**，每次只取一個批次計算 Loss 和梯度，然後更新參數。
    *   **原因：[(第三章再講解)](https://hackmd.io/Yb64YvKgQQ2ossHZCSfIlg?view#%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E4%BD%BF%E7%94%A8%E6%89%B9%E6%AC%A1-Why-Batch)**
    *   **Epoch**：將所有批次都看過一次稱為一個 **Epoch**。
    *   **Update**：每次使用一個批次更新參數稱為一次 **Update**。一個 Epoch 中會進行多次 Update (取決於批次大小)。
    *   **批次大小 (Batch Size)** 是一個**超參數**。

![image](https://hackmd.io/_uploads/BJQnj6Co1l.png)

---

## 另一激活函式：ReLU (Rectified Linear Unit)

*   **ReLU 函式**：另一種常用的**激活函式 (Activation Function)**，數學式為 $max(0, b + wx₁)$。
    *   當 $b + wx_1 < 0$ 時，輸出為 $0$；當 $b + wx_1 > 0$ 時，輸出為 $b + wx_1$。
    *   比較：
$$ y = b + \sum_{i} \color{red}{c_i} \ \underline{\text{sigmoid}}(\color{green}{b_i} + \sum_{j} \color{blue}{w_{ij}}x_j)$$$$y = b + \sum_{2i} \color{red}{c_i} \ \underline{\max(0,} \color{green}{b_i} + \sum_{j} \color{blue}{w_{ij}}x_j)$$
    *   可以透過調整 $w$, $b$, $c$ (前面的係數) 來改變形狀和位置。
    *   兩個 ReLU 的疊加可以近似 Hard Sigmoid。
    ![image](https://hackmd.io/_uploads/S1x-3a0oye.png)
*   可以使用 ReLU 替代 Sigmoid 來構建更具彈性的模型。
*   **實驗結果**：相較於線性模型，使用 ReLU 的模型在訓練資料和未見過的資料上通常能取得更好的 Loss. 更多 ReLU (例如 100 個) 通常比少量 (例如 10 個) 效果更好。

---

## 深度學習：多層神經網路 (Deep Learning：Neural Networks with Multiple Layers)

將上述的運算 (線性轉換 + 激活函式) **重複堆疊多層**，就形成了**深度神經網路 (Deep Neural Network)**。每一層都包含更多的未知參數。
*   **神經元 (Neuron)**：Sigmoid 或 ReLU 等激活函式可以視為一個神經元。
*   **神經網路 (Neural Network)**：許多神經元連接在一起形成神經網路。
*   **隱藏層 (Hidden Layer)**：中間的每一層都稱為隱藏層。
*   **深度 (Deep)**：擁有許多隱藏層的網路稱為深度網路，這就是 **深度學習 (Deep Learning)** 的由來。
*   **歷史**：神經網路並非新技術，但在 80-90 年代因過度炒作而聲譽受損，後來透過深度學習重新獲得關注。
*   **深 vs. 胖 (Deep vs. Fat)**：為什麼要疊加多層 (Deep) 而不是只使用一層但包含大量的神經元 (Fat)？這是後續會討論的問題。
*   **實驗結果**：增加網路的層數 (深度) 可以進一步降低在訓練資料上的 Loss，但在未見過的資料上可能會發生 **過度擬合 (Overfitting)** 的問題。
![image](https://hackmd.io/_uploads/S1Gybv-hyg.png)

---

## 過度擬合 (Overfitting) 與 模型選擇 (Model Selection)

*   **[過度擬合](https://hackmd.io/@Jaychao2099/imrobot2#%E9%81%8E%E5%BA%A6%E6%93%AC%E5%90%88-Overfitting)**：模型在訓練資料上表現良好，但在未見過的資料上表現不佳。
*   **[模型選擇](https://hackmd.io/@Jaychao2099/imrobot2#%E5%81%8F%E5%B7%AE-%E8%A4%87%E9%9B%9C%E5%BA%A6%E6%AC%8A%E8%A1%A1-Bias-Complexity-Trade-off)**：當有多個不同結構的模型 (例如不同層數的網路) 時，需要選擇在未見過的資料上表現最好的模型。通常不選擇在訓練資料上 Loss 最低的，而是選擇在驗證集 (Validation Set，訓練過程中用於評估的未見過資料) 上表現最好的。

---

## 預測範例與未來展望

*   使用一個三層 ReLU 神經網路預測 YouTube 頻道觀看人數的範例，展現模型捕捉週期性模式的能力 (例如週末觀看人數較低)，但可能無法預測未知的突發事件 (例如過年)。
*   如何選擇最佳模型 (例如 3 層 vs. 4 層) 將在[下個章節](https://hackmd.io/@Jaychao2099/imrobot2)討論。
*   **反向傳播 (Backpropagation)**：一種有效率計算梯度的演算法，是訓練深度學習模型的關鍵 (詳細內容可參考[2016上課影片](https://youtu.be/ibJpTrp5mcE))。
---
回[主目錄](https://hackmd.io/@Jaychao2099/aitothemoon/)