本篇文章為大家介紹一種可解決機器學習問題的通用模板,內容節選自《Python深度學習》,個人覺得寫的非常好,可以拿來反復的研讀和領悟。
Part 01
定義問題,收集數據集
首先,你必須定義所面對的問題。
你的輸入數據是什么?你要預測什么?只有擁有可用的訓練數據,你才能學習預測某件事情。比如,只有同時擁有電影評論和情感標注,你才能學習對電影評論進行情感分類。因此,數據可用性通常是這一階段的限制因素(除非你有辦法付錢讓人幫你收集數據)。
你面對的是什么類型的問題?是二分類問題、多分類問題、標量回歸問題、向量回歸問題,還是多分類、多標簽問題?或者是其他問題,比如聚類、生成或強化學習?確定問題類型有助于你選擇模型架構、損失函數等。
只有明確了輸入、輸出以及所使用的數據,你才能進入下一階段。注意你在這一階段所做的假設,這點很重要。
?假設輸出是可以根據輸入進行預測的。
?假設可用數據包含足夠多的信息,足以學習輸入和輸出之間的關系。
在開發出工作模型之前,這些只是假設,等待驗證真假。并非所有問題都可以解決。你收集了包含輸入X和目標Y的很多樣例,并不意味著X包含足夠多的信息來預測Y。例如,如果你想根據某支股票最近的歷史價格來預測其股價走勢,那你成功的可能性不大,因為歷史價格并沒有包含很多可用于預測的信息。
有一類無法解決的問題你應該知道,那就是非平穩問題(nonstationary problem)。假設你想要構建一個服裝推薦引擎,并在一個月(八月)的數據上訓練,然后在冬天開始生成推薦結果。一個大問題是,人們購買服裝的種類是隨著季節變化的,即服裝購買在幾個月的尺度上是一個非平穩現象。你想要建模的對象隨著時間推移而改變。在這種情況下,正確的做法是不斷地利用最新數據重新訓練模型,或者在一個問題是平穩的時間尺度上收集數據。對于服裝購買這種周期性問題,幾年的數據足以捕捉到季節性變化,但一定要記住,要將一年中的時間作為模型的一個輸入。
請記住,機器學習只能用來記憶訓練數據中存在的模式。你只能識別出曾經見過的東西。在過去的數據上訓練機器學習來預測未來,這里存在一個假設,就是未來的規律與過去相同。但事實往往并非如此。
Part 02
選擇衡量成功的指標
要控制一件事物,就需要能夠觀察它。要取得成功,就必須給出成功的定義:精度?準確率(precision)和召回率(recall)?客戶保留率?衡量成功的指標將指引你選擇損失函數,即模型要優化什么。它應該直接與你的目標(如業務成功)保持一致。
對于平衡分類問題(每個類別的可能性相同),精度和接收者操作特征曲線下面積(area under the receiver operatingcharacteristiccurve, ROC AUC)是常用的指標。
對于類別不平衡的問題,你可以使用準確率和召回率。對于排序問題或多標簽分類,你可以使用平均準確率均值(mean averageprecision)。自定義衡量成功的指標也很常見。
Part 03
確定評估方法
一旦明確了目標,你必須確定如何衡量當前的進展。前面介紹了三種常見的評估方法。
? 留出驗證集。數據量很大時可以采用這種方法。
? K折交叉驗證。如果留出驗證的樣本量太少,無法保證可靠性,那么應該選擇這種方法。
? 重復的K折驗證。如果可用的數據很少,同時模型評估又需要非常準確,那么應該使用這種方法。
只需選擇三者之一。大多數情況下,第一種方法足以滿足要求。
Part 04
準備數據
一旦知道了要訓練什么、要優化什么以及評估方法,那么你就幾乎已經準備好訓練模型了。但首先你應該將數據格式化,使其可以輸入到機器學習模型中(這里假設模型為深度神經網絡)。
? 如前所述,應該將數據格式化為張量。
? 這些張量的取值通常應該縮放為較小的值,比如在[-1,1]區間或[0,1]區間。
? 如果不同的特征具有不同的取值范圍(異質數據),那么應該做數據標準化。
?你可能需要做特征工程,尤其是對于小數據問題。準備好輸入數據和目標數據的張量后,你就可以開始訓練模型了。
Part 05
開發比基準更好的模型
這一階段的目標是獲得統計功效(statistical power),即開發一個小型模型,它能夠打敗純隨機的基準(dumbbaseline)。
在MNIST數字分類的例子中,任何精度大于0.1的模型都可以說具有統計功效;在IMDB的例子中,任何精度大于0.5的模型都可以說具有統計功效。
注意,不一定總是能獲得統計功效。如果你嘗試了多種合理架構之后仍然無法打敗隨機基準,那么原因可能是問題的答案并不在輸入數據中。要記住你所做的兩個假設。
?假設輸出是可以根據輸入進行預測的。
?假設可用的數據包含足夠多的信息,足以學習輸入和輸出之間的關系。這些假設很可能是錯誤的,這樣的話你需要從頭重新開始。如果一切順利,你還需要選擇三個關鍵參數來構建第一個工作模型。
?最后一層的激活。它對網絡輸出進行有效的限制。例如,IMDB分類的例子在最后一層使用了sigmoid,回歸的例子在最后一層沒有使用激活,等等。
?損失函數。它應該匹配你要解決的問題的類型。例如,IMDB的例子使用binary_crossentropy、回歸的例子使用mse,等等。
?優化配置。你要使用哪種優化器?學習率是多少?大多數情況下,使用rmsprop及其默認的學習率是穩妥的。
關于損失函數的選擇,需要注意,直接優化衡量問題成功的指標不一定總是可行的。有時難以將指標轉化為損失函數,要知道,損失函數需要在只有小批量數據時即可計算(理想情況下,只有一個數據點時,損失函數應該也是可計算的),而且還必須是可微的(否則無法用反向傳播來訓練網絡)。例如,廣泛使用的分類指標ROC AUC就不能被直接優化。因此在分類任務中,常見的做法是優化ROC AUC的替代指標,比如交叉熵。一般來說,你可以認為交叉熵越小,ROC AUC越大。
下表列出了常見問題類型的最后一層激活和損失函數,可以幫你進行選擇。
Part 06
擴大模型規模:開發過擬合的模型
一旦得到了具有統計功效的模型,問題就變成了:模型是否足夠強大?它是否具有足夠多的層和參數來對問題進行建模?
例如,只有單個隱藏層且只有兩個單元的網絡,在MNIST問題上具有統計功效,但并不足以很好地解決問題。請記住,機器學習中無處不在的對立是優化和泛化的對立,理想的模型是剛好在欠擬合和過擬合的界線上,在容量不足和容量過大的界線上。
為了找到這條界線,你必須穿過它。要搞清楚你需要多大的模型,就必須開發一個過擬合的模型,這很簡單。
(1)添加更多的層。
(2) 讓每一層變得更大。
(3) 訓練更多的輪次。
要始終監控訓練損失和驗證損失,以及你所關心的指標的訓練值和驗證值。如果你發現模型在驗證數據上的性能開始下降,那么就出現了過擬合。
下一階段將開始正則化和調節模型,以便盡可能地接近理想模型,既不過擬合也不欠擬合。
Part 07
模型正則化與調節超參數
這一步是最費時間的:你將不斷地調節模型、訓練、在驗證數據上評估(這里不是測試數據)、再次調節模型,然后重復這一過程,直到模型達到最佳性能。你應該嘗試以下幾項。
?添加dropout。
?嘗試不同的架構:增加或減少層數。
? 添加L1和/或L2正則化。
?嘗試不同的超參數(比如每層的單元個數或優化器的學習率),以找到最佳配置。
?(可選)反復做特征工程:添加新特征或刪除沒有信息量的特征。請注意:每次使用驗證過程的反饋來調節模型,都會將有關驗證過程的信息泄露到模型中。如果只重復幾次,那么無關緊要;但如果系統性地迭代許多次,最終會導致模型對驗證過程過擬合(即使模型并沒有直接在驗證數據上訓練)。這會降低驗證過程的可靠性。
一旦開發出令人滿意的模型配置,你就可以在所有可用數據(訓練數據+驗證數據)上訓練最終的生產模型,然后在測試集上最后評估一次。如果測試集上的性能比驗證集上差很多,那么這可能意味著你的驗證流程不可靠,或者你在調節模型參數時在驗證數據上出現了過擬合。在這種情況下,你可能需要換用更加可靠的評估方法,比如重復的K折驗證。
編輯:黃飛
?
評論