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