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









評(píng)論