數據模型需要多少訓練數據?
【編者的話】毫無疑問機器學習是大數據分析不可或缺的一部分,在使用機器學習技術的時候工程師除了要選擇合適的算法之外還需要選擇合適的樣本數據。那么工 程師到底應該選擇哪些樣本數據、選擇多少樣本數據才最合適呢?來自于Google的軟件工程師Malay Haldar最近發表了一篇題為《 數據模型需要多少訓練數據 》的文章對此進行了介紹。
訓練數據的質量和數量通常是決定一個模型性能的最關鍵因素。一旦訓練數據準備好,其他的事情就順理成章了。但是到底應該準備多少訓練數據呢?答案是這取決 于要執行的任務,要滿足的性能,所擁有的輸入特征、訓練數據中的噪音、提取特征中的噪音以及模型的復雜程度等因素。而找出這些變量之間相互關系的方法就是 在不同數據量的訓練數據上訓練模型并 繪制學習曲線 。但是這僅僅適合于已經有一定數量的訓練數據的情況,如果是最開始的時候,或者說只有很少一點訓練數據的情況,那應該怎么辦呢?
與死板地給出所謂精確的“正確”答案相比,更靠譜的方法是通過估算和具體的經驗法則。例如本文將要介紹的實證方法:首先自動生成很多邏輯回歸問 題。然后對生成的每一個問題,研究訓練數據的數量與訓練模型的性能之間的關系。最后通過觀察這兩者在這一系列問題上的關系總結出一個簡單的規則。
生成一系列邏輯回歸問題并研究不同數據量的訓練數據所造成的影響的代碼可以從 GitHub 上獲取。相關代碼是基于 Tensorflow 實現的,運行這些代碼不需要任何特殊的軟件或者硬件,用戶可以在自己的筆記本上運行整個實驗。代碼運行之后生成的圖表如下:
其中,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的代碼中插入自己的模型和假設,然后運行代碼進行驗證研究。