本章涵蓋了以下主題:
?分類和回歸之外的其他類型的問題;
?評(píng)估問題,理解過擬合、欠擬合,以及解決這些問題的技巧;
?為深度學(xué)習(xí)準(zhǔn)備數(shù)據(jù)。
請(qǐng)記住,在本章中討論的大多數(shù)技術(shù)都是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)通用的,一部分用于解決過擬合問題的技術(shù)(如dropout)除外。
4.1三類機(jī)器學(xué)習(xí)問題
在之前的所有例子中,嘗試解決的是分類(預(yù)測(cè)貓或狗)或回歸(預(yù)測(cè)用戶在平臺(tái)上花費(fèi)的平均時(shí)間)問題。所有這些都是有監(jiān)督學(xué)習(xí)的例子,目的是找到訓(xùn)練樣例和目標(biāo)之間的映射關(guān)系,并用來預(yù)測(cè)未知數(shù)據(jù)。
有監(jiān)督學(xué)習(xí)只是機(jī)器學(xué)習(xí)的一部分,機(jī)器學(xué)習(xí)也有其他不同的部分。以下是3種不同類型的機(jī)器學(xué)習(xí):
?有監(jiān)督學(xué)習(xí);
?無監(jiān)督學(xué)習(xí);
?強(qiáng)化學(xué)習(xí)。
下面詳細(xì)講解各種算法。
4.1.1有監(jiān)督學(xué)習(xí)
在深度學(xué)習(xí)和機(jī)器學(xué)習(xí)領(lǐng)域中,大多數(shù)成功用例都屬于有監(jiān)督學(xué)習(xí)。本書中所涵蓋的大多數(shù)例子也都是有監(jiān)督學(xué)習(xí)的一部分。來看看有監(jiān)督學(xué)習(xí)的一些常見的例子。
?分類問題:狗和貓的分類。
?回歸問題:預(yù)測(cè)股票價(jià)格、板球比賽成績等。
?圖像分割:進(jìn)行像素級(jí)分類。對(duì)于自動(dòng)汽車駕駛來說,從攝像機(jī)拍攝的照片中,識(shí)別出每個(gè)像素屬于什么物體是很重要的。這些像素可以是汽車、行人、樹、公共汽車等。
?語音識(shí)別:OK Google、Alexa和Siri都是語音識(shí)別的例子。
?語言翻譯:從一種語言翻譯成另一種語言。
4.1.2無監(jiān)督學(xué)習(xí)
在沒有標(biāo)簽數(shù)據(jù)的情況時(shí),可以通過可視化和壓縮來幫助無監(jiān)督學(xué)習(xí)技術(shù)理解數(shù)據(jù)。兩種常用的無監(jiān)督學(xué)習(xí)技術(shù)是:
?聚類;
?降維。
聚類有助于將所有相似的數(shù)據(jù)點(diǎn)組合在一起。降維有助于減少維數(shù),從而可視化高維數(shù)據(jù),并找到任何隱藏的模式。
4.1.3強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí)是最不流行的機(jī)器學(xué)習(xí)范疇。在真實(shí)世界中沒有發(fā)現(xiàn)它的成功用例。然而,近年來有了些改變,來自Google的DeepMind團(tuán)隊(duì)成功地構(gòu)建了基于強(qiáng)化學(xué)習(xí)的系統(tǒng),并且在AlphaGo比賽中贏得世界冠軍。計(jì)算機(jī)可以在比賽中擊敗人類的這種技術(shù)上的進(jìn)展,曾被認(rèn)為需要花費(fèi)數(shù)十年時(shí)間才能實(shí)現(xiàn)。然而,使用深度學(xué)習(xí)和強(qiáng)化學(xué)習(xí)卻可以這么快就達(dá)到目標(biāo),比任何人所預(yù)見的都要快。這些技術(shù)已經(jīng)可以看到早期的成功,但可能需要幾年時(shí)間才能成為主流。
在本書中,我們將主要關(guān)注有監(jiān)督的技術(shù)和一些特定于深度學(xué)習(xí)的無監(jiān)督技術(shù),例如用于創(chuàng)建特定風(fēng)格圖片的生成網(wǎng)絡(luò):風(fēng)格遷移(style transfer)和生成對(duì)抗網(wǎng)絡(luò)(generative adversarial network)。
4.2機(jī)器學(xué)習(xí)術(shù)語
前面幾章出現(xiàn)了大量的術(shù)語,如果大家剛?cè)腴T機(jī)器學(xué)習(xí)或深度學(xué)習(xí)領(lǐng)域,這些術(shù)語看起來會(huì)比較生疏。這里將列出機(jī)器學(xué)習(xí)中常用的多數(shù)術(shù)語,這些通常也在深度學(xué)習(xí)文獻(xiàn)中使用。
?樣本(sample)或輸入(input)或數(shù)據(jù)點(diǎn)(data point):訓(xùn)練集中特定的實(shí)例。我們?cè)谏弦徽轮锌吹降膱D像分類問題,每個(gè)圖像都可以被稱為樣本、輸入或數(shù)據(jù)點(diǎn)。
?預(yù)測(cè)(prediction)或輸出(output):由算法生成的值稱為輸出。例如,在先前的例子中,我們的算法對(duì)特定圖像預(yù)測(cè)的結(jié)果為0,而0是給定的貓的標(biāo)簽,所以數(shù)字0就是我們的預(yù)測(cè)或輸出。
?目標(biāo)(target)或標(biāo)簽(label):圖像實(shí)際標(biāo)注的標(biāo)簽。
?損失值(loss value)或預(yù)測(cè)誤差(prediction error):預(yù)測(cè)值與實(shí)際值之間的差距。數(shù)值越小,準(zhǔn)確率越高。
?類別(classes):給定數(shù)據(jù)集的一組可能的值或標(biāo)簽。在前一章的例子中有貓和狗兩種類別。
?二分類(binary classification):將輸入實(shí)例歸類為兩個(gè)互斥類別中的其中一個(gè)的分類任務(wù)。
?多類別分類(multi-class classification):將輸入實(shí)例歸類為兩個(gè)以上的不同類別的分類任務(wù)。
?多標(biāo)簽分類(multi-label classification):一個(gè)輸入實(shí)例可以用多個(gè)標(biāo)簽來標(biāo)記。例如根據(jù)提供的食物不同來標(biāo)記餐館,如意大利菜、墨西哥菜和印度菜。另一個(gè)常見的例子是圖片中的對(duì)象檢測(cè),它使用算法識(shí)別出圖片中的不同對(duì)象。
?標(biāo)量回歸(scalar regression):每個(gè)輸入數(shù)據(jù)點(diǎn)都與一個(gè)標(biāo)量質(zhì)量(scalar quality)相關(guān)聯(lián),該標(biāo)量質(zhì)量是數(shù)值型的。這樣的例子有預(yù)測(cè)房價(jià)、股票價(jià)格和板球得分等。
?向量回歸(vector regression):算法需要預(yù)測(cè)不止一個(gè)標(biāo)量質(zhì)量。一個(gè)很好的例子當(dāng)你試圖識(shí)別圖片中魚的位置邊界框時(shí)。為了預(yù)測(cè)邊界框,您的算法需要預(yù)測(cè)表示正方形邊緣的4個(gè)標(biāo)量。
?批(batch):大多數(shù)情況下,我們?cè)诜Q為批的輸入樣本集上訓(xùn)練我們的算法。取決于GPU的內(nèi)存,批尺寸一般從2~256不等,權(quán)重也在每個(gè)批次上進(jìn)行更新,因此算法往往比在單個(gè)樣例上訓(xùn)練時(shí)學(xué)習(xí)的更快。
?輪數(shù):在整個(gè)數(shù)據(jù)集上運(yùn)行一遍算法稱為一個(gè)Epoch。通常要訓(xùn)練(更新權(quán)重)幾個(gè)Epoch。
4.3評(píng)估機(jī)器學(xué)習(xí)模型
在上一章中介紹的圖像分類示例中,我們將數(shù)據(jù)分成兩個(gè)不同的部分,一個(gè)用于訓(xùn)練,一個(gè)用于驗(yàn)證。使用單獨(dú)的數(shù)據(jù)集來測(cè)試算法的性能是一種很好的做法,因?yàn)樵谟?xùn)練集上測(cè)試算法可能無法讓用戶獲得算法真正的泛化能力。在大多數(shù)現(xiàn)實(shí)世界的用例中,基于驗(yàn)證的準(zhǔn)確率,我們經(jīng)常以不同方式來調(diào)整算法,例如添加更多的層或不同的層,或者使用不同的技術(shù),這些將在本章的后面部分進(jìn)行介紹。因此,選擇基于驗(yàn)證數(shù)據(jù)集來調(diào)整算法的可能性更高。以這種方式訓(xùn)練的算法往往在訓(xùn)練數(shù)據(jù)集和驗(yàn)證數(shù)據(jù)集上表現(xiàn)良好,但當(dāng)應(yīng)用到未知的數(shù)據(jù)時(shí)可能會(huì)失敗。驗(yàn)證數(shù)據(jù)集上的信息泄露會(huì)影響到對(duì)算法的調(diào)整。
為了避免信息泄露并改進(jìn)泛化的問題,通常的做法是將數(shù)據(jù)集分成3個(gè)不同的部分,即訓(xùn)練、驗(yàn)證和測(cè)試數(shù)據(jù)集。我們?cè)谟?xùn)練集和驗(yàn)證集上訓(xùn)練算法并調(diào)優(yōu)所有超參數(shù)。最后,當(dāng)完成整個(gè)訓(xùn)練時(shí),在測(cè)試數(shù)據(jù)集上對(duì)算法進(jìn)行測(cè)試。我們討論過有兩種類型的參數(shù)。一種是在算法內(nèi)使用的參數(shù)或權(quán)重,通過優(yōu)化器或反向傳播進(jìn)行調(diào)優(yōu)。另一種是稱為超參數(shù)(hyper parameter)的參數(shù),這些參數(shù)控制著網(wǎng)絡(luò)中所用層的數(shù)量、學(xué)習(xí)率以及通常改變架構(gòu)(這種改變經(jīng)常是手動(dòng)調(diào)整的)的其他類型的參數(shù)。
特定的算法在訓(xùn)練集中表現(xiàn)非常優(yōu)越,但在驗(yàn)證集或測(cè)試集上卻表現(xiàn)不佳的現(xiàn)象稱為過擬合(overfitting),或者說算法缺乏泛化的能力。存在一種相反的現(xiàn)象,即算法在訓(xùn)練集上的表現(xiàn)不佳,這種現(xiàn)象稱為欠擬合(underfitting)。后面將學(xué)習(xí)可以幫助解決過擬合和欠擬合問題的不同策略。
在了解過擬合和欠擬合之前,先看看可用于拆分?jǐn)?shù)據(jù)集的各種策略。
4.3.1訓(xùn)練、驗(yàn)證和測(cè)試集的拆分
將數(shù)據(jù)劃分成3個(gè)部分——訓(xùn)練、驗(yàn)證和測(cè)試數(shù)據(jù)集是最佳實(shí)踐。使用保留(holdout)數(shù)據(jù)集的最佳方法如下所示。
1.在訓(xùn)練數(shù)據(jù)集上訓(xùn)練算法。
2.在驗(yàn)證數(shù)據(jù)集上進(jìn)行超參數(shù)調(diào)優(yōu)。
3.迭代執(zhí)行前兩個(gè)步驟,直到達(dá)到預(yù)期的性能。
4.在凍結(jié)算法和超參數(shù)后,在測(cè)試數(shù)據(jù)集上進(jìn)行評(píng)估。
應(yīng)避免只將數(shù)據(jù)劃分成兩部分,因?yàn)檫@可能導(dǎo)致信息泄露。在相同的數(shù)據(jù)集上進(jìn)行訓(xùn)練和測(cè)試是絕對(duì)不不允許的,這將無法保證算法的泛化能力。將數(shù)據(jù)分割成訓(xùn)練集和驗(yàn)證集有3種常用的保留策略,它們是:
?簡單保留驗(yàn)證;
?K折驗(yàn)證;
?迭代K折驗(yàn)證。
1.簡單保留驗(yàn)證
劃分一定比例的數(shù)據(jù)作為測(cè)試數(shù)據(jù)集。留出多大比例的數(shù)據(jù)可能是和特定問題相關(guān)的,并且很大程度上依賴于可用的數(shù)據(jù)量。特別是對(duì)于計(jì)算機(jī)視覺和自然語言處理領(lǐng)域中的問題,收集標(biāo)簽數(shù)據(jù)可能非常昂貴,因此留出30%的測(cè)試數(shù)據(jù)(比例相當(dāng)大)可能會(huì)使算法學(xué)習(xí)起來非常困難,因?yàn)橛糜谟?xùn)練的數(shù)據(jù)很少。因此,需要根據(jù)數(shù)據(jù)的可用性,謹(jǐn)慎地選擇劃分比例。測(cè)試數(shù)據(jù)拆分后,在凍結(jié)算法及其超參數(shù)前,要保持?jǐn)?shù)據(jù)的隔離。為了給問題選擇最佳超參數(shù),請(qǐng)選擇單獨(dú)的驗(yàn)證數(shù)據(jù)集。為了避免過擬合,通常將可用數(shù)據(jù)劃分成3個(gè)不同的集合,如圖4.1所示。
上一章使用了圖4.1的簡單實(shí)現(xiàn)來創(chuàng)建驗(yàn)證數(shù)據(jù)集,實(shí)現(xiàn)的快照如下:
圖4.1
這是最簡單的保留策略之一,通常在開始時(shí)使用。在小型數(shù)據(jù)集上使用這種劃分策略有一個(gè)弊端,驗(yàn)證數(shù)據(jù)集或測(cè)試數(shù)據(jù)集中的現(xiàn)有數(shù)據(jù)可能不具有統(tǒng)計(jì)代表性。在劃分?jǐn)?shù)據(jù)前混洗數(shù)據(jù)即可以輕松意識(shí)到這一點(diǎn)。如果得到的結(jié)果不一致,那么需要使用更好的方法。為了避免這個(gè)問題,我們最后通常使用K折(K-fold)驗(yàn)證或迭代K折(iterated k-fold)驗(yàn)證。
2.K折驗(yàn)證
留出一定比例的數(shù)據(jù)用于測(cè)試,然后將整個(gè)數(shù)據(jù)集分成K個(gè)數(shù)據(jù)包,其中K可以是任意數(shù)值,通常從2到10不等。在任意給定的迭代中,選取一個(gè)包作為驗(yàn)證數(shù)據(jù)集,并用其余的數(shù)據(jù)包訓(xùn)練算法。最后的評(píng)分通常是在K個(gè)包上獲得的所有評(píng)分的平均值。圖4.2所示為一個(gè)K折驗(yàn)證的實(shí)現(xiàn),其中K為4;也就是說,數(shù)據(jù)劃分成4部分(稱為4折驗(yàn)證)。
使用K折驗(yàn)證數(shù)據(jù)集時(shí),要注意的一個(gè)關(guān)鍵問題是它的代價(jià)非常昂貴,因?yàn)樾枰跀?shù)據(jù)集的不同部分上運(yùn)行該算法數(shù)次,這對(duì)于計(jì)算密集型算法來說是非常昂貴的,特別是在計(jì)算機(jī)視覺算法領(lǐng)域。有時(shí)候,訓(xùn)練算法可以花費(fèi)從幾分鐘到幾天的時(shí)間。所以,請(qǐng)謹(jǐn)慎地使用這項(xiàng)技術(shù)。
3.帶混洗的K折驗(yàn)證
為了使算法變得復(fù)雜和健壯,可以在每次創(chuàng)建保留的驗(yàn)證數(shù)據(jù)集時(shí)混洗數(shù)據(jù)。當(dāng)小幅度的性能提升提升可能會(huì)對(duì)業(yè)務(wù)產(chǎn)生巨大影響時(shí),這種做法是有益的。如果我們的情況是快速構(gòu)建和部署算法,并且可以接受百分之幾的性能差異,那么這種方法可能并不值得。所有這一切都取決于試圖要解決的問題,以及對(duì)準(zhǔn)確率的要求。
圖4.2
在拆分?jǐn)?shù)據(jù)時(shí)可能需要考慮其他一些事情,例如:
?數(shù)據(jù)代表性;
?時(shí)間敏感性;
?數(shù)據(jù)冗余。
1.數(shù)據(jù)代表性
在上一章中的例子中,我們把圖像分類為狗或者貓。假設(shè)有這樣一個(gè)場(chǎng)景,所有的圖像已被排序,其中前60%的圖像是狗,其余的是貓。如果選擇前面的80%作為訓(xùn)練數(shù)據(jù)集,其余的作為驗(yàn)證集來分割這個(gè)數(shù)據(jù)集,那么驗(yàn)證數(shù)據(jù)集將無法代表數(shù)據(jù)集的真實(shí)性,因?yàn)樗话埖膱D像。因此,在這些情況下,應(yīng)該注意通過在分割或進(jìn)行分層抽樣之前對(duì)數(shù)據(jù)進(jìn)行混洗來實(shí)現(xiàn)數(shù)據(jù)的良好混合。分層抽樣是指從每個(gè)類別中提取數(shù)據(jù)點(diǎn)來創(chuàng)建驗(yàn)證和測(cè)試數(shù)據(jù)集。
2.時(shí)間敏感性
讓我們以股價(jià)預(yù)測(cè)為例。我們有從1月到12月的數(shù)據(jù)。在這種情況下,如果進(jìn)行混洗或分層抽樣,那么最終將會(huì)造成信息的泄露,因?yàn)閮r(jià)格很可能是時(shí)間敏感的。因此,創(chuàng)建驗(yàn)證數(shù)據(jù)集時(shí)應(yīng)采用不會(huì)引起信息泄露的方式。本例中,選擇12月的數(shù)據(jù)作為驗(yàn)證數(shù)據(jù)集可能更合理。實(shí)際的股價(jià)預(yù)測(cè)用例比這要復(fù)雜得多,因此在選擇驗(yàn)證分割時(shí),特定領(lǐng)域的知識(shí)也會(huì)發(fā)揮作用。
3.數(shù)據(jù)冗余
重復(fù)數(shù)據(jù)是很常見的。需要注意的是,在訓(xùn)練、驗(yàn)證和測(cè)試集中存在的數(shù)據(jù)應(yīng)該是唯一的。如果有重復(fù),那么模型可能無法很好地泛化未知數(shù)據(jù)。
4.4數(shù)據(jù)預(yù)處理與特征工程
我們已經(jīng)了解了使用不同的方法來劃分?jǐn)?shù)據(jù)集并構(gòu)建評(píng)估策略。在大多數(shù)情況下,接收到的數(shù)據(jù)可能并不是訓(xùn)練算法立即可用的格式。本節(jié)將介紹一些預(yù)處理技術(shù)和特征工程技術(shù)。雖然大部分的特征工程技術(shù)都是針對(duì)特定領(lǐng)域的,特別是計(jì)算機(jī)視覺和文本處理領(lǐng)域,但還是有一些通用的特征工程技術(shù),這將在本章中討論。
神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)預(yù)處理是一個(gè)使數(shù)據(jù)更適合于深度學(xué)習(xí)算法訓(xùn)練的過程。以下是一些常用的數(shù)據(jù)預(yù)處理步驟:
?向量化;
?歸一化;
?缺失值;
?特征提取。
4.4.1向量化
數(shù)據(jù)通常表現(xiàn)為各種格式,如文本、聲音、圖像和視頻。首先要做的就是把數(shù)據(jù)轉(zhuǎn)換成PyTorch張量。在前面的例子中,使用tourchvision的工具函數(shù)將Python圖形庫(Python Imaging Library,PIL)的圖片轉(zhuǎn)換成張量對(duì)象,盡管PyTorchtorchvision庫抽取出了大部分的復(fù)雜度。在第7章中處理遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)時(shí),將了解如何把文本數(shù)據(jù)轉(zhuǎn)換成PyTorch張量。對(duì)于涉及結(jié)構(gòu)化數(shù)據(jù)的問題,數(shù)據(jù)已經(jīng)以向量化的格式存在,我們需要做的就是把它們轉(zhuǎn)換成PyTorch張量。
4.4.2值歸一化
在將數(shù)據(jù)傳遞到任何機(jī)器學(xué)習(xí)算法或深度學(xué)習(xí)算法之前,將特征歸一化是一種通用實(shí)踐。它有助于更快地訓(xùn)練算法并達(dá)到更高的性能。歸一化是指,將特定特征的數(shù)據(jù)表示成均值為0、標(biāo)準(zhǔn)差為1的數(shù)據(jù)的過程。
在上一章所描述的狗貓分類的例子中,使用了ImageNet數(shù)據(jù)集中已有的均值和標(biāo)準(zhǔn)差來歸一化數(shù)據(jù)。我們選擇ImageNet數(shù)據(jù)集的均值和標(biāo)準(zhǔn)差的原因,是因?yàn)槭褂玫腞eNet模型的權(quán)重是在ImageNet上進(jìn)行預(yù)訓(xùn)練的。通常的做法是將每個(gè)像素值除以255,使得所有值都在0和1之間,尤其是在不使用預(yù)訓(xùn)練權(quán)重的情況下。
歸一化也適用于涉及結(jié)構(gòu)化數(shù)據(jù)的問題。假設(shè)我們正在研究房價(jià)預(yù)測(cè)問題,可能存在不同規(guī)模的不同特征。例如,到最近的機(jī)場(chǎng)的距離和房子的屋齡是具備不同度量的變量或特征。將它們與神經(jīng)網(wǎng)絡(luò)一起使用可以防止梯度收斂。簡單來說,損失可能不會(huì)像預(yù)期的那樣下降。因此,在對(duì)算法進(jìn)行訓(xùn)練之前,應(yīng)該謹(jǐn)慎地將歸一化應(yīng)用到任何類型的數(shù)據(jù)上。為了使算法或模型性能更好,應(yīng)確保數(shù)據(jù)遵循以下規(guī)則。
?取較小的值:通常取值在0和1之間。
?相同值域:確保所有特征都在同一數(shù)據(jù)范圍內(nèi)。
4.4.3處理缺失值
缺失值在現(xiàn)實(shí)世界的機(jī)器學(xué)習(xí)問題中是很常見的。從之前預(yù)測(cè)房價(jià)的例子來看,房屋屋齡的某些信息可能會(huì)丟失。通常用不可能出現(xiàn)的數(shù)字替換缺失值是安全的。算法將能夠識(shí)別模式。還有其他技術(shù)可用于處理更特定領(lǐng)域的缺失值。
4.4.4特征工程
特征工程是利用特定問題的領(lǐng)域知識(shí)來創(chuàng)建可以傳遞給模型的新變量或特征的過程。為了更好地理解,來看一個(gè)銷售預(yù)測(cè)的問題。假設(shè)我們有促銷日期、假期、競爭者的開始日期、與競爭對(duì)手的距離以及特定日期的銷售情況。在現(xiàn)實(shí)世界中,有數(shù)以百計(jì)的特征可以用來預(yù)測(cè)店鋪的價(jià)格,可能有一些信息在預(yù)測(cè)銷售方面很重要。一些重要的特征或衍生價(jià)值是:
?知道下一次促銷的日期;
?距離下一個(gè)假期還有多少天;
?競爭對(duì)手的業(yè)務(wù)開放天數(shù)。
還有許多這樣的特征可以從領(lǐng)域知識(shí)中提取出來。對(duì)于任何機(jī)器學(xué)習(xí)算法或深度學(xué)習(xí)算法,算法自動(dòng)提取這種類別的特征都是相當(dāng)具有挑戰(zhàn)性的。對(duì)于某些領(lǐng)域,特別是在計(jì)算機(jī)視覺和文本領(lǐng)域,現(xiàn)代深度學(xué)習(xí)算法有助于我們擺脫特征工程。除了這些領(lǐng)域,良好的特征工程對(duì)下述方面也總是有益的。
?用較少的計(jì)算資源就可以更快地解決問題。
?深度學(xué)習(xí)算法可以使用大量數(shù)據(jù)自己學(xué)習(xí)出特征,不再使用手動(dòng)的特征工程。所以,如果你注重?cái)?shù)據(jù),可以專注于構(gòu)建良好的特征工程。
4.5過擬合與欠擬合
理解過擬合和欠擬合是成功構(gòu)建機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型的關(guān)鍵。在本章的開頭,我們簡要地描述了什么是過擬合和欠擬合,這里將詳細(xì)解釋過擬合和欠擬合的概念,以及如何解決過擬合和欠擬合問題。
過擬合或不泛化,是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中的一類常見問題。當(dāng)特定的算法在訓(xùn)練數(shù)據(jù)集上執(zhí)行得很好,但在未知數(shù)據(jù)或驗(yàn)證和測(cè)試數(shù)據(jù)集上表現(xiàn)不佳時(shí),就說算法過擬合了。這種情況的發(fā)生主要是因?yàn)樗惴ㄟ^于特定于訓(xùn)練集而造成的。簡單來說,我們可以理解為該算法找出了一種方法來記憶數(shù)據(jù)集,使其在訓(xùn)練數(shù)據(jù)集上表現(xiàn)得很好,但無法對(duì)未知數(shù)據(jù)執(zhí)行。有不同的技術(shù)可以用來避免算法的過擬合。這些技術(shù)是:
?獲取更多數(shù)據(jù);
?縮小網(wǎng)絡(luò)規(guī)模;
?應(yīng)用權(quán)重正則化;
?應(yīng)用dropout。
4.5.1獲取更多數(shù)據(jù)
如果能夠獲得更多的用于算法訓(xùn)練的數(shù)據(jù),則可以通過關(guān)注一般模式而不是特定于小數(shù)據(jù)點(diǎn)的模式來幫助算法避免過擬合。在某些情況下,獲取更多標(biāo)簽數(shù)據(jù)可能是一項(xiàng)挑戰(zhàn)。
有一些技術(shù),如數(shù)據(jù)增強(qiáng),可用于在計(jì)算機(jī)視覺相關(guān)的問題中生成更多的訓(xùn)練數(shù)據(jù)。數(shù)據(jù)增強(qiáng)是一種讓用戶通過執(zhí)行不同的操作,如旋轉(zhuǎn)、裁剪和生成更多數(shù)據(jù),來輕微調(diào)整圖像的技術(shù)。在對(duì)行業(yè)知識(shí)足夠了解時(shí),如果獲取實(shí)際數(shù)據(jù)的成本很高,也可以創(chuàng)建人造數(shù)據(jù)。當(dāng)無法獲得更多數(shù)據(jù)時(shí),還有其他方法可以幫助避免過擬合。讓我們看看這些方法。
4.5.2縮小網(wǎng)絡(luò)規(guī)模
網(wǎng)絡(luò)的大小通常是指網(wǎng)絡(luò)中使用的層數(shù)或權(quán)重參數(shù)的數(shù)量。在上一章中的圖像分類例子中,我們使用了一個(gè)ResNet模型,它包含具有不同層的18個(gè)組成模塊。PyTorch中的torchvision庫具有不同大小的ResNet模型,從18個(gè)塊開始,最多可達(dá)152個(gè)塊。比如說,如果我們使用具有152個(gè)塊的ResNet模型導(dǎo)致了過擬合,那么可以嘗試使用101個(gè)塊或50個(gè)塊的ResNet。在構(gòu)建的自定義架構(gòu)中,可以簡單地去除一些中間線性層,從而阻止我們的PyTorch模型記憶訓(xùn)練數(shù)據(jù)集。讓我們來看一個(gè)示例代碼片段,它演示了縮小網(wǎng)絡(luò)規(guī)模的確切含義:
上面的架構(gòu)有3個(gè)線性層,假設(shè)它在訓(xùn)練數(shù)據(jù)上過擬合了,讓我們重新創(chuàng)建更低容量的架構(gòu):
上面的架構(gòu)只有兩個(gè)線性層,減少了容量后,潛在地避免了訓(xùn)練數(shù)據(jù)集的過擬合問題。
4.5.3應(yīng)用權(quán)重正則化
有助于解決過擬合或泛化問題的關(guān)鍵原則之一是建立更簡單的模型。一種構(gòu)建簡單模型的技術(shù)是通過減小模型大小來降低架構(gòu)的復(fù)雜性。另一個(gè)重要的事情是確保不會(huì)采用更大的網(wǎng)絡(luò)權(quán)重值。當(dāng)模型的權(quán)重較大時(shí),正則化通過懲罰模型來提供對(duì)網(wǎng)絡(luò)的約束。每當(dāng)模型使用較大的權(quán)重值時(shí),正則化開始啟動(dòng)并增加損失值,從而懲罰模型。有兩種類型的可能的正則化方案,如下所示。
?L1正則化:權(quán)重系數(shù)的絕對(duì)值之和被添加到成本中。它通常稱為權(quán)重的L1范數(shù)。
?L2正則化:所有權(quán)重系數(shù)的平方和被添加到成本中。它通常稱為權(quán)重的L2范數(shù)。
PyTorch提供了一種使用L2正則化的簡單方法,就是通過在優(yōu)化器中啟用weight_decay參數(shù):
默認(rèn)情況下,權(quán)重衰減參數(shù)設(shè)置為0。可以嘗試不同的權(quán)重衰減值;一個(gè)較小的值,比如1e-5大多時(shí)候都是有效的。
4.5.4應(yīng)用dropout
dropout是深度學(xué)習(xí)中最常用和最強(qiáng)大的正則化技術(shù)之一,由多倫多大學(xué)的Hinton和他的學(xué)生開發(fā)。dropout在訓(xùn)練期間被應(yīng)用到模型的中間層。讓我們看一下如何在生成10個(gè)值的線性層的輸出上應(yīng)用dropout(見圖4.3)。
圖4.3所示為dropout閾值設(shè)置為0.2并應(yīng)用于線性層時(shí)發(fā)生的情況。它隨機(jī)地屏蔽或歸零20%的數(shù)據(jù),這樣模型將不依賴于一組特定的權(quán)重或模式,從而不會(huì)導(dǎo)致過擬合。讓我們來看另一個(gè)例子,在這里使用一個(gè)閾值為0.5的dropout(見圖4.4)。
圖4.3
圖4.4
通常dropout的閾值在0.2~0.5的范圍內(nèi),并且dropout可以應(yīng)用在不同的層。dropout僅在訓(xùn)練期間使用,在測(cè)試期間,輸出值使用與dropout相等的因子縮小。PyTroch允許將dropout作為一層,從而使它更容易使用。下面的代碼片段展示了如何在PyTorch中使用一個(gè)dropout層:
dropout層接受一個(gè)名為training的參數(shù),它需要在訓(xùn)練階段設(shè)置為True,而在驗(yàn)證階段或測(cè)試階段時(shí)設(shè)置為False。
4.5.5欠擬合
當(dāng)模型明顯在訓(xùn)練數(shù)據(jù)集上表現(xiàn)不佳時(shí),模型可能無法學(xué)習(xí)出任何模式。當(dāng)模型無法擬合的時(shí)候,通常的做法是獲取更多的數(shù)據(jù)來訓(xùn)練算法。另一種方法是通過增加層數(shù)或增加模型所使用的權(quán)重或參數(shù)的數(shù)量,來提高模型的復(fù)雜度。通常在實(shí)際過擬合數(shù)據(jù)集之前,最好不要使用上述的任何正則化技術(shù)。
4.6機(jī)器學(xué)習(xí)項(xiàng)目的工作流
在本節(jié)中,我們通過將問題描述、評(píng)估、特征工程和避免過擬合結(jié)合起來,形成一個(gè)可用于解決任何機(jī)器學(xué)習(xí)問題的解決方案框架。
4.6.1問題定義與數(shù)據(jù)集創(chuàng)建
為了定義問題,我們需要兩件重要的事情,即輸入數(shù)據(jù)和問題類型。
我們的輸入數(shù)據(jù)和對(duì)應(yīng)標(biāo)簽是什么?比如說,我們希望根據(jù)顧客提供的評(píng)論基于提供的特色菜式對(duì)餐館進(jìn)行分類,區(qū)別意大利菜、墨西哥菜、中國菜和印度菜等。要開始處理這類問題,需要手動(dòng)將訓(xùn)練數(shù)據(jù)標(biāo)注為可能的類別之一,然后才可以對(duì)算法進(jìn)行訓(xùn)練。在此階段,數(shù)據(jù)可用性往往是一個(gè)具有挑戰(zhàn)性的因素。
識(shí)別問題的類型將有助于確定它是二分類、多分類、標(biāo)量回歸(房屋定價(jià))還是向量回歸(邊界框)。有時(shí),我們可能不得不使用一些無監(jiān)督的技術(shù),如聚類和降維。一旦識(shí)別出問題類型,就更容易確定應(yīng)該使用什么樣的架構(gòu)、損失函數(shù)和優(yōu)化器。
在獲得了輸入并確定了問題的類型后,就可以開始使用以下假設(shè)來構(gòu)建模型:
?數(shù)據(jù)中隱藏的模式有助于將輸入映射到輸出;
?我們擁有的數(shù)據(jù)足以讓模型進(jìn)行學(xué)習(xí)。
作為機(jī)器學(xué)習(xí)的實(shí)踐者,我們需要理解的是可能無法僅用一些輸入數(shù)據(jù)和目標(biāo)數(shù)據(jù)來構(gòu)建模型。下面以股票價(jià)格預(yù)測(cè)為例。假設(shè)有代表歷史價(jià)格、歷史表現(xiàn)和競爭細(xì)節(jié)的特征,但仍然不能建立一個(gè)有意義的模型來預(yù)測(cè)股票價(jià)格,因?yàn)楣善眱r(jià)格實(shí)際上可能受到各種其他因素的影響,比如國內(nèi)外政治環(huán)境、自然因素,以及輸入數(shù)據(jù)可能無法表示的許多其他因素。因此,任何機(jī)器學(xué)習(xí)或深度學(xué)習(xí)模型都無法識(shí)別出模式。因此,請(qǐng)基于領(lǐng)域仔細(xì)挑選可以成為目標(biāo)變量的真實(shí)指標(biāo)的特征。所有這些都可能是模型不擬合的原因。
機(jī)器學(xué)習(xí)還有另一個(gè)重要的假設(shè)。未來或未知的數(shù)據(jù)將接近歷史數(shù)據(jù)所描述的模式。有時(shí),模型失敗的原因可能是歷史數(shù)據(jù)中不存在模式,或者模型訓(xùn)練的數(shù)據(jù)未涵蓋某些季節(jié)性或模式。
4.6.2成功的衡量標(biāo)準(zhǔn)
成功的衡量標(biāo)準(zhǔn)將直接取決于業(yè)務(wù)目標(biāo)。例如,當(dāng)試圖預(yù)測(cè)風(fēng)車何時(shí)會(huì)發(fā)生下一次機(jī)器故障時(shí),我們會(huì)對(duì)模型能夠預(yù)測(cè)到故障的次數(shù)更感興趣。簡單地使用準(zhǔn)確率可能是錯(cuò)誤的度量,因?yàn)榇蠖鄶?shù)時(shí)候模型在機(jī)器不出現(xiàn)故障時(shí)預(yù)測(cè)都正確,因?yàn)檫@是最常見的輸出。假設(shè)得到了98%的準(zhǔn)確率,但模型每次預(yù)測(cè)故障時(shí)都是錯(cuò)誤的,這樣的模型在現(xiàn)實(shí)世界中可能沒有任何用處。選擇正確的成功度量標(biāo)準(zhǔn)對(duì)于業(yè)務(wù)問題至關(guān)重要。通常,這類問題具有不平衡的數(shù)據(jù)集。
對(duì)于平衡分類問題,其中所有的類別都具有相似的準(zhǔn)確率,ROC和AUC是常見的度量。對(duì)于不平衡的數(shù)據(jù)集,可以使用查準(zhǔn)率(precision)和查全率(recall)。對(duì)于排名問題,可以使用平均精度均值(Mean Average Precision,MAP)。
4.6.3評(píng)估協(xié)議
決定好如何評(píng)估當(dāng)前的進(jìn)展后,重要的事情就是如何評(píng)估數(shù)據(jù)集??梢詮脑u(píng)估進(jìn)展的3種不同方式中進(jìn)行選擇。
?保留驗(yàn)證集:這是最常用的,尤其是當(dāng)有足夠的數(shù)據(jù)時(shí)。
?K折交叉驗(yàn)證:當(dāng)數(shù)據(jù)有限時(shí),這個(gè)策略有助于對(duì)數(shù)據(jù)的不同部分進(jìn)行評(píng)估,從而有助于更好地了解性能。
?迭代K折驗(yàn)證:想進(jìn)一步提升模型的性能時(shí),這種方法會(huì)有所幫助。
4.6.4準(zhǔn)備數(shù)據(jù)
通過向量化將不同格式的可用數(shù)據(jù)轉(zhuǎn)換成張量,并確保所有特征進(jìn)行了伸縮和歸一化處理。
4.6.5模型基線
創(chuàng)建一個(gè)非常簡單的模型來打破基線分?jǐn)?shù)。在之前的狗貓分類示例中,基線準(zhǔn)確度應(yīng)該是0.5,我們的簡單模型應(yīng)該能夠超過這個(gè)分?jǐn)?shù)。如果無法超過基線分?jǐn)?shù),則輸入數(shù)據(jù)可能不包含進(jìn)行必要預(yù)測(cè)所需的必要信息。記住,不要在這一步引入任何正則化或dropout。
要使模型工作,必須要做出3個(gè)重要的選擇。
?最后一層的選擇:對(duì)于回歸問題,應(yīng)該是生成標(biāo)量值作為輸出的線性層。對(duì)于向量回歸問題,應(yīng)是生成多個(gè)標(biāo)量輸出的相同線性層。對(duì)于邊界框問題,輸出的是4個(gè)值。對(duì)于二分類問題,通常使用sigmoid,對(duì)于多類別分類問題,則為softmax。
?損失函數(shù)的選擇:問題的類型將有助于決定損失函數(shù)。對(duì)于回歸問題,如預(yù)測(cè)房價(jià),我們使用均方誤差(Mean Squared Error,MSE),對(duì)于分類問題,使用分類交叉熵。
?優(yōu)化:選擇正確的優(yōu)化算法及其中的一些超參數(shù)是相當(dāng)棘手的,我們可以通過試驗(yàn)找出。對(duì)于大多數(shù)用例,Adam或RMSprop優(yōu)化算法效果更好。下面將介紹一些可用于學(xué)習(xí)率選擇的技巧。
下面總結(jié)一下在深度學(xué)習(xí)算法中,網(wǎng)絡(luò)的最后一層將使用什么樣的損失函數(shù)和激活函數(shù)(見表4.1)。
表4.1
問題類型 激活函數(shù) 損失函數(shù)
二分類 sigmoid nn.CrossEntropyLoss()
多類別分類 softmax nn.CrossEntropyLoss()
多標(biāo)簽分類 sigmoid nn.CrossEntropyLoss()
回歸 無 MSE
向量回歸 無 MSE
4.6.6大到過擬合的模型
一旦模型具有了足夠的容量來超越基線分?jǐn)?shù),就要增加基線容量。增加架構(gòu)能力的一些簡單技巧如下:
?為現(xiàn)有架構(gòu)中添加更多層;
?為已存在的層加入更多權(quán)重;
?訓(xùn)練更多輪數(shù)。
我們通常將模型訓(xùn)練足夠的輪數(shù),當(dāng)訓(xùn)練準(zhǔn)確率還在提高但驗(yàn)證準(zhǔn)確性卻停止增加并且可能開始下降時(shí)停止訓(xùn)練,這就是模型開始過擬合的地方。到達(dá)這個(gè)階段后,就需要應(yīng)用正則化技術(shù)。
請(qǐng)記住,層的數(shù)量、大小和訓(xùn)練輪數(shù)可能會(huì)因問題而異。較小的架構(gòu)可以用于簡單的分類問題,但是對(duì)于面部識(shí)別等復(fù)雜問題,模型架構(gòu)要有足夠的表示能力,并且模型要比簡單的分類問題訓(xùn)練更長的時(shí)間。
4.6.7應(yīng)用正則化
找到最佳的方法來調(diào)整模型或算法是過程中最棘手的部分之一,因?yàn)橛泻芏鄥?shù)需要調(diào)整??蓪?duì)下面這些用于正則化模型的參數(shù)進(jìn)行調(diào)整。
?添加dropout:這可能很復(fù)雜,因?yàn)榭梢栽诓煌膶又g添加,并且找到最佳位置通常是通過試驗(yàn)來完成的。要添加的dropout百分比也很棘手,因?yàn)樗兇庖蕾囉谖覀冊(cè)噲D解決的問題的描述。從較小的數(shù)值開始(如0.2),通常是最佳實(shí)踐。
?嘗試不同的架構(gòu):可以嘗試不同的架構(gòu)、激活函數(shù)、層數(shù)、權(quán)重,或?qū)拥膮?shù)。
?添加L1或L2正則化:可以使用正則化中的任何一個(gè)。
?嘗試不同的學(xué)習(xí)率:在這里有不同的技術(shù)可以使用,本章后面部分將討論。
?添加更多特征或更多數(shù)據(jù):可以通過獲取更多的數(shù)據(jù)或增強(qiáng)數(shù)據(jù)來實(shí)現(xiàn)。
我們將使用驗(yàn)證數(shù)據(jù)集來調(diào)整所有上述的超參數(shù)。在不斷地迭代和調(diào)整超參數(shù)的同時(shí),可能會(huì)遇到數(shù)據(jù)泄露的問題。因此,應(yīng)確保有用于測(cè)試的保留數(shù)據(jù)。如果模型在測(cè)試數(shù)據(jù)集上的性能相比訓(xùn)練集和驗(yàn)證集要好,那么我們的模型很有可能在未知的數(shù)據(jù)上表現(xiàn)良好。但是,如果模型在測(cè)試數(shù)據(jù)上表現(xiàn)不佳,但是在驗(yàn)證和訓(xùn)練數(shù)據(jù)上表現(xiàn)很好,那么驗(yàn)證數(shù)據(jù)很可能不是對(duì)真實(shí)世界數(shù)據(jù)集的良好表示。在這樣的情況下,可以使用K折驗(yàn)證或迭代K折驗(yàn)證數(shù)據(jù)集。
4.6.8學(xué)習(xí)率選擇策略
找到合適的學(xué)習(xí)率來訓(xùn)練模型是一個(gè)還在進(jìn)行中的研究領(lǐng)域,并且已經(jīng)取得了很多進(jìn)展。PyTorch提供了一些調(diào)整學(xué)習(xí)率的技術(shù),它們由torch.optim.lr_sheduler包提供。我們將探討PyTorch提供的一些動(dòng)態(tài)選擇學(xué)習(xí)率的技術(shù)。
?StepLR:這個(gè)調(diào)度器有兩個(gè)重要的參數(shù)。第一個(gè)參數(shù)是步長,它表示學(xué)習(xí)率多少輪改變一次,第二個(gè)參數(shù)是gamma,它決定學(xué)習(xí)率必須改變多少。
對(duì)學(xué)習(xí)率0.01來說,在步長10和gamma為0.1的情況下,學(xué)習(xí)率每10輪以gamma的倍數(shù)變化。也就是說,對(duì)于前10輪,學(xué)習(xí)率變?yōu)?.001,并且在接下來的10輪,變成0.0001。下面的代碼解釋了StepLR的實(shí)現(xiàn)。
?MultiStepLR:MultiStepLR與StepLR的工作方式類似,只不過步長不是規(guī)則間斷的,步長以列表的形式給出。例如,給出的步長列表為10、15、30,并且對(duì)于每個(gè)步長,學(xué)習(xí)率要乘上gamma值。下面的代碼演示了MultiStepLR的實(shí)現(xiàn)。
?ExponentialLR:每一輪都將學(xué)習(xí)率乘上gamma值。
?ReduceLROnPlateau:這是常用的學(xué)習(xí)率策略之一。應(yīng)用本策略時(shí),當(dāng)特定的度量指標(biāo),如訓(xùn)練損失、驗(yàn)證損失或準(zhǔn)確率不再變化時(shí),學(xué)習(xí)率就會(huì)改變。通用實(shí)踐是將學(xué)習(xí)率的原始值降低為原來的1/2~1/10。
審核編輯:湯梓紅
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8422瀏覽量
132723 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5504瀏覽量
121229
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論