# ML Lecture 2: Where does the error come from? ###### tags: `機器學習` `李弘毅教授` ## 一、Error主要來自兩個來源 1. Variance 2. bias ## 二、估測隨機變數的平均值、變異數(機率與統計) ### (一) 估測μ(Mean,平均值) #### 方式(但採樣出來的結果不一定等於平均值): 假如要估測一個隨機變數的平均值的話,可以對一個變數做很多組的採樣,分別對每組資料計算平均數。結果算出來會發現,每一組的平均數「不一定」等於該變數的平均值。  #### 求期望值找出真正的平均值: 不過用各組算出來的平均數來取期望值,最後算出來還是會等於μ。  #### 採樣結果與樣本數的關係: 由於各次採樣得到的平均數是散開的,我們可以透過計算平均數的變異數,觀察出採樣次數與平均值分散程度的關係。結果發現,假如採樣的樣本多的話,這些點就會比較集中;如果少的話,則較分散。  ### (二) 估測σ^2^(變異數) #### 方式: 先用上一點的方式估測出m,之後再將這個值代入下列式子即可得到估計出來的變異數s^2^。不過使用各組樣本求得的s^2^還是「不一定」跟σ^2^相同。  #### 取期望值的結果? 就算是對他取期望值,還是不會相等。因為如下圖所示,對他取期望值,得到的結果是有bias的。因此可以發現,採樣出來的點通常會比真正的σ^2^小,只是因為有變異數,因此還是有些會大於σ^2^。另外也可以發現,假如N取的很大的話,期望值算出來會非常接近σ^2^。  ## 三、以射標靶為例,說明error產生的原因 從下圖中右下角的標靶可以看出,其實會造成射出去不準的原因是: 1. 有bias,bias就是從取樣點的期望值到靶中心的偏移,這是整體的偏移。 2. 有variance,variance就是各個取樣點與其期望值之間的誤差。 > 點的期望值:取樣了很多次,最可能出現在哪裡。很像平均值的概念。 >  具備以上知識後,就可以理解: - 左上靶沒有誤差是因為,bias、variance都很小。 - 造成右上靶有誤差的原因是,variance很大。仔細觀察其實可以發現他的bias很小,誤差都是因為variance造成的。 - 造成左下角誤差的原因是,bias很大。其實所有的樣本點是很接近的,只是因為整體都偏移了靶心,因此形成了大error。 > 一個點就代表一個模型,也就是上一章中的「一條線」。這邊的概念就是,假如有一個模型的error很大,他就會偏離靶心。 > ## 四、比較簡單、複雜Model的差別 事實上,==即使是相同的模型,如果使用了不同的訓練資料,產生出來的結果也很可能不同==。以下使用「線」的方式,觀察「對相同模型,使用不同訓練資料」產生出來的結果具備什麼特性。 ### (一) 比較Variance 從下圖可以發現: - 使用相同簡單模型時,不同訓練資料對模型造成的影響不會很大。 - 使用相同複雜模型時,不同訓練資料會對模型產生很大的影響。 ==結論:簡單模型較不受Variance影響;複雜模型受Variance影響很深。==  ### (二) 比較Bias 下圖中,黑線代表真實的資料,每一筆資料都是從這條線取得的;藍線代表取樣很多次得到很多個models,將這些模型取平均得到的結果。 透過這張圖,我們可以觀察出: - 簡單模型得到的平均值離代表實際資料的曲線較遠,也就是說簡單模型受Bias影響較大。 - 複雜模型看起來雖然很雜亂,但是這很多個模型取平均之後,非常接近黑線。也就是說複雜模型較不售Bias影響。 ==結論:簡單模型因bias產生的error較大;複雜模型因bias產生的error較小。== > 為甚麼會有這樣的現象? > 從上圖中下方的靶可以觀察出: > - 簡單模型的資料較受限。因此就算從這個模型中找出error最小的資料,實際上還是距離靶心有一段距離。 > - 複雜模型在設計時,則是包含了靶心。雖然因為它包含很多可能性,很難找出真正的最佳解,因此Variance很大。不過如果採樣多次一點,最後算出來的結果還是會往靶心靠近。  ### (三) 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>==。  ## 五、如何判斷bias大還是variance大? ### (一) bias大 如果是bias大的話,就代表現在的model不對,沒有把正確答案包進去。再怎麼訓練都沒辦法把模型fit到接近現在的訓練資料,因此training error會很大。 > 這種情形就算加再多訓練資料也沒用,因為模型整個都偏掉了,就算加再多訓練資料,也沒辦法讓Training error下降。 ### (二) variance大 如果訓練完後,Training error很小,但Testing error很大的話,就代表variance大。如下圖,如果一個Model的variance過大的話,模型涵蓋的範圍很大,訓練出的模型可能包含很多無效的點。因此拿Training Data來測的時候,可能可以得到很好的結果;但拿Testing Data來測的時候,可能就剛好在無效的區域,造成結果很差。 > 從下圖的例子就可以看出,如果拿訓練資料來評估這個模型,確實可以得到很小的誤差;但如果拿測試資料來評估的話,反而會得到一個極差的結果。雖然這個例子有點極端,但感覺滿好理解的。 >  ## 六、處理bias、variance大的問題 ### (一) bias大 bias大通常是因為模型沒有包含正確的答案,所以模型甚至沒辦法fit訓練資料。如果要解決這個問題的話,就要重新設計模型。或許要將其他特徵值考慮進來,又或者是讓模型變複雜,本來可能是一次式,現在讓模型變成二次式之類的。 這種情形就算在蒐集更多訓練資料,也不會有幫助。因為模型本身就已經不包含正確答案了。 ### (二) variance大 - 增加更多資料: 前面訓練模型的例子,每次在訓練時都只使用10隻寶可夢做訓練。但如果每次訓練時,都使用100筆資料,最後結果會變得還不錯。比較如下圖:  > 會產生這個現象的原因是因為,如果只是用少量的資料,訓練出來的模型可能會有些無效區間(如同前一張圖)。但如果使用了更多資料,而且模型又有包含正確結果,在訓練的時候就可以減少模型出現無限的區間。因為如果無效區間還存在的話,他對應到訓練資料就會產生很大的誤差。 > 註:加資料之後也不會產生Training error下不來的問題。因為在還沒加資料前,模型就可以fit訓練資料了,就代表模型是有能力涵蓋正確資料的。沒理由在增加資料後,就讓模型沒辦法包含正確答案。 不過現實中,不一定有辦法取得更多訓練資料,因為取得資料真的是很麻煩。不過還有其他作法可以增加資料量的,就是==製造假資料==。例如: - 在做手寫數字辨識時,因為每個人寫的數字可能斜度都不一樣。因此可以把每一筆資料都左斜、右斜15度,這樣就可以在不用標記資料的情況下,產生更多資料了。 - 在做語音辨識時,我們可能女生的聲音不夠,這時可以把所有男生的音高都提高。這樣一樣可以拿來訓練。 - Regularization 跟Lecture 1中提到的Regularization是一樣的事,在Loss Function中多加一項,目的是為了將==模型變平滑==。透過這樣的方式,就可以減少模型中的無效區域。下圖是有用Regularization跟沒用的差別(最左邊是沒有Regularization,最右邊是使用較大的weight(平滑程度)):  #### 透過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有點像,但又不太像。我覺得可以理解成:每個子集合包含到的資料都不太一樣,因此如果使用不同子集合的資料來評估模型,可能都會得到不同的結果。 >  ### (二) 應該用這個方式選擇模型: - 作法: 一開始先將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。  ## 八、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中得到的誤差值。 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up