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