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

Part 06
擴(kuò)大模型規(guī)模:開發(fā)過擬合的模型
一旦得到了具有統(tǒng)計功效的模型,問題就變成了:模型是否足夠強(qiáng)大?它是否具有足夠多的層和參數(shù)來對問題進(jìn)行建模?
例如,只有單個隱藏層且只有兩個單元的網(wǎng)絡(luò),在MNIST問題上具有統(tǒng)計功效,但并不足以很好地解決問題。請記住,機(jī)器學(xué)習(xí)中無處不在的對立是優(yōu)化和泛化的對立,理想的模型是剛好在欠擬合和過擬合的界線上,在容量不足和容量過大的界線上。
為了找到這條界線,你必須穿過它。要搞清楚你需要多大的模型,就必須開發(fā)一個過擬合的模型,這很簡單。
(1)添加更多的層。
(2) 讓每一層變得更大。
(3) 訓(xùn)練更多的輪次。
要始終監(jiān)控訓(xùn)練損失和驗證損失,以及你所關(guān)心的指標(biāo)的訓(xùn)練值和驗證值。如果你發(fā)現(xiàn)模型在驗證數(shù)據(jù)上的性能開始下降,那么就出現(xiàn)了過擬合。
下一階段將開始正則化和調(diào)節(jié)模型,以便盡可能地接近理想模型,既不過擬合也不欠擬合。
Part 07
模型正則化與調(diào)節(jié)超參數(shù)
這一步是最費時間的:你將不斷地調(diào)節(jié)模型、訓(xùn)練、在驗證數(shù)據(jù)上評估(這里不是測試數(shù)據(jù))、再次調(diào)節(jié)模型,然后重復(fù)這一過程,直到模型達(dá)到最佳性能。你應(yīng)該嘗試以下幾項。
?添加dropout。
?嘗試不同的架構(gòu):增加或減少層數(shù)。
? 添加L1和/或L2正則化。
?嘗試不同的超參數(shù)(比如每層的單元個數(shù)或優(yōu)化器的學(xué)習(xí)率),以找到最佳配置。
?(可選)反復(fù)做特征工程:添加新特征或刪除沒有信息量的特征。請注意:每次使用驗證過程的反饋來調(diào)節(jié)模型,都會將有關(guān)驗證過程的信息泄露到模型中。如果只重復(fù)幾次,那么無關(guān)緊要;但如果系統(tǒng)性地迭代許多次,最終會導(dǎo)致模型對驗證過程過擬合(即使模型并沒有直接在驗證數(shù)據(jù)上訓(xùn)練)。這會降低驗證過程的可靠性。
一旦開發(fā)出令人滿意的模型配置,你就可以在所有可用數(shù)據(jù)(訓(xùn)練數(shù)據(jù)+驗證數(shù)據(jù))上訓(xùn)練最終的生產(chǎn)模型,然后在測試集上最后評估一次。如果測試集上的性能比驗證集上差很多,那么這可能意味著你的驗證流程不可靠,或者你在調(diào)節(jié)模型參數(shù)時在驗證數(shù)據(jù)上出現(xiàn)了過擬合。在這種情況下,你可能需要換用更加可靠的評估方法,比如重復(fù)的K折驗證。
編輯:黃飛
?
電子發(fā)燒友App









評論