天天看點

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

Fundamentals of Machine Learning

在前幾章中,我們看到了如何建立深度學習模型來解決分類和回歸問題的執行個體,例如圖像分類和平均使用者視圖預測。同樣,我們發展了一種關于如何建構深度學習問題的直覺。在本章中,我們将研究如何解決不同類型的問題和不同的調整,我們最終可能會使用這些問題來改進我們的模型在我們的問題上的性能。

在本章中,我們将探讨以下問題:

  • 不同于分類和回歸的其他形式的問題
  • 評估、了解過度拟合、拟合不足和解決這些問題的技術問題
  • 為深度學習準備資料

請記住,我們在本章中讨論的大部分主題都是機器學習和深度學習所共有的,除了我們用來解決過度拟合問題的一些技術,比如中斷(Dropout)。

三種機器學習問題:

在前面的所有示例中,我們試圖解決分類(預測貓或狗)或回歸(預測使用者在平台上的平均時間)問題。所有這些都是監督學習的例子,其目标是繪制訓練示例與其目标之間的關系,并利用它們對不可見資料進行預測。

監督學習隻是機器學習的一部分,機器學習還有其他不同的部分。機器學習的三種不同方式:

  • 有監督機器學習
  • 無監督機器學習
  • 增強學習

有監督學習

在深度學習和機器學習領域,大多數成功的用例都屬于監督學習。我們在這本書中所涵蓋的大多數例子也将是監督學習的一部分。一些常見的有監督學習的例子:

  • 分類問題:分類狗和貓
  • 回歸問題:預測股票價格,闆球比賽分數,等等。
  • 圖像分割:進行像素級分類。對于自駕駛汽車,重要的是識别每個像素所屬的是由其相機拍攝的照片的什麼部分,像素可以屬于汽車、行人、樹木、公共汽車等。
  • 語音識别:Google,Alexa和Siri是語音識别的好例子。
  • 語言翻譯:從一種語言到另一種語言的翻譯

無監督學習

當沒有标簽資料時,非監督學習技術通過可視化和壓縮幫助了解資料。在無監督學習中常用的兩種技術是:

  • 聚類
  • 降維

聚類有助于将所有相似的資料點組合在一起。 降維有助于減少維數,使我們能夠可視化高維資料以找到任何隐藏的模式。

增強學習

增強學習是最不流行的機器學習範疇。它沒有在現實世界中找到成功的用例。然而,最近幾年它發生了變化,Google DeepMind的團隊能夠成功地建構基于強化學習的系統,并能夠赢得AlphaGo遊戲的世界冠軍。這種技術進步,一台計算機可以在遊戲中擊敗人類,被認為需要幾十年的時間才能實作。然而,将深度學習與強化學習相結合,能夠比任何人預期的要快得多。這些技術已經開始看到早期的成功,可能需要幾年才能成為主流。

在這本書中,我們将主要集中在監督技術和一些非監督技術,這些技術是專門用于深度學習的。例如,生成網絡,用于建立一種特定風格的圖像,稱為樣式轉移和生成對抗性網絡。

機器學習詞彙

在前面幾章中,我們使用了許多術語,如果您隻是進入機器學習或深度學習空間,那麼這些術語對您來說可能是全新的。我們将列出許多機器學習中常用的術語,這些術語也在深度學習文獻中使用。

  • 樣例或輸入或資料點(Sample or input or data point):在上一章中看到的圖像分類問題中,每一幅圖像都可以被稱為樣例、輸入或資料點。
  • 預測或輸出(Prediction or output):我們的算法生成的值作為輸出,例如,在前面的示例中,我們的算法将特定的圖像預測為0,這是給cat的标簽,是以0是我們的預測或輸出。
  • 目标或标簽(Target or label):圖像的實際标記标簽。
  • 損失值或預測誤差(Loss value or prediction error):預測值與實際值之間距離的某種度量。數值越小,準确度就越好。
  • 類别(Classes):給定資料集的可能值或标簽集。在上一章的例子中,我們有兩個類貓和狗。
  • 二進制分類(Binary classification):一個分類任務,其中每個輸入示例都應該被歸類為兩個獨占類别之一。
  • 多類别分類(Multi-class classification):一個分類任務,在這個任務中,每個輸入示例可以分為兩個以上的不同類别。
  • 多标簽分類(Multi-label classification):一個輸入示例可以标記為多個标簽,例如,用它提供的不同類型的食物(如意大利、墨西哥和印度)标記一家餐館。另一個常用的例子是圖像中的對象檢測,其中算法識别圖像中的不同對象。
  • 标量回歸(Scalar regression):每個輸入資料點将與一個标量品質相關聯,該标量品質是一個數字。一些例子可以預測房價、股票價格和闆球的得分。
  • 向量回歸(Vector regression):其中,算法需要預測多個标量。一個好的示例是當您嘗試識别圖像中包含魚的位置的邊界框時。為了預測包圍框,您的算法需要預測四個标量,這些标量表示一個正方形的邊。
  • 批處理(Batch):在大多數情況下,我們在一堆稱為批處理的輸入樣本上訓練我們的算法。批處理大小通常從2到256不等,具體取決于GPU的記憶體。每個批次的權重也會被更新,是以算法往往比在單個示例上訓練時學習得更快。
  • 紀元(Epoch):在完整的資料集中運作該算法稱為一個紀元。在幾個紀元訓練(更新重量)是很常見的

評估機器學習模型

在我們在上一章中讨論的圖像分類示例中,我們将資料分成兩個不同的部分,一個用于訓練,另一個用于驗證。使用單獨的資料集測試算法的性能是一種很好的做法,因為在訓練集上測試算法可能不會給算法帶來真正的泛化能力。在大多數真實的用例中,基于驗證的準确性,我們經常以不同的方式調整算法,例如添加更多的層或不同的層,或者使用我們将在本章後面部分讨論的不同技術。是以,你調整算法的選擇很有可能是基于驗證資料集的。通過這種方式訓練的算法往往在訓練資料集和驗證資料集中表現良好,但是不能很好地推廣到看不見的資料上。這是由于你的驗證資料集的資訊洩漏,這影響了我們調整算法。

為了避免資訊洩漏的問題并提高泛化能力,将資料集分成三個不同部分通常是常見的做法,即訓練、驗證和測試資料集,我們使用訓練和驗證集進行算法的所有超參數調整。最後,當整個訓練完成後,你将在測試資料集上測試算法。我們讨論的參數有兩種類型。一個是算法中使用的參數或權重,其由優化器或在反向傳播期間調整;另一組參數,稱為“超參數”,控制網絡中使用的層數、學習速率和其他類型的參數,這些參數通常會改變體系結構,通常是手動完成的。

某一特定算法在訓練集中表現更好,而在驗證或測試集上不能執行的現象稱為過度拟合,或者缺乏算法的泛化能力,另一種相反的現象是,算法不能對訓練集執行,這稱為欠拟合。我們将研究不同的政策,這些政策将幫助我們克服過度拟合和不足拟合的問題。

讓我們先看一下可用于拆分資料集的各種政策,然後再看過拟合和欠拟合。

訓練、驗證和測試拆分(Training, validation, and test split):

使用Holdout資料集的最佳方法是:

1、在訓練集上訓練算法

2、根據驗證資料集執行超參數優化

3、疊代執行前兩個步驟,直到達到預期的性能。

4、在當機算法和超參數後,在測試資料集中對其進行評估

避免将資料分成兩部分,因為這可能導緻資訊洩漏。在同一資料集中進行的訓練和測試是明确的no-no,因為它不保證算法的泛化。有三種常用的拒絕政策可以用來将資料分成訓練和驗證集。它們如下:

1、簡單二劃分校驗(Simple holdout validation)

2、K-fold驗證(K-fold validation)

3、疊代K-fold驗證(Iterated k-fold validation)

簡單二劃分校驗(Simple holdout validation)

将資料的一部分設定為測試資料集,保留哪一部分可能是非常具體的問題,并可能在很大程度上取決于可用的資料量。對于一些問題尤其是像計算機視覺及NLP領域的,收集标記過的資料可能是非常昂貴的,是以,為了保持30%的大比例可能使得算法難以學習,因為它将具有較少的資料來訓練。是以,根據資料可用性,需要明智地選擇資料集的一部分。拆分測試資料後,将其分開,直到确定算法及其超級參數。為問題選擇最佳的超級參數,需要選擇一個單獨的驗證資料集。為了避免過度拟合,我們通常将可用資料分成三個不同的集合,如下圖所示:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

我們在上一章中簡單地執行了前面的圖以建立我們的驗證集。讓我們看一下實施的快速過程:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

這是最簡單的抵抗政策之一,并且也是最早開始使用的。具有小資料集使用這種方法存在一個缺點。驗證資料集或測試資料集可能在統計上不能代表手頭的資料。我們可以很容易地識别出這一點,方法是在儲存資料之前對資料進行洗牌。如果得到的結果不一緻,那麼我們需要使用更好的方法。為了避免這個問題,我們通常會使用K-fold或疊代K-fold。

K-fold驗證集(K-fold validation)

保留測試拆分的資料集的一部分,然後将整個資料集劃分為k-fold,其中k可以是任意數量,通常從2到10變化。在任何給定的疊代中,我們持有一個塊進行驗證,并在其餘的塊上對算法進行訓練。最後的分數通常是通過k-fold得到的所有分數的平均值。下圖顯示k-fold驗證的實作,其中k為4,也就是說,資料被分成四部分:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

使用k-fold驗證資料集時要注意的一個關鍵問題是,它非常昂貴,因為您在資料集的不同部分上運作了幾次該算法,對于計算密集型算法來說,這可能是非常昂貴的,特别是在計算機視覺算法領域,有時,訓練一個算法可能需要幾分鐘到幾天的時間。是以,明智地使用這個技巧。

用洗牌法進行K-fold驗證(K-fold validation with shuffling)

為了使事情變得複雜和健壯,你可以在每次建立延遲驗證資料集時對資料進行洗牌,這對于解決性能上的小提升可能會對業務産生巨大影響的問題是非常有幫助的。如果你的案例是快速建構和部署算法,你可以在性能差異中犧牲幾個百分點,那麼這種方法可能不值得。這一切歸結為你想要解決的問題,以及精确性對你來說意味着什麼。

在拆分資料時,可能需要考慮其他一些問題,例如:

1、資料代表性

2、時間敏感性

3、資料備援

資料代表性(Data Representativeness)

在我們在上一章中看到的例子中,我們把圖像歸類為狗或貓。讓我們以一個場景為例,所有的圖像都被排序,前60%的圖像是狗,其餘的是貓,如果選擇前80%作為訓練資料集,選擇其餘資料集作為驗證集,則對此資料集進行拆分,則驗證資料集将不是資料集的真實表示形式,因為它隻包含貓圖像。是以,在這種情況下,我們應該注意的是,我們有一個良好的混合,在分割或進行分層抽樣之前對資料進行洗牌。分層抽樣是指從每個類别中提取資料點,以建立驗證和測試資料集。

時間敏感性(Time Sensitivity)

讓我們以預測股票價格為例。我們有一月到十二月的資料。在這種情況下,如果我們進行混洗或分層采樣,那麼我們就會發現資訊洩漏,因為價格可能對時間敏感。是以,以一種不存在資訊洩漏的方式建立驗證資料集。在這種情況下,選擇12月資料作為驗證資料集可能更有意義。在股票價格的情況下,它比這更複雜,是以在選擇驗證分割時,特定領域的知識也會發揮作用。

資料備援(Data Redundancy)

重複在資料中很常見。應注意使訓練、驗證和測試集中的資料是唯一的。如果有重複的,那麼模型可能不能很好地泛化到看不見的資料上。

資料預處理與特征工程(Data preprocessing and feature engineering)

我們已經研究了不同的方法來分割我們的資料集來建構我們的評估政策。在大多數情況下,我們收到的資料可能不是我們可以很容易地用于訓練的格式。在本節中,我們将介紹一些預處理技術和特征工程技術。雖然大多數特征工程技術都是特定領域的,特别是在計算機視覺和文本領域,但也有一些常見的特征工程技術。我們将在本章中讨論這一問題。

神經網絡的資料預處理是一種使資料更适合于深層學習算法進行訓練的過程,以下是一些常用的資料預處理步驟:

1、向量化

2、正則化

3、損失值

4、特征提取

向量化(Vectorization)

資料以各種格式出現,如文本、聲音、圖像和視訊。需要做的第一件事就是把資料轉換成Pytorch Tensors。在前面的示例中,我們使用torchvision實用程式函數将Python成像庫(PIL)圖像轉換為張量對象,雖然大部分的複雜性都被Pytorch torchvision庫提取出來,在Chapter 7,生成網絡中,當我們處理遞歸神經網絡(RNNs)時,我們将看到文本資料如何被轉換為PyTorch張量。對于涉及結構化資料的問題,資料已經以矢量化格式存在;我們需要做的就是把它們轉換成Pytorch Tensors。

值歸一化(Value normalization)

在将資料傳遞給任何機器學習算法或深度學習算法之前,規範特征是一種常見的做法。它有助于更快地訓練算法,并有助于實作更高的性能。規範化是指将資料表示為屬于某一特定特性的過程,使其均值為零,标準差為1。

在狗和貓的例子中,我們在上一章中介紹的分類,我們使用ImageNet資料集中可用的資料的平均值和标準偏差對資料進行了标準化。我們之是以選擇ImageNet資料集的均值和标準差作為示例,是因為我們使用的是ResNet模型的權重,這是在ImageNet上預先訓練的。将每個像素值除以255也是一種常見的做法,這樣所有的值都在0到1之間,特别是當不使用預訓練權重時。

歸一化也适用于涉及結構化資料的問題。正如我們正在處理房價預測問題,可能會有不同的特點可能會在不同的尺度上下降。例如,距離最近的機場的距離和房子的樓齡是不同尺度的變量或特征。将它們與神經網絡結合使用,可以防止梯度收斂。簡單地說,損失可能不會像預期的那樣減少。是以,在對算法進行訓練之前,我們應該小心地将規範化應用于任何類型的資料。為了確定算法或模型的性能更好,請確定資料遵循以下特征:

1、取小值:通常在0到1之間的範圍内。

2、相同範圍:確定所有功能都在相同的範圍内。

處理缺失值(Handling missing values)

在實際機器學習問題中,缺失值是很常見的。從我們先前預測房價的例子來看,房屋年齡的某些領域可能會丢失。用其他情況下可能不會發生的數字替換丢失的值通常是安全的。該算法将能夠識别該模式還有其他技術可用于處理更特定于域的缺失值。

特征工程(Feature engineering)

特征工程是利用有關特定問題的領域知識來建立可以傳遞給模型的新變量或特性的過程。為了更好地了解,讓我們來看看一個銷售預測問題,假設我們有關于促銷日期、假期、競争者的開始日期、與競争對手的距離以及某一天的銷售的資訊。在現實世界中,可能有數以百計的功能可以用來預測商店的價格。在預測銷售時,可能會有一些重要的資訊。一些重要的特性或派生值是:

1、離下一次促銷還有幾天

2、離下一個假期還有幾天

3、競争對手營業的天數

可以從領域知識中提取出更多這樣的特征。對于任何機器學習算法或深度學習算法來說,提取這類特征對于算法本身來說都是很有挑戰性的。對于某些領域,尤其是在計算機視覺和文本領域,現代深度學習算法幫助我們擺脫特征工程。除了這些領域,好的特性工程在以下方面總是有幫助:

1、用較少的計算資源可以更快地解決這個問題。

2、深度學習算法可以通過使用大量的資料來學習特征,而無需手工設計它們。是以,如果對資料很緊,那麼關注好的特性工程是很好的。

過拟合及拟合不足(Overfitting and underfitting)

了解過拟合和拟合不足是建立成功的機器學習和深度學習模型的關鍵。在本章的開頭,我們簡要介紹了過拟合及拟合不足,讓我們詳細地看一看它們,以及如何解決它們。

機器學習和深度學習中常見的問題是過度拟合或不泛化。我們說,當某一特定算法在訓練資料集上表現良好但無法在未見資料集或驗證和測試資料集上執行時,它便是過拟合的。這主要是因為算法識别了過于特定于訓練資料集的模式。簡單地說,我們可以說該算法找到了一種記憶資料集的方法,以便它在訓練資料集上表現得非常好,而無法在未見資料上執行。為了避免算法過度拟合,可以使用不同的技術。其中一些技術是:

1、擷取更多的資料

2、縮小網絡規模

3、應用權重調整器

4、應用中斷

擷取更多資料(Get more data)

如果能夠獲得更多算法可以對其進行訓練的資料,這可以幫助算法通過關注一般的模式,而不是特定于小資料的模式,避免過度拟合。有幾種情況下獲得更多标記的資料可能是一個挑戰。

有一些技術,如資料增強,可以用于在與計算機視覺相關的問題上生成更多的教育訓練資料。資料增強是一種技術,可以通過執行不同的操作(如旋轉、裁剪和生成更多資料)來稍微調整圖像。有了足夠的領域了解,如果捕獲實際資料的代價很高,您也可以建立合成資料。當無法獲得更多資料時,還有其他方法可以幫助避免過度拟合。讓我們看看他們。

縮小網絡規模(Reducing the size of the network)

網絡的規模一般是指網絡中使用的層數或權重參數的數量。在我們在上一章中看到的圖像分類的例子中,我們使用了一個Resnet模型,它有18塊由内部不同層組成的塊。Pytorch中的TorchVision庫采用不同大小的Resnet模型,從18個區塊開始,并達到152個區塊。例如,如果我們使用具有152個塊的Resnet塊并且該模型是過度拟合的,那麼我們可以嘗試使用具有101個塊或50個塊的Resnet塊嘗試使用Resnet塊。在我們建構的自定義體系結構中,我們可以簡單地删除一些中間線性層,進而防止我們的PyTorch模型記憶訓練資料集。讓我們看一個示例代碼片段,它示範了減少網絡規模的确切含義:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

前面的體系結構有三個線性層,讓我們說它超越了我們的訓練資料。是以,讓我們重新建立容量降低的體系結構:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

前面的體系結構隻有兩個線性層,進而減少了容量,進而可能避免過度比對訓練資料集。

應用權重正則化(Applying weight regularization)

幫助解決過度拟合或泛化問題的關鍵原則之一是建立更簡單的模型。一種用于建構更簡單模型的技術是通過減小其規模來降低體系結構的複雜性,另一件重要的事情是確定網絡的權重不會采用更大的值。當模型的權重較大時,正則化通過懲罰模型來提供網絡上的限制。無論何時模型使用較大的權重,正則化都會開始并增加損失值,進而損害模型。有兩種可能的正則化。:

1、L1正則化:權重系數絕對值之和添加到成本,通常稱為權重的L1範數

2、L2正則化:将所有權重系數的平方和加到成本中。它常被稱為權重的l2範數。

PyTorch通過在優化器中啟用weight_decay參數,提供了一種使用L2正則化的簡單方法:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

預設情況下,權重衰減參數被設定為零.對于權重衰減,我們可以嘗試不同的值;像1e-5這樣的小值在大多數情況下都是有效的。

Dropout

Dropout(師姐說不是翻譯成中斷啦)是最常用的和最強大的用于深度學習的正則化技術之一。它是由Hinton和他在多倫多大學的學生開發的。在訓練期間,将Dropout應用于模型的中間層。讓我們看看如何在生成10個值的線性層輸出上應用Dropout的示例:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

上圖顯示了當将Dropout應用于具有0.2的門檻值的線性層輸出時發生的情況。它随機掩蔽或歸零20%的資料,這樣模型就不會依賴于一組特定的權重或模式,是以而過拟合。

讓我們看另一個例子,其中我們應用了一個門檻值為0.5的Dropout:

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

通常情況下,在0.2到0.5的範圍内使用Dropout門檻值是很常見的。并且在不同的層施加Dropout。Dropout隻在訓練期間使用,在測試期間,測試值按等于Dropout的因素縮小。Pytorch将Dropout提供為另一層,進而使其更易于使用。下面的代碼片段示範了如何在PyTorch中使用Dropout層。

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

Dropout接受一個名為training的參數,需要在訓練階段将其設定為True,在驗證或測試階段設定為false。

欠拟合(Underfitting)

有時,我們的模型可能無法從我們的訓練資料中學習到任何模式,當模型即使在它所訓練的資料集上也不能很好地執行時,這一點就很明顯了。當模型不合适時,最常見的一件事是擷取更多的資料,以便對算法進行訓練。另一種方法是通過增加層數或增加模型使用的權重或參數的數量來增加模型的複雜性。在我們真正過拟合資料集之前,最好不要使用上述任何正則化技術。

機器學習項目的工作流(Workflow of a machine learning project)

在本節中,我們将制定解決任何機器學習問題的解決方案架構,通過将問題陳述、評估、特征工程和避免過拟合結合在一起來解決任何機器學習問題。

問題定義和資料集建立(Problem definition and dataset creation)

要定義這個問題,我們需要兩件重要的事情:輸入資料和問題的類型。

我們的輸入資料和目标标簽将是什麼?例如,我們想根據他們的特色對餐館進行分類,比如意大利、墨西哥、中國和印度的食物,通過客戶的評論。要開始處理這種問題,我們需要手動手動将訓練資料标注為可能的類别之一,然後才能在其上訓練算法。在這個階段,資料可用性通常是一個具有挑戰性的因素。

識别問題的類型将有助于确定它是否為二進制分類、多分類、标量回歸(房屋定價)或向量回歸(邊界框)。有時,我們可能需要使用一些無監督的技術,如聚類和降維。一旦确定了問題類型,就更容易确定應該使用哪種體系結構、損失函數和優化器。

一旦我們有了輸入并确定了問題的類型,那麼我們就可以開始使用以下假設來建構我們的模型:

1、可以幫助将輸入映射到輸出的資料中存在隐藏模式

2、我們擁有足以讓模型學習的資料。

作為機器學習從業者,我們需要了解,我們可能無法建立一個具有一些輸入資料和目标資料的模型。讓我們以預測股價為例。讓我們假設我們有代表曆史價格、曆史表現和競争細節的特性,但我們可能仍然無法建立一個有意義的模型來預測股票價格,因為股票的價格實際上可能受到各種其他因素的影響,如國内政治形勢、國際政治形勢、自然因素,例如具有良好的季風以及許多其它可能無法由我們的輸入資料表示的因素。是以,任何機器學習或深度學習模型都不可能識别模式。是以,基于域,仔細選擇可以作為目标變量的真實名額的特征。所有這些都可能是模型欠拟合的原因。

機器學習還有另一個重要的假設。未來或看不見的資料将接近模式,正如曆史資料所描述的那樣。有時,我們的模型可能會失敗,因為曆史資料中從來不存在模式,或者模型訓練過的資料沒有涵蓋某些季節性或模式。

衡量成功(Measure of success)

成功的衡量将由您的業務目标直接決定。例如,當試圖預測下一次機器故障将發生在風車中時,我們會更感興趣地了解該模型能夠預測故障的次數。使用簡單的精度可能是錯誤的度量,因為大多數情況下,模型将正确地預測機器何時不會發生故障,因為這是最常見的輸出。假設我們的準确率為98%,而且模型每次在預測故障率時都是錯誤的–這些模型在現實世界中可能沒有任何用處。選擇正确的成功度量對于業務問題至關重要。通常,這類問題有不平衡的資料集。

對于平衡分類問題,如果所有類都具有可能的精度,ROC和曲線下的面積(AUC)是常見的度量。對于不平衡的資料集,我們可以使用精确和回憶。對于排序問題,我們可以使用平均精度。

評估協定(Evaluation protocol)

一旦決定了如何評估目前進度,就必須決定如何在資料集上進行評估。我們可以從三種不同的方法中選擇一種評估我們的進展的方法。

1、Holdout驗證集:最常用的,尤其是當您有足夠的資料時

2、K-fold交叉驗證:當您有有限的資料時,此政策可幫助您對資料的不同部分進行評估,進而幫助我們更好地檢視性能

3、疊代k-fold驗證:當您希望進一步提高模型的性能時,這種方法将有所幫助。

準備你的資料(Prepare your data)

通過矢量化,将不同格式的可用資料轉換成張量(Tensors)類型,并確定所有特征的縮放和标準化。

基準模型(Baseline model)

建立一個非常簡單的模型,該模型優于基線得分。在我們以前的狗和貓的例子中,分類,基線精确度應該是0.5,我們的簡單模型應該能夠戰勝這個分數。如果我們無法擊敗基線分數,則可能輸入資料不包含進行必要預測所需的必要資訊。記住,不要在這一步引入任何正規化或中斷。

為了使模型工作我們必須做出三個重要的選擇:

1、最後一層的選擇:對于回歸,應該是生成标量值作為輸出的線性層。對于向量回歸問題,它将是同一個線性層,産生多個标量輸出。對于一個邊框,它輸出四個值。對于二進制分類,常用的是Sigmoid,而對于多類分類,則是Softmax。

2、損失函數的選擇:問題的類型将幫助您決定損失函數。對于一個回歸問題,如預測房價,我們使用均方誤差,對于分類問題,我們使用分類交叉熵。

3、最優化:選擇正确的優化算法及其一些超參數是相當棘手的,我們可以通過不同的實驗來找到它們。對于大多數用例,ADAM或RMSPROP優化算法工作得更好,我們将介紹一些可用于選擇學習速率的技巧。

讓我們總結一下在我們的深度學習算法中,對于網絡的最後一層,我們将使用什麼樣的損失函數和激活函數。

DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

足夠大的模型導緻過拟合(Large model enough to overfit):

一旦你有了一個有足夠能力超過你的基線得分的模型,就增加你的基線能力。增加您的架構容量的一些簡單的技巧如下:

1、向現有體系結構添加更多層

2、向現有層添加更多權重

3、更多的訓練

我們通常用足夠數量的Epochs訓練模型。當訓練精度不斷提高,驗證精度停止增加,并且可能開始下降時,停止訓練,這就是模型開始過度拟合的地方。一旦我們達到這個階段,我們就需要應用正則化技術。

請記住,層數(the number of layers)、層規模( size of layers)和曆元數(epochs)可能會随着問題的不同而變化。較小的體系結構可以用于簡單的分類問題,但對于面部識别等複雜問題,我們的體系結構需要足夠的表現力,而模型需要比簡單分類問題訓練更多次。

應用正則化(Applying regularization)

找出調整模型或算法的最佳方法是過程中最棘手的部分之一,因為有許多參數需要調整。我們可以調優以使模型正則化的一些參數是:

1、添加中斷:這可以很複雜,因為這可以在不同的層之間添加,并且發現最佳位置通常是通過實驗來完成的。添加中斷的百分比也很棘手,因為它完全取決于我們試圖解決的問題說明。通常良好的做法是從一個小數目開始,例如0.2。

2、嘗試不同的架構:我們可以嘗試不同的體系結構、激活函數、層數、權重或圖層内部的參數。

3、添加L1或L2正則化:我們可以利用正規化

4、嘗試不同的學習率:我們可以使用不同的技術,我們将在本章後面的部分中讨論這些技術。

5、添加更多特性或更多資料:這可能是通過擷取更多資料或增強資料來完成的。

我們将使用我們的驗證資料集調整所有上述超參數。當我們不斷地疊代和調整超參數時,最終可能會出現資料洩漏問題。是以,我們應該確定我們有資料進行測試。如果模型對測試資料的性能與訓練和驗證相比是好的,那麼我們的模型很有可能在不可見的資料上表現良好。但是,如果模型不能對測試資料執行而是對驗證和訓練資料執行,則存在驗證資料不能很好的代表真實世界資料集,在這種情況下,我們可以使用k-fold驗證或疊代k-fold驗證資料集。

學習率選擇政策(Learning rate picking strategies)

找到正确的訓練模式是一個正在進行的研究領域,在這個研究領域已經取得了很大的進展。Pytorch提供了一些技術來調整學習速率,并提供在torch.optim.lr_sheduler包封裝中。我們将探讨PyTorch提供的一些動态選擇學習速率的技術:

  • StepLR:這個排程程式有兩個重要的參數。一個是步長,這表示學習速率必須改變多少個時期,而第二參數是gamma,這決定了要改變學習速率的多少。

    例如:對于學習速率為0.01,步長為10,gamma大小為0.1,對于每10次周遊資料集,學習率随gamma次數而變化。也就是說,在前10次中,學習率變化到0.001,到最後,在接下來的10次中,學習率變化到0.0001。下面的代碼解釋了StepLR的實作:

    DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning
  • MultiStepLR:MultiSteppr類似于STEPPLR,但以下事實除外:步驟不在規則的間隔内;步驟作為清單給出。例如,它被作為10,15,30的清單給出,對于每個步驟值,學習速率乘以它的gamma值。下面的代碼解釋了MultiStepLR的實作:
    DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning
  • ExponentialLR:這将将學習速率設定為每個時期的學習速率與gamma值的倍數。
  • ReduceLROnPlateau:這是最常用的學習政策之一。在這種情況下,當特定的度量(如訓練損失、驗證損失或準确性停滞)時,學習速率會發生變化。将學習率降低2至10倍是一種常見的做法。ReduceLROnPlateau可按以下方式實作:
    DeepLearning with Pytorch Chapter04Fundamentals of Machine Learning

總結(Summary)

在本章中,我們介紹了用于解決機器學習或深度學習問題的一些常見的最佳實踐。我們讨論了各種重要步驟,例如建立問題語句、選擇算法,打基線分數,增加模型的容量,直到其超出資料集,應用能夠防止過度拟合的正則化技術、,提高泛化能力,調整模型或算法的不同參數,并探索不同的學習政策,以最優、更快的方式訓練深度學習模式。

在下一章中,我們将涵蓋負責建立最先進的卷積神經網絡(CNNS)的不同元件。我們還将包括轉移學習,這将幫助我們在幾乎沒有資料的情況下訓練圖像分類器。我們還将介紹幫助我們更快地訓練這些算法的技術。

emmm, 先翻譯一遍,,,,

繼續閱讀