毫無疑問機器學習是大資料分析不可或缺的一部分,在使用機器學習技術的時候工程師除了要選擇合適的演算法之外還需要選擇合適的樣本資料。那麼工程師到底應該選擇哪些樣本資料、選擇多少樣本資料才最合適呢?來自於Google的軟體工程師Malay Haldar最近發表了一篇題為《資料模型需要多少訓練資料》的文章對此進行了介紹。

訓練資料的質量和數量通常是決定一個模型效能的最關鍵因素。一旦訓練資料準備好,其他的事情就順理成章了。但是到底應該準備多少訓練資料呢?答案是這取決於要執行的任務,要滿足的效能,所擁有的輸入特徵、訓練資料中的噪音、提取特徵中的噪音以及模型的複雜程度等因素。而找出這些變數之間相互關係的方法就是在不同資料量的訓練資料上訓練模型並繪製學習曲線。但是這僅僅適合於已經有一定數量的訓練資料的情況,如果是最開始的時候,或者說只有很少一點訓練資料的情況,那應該怎麼辦呢?

與死板地給出所謂精確的“正確”答案相比,更靠譜的方法是通過估算和具體的經驗法則。例如本文將要介紹的實證方法:首先自動生成很多邏輯迴歸問題。然後對生成的每一個問題,研究訓練資料的數量與訓練模型的效能之間的關係。最後通過觀察這兩者在這一系列問題上的關係總結出一個簡單的規則。

1-2

生成一系列邏輯迴歸問題並研究不同資料量的訓練資料所造成的影響的程式碼可以從GitHub上獲取。相關程式碼是基於Tensorflow實現的,執行這些程式碼不需要任何特殊的軟體或者硬體,使用者可以在自己的筆記本上執行整個實驗。程式碼執行之後生成的圖表如下:

2-2

其中,X軸是訓練樣本的數量與模型引數數量的比率。Y軸是訓練模型的得分(f-score)。不同顏色的曲線表示不同引數數量的模型。例如,紅色曲線代表模型有128個引數,曲線的軌跡表明了隨著訓練樣本從128 x 1到 128 x 2並不斷增長的過程中該模型的得分變化。

通過該圖表,我們能夠發現模型得分並不會隨著引數規模的變化而變化。但是這是針對線性模型而言,對於一些隱藏的非線性模型並不適合。當然,更大的模型需要更多的訓練資料,但是對於一個給定的訓練模型數量與模型引數數量比率其效能是一樣的。該圖表還顯示,當訓練樣本的數量與模型引數數量的比率達到10:1之後,模型得分基本穩定在0.85,該比率便可以作為良好效能模型的一種定義。根據該圖表我們可以總結出10X規則,也就是說一個優秀的效能模型需要訓練資料的數量10倍於該模型中引數的數量。

10X規則將估計訓練資料數量的問題轉換成了需要知道模型引數數量的問題。對於邏輯迴歸這樣的線性模型,引數的數量與輸入特徵的數量相等,因為模型會為每一個特徵分派一個相關的引數。但是這樣做可能會有一些問題:

  • 特徵可能是稀疏的,因而可能會無法直接計算出特徵的數量。
  • 由於正則化和特徵選擇技術,很多特徵可能會被拋棄,因而與原始的特徵數相比,真正輸入到模型中的特徵數會非常少。

避免這些問題的一種方法是:必須認識到估算特徵的數量時並不是必須使用標記的資料,通過未標記的樣本資料也能夠實現目標。例如,對於一個給定的大文字語料庫,可以在標記資料進行訓練之前通過生成單詞頻率的歷史圖表來理解特徵空間,通過歷史圖表廢棄長尾單詞進而估計真正的特徵數,然後應用10X規則來估算模型需要的訓練資料的資料量。

需要注意的是,神經網路構成的問題集與邏輯迴歸這樣的線性模型並不相同。為了估算神經網路所需要的引數數量,你需要:

  • 如果輸入是稀疏的,那麼需要計算巢狀層使用的引數的數量。參照word2vec的Tensorflow教程示例。
  • 計算神經網路中邊的數量

由於神經網路中引數之間的關係並不是線性的,所以本文基於邏輯迴歸所做的實證研究並不適合神經網路。但是在這種情況下,可以將10X規則作為訓練資料所需資料量的下限。

儘管有上面的問題,根據Malay Haldar的經驗,10X規則對於大部分問題還是適用的,包括淺神經網路。如果有疑問,可以在Tensorflow的程式碼中插入自己的模型和假設,然後執行程式碼進行驗證研究。

via:InfoQ中文站