《Machine Learning Yearing》讀書筆記


——深度學習的建模、調參思路整合。

 

寫在前面

最近偶爾從師兄那里獲取到了吳恩達教授的新書《Machine Learning Yearing》(手稿),該書主要分享了神經網絡建模、訓練、調節參數時所需要的一些技巧和經驗。我在之前的一些深度學習項目中也遇到過模型優化,參數調節之類的問題,由於當時缺少系統化的解決方案,僅僅依靠感覺瞎蒙亂碰。雖然有時也能獲得效果不錯的網絡模型,但對於該模型是否已到達最佳性能、該模型是否能適配更泛化的數據等問題心理沒底。通過閱讀這本教材,對於數據集的獲取、划分;訓練模型的評分標准;在模型訓練時需要調節哪些參數等有了更加具體、科學的認知。而這些經驗在具體的工程應用中彌足珍貴,這里我將學習的一些內容做筆記整理下來。

 

書籍可以在其官網上進行查看:http://www.mlyearning.org/  (需連接國際互聯網)

也有學者對其進行了翻譯:https://xiaqunfeng.gitbooks.io/machine-learning-yearning/content/

 

本書一共由以下11個大的章節組成:

一. Introduction:

包括chapter 1-4,主要介紹了包括這本書的寫作目的與使用方式。

二. Setting up development and test sets:

包括 chapter 5-12,主要介紹了數據集的獲取及划分,衡量標准的制定,模型算法的訓練、調試流程。

三. Basic Error Analysis:

包括 chapter 13-19,主要介紹了錯誤分析(Error Analysis)的定義,以及如何使用錯誤分析來為模型訓練調試指明方向。

四. Bias and Variance:

包括 chapter 20-27,主要介紹了兩種主要的錯誤來源bias & variance,以及針對不同錯誤來源的模型優化策略。

五. Learning curves:

包括 chapter 28-32,主要介紹學習曲線(learning curve)的定義與繪制,以及如何使用它來判斷當前模型所處的狀態。

六. Comparing to human-level performance:

包括 chapter 33-35,主要介紹使用人類的識別能力作為模型算法目標對比的原因及方法。

七. Training and testing on different distributions:

包括 chapter 36-43, 主要介紹在使用不同來源數據做訓練時的一些技巧。

八. Debugging inference algorithms:

包括 chapter 44-46,講解了一些在復雜建模情況下的調試方法。

九. End-to-end deep learning:

包括 chapter 47-52,主要介紹最近興起的直接學習(end-to-end learning)及其應用場景,並與分步學習的思路進行比較。

十. Error analysis by parts:

包括 chapter 53-57,介紹了如何對機器學習“管道”中的組件進行驗證,判斷其是否有性能提升的空間。

十一. Conclusion

 

 

第一章(Introduction)筆記

·常規的神經網絡模型優化思路(包括但不限於):

1.獲取更多訓練數據;

2.獲取更多種類的訓練數據(如圖像識別任務中,獲取不同角度的目標物體圖片);

3.訓練更長時間、更多輪次;

4.擴大模型結構(更多神經元,更深的網絡);

5.縮小模型結構;

6.使用正則化(regularization);

7.改變網絡結構(改變激活函數,參數傳播路徑設計等)。

 

 

第二章(Setting up development and test sets)筆記

·Train set、dev set、test set的定義及使用:

Training set——訓練集,對算法模型進行訓練的數據集。

Dev set(development set)——開發集,使用該數據集來調節參數,即在使用Training set對模型進行訓練后,根據模型在Dev set上展現出來的效果進行深入分析,制定模型參數的調整方向,調整訓練策略。

Test set——測試集,根據模型在這個數據集上的表現,來對模型進行評分。注意不要使用這個數據集反映出來的問題來確定訓練策略。

 

·數據來源:

Training set的數據來源限制不是很強,但Dev set 和 Test set的數據一定要貼近實際目標。例如在一個人臉識別項目中,為了擴充訓練集的樣本數目,可以將手工素描的人像作品作為樣本加入Training set,但不要將素描作品加入Dev set 和Test set,應使用真實環境的照片來作為Dev set 和Test set中的樣本,因為其更貼近我們模型的真實使用環境。

 

·數據集的大小:

Dev set的大小沒有硬性規定,一般只要求能反映出算法的實際效果即可。如果一個廣告推薦算法能將點擊率提高0.1%,那么由100個樣本所組成的Dev set必定反映不出這種增長。一般來講,dev set包含1000~10000個樣本。

Test set的規模應該足夠大,以能產生可信的模型評分為標准。傳統的機器學習實踐中經常以70%/30%的比例來分割訓練集、測試集,但是在現在數據量激增的背景下,該分割方法的適用性並不強,應該具體事例具體分析。

 

·項目實施流程:

深度學習的項目分為三個步驟,想法(建模思路、樣本獲取等)→編碼→實驗。之后根據實驗的結果來對想法進行調整,修改代碼繼續實驗。整個工作流程形成一個閉合的環狀。

其中,在實驗步驟之后,根據Dev set所展現出來的結果,來對模型進行調整,即整個工作流程的展開都是以優化模型在Dev set上面的表現為目標。這有可能導致模型對Dev set過擬合,判斷其過擬合的方法為:模型在Dev set上表現良好,而在Test set上表現不佳。一般可以使用增加Dev set的樣本數目來對過擬合現象進行糾正。

 

 

·單一標准評價體系:

在評定模型效果的時候使用單一標准的評分。很多時候多個模型在不同的方面各有優劣,例如有的樣本精確率比較高,有的樣本召回率比較高。為了能更快的對這些模型進行比較,以提高我們項目實施流程循環的速度,我們需要一個單一標准的衡量體系,可以為每一項指標賦予一個權重,將其進行加權形成單一標准評價體系。

多標准評價矩陣:

 

單一標准評價矩陣(Single-number evaluation metric):

當然,在感覺這個單一評價矩陣的權重分配不合適的時候,可以在項目組內部進行討論,來對各指標的權重進行修改。

 

·過擬合,數據分布不一致,衡量指標有偏差時的應對措施:

Dev set過擬合時:增加Dev set的樣本數;Dev/Test set中包含的數據與所關心數據來源不一致時:獲取新的Dev/Test set數據;衡量指標有偏差時:即該單一評價標准無法正確的對各指標進行衡量的時候,可以對單一評價標准的權重進行修改。

 

 

第三章(Basic Error Analysis)筆記:

·有了想法之后快速的進行實現:

不要想着一下能設計出來一個最優的建模方式、得到最好的算法模型。有了想法之后快速的上手進行實現,在動手實施項目的時候,往往會產生新的想法來幫助你尋找到更有可能的優化改進方向,之后根據這些優化方向來不斷迭代,以第二章所展示的工作流程對項目進行推進,以獲得更好的算法模型。

一般來講快速實現的第一個版本需要在一周之內做出來。

 

·錯誤分析(Error Analysis)

定義:在Dev set中找出一定數量的錯分樣本(模型對其進行了錯誤的分類),對錯誤類型進行手動分析。(注意:錯誤分析僅僅針對Dev set,不要將其應用在Test set中)

目的:理解模型出錯的原因,提出針對性的改進意見。

 

·錯誤統計表:

在錯誤分析時,列出一個統計表格以統計不同類型的錯誤,對錯誤情況有一個直觀印象。如下表:

 

該表即貓咪圖像識別項目中,對部分樣本進行錯誤分析的統計表,注意一個錯誤樣本可以有多個錯誤原因。

根據錯誤統計表,可以提出針對性的改進方案,如在上述貓咪圖像識別任務中,有兩個優化方案:

1.增加一個分類器以區分貓和狗;

2.增加一個分類器以區分寵物貓和其他大型貓科動物。

通過錯誤統計表,可以很容易的知道方案2將會帶來更大的效果提升。

 

·Dev set的分割:

當Dev set過大時,可以將其進行分割以減少手工錯誤分析的工作量。將Dev set分割為兩個部分:Eyeball dev set 和 Blackbox dev set。

Eyeball dev set(開發集-觀測):即需要手動對其進行錯誤分析的部分。

Blackbox dev set(開發集-黑盒):即不需要手動進行錯誤分析的部分,只對其錯誤率進行統計。

用法:使用Eyeball dev set 進行手動分析,制定優化方案。將優化后的模型同時在Eyeball dev set和Blackbox dev set上進行應用,如兩者效果相當,則優化成功;如優化后模型在Eyeball dev set上的表現明顯優於blackbox dev set,則說明該優化方案對Eyeball dev set 過擬合,此時需要對eyeball dev set進行修改,可以重新划分或通過對其增加樣本的方式進行。

 

·Eyeball dev set的大小:

一般來講,手動錯誤分析需要有足夠的錯誤樣本,例如:當Eyeball dev set中僅有10個錯誤樣本的話,你無法准確的評判各種錯誤類型所占的比例。一般要求Eyeball dev set中含有50個以上的錯誤樣本,100個為佳。因此:

如一個模型的分類准確率為90%,要求Eyeball dev set中具有100個錯誤樣本,即Eyeball dev set 中需要100/(1-90%)=1000個樣本。在Dev set規模不大的時候,將Dev set整個作為Eyeball dev set也是可行的,即手動分析Dev set中的所有錯誤樣本。

 

 

第四章(Bias and Variance)筆記:

·Bias 和 Variance的定義:

(注:直接將Bias和Variance翻譯為偏差和方差不能准確的表明其在本書中的含義,這里直接使用其英文名稱了。)

Bias測試集(Training set)的錯誤率。

Variance開發集(Dev set)的錯誤率減去Bias,即模型在Dev set上的表現比其在Training set上表現更差的程度。

Avoidable bias表示可以優化的bias,使用Bias減去最優情況下的錯誤率得到。如一個語音識別的項目中,部分樣本有雜音,人類識別的錯誤率為14%,可定義最優情況的錯誤率為14%,模型識別錯誤率為15%,即bias=15%,此時Avoidable bias=15%-14%=1%。

 

·根據Bias 和 Variance來調整優化方向:

Bias小、Variance大:即模型對訓練集過擬合。

優化策略:擴充訓練樣本數目,或簡化模型結構,或減少訓練時間。其中,擴充訓練樣本數目最為常用、效果最好。

例——Training set的錯誤率為1%,Dev set的錯誤率為11%,此時bias=1%,variance=10%,即bias小,variance大,可判斷為對訓練集過擬合。

Bias大、Variance小:即模型對訓練集欠擬合。

優化策略:增加網絡復雜度(可同時使用正則化或dropout,以減少增加variance的風險),改變網絡結構,增加訓練輪次(增長訓練時間)。

例——Training set的錯誤率為15%,Dev set的錯誤率為16%,此時bias=15%,variance=1%,即模型展現出的效果不佳,判斷其為欠擬合。

Bias大、Variance大:即模型在訓練集合開發集上均表現不佳,其中開發集更差。

優化策略:同時使用上面的兩種情況的優化策略對模型進行優化,或者通過深入分析,改變模型結構以同時減小bias 和 variance。

 

·減少Bias 的方法總結:

1.增加模型復雜度。

2.對Training set 進行錯誤分析,根據分析結果,調整輸入樣本的特征,盡量增加輸入特征數目來使模型進行更准確的判斷。

3.避免使用正則化或Dropout。正則化和Dropout的使用會增加bias,減少variance。

4.修改模型結構。

 

·減少Variance的方法總結:

1.增加更多訓練數據。

2.增加正則化或Dropout。(該方法有可能在減少variance的同時增大bias)

3.設置訓練停止閾值,即在loss減少不明顯的情況下終止訓練,防止訓練迭代輪次過多而產生過擬合。

4.對輸入樣本的特征進行篩選,減少特征數目。

5.降低模型復雜度。

6.對Dev set進行錯誤分析,調整樣本特征,可增加有利於提升模型表現的特征。

7.改變模型結構。

 

 

第五章(Learning Curves)筆記:

·學習曲線(Learning Curve)

定義:訓練樣本數目(訓練集規模)與Dev set錯誤率的對應關系圖像。 

 

上圖即一個學習曲線的示例,隨着訓練集的增大,Dev set的錯誤率不斷降低。

 

·包含Bias和最優表現的學習曲線:

定義:在學習曲線的圖表中加入模型對訓練集的錯誤率統計(即Bias),和所期待模型達到的最優錯誤率,即獲得該圖表。

上圖即一個一般情況下的學習曲線圖。

下方的曲線代表模型在訓練集上的誤差,可以看出隨着樣本量的增加,訓練集上的誤差越來越大。這也很容易理解,當訓練樣本只有1個的時候,模型肯定會完全擬合,錯誤率為0。當樣本越來越多的時候,網絡就越來越難以“記憶”這些樣本的特性,因此在其上的誤差會越來越大,即Bias越來越大。

上方的曲線代表模型在開發集上的誤差,隨着訓練集樣本數目的增加,模型的泛化能力增強,因此模型在Dev set上的誤差越來越小,最終接近我們所期待的最優效果。

中間的直線代表我們期待模型所能達到的最佳效果。它是一個固定的錯誤率。一般來講,隨着樣本數目的增加,模型訓練效果會越來越接近這條直線,但不會與之交叉,一旦越過這條直線,可以判定:①最佳效果的錯誤率制定有誤;②模型對訓練集/開發集過擬合。

 

·使用學習曲線觀測Bias和Variance

根據Bias和Variance的定義,Train Error的值即為Bias,Dev Error和Train Error的差值即為Variance。

 

 

·使用學習曲線決定模型優化方向:

在上圖這種情況下,Bias很大,Variance很小,並且兩者均大於最優錯誤率。可以判定模型對訓練集欠擬合,而且隨着訓練集的增大(訓練樣本增多),模型並沒有展現出更進一步的情況。此時,需要對模型的結構進行改變,增加模型的復雜度。

在上圖這種情況下,Bias雖然比較大,但它的Avoidable Bias(即Training Error減去 Desired Performance)比較小,因此可以判定其Bias較小,Variance較大。可以使用增加訓練樣本的方法來降低Dev Error。

 

·學習曲線的弊端:

將模型在不同數量的訓練集下進行訓練,會消耗較大的計算量。

 

 

第六章(Comparing to human-level performance)筆記:

·定義及作用:

定義:使用人類的能力來和模型進行比對,包括錯誤率比對(以方便判斷該算法模型是否還具有繼續提升的空間),和錯誤分析比對(使用人類直覺以判斷分析模型在哪些方面容易出問題)。

作用:獲取標記樣本;錯誤分析時作比對,找出正確改進方向;設置最優錯誤率(Desired error rate)。

 

·定義效果超出人類所達到的能力:

可以對模型分類錯誤的樣本進行錯誤分析(Error Analysis),將錯誤進行分類,如果在某種錯誤類型上,人類依然擁有更加優秀的表現,那么就可以朝這個方向繼續優化,以使模型達到超越人類的表現。

如:在貓咪圖片識別任務中,模型與人類整體表現相當。其中,模型對模糊圖像的識別效果更好,人類對大型貓科動物的區分度更高。此時可以通過優化模型對貓科動物的區分能力,以使模型的整體表現優於人類。

 

 

第七章(Training and testing on different distributions)筆記:

·使用不同來源的數據進行訓練:

情境:當真實環境中的數據量不夠的時候,可以將一些模擬數據、生成數據、網絡上相關數據加入到訓練集中進行訓練。以擴展模型識別潛在特征的能力,增強泛化性,使其更好的在未來的實際應用場景中工作。

問題:由於數據來源不同,可能導致模型的效果不佳。以人腦來進行比喻,人腦的記憶空間有限,如果外部來源的數據使用過多,有可能會弱化對目標來源數據的判斷。

 

·使用權重來調節不同來源數據所造成的影響:

具體方法是在計算損失函數的時候,加入權重,以增大真實環境數據對網絡的影響。

例子:在貓咪識別任務中,假設我們有有200,000個來自互聯網的樣本圖片,以及5000張來自真實環境(手機上傳)的樣本圖片,其比例為40:1。

不使用權重時的損失函數計算公式(此時互聯網樣本和真實樣本對模型的影響比例為40:1):

加入權重的損失函數計算公式:

其中,β是用戶設計的權重值,在上述貓咪識別的例子中,β=1/40時,可以使來自互聯網的樣本和真實樣本對模型產生1:1的影響。

 

·數據不匹配誤差(Data Mismatch Error)

定義:由訓練集和開發集的數據來源分布不一致所造成的誤差。假設訓練集的數據來源是50%的互聯網數據+50%的真實數據。

判定:從訓練集中分出一部分,保持和訓練集的數據分布相同,將其稱作訓練-開發集(Training dev set)。該數據集不參與模型訓練,僅在訓練完成之后用於和訓練集、開發集的錯誤率進行比較。當訓練集和訓練-開發集的誤差相似,而開發集(dev set)的誤差比兩者要大得多的時候,即可判定出現了數據不匹配誤差(Data Mismatch Error)。

解決方法:①通過錯誤分析等方法判斷訓練樣本和Dev set中樣本的差異,針對這些差異性對模型進行改進。②獲取更多真實數據來增加訓練集中真實數據的比例。

人工數據合成:另外還有手動數據合成的方法來實現增加真實數據樣本的目的。如在語音識別任務中,為清晰的語音樣本(來自互聯網)人為的注入噪聲影響,以模擬真實數據。

 

 

第八章(Debugging inference algorithm)筆記:

本章講解了一些在復雜建模情況下的調試方法

·映射函數:

映射函數:在某些不好直接數值化建模的情況下,我們需要一個函數將原始輸入轉換成一個數值或數值向量,這個函數就叫做映射函數。(書中將這個函數稱為Scoring function

例如:在語音識別任務中,我們有一個輸入語音A,以及一個對應的語句字符串S。現在需要通過一個映射函數ScoreA(S)來計算出一個得分,這個得分能正確的反映字符串S與語音A的匹配程度,匹配程度越高,得分越高。

基於映射函數的AI設計模式:很多任務里面,可以使用映射函數對一個輸出進行評分,之后使用相關機器學習算法來優化這個評分,使其得到最大值。

 

·優化驗證測試(optimization verification test)

目的:在對具有映射函數的模型進行建模訓練時,會面臨一個問題,當訓練效果不佳時,建模人員不清楚是映射函數不合理還是機器學習算法模型有誤。為解決這個問題,引入優化驗證測試。

方法:拿出一個錯誤樣本,對其算法模型的輸出S_out和正確樣本輸出S_true分別使用映射函數計算得分,如果 得分(S_out)>=得分(S_true),則說明映射函數無法正確的對這個樣本的輸出進行評判。抽取一些錯誤樣本進行測試,當有相當部分的錯誤樣本在映射函數上出了問題時,考慮更換映射函數。

 

 

第九章(End-to-end deep learning)筆記:

·機器學習“管道”(machine learning pipeline):

概念:這里的“管道”指的是機器學習的建模流程。管道左側為輸入,可以是一個語音片段,一張圖片或一行文字等等;管道右側為輸出,可以是一行文字,一個識別結果或一個情感分析結果(積極情感、消極情感)等等。

示例:下方圖片是一個語音識別項目的機器學習管道,由三個組件組成:特征提取,音素識別器,末端識別器。

 

·端到端學習(End-to-end learning):

概念:一個機器學習管道中,可以由多個組件按照某種順序組合而成;也可以由一個單一的學習算法構成。其中由單一學習算法構成的管道稱為端到端學習

-包含多組件的學習管道(車輛自動駕駛項目):

-端到端學習(車輛自動駕駛項目):

 

近年來,在數據樣本十分豐富的條件下,端到端學習展現出了非常強大的能力,取得了相當的成功。

 

·端到端學習的優缺點:

優點:過多“手工設計”的管道組件在進行編碼、映射時有可能會丟失部分輸入信息,而端到端學習將原始樣本進行輸入可以將信息全部保留;部分“手工設計”的管道組件並不是一個完美的模型,也許存在部分系統缺陷,端到端學習可以避免引入這部分缺陷;此外,端到端學習在可以應用在人類先驗知識較為缺乏的領域。

缺點:由於沒有“手工設計”管道組件的預處理步驟,端到端學習的過程相對復雜,需要更長的學習時間,使用更大的數據量。

 

·學習管道的組件(component)選擇:

很多時候我們在數據量缺乏的時候,不能使用端到端學習,因此需要手工設計一個由多組件(模塊)組成的學習管道。關於組件(模塊)的選擇,有以下兩個注意事項:

數據可用性:如需將某個組件加入管道,要保證能夠較為容易的獲取相關數據來對這個組件進行訓練。

任務簡易性:即對於單個組件,避免使其執行復雜任務。

如在語音識別任務中,將特征提取工作分解成特征計算組件和音素識別兩個組件;分別使用現有的MFCC特征提取法和基於語言學的音素識別算法,能夠較為容易完成這兩個組件的工作,保證了整個學習管道的易用性。

 

 

第十章(Error analysis by parts)筆記:

·分部錯誤分析:

在使用多組件管道進行深度學習任務的時候,一旦整體效果不佳,就需要對管道里的各個組件篩查,以確定哪些組件出了問題。這個篩查的過程就稱作分部錯誤分析(Error analysis by parts)

方法:使用錯誤樣本,輸出每一個組件中間步驟的結果,人工對其進行判讀,以確定哪些組件問題較大,有繼續優化的空間。

:在暹羅貓識別任務中,設計如下的學習管道:

第一個組件使用原始輸入圖片對貓咪進行識別,獲取貓咪的部分傳入第二個組件,第二個組件來判別貓咪是否為暹羅貓。

對於一個錯誤樣本,如果第一個組件(貓咪識別組件)沒有正確的將貓咪進行識別,得到類似下圖(左)的結果,則可以判定第一個組件有問題;如果第一個組件能夠正確識別出貓咪所在區域,得到類似下圖(右)的結果,則可以判定第二個組件有問題。

取多個樣本進行分部錯誤分析,對分析結果進行統計,可以判斷出哪些組件需要優化提升。

 

·分部錯誤分析的一般流程:

錯誤組件定位流程概括:即從輸入至輸出的順序對每個組件逐個排查。使用完美的(正確的)輸出對該組件的輸出進行替代,如經過替代后該組件可以最終得到正確輸出,則判斷該組件有問題。

:對於汽車自動駕駛問題,學習管道如下。

 

對於這個管道,錯誤組件定位的方式為:

步驟1:使用該錯誤樣本進行輸入,對汽車探測器組件的輸出進行修改,使其變成正確的輸出,行人探測器組件的輸出結果不變,將這兩個輸出結果傳入路徑規划組件,如果能夠輸出正確的汽車運行路線,則說明汽車探測器組件存在問題。如果不能輸出正確路線,則進入步驟2。

步驟2:使用該錯誤樣本進行輸入,對行人探測器的輸出進行修改,使其變成完美的(正確的)輸出,看管道能否生成正確的路線,能正確輸出的話則說明行人探測器組件存在問題;如依然不能輸出正確路線,轉至步驟3。

步驟3:路徑規划組件存在問題。

 

·使用人類的水平來對比每一個組件:

為了獲得更加准確的輸出結果和更強的魯棒性,我們可以對管道中的每一個組件進行分析,以人類的水准來進行對比,盡可能多的強化學習管道的能力。

例如:在暹羅貓識別任務中,

 

①先看第一個組件,貓咪探測器的輸出如下:

 

使用人類的水平進行對比,這個輸出結果明顯是不合格的,說明該組件擁有巨大的提升空間。

②再看第二個組件,貓咪類型探測器的輸入:

對於一個貓咪愛好者來說,完全可以根據這個圖片判斷出來這是一只暹羅貓。證明第二個組件也沒有達到人類的識別水平,依然擁有性能提升空間。

注意:一旦管道中所有的組件都達到了接近人類的水准,但管道依然無法提供正確的輸出,則說明管道的設計存在問題,需要進行重新設計(新增組件或刪改組件)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM