# 2024-09-28 ML - 主題(李宏毅老師2017年的講義): - Where does the error come from? - Gradient Descent - 影片: - [`Where does the error come from?`](https://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2017/Lecture/Error.mp4) - [`Gradient Descent`](https://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2017/Lecture/Gradient%20Descent.mp4) - 資料: - [Where does the error come from?](https://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2017/Lecture/Bias%20and%20Variance.pdf) - [Gradient Descent](https://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2017/Lecture/Gradient%20Descent.pdf) - 分工 - 教學組 - @Princendwang - @munin - @sin-iu-ho - @as854398 --- ## 目錄 [TOC] --- ## 1. Where does the error come from? :::info 介紹 Bias 與 Variance 各自的意義,需了解兩者的差別,才能回頭調整 Model,本節課程提供了處理不同 Error 的方式。 ::: ### 1.1 Review ![image](https://hackmd.io/_uploads/S1h-gqvCA.png =500x) - x 軸:為模型 $f^*$ 的次方項 - y 軸:為 Loss 大小 :::danger :warning: 越複雜的模型不一定總是有好的成效 ::: ### 1.2 樣本變異數 & 有偏估計值 ![image](https://hackmd.io/_uploads/BJ7kf9P00.png =500x) - 由於樣本變異數是 $x^N$ 減去樣本平均數,所以算出來的樣平變異數期望值不會等於母體變異數 $\sigma^2$ ,稱為有偏估計值 #### 1.2.1 $\frac{N-1}{N}σ^2$ 推導過程 **要推導 $\frac{N-1}{N}σ^2$ 這個有偏估計公式,我們需要從樣本變異數 $s^2$ 的期望值(期望值反映統計量的平均行為)來進行推導。** ##### 設定 - 母體的平均值:$\mu$ - 母體的變異數:$\sigma^2$ - 樣本的平均值:$m = \frac{1}{N} \sum_{n=1}^{N} x^n$ - 樣本變異數(未修正):$s^2 = \frac{1}{N} \sum_{n=1}^{N} (x^n - m)^2$ :::info :bulb: 講義的樣本變異數是 s,這邊是用 $s^2$ ::: ##### 步驟 1:樣本變異數的分解 - 我們知道 $s^2$ 是基於樣本平均值 $m$ 計算的樣本變異數: $$ s^2 = \frac{1}{N} \sum_{n=1}^{N} (x^n - m)^2 $$ - 但我們希望推導出這個樣本變異數的期望值,即 $E[s^2]$,來檢查它相對於母體變異數 $\sigma^2$ 是否有偏差。 ##### 步驟 2:$x^n - m$ 的分解 - 將每個樣本值和樣本平均值的偏差 $(x^n - m)^2$ 分解如下: $$ x^n - m = (x^n - \mu) - (m - \mu) $$ - 因此: $$ (x^n - m)^2 = \left( (x^n - \mu) - (m - \mu) \right)^2 $$ - 使用平方展開公式: $$ (x^n - m)^2 = (x^n - \mu)^2 - 2(x^n - \mu)(m - \mu) + (m - \mu)^2 $$ ##### 步驟 3:期望值運算 - 現在,我們來計算樣本變異數的期望值 $E[s^2]$。 - 首先,對每項取期望值: 1. **第一項:$E[(x^n - \mu)^2]$** 根據母體變異數的定義,我們有: $$ E[(x^n - \mu)^2] = \sigma^2 $$ 2. **第二項:$E[2(x^n - \mu)(m - \mu)]$** 由於 $m$ 是 $x^n$ 的樣本平均值,它的期望是 $\mu$,所以$E[m - \mu] = 0$,因此這一項的期望值為 0。 3. **第三項:$E[(m - \mu)^2]$** $m$ 是樣本平均值,其期望值是 $\mu$,而 $m$ 的變異數為: $$ E[(m - \mu)^2] = \frac{\sigma^2}{N} $$ ##### 步驟 4:將各項期望值代入 - 將期望值代入 $E[s^2]$ 的公式: $$ E[s^2] = \frac{1}{N} \sum_{n=1}^{N} \left( E[(x^n - \mu)^2] - 2E[(x^n - \mu)(m - \mu)] + E[(m - \mu)^2] \right) $$ - 簡化後得到: $$ E[s^2] = \frac{1}{N} \sum_{n=1}^{N} \left( \sigma^2 - 0 + \frac{\sigma^2}{N} \right) $$ - 因此,我們得到: $$ E[s^2] = \sigma^2 - \frac{\sigma^2}{N} $$ - 這就推導出有偏估計的期望值公式: $$ E[s^2] = \frac{N-1}{N} \sigma^2 $$ ##### 結論 - 因此,樣本變異數 $s^2$ 的期望值是 $\frac{N-1}{N} \sigma^2$,這意味著它是有偏的,因為其期望值比母體變異數 $\sigma^2$ 小。 ### 1.3 Bias #### 1.3.1 什麼是 Bias? ![image](https://hackmd.io/_uploads/rk0kx0U0C.png =200x) ![image](https://hackmd.io/_uploads/SkrVlCIRC.png =207x) - Bias 就是 $\bar{f}$ 與 $\hat{f}$ 的距離 - 大的 Bias:距離 $\hat{f}$(靶心)有一段距離 - 小的 Bias:$\bar{f}$(平均值)與 $\hat{f}$(靶心)的距離是接近的(暫不考慮分散的狀況) #### 1.3.2 複雜度不同的模型比較 ![image](https://hackmd.io/_uploads/SJg4WRL0C.png =500x) :::info :bulb: 曲線的涵義 :red_circle: 紅色曲線:例如抓十次寶可夢可以找出一個 $f^*$,此處紅色曲線有 5000 條,代表做了 5000 次實驗。 :large_blue_circle: 藍色曲線:5000 次實驗的平均。 :black_circle: 黑色曲線:真正的 True Function $\hat{f}$(靶心)。 ::: - 簡單的模型(一次式):雖然分布集中,但它的 Bias 比較大 - 複雜的模型(五次式):每一次找出的 $f^*$ 皆不一樣,但它的 Bias 其實比較小 - 如果使用一個範圍來表示 Function Set,代表每一次的 Function 只能從這個範圍找出來 - 簡單的模型可能根本就未包含 Target - 複雜的模型雖然涵蓋了 Target,但可能無法找到 Target 在哪裡 --> 因為給的訓量資料不夠多,所以每次找出的 $f^*$ 都不一樣 ![image](https://hackmd.io/_uploads/HkNvVCLRC.png) ### 1.4 Bias v.s. Variance ![image](https://hackmd.io/_uploads/SkfwPR8R0.png =500x) - 簡單模型:Bias 大,但 Variance 比較小 - 複雜模型:Bias 小,但 Variance 比較大 - Overfitting v.s. Underfitting - 如果 Error 來自 Variance,代表 Overfitting - 如果 Error 來自 Bias,代表 Underfitting - 調整改善模型之前,需要先知道是 Bias 或是 Variance 哪個比較大,以確認 Error 來自哪裡 #### 1.4.1 如何改善 Bias 過大的情況? ```markdown! 在訓練資料上表現不好/無法 Fit,代表 Bias 過大 -> Underfitting ``` - 重新設計 Model - 重新寫 Model 的公式,加入更多的 Features - 讓 Model 更複雜,考慮更多次 - :warning: 蒐集更多資料並不會有幫助,因為本來就偏移靶心(Function Set 的範圍沒有涵蓋到 Target),所以即便有更多資料也不會改善 #### 1.4.2 如何改善 Variance 過大的情況? ```markdown! 在訓練資料上表現很好,但測試資料表現差,代表 Variance 過大 -> Overfitting ``` - 增加資料是一個有效控制 Variance 的方法,且不會影響到 Bias - 但在實際面上可能無法蒐集到更多資料,要解決這方面的問題,可生成假的訓練資料。例如: - 根據對問題的理解,製造更多的 Data - 圖片角度轉移、翻轉等 - 男女音頻轉換、加入雜訊等 - 正則化(Regularization) ![image](https://hackmd.io/_uploads/BJ2WykPR0.png)[參考 24-09-21 ML](https://hackmd.io/@learnai2024/ml-session-240921#%E8%AA%B2%E7%A8%8B%E5%85%A7%E5%AE%B9%E7%AD%86%E8%A8%98) - 在 Loss Function 裡再加入一個 Term(紅框處),使找出的曲線越平滑越好 ![image](https://hackmd.io/_uploads/rJI8xJwCC.png) - 加了正則化之後,就會強迫所有曲線變得比較平滑(如右圖),但因為調整了整個 Function Space,變成只聚焦在比較平滑的曲線,所以可能無法涵蓋到 $\hat{f}$(靶心) ,進而傷害到 Bias - 調整權重的時候,需要取得 Variance 與 Bias 的平衡 ### 1.5 Model Selection - 如何選擇 Model? 需在 Bias 與 Variance 取得平衡,讓 Variance 夠小,Bias 也夠小,兩個合起來後,可以得出最小的 Testing Data Error。 - :warning: 選擇 Model 時,建議不要利用 Testing Set 得出的 Error 來作為模型選擇的依據,因為會同時把 Testing Set 自己的 Bias 也連帶考慮進去,最後得出的 Error 無法實際反映真實的資料,得出大於 Testing Set 的 Error。 - 如何解決?使用 Cross Validation 或 N-fold Cross Validation。 - Cross Validation ![image](https://hackmd.io/_uploads/rJ0bDkPC0.png =500x) - 將 Training Set 分為兩組:Training Set 與 Validation Set。 - 利用 Training Set 來訓練模型,再根據 Validation Set 的表現來選擇模型,接著就可直接應用在 Testing Set 上。 - 如果覺得 Training Data 變少,可以選擇模型之後,再將全部的 Training Data(包含Training Set 與 Validation Set)重新投入該模型的訓練。 - 如此,即使 Error 會相對於其他模型較大,但它才可以真正反映 Real Data 的 Error。 - N-fold Cross Validation ![image](https://hackmd.io/_uploads/ByAXvJDCC.png =500x) - 如果擔心 Validation Set 有奇怪的Bias,也可以換做 N-fold Cross Validation。 - 將 Training Set 分成多種群組,例如 3-fold 的話,代表將 Training Set 分成三份。 - 分別算出各種分組的 Error 平均,比較不同模型的平均 Error 結果,接著選出最好的表現,可再使用完整的 Training Set 到該模型上,接著再應用於 Testing Set。 - 原則就是不要太在意 Testing Set / Public Set 的分數,盡量少根據它去調整自己的 Model,如此 Private Set 與 Public Set的差距才能是最小。 ## 2. Gradient Descent {%hackmd -q7JdJChTpuNbw2auKMqyA %} # 補充資料 - 真實的計算寶可夢CP公式 $\hat{f}$ 為 ```markdown! CP = ((基礎攻擊 + 攻擊 IV) * (基礎防禦 + 防禦 IV)^0.5 * (基礎 HP + HP IV)^0.5 * (PowerUpValue^2) / 10 ) CP = floor((Base Attack + Attack IV) * (Base Defense + Defense IV)^0.5 * (Base HP + HP IV)^0.5 * (PowerUpValue^2) / 10 ) ``` # 課程提問 :::spoiler 為何不以 Testing Set 的結果作為依據來選擇模型? - 同學使用 ChatGPT 回覆 為什麼不能用測試集來訓練 過擬合風險:如果模型在測試集上進行訓練,它可能會學習到測試集中的特定特徵,而不是一般化的模式。這樣一來,模型在測試集上的表現可能會很好,但在新數據上卻表現不佳。 評估失真:測試集的目的是評估模型的性能。如果用測試集進行訓練,最終評估結果將無法準確反映模型在未見過的數據上的表現。 模型選擇偏差:如果在選擇最佳模型時使用測試集,則可能會導致模型在測試集上表現良好,但在其他數據上表現不如預期。 交叉驗證的優勢 交叉驗證(cross-validation)是評估模型性能的一種技術,它可以幫助解決數據集劃分問題,具體包括以下幾點: 可靠性:通過多次劃分和驗證,交叉驗證提供了一個更可靠的模型性能評估,使結果不依賴於特定的數據劃分。 充分利用數據:在每次驗證中,所有數據都能夠被用作訓練集和驗證集,這對於數據量有限的情況特別重要。 減少過擬合風險:由於在不同的數據子集上進行訓練和驗證,交叉驗證能有效減少模型過擬合的可能性。 :::