1. 程式人生 > >吳恩達新書-機器學習學習筆記-(四)學習曲線

吳恩達新書-機器學習學習筆記-(四)學習曲線

1.診斷偏差與方差:學習曲線

學習曲線可以將開發集的誤差訓練集樣本的數量進行關聯比較。想要繪製出它,你需要設定不同大小的訓練集執行演算法。假設有1000個樣本,你可以選擇在規模為100、200、300、····1000的樣本集中分別執行演算法,接著便能得到開發集誤差隨訓練集大小變化的曲線。如下圖所示:

隨著訓練集大小的增加,開發集誤差應該降低。我們通常會設定一些“期望錯誤率”,並希望學習演算法最終能夠達到該值。例如:

如果希望演算法能達到人類水平的表現,那麼人類錯誤率可能就是“期望錯誤率”。

如果學習演算法為某些產品提供服務(如提供貓咪圖片),我們或許將主觀感受到需什麼樣的水平才能給使用者提供出色的體驗。

如果你已經從事一項應用很長時間,那麼你可能會有一種直覺,預判在下一個季度裡你會有多大的進步。

我們將期望的表現水平新增到我們的學習曲線中:

根據紅色的“開發誤差”曲線的走勢來推測,在新增一定的數量的資料後,曲線距離期望的效能接近了多少。在上面的例子中,將訓練集的大小增加一倍可能會讓你達到期望的效能,這看起來是合理的。

觀察學習曲線或許能幫到你,避免花費幾個月的時間去收集兩倍的訓練資料,到頭來卻發現這並不管用的情況。

該方法的一個缺點是:如果你只關注了開發錯誤曲線,當資料量變得越來越多時,將很難預測後續紅色曲線的走向。因此我們會選擇另外一條曲線來協助評估新增資料所帶來的影響:即訓練誤差曲線。

2.繪製訓練誤差曲線

隨著訓練集大小的增加,開發集(和測試集)誤差應該會降低,但你的訓練集誤差往往會隨之增加。

讓我們來舉例說明一下。假設你的訓練集只有兩個樣本:一張貓圖和一張非貓圖。學習演算法輕易地就可以“記住”訓練集中這兩個樣本,並且訓練集錯誤率為 0%. 即使有一張或兩張的樣本圖片被誤標註了,演算法也能夠輕鬆地記住它們。

現在假設你的訓練集包含 100 個樣本,其中有一些樣本可能被誤標記,或者是模稜兩可的(影象非常模糊),所以即使是人類也無法分辨圖中是否有一隻貓。此時,或許學習演算法仍然可以“記住”大部分或全部的訓練集,但很難獲得 100% 的準確率。通過將訓練集樣本數量從 2個增加到 100 個,你會發現訓練集的準確率會略有下降。

可以看到藍色的“訓練誤差”曲線隨著訓練集大小的增加而上升,而且演算法在訓練集上通常比在開發集上表現得更好;因此,紅色的開發誤差曲線通常嚴格位於藍色訓練錯誤曲線之上。

3. 解讀學習曲線:高偏差

假設我們的開發集誤差曲線如下所示:

可以看到,我們增加訓練集資料後,我們的開發誤差曲線趨於平穩,則不太可能通過新增資料來達到預期的效能,但也很難確切地知道紅色的開發集錯誤曲線將趨於何值。如果開發集很小,或許會更加不確定,因為曲線中可能含有一些噪音干擾。

這個時候我們將訓練誤差新增到曲線中去:

我們現在可以肯定地說,新增更多的資料並不奏效。為什麼呢?記住我們的兩個觀察結果:

1.增加訓練集資料,訓練誤差變地更大,或者趨於穩定(藍色的曲線)。從而偏離期望的值,綠色的曲線。

2.紅色的開發誤差曲線通常要高於藍色的訓練誤差曲線。因此當訓練誤差高於期望效能的話,通過新增更多資料來讓紅色開發誤差曲線下降到期望效能水平之下也基本沒有可能。

上圖的例子說明:訓練誤差和期望效能有較大的間隙,這代表可避免偏差較大。此外,如果訓練曲線和開發曲線之間的間隙小,則表明方差小。

繪製完整的學習曲線將為我們呈現更全面的結果圖片,顯示演算法在不同訓練集大小上的表現。

4.解讀學習曲線:其它情況

考慮下面的學習曲線:

藍色訓練誤差曲線相對較低,紅色的開發誤差曲線比藍色訓練誤差高得多。因此,偏差很小,但方差很大。新增更多的訓練資料可能有助於縮小開發誤差和訓練誤差之間的差距。

考慮下面這種情況:

這種情況下,訓練誤差很大,它的期望的效能水平要高得多,開發誤差也比訓練誤差大得多。因此,學習演算法有著明顯的偏差和方差。此時你必須找到一種方法來減少演算法中的偏差和方差。

5.繪製學習曲線

如果你的機器學習應用程式很傾向於某一個類(如貓分類任務的負面樣本比例遠遠大於正面樣本),或者說有大量的類(如識別 100 種不同的動物物種),那麼選擇一個“非代表性”或糟糕的特殊訓練集的機率也將更大 。例如,假設你的整個樣本中有 80% 是負樣本(y=0),只有20% 是正樣本(y=1),那麼一個含有 10 個樣本的訓練集就有可能只包含負樣本,因而演算法很難從中學到有意義的東西。

存在訓練集噪聲致使難以正確理解曲線的變化時,有兩種解決方案:

1.與其只使用 10 個樣本訓練單個模型,不如從你原來的 100 個樣本中進行隨機有放回抽樣10,選擇幾批(比如 3-10 )不同的 10 個樣本進行組合。在這些資料上訓練不同的模型,並計算每個模型的訓練和開發錯誤。最終,計算和繪製平均訓練集誤差和平均開發集誤差。

2.如果你的訓練集偏向於一個類,或者它有許多類,那麼選擇一個“平衡”子集,而不是從100 個樣本中隨機抽取 10 個訓練樣本。例如,你可以確保這些樣本中的 2/10是正樣本,8/10 是負樣本。更常見的做法是,確保每個類的樣本比例儘可能地接近原始訓練集的總體比例。

除非你已經嘗試過繪製學習曲線,並得出了曲線太過嘈雜且無法看到潛在趨勢的結論,否則我將不會考慮使用這兩種技術。因為當你的訓練集規模很大——比如超過 10000 個樣本——而且類分佈不是很傾斜時,你可能就不需要這些技巧了。

最後提一點,繪製一個學習曲線的成本可能非常高:

例如,你可能需要訓練 10 個模型,其中樣本規模可以是 1000 個,然後是 2000 個,一直到 10000 個。使用小資料集訓練模型比使用大型資料集要快得多。因此,你可以用 1000、2000、4000、6000 和 10000 個樣本來訓練模型,而不是像上面那樣將訓練集的大小均勻地間隔在一個線性的範圍內。這仍然可以讓你對學習曲線的變化趨勢有一個清晰的認識。當然,這種技術只有在訓練所有額外模型所需的計算成本很重要時才有意義。