個人對泛化誤差的看法
泛化誤差與交叉驗證
誤差這個詞我們經常會遇到,在機器學習中,我們最終想要的結果實際上就是減小學習後的估計值和真實值的誤差。比如在迴歸中,我們的 loss function 就表示一個誤差。而我們需要做的,就是最小化這個誤差,也就是對 object function 的處理。
那麼什麼是泛化誤差呢?剛剛說我們最小化了 loss function, 那是不是就一定說明我訓練了一些樣本後,保證求出了一組最佳的參數從而得到了一個完美的模型呢?顯然不是,中國有句老話說的很好:“是騾子是馬,拉出來溜溜”。怎麼評價學習後得到的模型呢?實踐是檢驗真理的唯一標準,我們再用一些數據(test data)來看看我們得到的模型在這些數據實踐後,這時候的誤差是多少。而這個誤差,和剛剛 loss function的誤差是沒有關係的,也就是我們所說的泛化誤差。而將數據劃分爲訓練集(train set)和驗證集(validation set)從而來求取泛化誤差的方法,就是所謂的 交叉驗證。
所以交叉驗證在做什麼?假設我們有多種可能的模型而我們不能確定哪一種是最好的,那麼我們就需要測試每一個模型訓練後的泛化誤差,從而選擇最佳的模型。這裏想多說一句,什麼是模型,因爲在我學習這部分時一直理解爲模型就是不同參數下的同一種假設函數。實際上是完全錯誤的。模型指的是假設函數長什麼樣子,比如在迴歸問題中,我的假設函數可能是一個二次函數,也可能是三次甚至更高的多項式。每一個模型自然對應着一組最佳的參數,可以由最小化 loss function 來得到。交叉驗證的意義在於,不是選最佳的參數,而是對每一個可能的模型,用訓練集最小化 loss function 的誤差從而得到最佳參數後,運用驗證集來算出泛化誤差。通過對泛化誤差的評估來選出最優的模型。
所以我的理解就是: 訓練集的作用是最小化 loss function 這樣一個誤差,從而能夠得到最佳的參數,他不管你輸入的是什麼模型;驗證集的作用是求取一個模型的泛化誤差,它默認在測試後已經得到了該模型的最佳參數。所以交叉驗證的核心在於驗證集!
泛化誤差的意義
泛化誤差的意義,其實就是在訓練後的模型,想來看一看這個模型具不具備代表性。那麼這個代表性怎麼去衡量呢?我們用偏差(bias)和方差(variance)來描述。偏差是什麼?給了一些新的樣本,我用我所得到的模型對這個樣本進行估值,那這個估值和真實值的差距就是偏差;方差是什麼?在不同的訓練集上即使是同一模型我們可能會得到不同的參數,那麼不同訓練集上得到的假設函數對新樣本做出的估值是不同的。我們用這些不同估值的期望作爲最終這個模型對新樣本的估值,那麼我們想看一下這個期望的估值與不同訓練集訓練結果得到的估值的離散程度。
這和我們統計學上的期望與方差是相類似的,可以對比來看。我們希望最終的估值與實際值相差不大,而且所得到的模型也要相對穩定。在這種情況下我們就可以說我們的模型通用性比較強,也就是泛化。
泛化誤差的構成
我們剛剛說偏差和方差可以來衡量這個模型是不是具有代表性,那麼我們在驗證集上得到了泛化誤差後,怎麼就能直接評估這個模型呢?我們來看一下泛化誤差的構成。
先來定義幾個概念:
- 在訓練集
d 上,我們訓練後的模型爲fd(x) - 那麼該模型對數據
x 的預測輸出爲f(x)¯=Ed[fd(x)] - 驗證集樣本的真實值爲
y - 由於會有噪聲的存在,樣本的標籤值可能與真實值有出入,標籤值設爲
yd - 噪聲爲
ϵ=y−yd ,並且服從高斯分佈ϵ∼N(0,σ2) - 根據偏差的定義,爲預測輸出與樣本標籤的差值,
bias=y−f(x)¯ - 根據方差的定義,爲預測輸出與不同測試集差的離散程度,
var=Ed[(fd(x)−f(x)¯)2] - 泛化誤差的定義爲
Ed[(yd−fd(x))2]
泛化誤差即每一組訓練集得到結果後與驗證集計算誤差,誤差的均值就作爲衡量泛化的標準。
由這個推導可以看出來,對於每一次交差驗證完我們能夠得到一組誤差
總結
以上是我對泛化誤差和交叉驗證的理解,總結起來就是,泛化誤差是衡量一個模型推廣能力的標準,而交叉驗證正是利用這一性質,將數據集分爲訓練集合驗證集,對不同的模型計算泛化誤差。從而幫助我們選取這個問題下的最佳模型。