機器學習:你需要多少訓練資料?
作者為Google 軟體工程師,美國西北大學電子資訊工程博士,擅長大規模分散式系統,編譯器和資料庫。
從谷歌的機器學習程式碼中得知,目前需要一萬億個訓練樣本
訓練資料的特性和數量是決定一個模型效能好壞的最主要因素。一旦你對一個模型輸入比較全面的訓練資料,通常針對這些訓練資料,模型也會產生相應的結果。但是,問題是你需要多少訓練資料合適呢?這恰恰取決於你正在執行的任務、最終想通過模型實現的效能、現有的輸入特徵、訓練資料中含有的噪聲、已經提取的特徵中含有的噪聲以及模型的複雜性等等諸多因素。所以,發現所有這些變數相互之間有何聯絡,如何工作的方法即是通過在數量不一的訓練樣本上訓練模型,並且繪製出模型關於各個訓練樣本集的學習曲線圖。你必須已經具有特性比較明顯、數量適合的訓練資料,才能通過模型的訓練學習出感興趣、效能比較突出的學習曲線圖。要實現上述的目的,你不禁會問,當你剛剛著手訓練一個模型的時候,你應該怎樣做,或者是在你訓練模型的過程中,你什麼時候能察覺到模型的訓練資料過少,並且想要估量出在整個模型訓練過程中存在什麼樣的問題。
所以,針對上述這些問題,代替絕對精準的回答,我們給出一個推測出的,比較實用的拇指規則。其大致過程是:自動生成大量的關於邏輯迴歸的問題。對於每個生成的邏輯迴歸問題,學習出訓練樣本的數量與訓練模型效能之間的存在的某種關係。基於一系列的問題觀察訓練樣本的數量與訓練模型效能之間的聯絡,從而得到一個簡單的規則——拇指規則。
我不能確定我的模型需要多少訓練樣本,我將建立一個模型來推測出所需訓練樣本的數量。
這裡是生成一系列關於邏輯迴歸問題和研究基於數量漸變的訓練樣本在模型上訓練效果的程式碼。通過呼叫谷歌的開源工具箱Tensorflow執行程式碼。程式碼的執行過程中不需要應用到任何軟體和硬體,並且我能夠在我的筆記本上執行整個實驗。隨著程式碼的執行,會得到下面的學習曲線圖,如圖(1)所示
圖(1)中,x軸表示訓練樣本數量與模型引數數量的比值。y軸是模型的f-score值。圖中不同顏色的曲線對應於帶有不同引數數量的訓練模型。例如,紅色曲線表示一個具有128個引數的模型隨著訓練樣本數量128 X 1,128 X 2等等這樣變化時,f-score值的變化情況。
得到的第一個觀察結果即是:f-score值不隨著引數尺度的變化而變化。通過這一觀察結果,我們可以認為給定的模型是線性的,並且令人高興的是模型中的一些隱含層沒有混入非線性。當然,更大的模型需要更多的訓練樣本,但是若訓練樣本數量與模型引數數量的比值是給定的,你會獲得相同的模型效能。第二個觀察結果即是:當訓練樣本數量與模型引數數量之比為10:1時,f-score值在0.85上下浮動,我們可以稱此時的訓練模型是一個具有良好效能的模型。通過以上的觀察結果可以得出一個10倍規則法——即是要訓練出一個性能良好的模型,所需訓練樣本數量應是模型引數數量的10倍。
因而,藉由10倍規則法,將估量訓練樣本數量的問題轉換為只要知道模型中引數數量就可以訓練出一個性能良好的模型問題。基於這一點這引發了一些爭論:
(1)對於線性模型 ,例如邏輯迴歸模型。基於每個特徵,模型都分配了相應的引數,從而使得引數的數量和輸入的特徵數量相等,然而這裡可能存在一些問題:你的特徵可能是稀疏的,所以,計數的特徵數量並不是直接的。
譯者注:我覺得這句話的意思是,稀疏特徵,例如稀疏特徵的編碼是01001001對於模型的訓練能夠起到作用的特徵是少數的,而不起作用的特徵佔大多數。依照上述線性規則,若模型對於每個特徵分配相應的引數,也就是說對於無用的特徵也分配了相應的引數,再根據10倍規則法,獲取是模型引數數量10倍的訓練樣本集,此時的訓練樣本數量對於最佳的訓練模型來說可能是超量的,所以,此時用10倍規則法得到的訓練樣本集未必能夠真實地得出好的訓練模型。
(2)由於規範化和特徵選擇技術,訓練模型中真實輸入的特徵的數量少於原始特徵數量。
譯者注:我覺得這兩點即是在解釋上述利用10倍規則法來得到效能良好模型的理論是有一定的侷限性,這個理論是相對於輸入特徵是完備且每個特徵對於模型的訓練都有一定的貢獻程度的。但是對於(1)、(2)這兩點所說的稀疏特徵和特徵降維技術的使用導致特徵數量減少的情況,利用10倍規則法能夠得到效能良好的模型的理論還有待進一步討論。
解決上述(1)、(2)問題的一個辦法即是:在提取特徵時,你不僅要用到有類別標籤的資料還要用到不帶類別標籤的資料來估計特徵的數量。例如給定一個文字語料庫,在標記資料進行訓練之前,你可以通過統計每個單詞出現的次數,來生成一個關於單詞頻率直方圖,以此來理解你的特徵空間。根據單詞頻率直方圖,你可以去掉長尾詞,來獲得真實的、主要的特徵數量,之後你可以運用10倍規則法來估測在得到效能良好的模型時,你所需要的訓練樣本數量。
與像邏輯迴歸這樣的線性模型相比,神經網路模型提出了一組不同的問題。為了得到神經網路中引數的數量你需要:
(1)如果你的輸入特徵是稀疏的,計算嵌入層中(我覺得就是隱含層)引數數量。
(2)計算神經網路模型中的邊數。
根本問題是在神經網路中引數之間的關係不再是線性的。所以基於邏輯迴歸模型的學習經驗總結不再適用於神經網路模型。在像諸如神經網路這樣的模型中,你可以將基於10倍規則法獲取的訓練樣本數量作為在模型訓練中輸入的訓練樣本量的一個下界。
譯者注:是在神經網路這樣非線性模型中,要想獲得一個性能良好的訓練模型,所需訓練資料最少為模型引數的10倍,實際上所需的訓練資料應該比這個還多。
儘管會存在以上的爭論,但是我的10倍規則法在大多數問題中都起到了作用。然而,帶著對10倍規則法的疑問,你可以在開源工具箱Tensorflow中插入你自己的模型以及對訓練樣本的數量和模型的訓練效果之間的關係作出一個假設,並通過模擬實驗來研究模型的訓練效果,如果你在執行過程中有了其它見解,歡迎隨時分享。
它是一個簡單的規則,但是有時候它是一個模型
這篇文獻主要是探討了如何通過設定合理的訓練樣本量來得到一個性能良好的模型。作者在這裡向我們介紹了一種可以合理設定訓練樣本量的10倍規則法——即是訓練樣本數量是模型引數數量的10倍。以此為基礎,引出了兩個特例:線性模型如邏輯迴歸模型、神經網路模型,來得到利用這種方法進行模型訓練的過程中可能產生的困惑或者不適用的情況,並且針對邏輯迴歸線性模型和神經網路模型如何進行改進以及怎麼結合10倍規則法獲得一個性能良好的訓練模型給出了相應的建議。
在我平常所做的模型訓練的實驗中,我曾經也經常遇到不知如何選取訓練樣本數量的問題,根據讀過的論文的經驗,來設定訓練資料的數量,不斷進行嘗試,之前並不知道有這種方法的存在,看了這篇論文獲得了一定的啟發,訓練資料的多少以及特徵的貢獻程度對一個模型進行分類或者回歸至關重要。
額外補充關於F-score值的介紹
準確率與召回率(Precision&Recall)
準確率和召回率是廣泛用於資訊檢索和統計學分類領域的兩個度量值,用來評價結果的質量。
其中精度是檢索出相關文件數與檢索出文檔總數的比率,衡量的是檢索系統的查準率;
召回率是指檢索出的相關文件數和文庫中所有的相關文件數的比率,衡量的是檢索系統的查全率。
一般來說,Precision就是檢索出來的條目(比如:文件、網頁等)有多少是準確的,Recall就是所有準確的條目有多少被檢索出來來。
正確率、召回率和F值是在眾多訓練模型中選出目標的重要指標。
1. 正確率=提取出的正確資訊條數/提取出的資訊條數
2. 召回率=提取出的正確資訊條數/樣本中的資訊條數
兩者取值在0和1之間,越接近數值1,查準率或查全率就越高。
3. F值=正確率*召回率*2/(正確率+召回率)
即F值即是正確率與召回率的平均值,且F值越好,說明模型的效能越好。
關於google開源工具箱Tensorflow
Tensorflow是一個基於流行資料進行數值計算的開源庫,類似於我們在進行SVM訓練時用的libSVM工具箱一樣。
更多可以關注公眾號Easy-soo,也可登入站點easysoo