---
# System prepended metadata

title: 'ML Lecture 2: Where does the error come from?'
tags: [李弘毅教授, 機器學習]

---

# ML Lecture 2: Where does the error come from?
###### tags: `機器學習` `李弘毅教授`
## 一、Error主要來自兩個來源
1. Variance
2. bias
## 二、估測隨機變數的平均值、變異數(機率與統計)
### (一) 估測μ(Mean，平均值)
#### 方式(但採樣出來的結果不一定等於平均值)：
假如要估測一個隨機變數的平均值的話，可以對一個變數做很多組的採樣，分別對每組資料計算平均數。結果算出來會發現，每一組的平均數「不一定」等於該變數的平均值。
![](https://i.imgur.com/84kPitT.png)
#### 求期望值找出真正的平均值：
不過用各組算出來的平均數來取期望值，最後算出來還是會等於μ。
![](https://i.imgur.com/zvuKoN2.png)
#### 採樣結果與樣本數的關係：
由於各次採樣得到的平均數是散開的，我們可以透過計算平均數的變異數，觀察出採樣次數與平均值分散程度的關係。結果發現，假如採樣的樣本多的話，這些點就會比較集中；如果少的話，則較分散。
![](https://i.imgur.com/JBMP4YO.png)

### (二) 估測σ^2^(變異數)
#### 方式：
先用上一點的方式估測出m，之後再將這個值代入下列式子即可得到估計出來的變異數s^2^。不過使用各組樣本求得的s^2^還是「不一定」跟σ^2^相同。
![](https://i.imgur.com/nPsDcGV.png)
#### 取期望值的結果？
就算是對他取期望值，還是不會相等。因為如下圖所示，對他取期望值，得到的結果是有bias的。因此可以發現，採樣出來的點通常會比真正的σ^2^小，只是因為有變異數，因此還是有些會大於σ^2^。另外也可以發現，假如N取的很大的話，期望值算出來會非常接近σ^2^。
![](https://i.imgur.com/C0TMFNh.png)

## 三、以射標靶為例，說明error產生的原因
從下圖中右下角的標靶可以看出，其實會造成射出去不準的原因是：
1. 有bias，bias就是從取樣點的期望值到靶中心的偏移，這是整體的偏移。
2. 有variance，variance就是各個取樣點與其期望值之間的誤差。
> 點的期望值：取樣了很多次，最可能出現在哪裡。很像平均值的概念。
> 
![](https://i.imgur.com/SCs72x5.png)
具備以上知識後，就可以理解：
- 左上靶沒有誤差是因為，bias、variance都很小。
- 造成右上靶有誤差的原因是，variance很大。仔細觀察其實可以發現他的bias很小，誤差都是因為variance造成的。
- 造成左下角誤差的原因是，bias很大。其實所有的樣本點是很接近的，只是因為整體都偏移了靶心，因此形成了大error。
> 一個點就代表一個模型，也就是上一章中的「一條線」。這邊的概念就是，假如有一個模型的error很大，他就會偏離靶心。
> 
## 四、比較簡單、複雜Model的差別
事實上，==即使是相同的模型，如果使用了不同的訓練資料，產生出來的結果也很可能不同==。以下使用「線」的方式，觀察「對相同模型，使用不同訓練資料」產生出來的結果具備什麼特性。
### (一) 比較Variance
從下圖可以發現：
- 使用相同簡單模型時，不同訓練資料對模型造成的影響不會很大。
- 使用相同複雜模型時，不同訓練資料會對模型產生很大的影響。

==結論：簡單模型較不受Variance影響；複雜模型受Variance影響很深。==
![](https://i.imgur.com/jnZLFXT.png)

### (二) 比較Bias
下圖中，黑線代表真實的資料，每一筆資料都是從這條線取得的；藍線代表取樣很多次得到很多個models，將這些模型取平均得到的結果。
透過這張圖，我們可以觀察出：
- 簡單模型得到的平均值離代表實際資料的曲線較遠，也就是說簡單模型受Bias影響較大。
- 複雜模型看起來雖然很雜亂，但是這很多個模型取平均之後，非常接近黑線。也就是說複雜模型較不售Bias影響。

==結論：簡單模型因bias產生的error較大；複雜模型因bias產生的error較小。==

> 為甚麼會有這樣的現象？
> 從上圖中下方的靶可以觀察出：
> - 簡單模型的資料較受限。因此就算從這個模型中找出error最小的資料，實際上還是距離靶心有一段距離。
> - 複雜模型在設計時，則是包含了靶心。雖然因為它包含很多可能性，很難找出真正的最佳解，因此Variance很大。不過如果採樣多次一點，最後算出來的結果還是會往靶心靠近。

![](https://i.imgur.com/L0LjKub.png)

### (三) Overfitting與Underfitting
圖片中的<font color="blue">藍線</font>是前一章提到的線，代表模型複雜度與error間的關係。這條線的形成其實跟<font color="green">綠線</font>、<font color="red">紅線</font>有關，綠線是因為variance產生的誤差；紅線則是從bias產生的誤差。
紅線、綠線在中間會有一段交叉，這個地方就是可以得到較低error的地方。往其他兩邊回得到較大的誤差，==假如來自bias產生error比較大，就稱為<font color="red">**Underfitting**</font>==；反之，==如果來自variance的誤差比較大，這種情形就稱為<font color="red">**Overfitting**</font>==。
![](https://i.imgur.com/HbGZXyE.png)

## 五、如何判斷bias大還是variance大？
### (一) bias大
如果是bias大的話，就代表現在的model不對，沒有把正確答案包進去。再怎麼訓練都沒辦法把模型fit到接近現在的訓練資料，因此training error會很大。
> 這種情形就算加再多訓練資料也沒用，因為模型整個都偏掉了，就算加再多訓練資料，也沒辦法讓Training error下降。

### (二) variance大
如果訓練完後，Training error很小，但Testing error很大的話，就代表variance大。如下圖，如果一個Model的variance過大的話，模型涵蓋的範圍很大，訓練出的模型可能包含很多無效的點。因此拿Training Data來測的時候，可能可以得到很好的結果；但拿Testing Data來測的時候，可能就剛好在無效的區域，造成結果很差。
> 從下圖的例子就可以看出，如果拿訓練資料來評估這個模型，確實可以得到很小的誤差；但如果拿測試資料來評估的話，反而會得到一個極差的結果。雖然這個例子有點極端，但感覺滿好理解的。
> 
![](https://i.imgur.com/epOwO2y.png)

## 六、處理bias、variance大的問題
### (一) bias大
bias大通常是因為模型沒有包含正確的答案，所以模型甚至沒辦法fit訓練資料。如果要解決這個問題的話，就要重新設計模型。或許要將其他特徵值考慮進來，又或者是讓模型變複雜，本來可能是一次式，現在讓模型變成二次式之類的。

這種情形就算在蒐集更多訓練資料，也不會有幫助。因為模型本身就已經不包含正確答案了。
### (二) variance大
- 增加更多資料：
    前面訓練模型的例子，每次在訓練時都只使用10隻寶可夢做訓練。但如果每次訓練時，都使用100筆資料，最後結果會變得還不錯。比較如下圖：
    ![](https://i.imgur.com/1aiQt2z.png)
    > 會產生這個現象的原因是因為，如果只是用少量的資料，訓練出來的模型可能會有些無效區間(如同前一張圖)。但如果使用了更多資料，而且模型又有包含正確結果，在訓練的時候就可以減少模型出現無限的區間。因為如果無效區間還存在的話，他對應到訓練資料就會產生很大的誤差。
    > 註：加資料之後也不會產生Training error下不來的問題。因為在還沒加資料前，模型就可以fit訓練資料了，就代表模型是有能力涵蓋正確資料的。沒理由在增加資料後，就讓模型沒辦法包含正確答案。

    不過現實中，不一定有辦法取得更多訓練資料，因為取得資料真的是很麻煩。不過還有其他作法可以增加資料量的，就是==製造假資料==。例如：
    - 在做手寫數字辨識時，因為每個人寫的數字可能斜度都不一樣。因此可以把每一筆資料都左斜、右斜15度，這樣就可以在不用標記資料的情況下，產生更多資料了。
    - 在做語音辨識時，我們可能女生的聲音不夠，這時可以把所有男生的音高都提高。這樣一樣可以拿來訓練。
- Regularization
跟Lecture 1中提到的Regularization是一樣的事，在Loss Function中多加一項，目的是為了將==模型變平滑==。透過這樣的方式，就可以減少模型中的無效區域。下圖是有用Regularization跟沒用的差別(最左邊是沒有Regularization，最右邊是使用較大的weight(平滑程度))：
![](https://i.imgur.com/vUBIug2.png)
#### 透過Regularitation減少variance可能產生的問題：
有可能會傷害到bias，因為模型的範圍會被限制，導致可能無法包含正確答案。

## 七、選擇模型
在設計模型時，往往有很多模型可以選擇，也有很多參數可以調。透過上面的說明，我們可以瞭解到，選擇模型時，我們要考量bias、variance。希望可以在這兩點間取得平衡，讓模型產生一個最小的Testing data error。
### (一) 在選擇模型不要做的事
- 從多個模型中做選擇時，==「<font color="red">**不要**</font>」用以下方式來評估模型：==
    直接把模型拿到Testing Set中去做測試，看出來的error會多大。最後直接斷定error最小的模型，就是最好的模型。
- 原因：
    如下圖，可能三個模型在Testing Set評估完後，發現Model 3的誤差最小，這時我們理所當然會覺得模型三最好。但其實不一定，因為每一個Data Set都有自己的bias。因此在Public Testing Set得到最好的模型，不一定可以在Private Testing Set得到好最好的效果。用這樣方式在Private得到的error，通常會比在Public中得到的還大。
> 這裡的bias跟前面的bias有點像，但又不太像。我覺得可以理解成：每個子集合包含到的資料都不太一樣，因此如果使用不同子集合的資料來評估模型，可能都會得到不同的結果。
> 
![](https://i.imgur.com/vPl8ybC.png)

### (二) 應該用這個方式選擇模型：
- 作法：
    一開始先將Training Set分成兩部分：Training Set、Validation Set。在訓練時就只使用分出來的Training Set來訓練，並在訓練完後，使用Validation Set來評估模型。透過Validation Set，可以取得一個比較好的Model。之後再將分出來的兩個Set合起來變成一個完整的Training Set，並拿這個完整的Training Set在比較好的Model上訓練一次，如此一來就不用擔心訓練資料減少。
    
- 這樣做有甚麼好處？
    如下圖，我們已經透過Validation Set找到最好的模型。這個模型在Testing Set得到的誤差，可能比在Validation Set中得到的誤差還大。不過這樣正好可以反映出，這個模型之後在別的地方、使用沒見過的資料時，真正可能得到的error。
    
- 不應該做的事：
    用這樣的方式，透過Testing Set來評估模型，通常會得到了一個較大的誤差。這時，可能有些人會想要回過頭去修改模型、參數，希望修改以後，可以讓模型在Testing Set得到較小的誤差。不過這樣是不對的，因為如果這時再回去修改模型，這個模型其實就考慮到了Testing Set的bias，就會讓Public Set的error沒辦法真正反映Private Set的error。
![](https://i.imgur.com/yPAP5lv.png)

## 八、N-fold Cross Validation
假如會擔心分出來的Validation Set包含了一些怪怪的bias，就可以使用這個方法。
- 方法說明：
    以下透過3-fold cross validation來做說明。在訓練前，先將Training分成三等份，其中兩份當作Training Set，另外一份當作Validation Set。每次就用那次的Validation Set來評估，最後再將各個Model在各次得到的error取平均，選擇平均誤差最低的那個模型。之後再將所有Set合併成為一個完整的Traing Set，重新訓練一次。然後再去Testing Set評估一次模型，這時得到的誤差值應該會很接近在private set中得到的誤差值。
    ![](https://i.imgur.com/qGKCbCM.png)
