# 第一章:機器學習與深度學習的基本概念
>上課筆記
* 影片連結
* ==[**機器學習基本概念簡介 (上)**](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 越小 (參數越好)。

### 步驟三:最佳化 (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):
任何連續曲線都可以用足夠多的分段線性曲線來逼近。

### 硬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 函式疊加起來,可以逼近各種分段線性曲線,進而逼近各種連續函式。

### 新的模型:
$$ 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$。

---
## 重新定義機器學習的步驟
* **步驟一:帶有未知參數的函式**:使用更彈性的模型,參數統稱為 $\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)** 是一個**超參數**。

---
## 另一激活函式: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。

* 可以使用 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)** 的問題。

---
## 過度擬合 (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/)