第十一章 實踐方法論 (開篇引言)
2017-06-09
Practical Methodology
https://www.youtube.com/live/gjca8HvfyLM?si=k5Iz-aT6AyLHCuP8
重點摘要: 要成功地使用深度學習技術,僅僅知道有哪些算法和解釋它們為何有效的原因是不夠的。一個優秀的機器學習實踐者還需要知道如何針對具體應用挑選一個合適的算法以及如何監控,並根據反饋改進機器學習系統。在機器學習系統的日常開發中,實踐者需要決定是否收集更多數據、增加或減少模型容量、添加或刪除正則化項、改進模型的優化、改進模型的近似推斷或調試模型的軟件實現。這些操作都需要大量時間,因此確定正確做法至關重要。 本章的大部分內容都是關於不同的機器學習模型、訓練算法和目標函數。這可能給人一種印象——成為機器學習專家的最重要因素是了解各種各樣的機器學習技術,並熟悉各種不同的數學。在實踐中,正確使用一個普通算法通常比草率地使用一個不清楚的算法效果更好。正確應用一個算法需要掌握一些相當簡單的方法論。本章的許多建議都來自 Ng (2015)。 建議參考以下幾個實踐設計流程:
- 確定目標——使用什麼樣的誤差度量,並為此誤差度量指定目標值。這些目標和誤差度量取決於該應用旨在解決的問題。
- 盡快建立一個端到端的工作流程,包括估計合適的性能度量。
- 搭建系統,並確定性能瓶頸。檢查哪個部分性能差于預期,以及是否是因為過擬合、欠擬合,或者數據或軟件缺陷造成的。
- 根據具體觀察反覆地進行增量式的改動,如收集新數據、調整超參數或改進算法。 本章將使用街景地址號碼轉錄系統 (Goodfellow et al., 2014d) 作為一個運行示例。
Q: 除了了解算法和數學原理,一個優秀的機器學習實踐者還需要具備哪些能力?
A: 一個優秀的機器學習實踐者還需要知道如何:
- 針對具體的應用挑選一個合適的算法。
- 監控機器學習系統的性能。
- 根據反饋和觀察結果來改進機器學習系統。
- 有效地決定開發過程中的下一步行動,例如是否收集更多數據、調整模型容量、修改正則化、優化算法等。
Q: 本章提出的實踐設計流程包含哪些主要步驟?
A: 主要步驟包括:
- 確定目標: 明確任務的誤差度量和目標性能值。
- 建立端到端工作流程: 盡快搭建一個可以運行的完整系統,包括性能評估。
- 性能分析與瓶頸定位: 監控系統性能,找出表現不佳的部分,並分析原因(如過擬合、欠擬合、數據或軟件問題)。
- 迭代改進: 根據觀察結果,進行增量式的改進,例如收集新數據、調整超參數或改進算法。
Q: 為什麼說「正確使用一個普通算法通常比草率地使用一個不清楚的算法效果更好」?
A: 這句話強調了實踐方法論的重要性。即使一個算法在理論上非常先進或複雜,如果不能正確地應用、調試和評估它,其效果可能還不如一個更簡單但被正確理解和使用的算法。良好的實踐方法論有助於系統性地發現問題、優化性能,並確保算法在其預期的方式下工作。
11.1 性能度量
重點摘要: 確定目標,即使用什麼誤差度量,是必要的第一步,因為誤差度量將指導接下來的所有工作。同時我們也應該了解大概能得到什麼級別的目標性能。 值得注意的是對於大多數應用而言,不可能實現絕對零誤差。即使你有無限的訓練數據,並且恢復了真正的概率分布,泛化誤差仍定義了僅能達到的最小錯誤率。這是因為輸入特征可能無法包含輸出變量的完整信息,或是因為系統可能本質上是隨機的。 訓練數據的數量會因為各種原因受到限制。當目標是打造現實世界中最好的產品或服務時,我們通常需要收集更多的數據,但必須確定進一步減少誤差的價值,並與收集更多數據的成本做權衡。 除了一開始設定的性能度量之外,另一個需要考慮的是度量的選擇。不同的應用可能需要不同類型的性能度量。例如,對於不平衡類別問題,準確率可能不是最佳指標。有時,一種錯誤可能會比另一種錯誤更嚴重。 例如,在垃圾郵件檢測中,將正常郵件錯誤地標記為垃圾郵件(假陽性)的代價通常遠高於將垃圾郵件錯誤地標記為正常郵件(假陰性)的代價。因此,查準率 (precision) 和召回率 (recall),以及它們的組合 F-score (公式 11.1),可能是比準確率更合適的度量。覆蓋率 (coverage) 也是一個重要的指標,尤其是在系統需要人工介入時。
Q: 為什麼在開始一個機器學習項目時,確定性能度量是必要的第一步?
A: 因為性能度量(或誤差度量)將指導整個項目的開發和優化方向。它定義了「成功」的標準,並幫助我們客觀地評估不同模型、算法或超參數設置的好壞。沒有明確的性能度量,就很難判斷模型的改進方向以及何時達到了可接受的性能水平。
Q: 為什麼說在大多數實際應用中,不可能實現絕對零誤差?
A: 主要原因有:
- 數據本身的局限性: 輸入特征可能沒有包含預測輸出變量所需的全部信息(即存在潛在的不可約誤差,也稱為貝葉斯誤差)。
- 系統的隨機性: 某些系統本質上就帶有隨機性,即使模型完美,也無法完全消除誤差。
- 數據採集的限制: 訓練數據的數量和質量總是有限的,可能無法完全代表真實的數據分布。
- 模型的局限性: 任何模型都是對現實的簡化,可能無法完美捕捉所有複雜的模式。
Q: 在評估分類器性能時,除了準確率 (accuracy),還有哪些常用的性能度量?它們各自關注什麼方面?
A: 除了準確率,常用的性能度量還包括:
- 查準率 (Precision): 在所有被模型預測為正例的樣本中,真正是正例的比例。關注的是模型預測為正例的結果有多「準確」。
Precision = TP / (TP + FP)
(TP: 真陽性, FP: 假陽性) - 召回率 (Recall) / 查全率 / 敏感度 (Sensitivity): 在所有真實為正例的樣本中,被模型成功預測為正例的比例。關注的是模型能「找出」多少真實的正例。
Recall = TP / (TP + FN)
(FN: 假陰性) - F-score (通常是 F1-score): 查準率和召回率的調和平均數,用於綜合評價模型的性能,特別是在類別不平衡或對查準率和召回率都有要求的情況下。
F1 = 2 * (Precision * Recall) / (Precision + Recall)
(公式 11.1) - PR 曲線 (Precision-Recall Curve): 以查準率為縱軸,召回率為橫軸繪製的曲線,用於展示在不同分類閾值下查準率和召回率的變化關係。曲線下面積 (AUC-PR) 也是一個重要的匯總指標。
- ROC 曲線 (Receiver Operating Characteristic Curve): 以真正例率 (TPR,即召回率) 為縱軸,假正例率 (FPR) 為橫軸繪製的曲線。曲線下面積 (AUC-ROC) 也是一個常用的分類器性能度量。
Q: 什麼是「覆蓋率 (coverage)」?在什麼情況下它是一個重要的性能度量?
A: 「覆蓋率」通常指的是系統能夠自動處理(即給出一個高置信度的預測)的樣本比例。對於那些系統無法高置信度處理的樣本,可能需要人工介入。 在以下情況下,覆蓋率是一個重要的性能度量: * 當人工干預成本很高時: 如果系統的覆蓋率低,意味著大量樣本需要人工處理,會增加成本。 * 當錯誤的自動化決策後果嚴重時: 在這種情況下,寧願系統對某些情況表示「不知道」(低置信度,不覆蓋),交由人工判斷,也不願做出錯誤的自動化決策。 * 衡量系統的適用範圍: 覆蓋率可以反映系統在多大程度上能夠獨立有效地解決問題。
11.2 默認的基准模型
重點摘要: 確定性能度量和目標後,任何實際應用的下一步是盡快建立一個合理的端到端系統的基線。本節提供了一些關於在不同情況下使用哪種算法作為第一基准方法的推薦。
- 問題類型判斷:
- 結構化輸出 vs. 簡單輸出: 如果需要預測多個相互關聯的值(如圖像分割的像素標籤),則問題更複雜。
- 監督 vs. 無監督: 數據是否有標籤。
- 「AI 完備」問題 vs. 簡單模式識別: 某些問題(如對象識別、語音識別、機器翻譯)需要接近人類水平的智能,通常需要深度學習。
- 選擇基線模型:
- 有標註數據且數據量大:
- 固定大小的向量輸入: 全連接的前饋網路。如果輸入具有已知的拓撲結構(如圖像),則使用卷積網路。
- 序列輸入: 門控循環神經網路 (LSTM 或 GRU)。
- 無監督學習: PCA(用於實值數據)、k-均值聚類、高斯混合模型或其他密度估計方法。
- 傳統機器學習方法: 對於許多問題,先嘗試簡單的線性模型(如邏輯回歸、SVM)或決策樹/隨機森林/梯度提升樹,它們訓練快,易於理解。
- 有標註數據且數據量大:
- 優化算法: 隨機梯度下降 (SGD) 及其變體(如 Adam、RMSProp)是深度學習的標準選擇。注意學習率的調整。
- 正則化: Dropout 是一個很好的通用正則化器。批量歸一化也有助於正則化和加速訓練。
- 激活函數: ReLU 及其變體(Leaky ReLU, PReLU, maxout)是常用的選擇,避免了 sigmoid 的梯度飽和問題。
Q: 在開始一個新的機器學習項目時,建立一個「默認的基准模型」有什麼好處?
A: 建立一個默認的基准模型的好處包括:
- 快速驗證端到端流程: 可以快速搭建一個完整的工作流程,從數據加載、預處理、模型訓練、評估到結果分析,確保整個系統是可運行的。
- 提供性能下限: 基准模型的性能可以作為一個參考點,後續更複雜的模型需要超越這個性能才算有實質性的改進。
- 幫助理解問題的難度: 如果一個簡單的基准模型就能達到不錯的性能,可能說明問題本身相對簡單,或者數據質量較好。反之,則可能意味著問題更具挑戰性。
- 指導後續模型選擇和優化方向: 通過分析基准模型的不足之處,可以為後續選擇更複雜的模型或改進方向提供線索。
Q: 針對不同類型的輸入數據和任務,有哪些推薦的默認基准模型?
A:
- 固定大小的向量輸入(監督學習):
- 簡單問題/傳統方法: 邏輯回歸 (分類)、線性回歸 (回歸)、支持向量機 (SVM)、決策樹、隨機森林、梯度提升機 (GBM/XGBoost/LightGBM)。
- 深度學習: 全連接的前饋神經網路(多層感知機, MLP)。
- 具有已知拓撲結構的輸入(如圖像)(監督學習): 卷積神經網路 (CNN)。
- 序列輸入(監督學習): 門控循環神經網路 (Gated RNN),如長短期記憶網路 (LSTM) 或門控循環單元 (GRU)。
- 無監督學習:
- 降維/特徵提取 (實值數據): 主成分分析 (PCA)。
- 聚類: k-均值聚類 (k-means)。
- 密度估計: 高斯混合模型 (GMM)、核密度估計 (KDE)。
- 表示學習: 自編碼器 (Autoencoder)、受限玻爾茲曼機 (RBM)(如果適用)。
Q: 在訓練深度學習模型時,常用的默認優化算法、激活函數和正則化方法是什麼?
A:
- 優化算法:
- 隨機梯度下降 (SGD) 及其動量變體。
- 自適應學習率算法,如 Adam、RMSProp、AdaGrad。Adam 通常是一個很好的默認選擇。
- 激活函數:
- 修正線性單元 (ReLU) 是最常用的默認選擇。
- ReLU 的變體,如 Leaky ReLU, Parametric ReLU (PReLU), Exponential Linear Unit (ELU), Maxout,可以解決 ReLU 的某些問題(如死亡 ReLU 單元)。
- 對於輸出層,根據任務類型選擇:
- 線性激活 (回歸)。
- Sigmoid (二元分類,或多標籤分類的每個標籤)。
- Softmax (多元互斥分類)。
- 正則化方法:
- Dropout: 一個非常通用且有效的正則化器,隨機地在訓練期間「丟棄」一部分神經元。
- 批量歸一化 (Batch Normalization): 除了加速收斂,也有一定的正則化效果。
- L2 正則化 (權重衰減): 懲罰大的權重。
- L1 正則化: 誘導權重稀疏。
- 數據增強 (Data Augmentation): 雖然不是直接作用於模型,但也是一種有效的防止過擬合的方法。
- 早停 (Early Stopping): 監控驗證集性能,在性能不再提升時停止訓練。
11.3 決定是否收集更多數據
重點摘要: 在建立第一個端到端系統的基線後,就可以度量算法性能並決定如何改進算法。一個常見的問題是判斷是否需要收集更多數據。
- 判斷標準:
- 訓練集性能是否可接受: 如果模型在訓練集上的性能就很差,那麼收集更多數據可能幫助不大,問題可能在於模型容量不足、優化不當或特征工程不夠。
- 訓練集與測試集性能的差距: 如果模型在訓練集上表現良好,但在測試集上表現差(即泛化能力差,過擬合),那麼收集更多與測試集同分布的數據通常是有益的。
- 學習曲線 (Learning Curves): 繪製訓練集和驗證集(或測試集)的性能隨訓練數據量增加而變化的曲線。如果隨著數據量的增加,驗證集性能持續提升且與訓練集性能的差距縮小,則表明增加數據是有益的。如果兩條曲線都趨於平緩且性能不佳,則可能需要改進模型或算法。
- 收集數據的成本與收益: 收集和標註數據通常是有成本的。需要權衡增加數據可能帶來的性能提升與付出的代價。
- 數據質量: 有時,提高現有數據的質量(如清理噪聲、修正錯誤標籤)比簡單地增加數據量更有效。
- 主動學習 (Active Learning): 一種策略,模型可以主動選擇哪些未標註的樣本進行標註,通常選擇那些模型最「不確定」的樣本,以期用最少的標註成本獲得最大的性能提升。 圖 5.4 繪製了訓練集規模和泛化誤差之間的關係,有助於判斷收集更多數據是否有幫助。
Q: 在什麼情況下,收集更多訓練數據通常是一個好的策略來提升模型性能?
A: 收集更多訓練數據通常在以下情況下是好的策略:
- 模型過擬合 (Overfitting): 當模型在訓練集上表現很好,但在未見過的測試集(或驗證集)上表現明顯較差時,表明模型學習了訓練數據中的噪聲或特定細節,而不是泛化的模式。增加更多多樣化的訓練數據可以幫助模型學習更魯棒的特征,減少過擬合。
- 學習曲線顯示潛力: 如果繪製的學習曲線(性能 vs. 訓練數據量)顯示,隨著數據量的增加,驗證集(或測試集)的性能仍在持續提升,並且與訓練集性能之間的差距在縮小,那麼進一步增加數據量很可能會帶來性能的提升。
- 數據本身信息量不足: 如果現有的訓練數據量相對於問題的複雜性或輸入特征的維度來說太少,模型可能無法學到足夠的模式。
Q: 在什麼情況下,僅僅收集更多數據可能無法解決模型性能不佳的問題?
A: 僅僅收集更多數據可能無法解決問題的情況包括:
- 模型欠擬合 (Underfitting): 如果模型在訓練集上的性能就已經很差,表明模型的容量(表達能力)不足以捕捉數據中的基本模式。此時,需要改進模型架構(例如,增加層數、增加隱藏單元數量)或使用更強大的特征,而不是簡單地增加數據。
- 數據質量差或標籤錯誤: 如果現有數據中存在大量噪聲、錯誤標籤或系統性偏差,那麼增加更多類似質量的數據可能幫助不大,甚至可能加劇問題。此時,清理數據或改進標註質量可能更重要。
- 算法或優化問題: 如果模型的優化過程存在問題(例如,學習率設置不當、陷入差的局部最優),或者選擇的算法本身不適合該問題,那麼增加數據也無法解決根本問題。
- 特征不足: 如果輸入特征本身沒有包含足夠的預測信息,無論多少數據,模型都無法學到好的預測。
Q: 什麼是學習曲線 (learning curve)?它如何幫助我們判斷是否需要收集更多數據?
A: 學習曲線是描繪模型性能(例如,準確率、損失函數值)隨訓練數據量(或訓練迭代次數)變化而變化的圖表。通常會同時繪製模型在訓練集上的性能曲線和在獨立的驗證集(或測試集)上的性能曲線。 學習曲線可以幫助判斷是否需要收集更多數據: * 高偏差 (High Bias) / 欠擬合: 如果訓練集性能和驗證集性能都很差,並且隨著數據量的增加兩者都趨於平緩且相差不大,這通常意味著模型欠擬合(容量不足)。此時,增加更多數據可能幫助不大,需要改進模型。 * 高方差 (High Variance) / 過擬合: 如果訓練集性能很好,但驗證集性能較差,並且兩者之間存在較大的差距,這通常意味著模型過擬合。如果隨著數據量的增加,驗證集性能持續提升並且與訓練集性能的差距在縮小,那麼增加更多數據通常是有益的。 * 理想情況: 訓練集性能和驗證集性能都很好,並且兩者比較接近。
11.4 選擇超參數
重點摘要: 大部分深度學習算法都有一組超參數來控制不同方面的算法表現。這些超參數的選擇對模型性能至關重要,但通常沒有直接的、理論指導的選擇方法,需要通過實驗來確定。
- 手動調整超參數: 依賴經驗和直覺,通過嘗試不同的超參數組合來觀察其對驗證集性能的影響。需要理解超參數(如學習率、正則化係數、模型容量相關參數)與訓練誤差、泛化誤差和計算資源之間的關係。表 11.1 提供了一些常見超參數及其對模型影響的總結。
- 自動超參數優化算法:
- 網格搜索 (Grid Search): 為每個超參數定義一組離散的候選值,然後遍歷所有可能的超參數組合,評估每種組合在驗證集上的性能,選擇最佳組合。計算成本隨超參數數量指數級增長。
- 隨機搜索 (Random Search): 在指定的超參數範圍內隨機採樣超參數組合進行評估。通常比網格搜索更高效,因為某些超參數可能比其他超參數對性能影響更大,隨機搜索更有可能找到這些重要超參數的較好值。
- 基於模型的超參數優化 (Model-Based Hyperparameter Optimization) / 貝葉斯優化 (Bayesian Optimization): 使用一個代理模型(如高斯過程)來建模超參數與模型性能之間的關係,並利用這個代理模型來智能地選擇下一個要評估的超參數組合,以期更快地找到最優組合。例如,Spearmint, TPE, SMAC 等工具。
11.4.1 手動調整超參數
重點摘要: 手動調整超參數需要理解每個超參數的作用以及它們如何影響模型的學習和泛化能力。
- 學習率 (Learning Rate): 可能是最重要的超參數。太小則收斂慢,太大則可能導致震盪或發散。通常需要嘗試不同的數量級(如 0.1, 0.01, 0.001)。學習率衰減策略(如逐步降低、指數衰減)也很常用。
- 模型容量相關參數:
- 隱藏單元數量/層數: 影響模型的表達能力。過小則欠擬合,過大則可能過擬合且計算成本高。
- 卷積核大小/數量 (CNN): 類似。
- 正則化相關參數:
- 權重衰減係數 (L2 正則化): 控制權重的大小,防止過擬合。
- Dropout 比率: 控制隨機丟棄神經元的比例。
- 優化器相關參數: 如 Adam 中的
β1
,β2
,ε
。 - 批量大小 (Batch Size): 影響梯度估計的噪聲水平和訓練速度。 通常從一個合理的初始猜測開始,然後根據驗證集的性能進行調整。監控訓練過程中的訓練誤差和驗證誤差曲線對於指導超參數調整非常重要。
Q: 在手動調整超參數時,哪些超參數通常被認為是最重要的,需要優先調整?
A: 通常,以下超參數被認為是最重要的,需要優先調整:
- 學習率 (Learning Rate): 這是幾乎所有基於梯度下降的優化算法中最重要的超參數。它直接影響模型的收斂速度和最終性能。
- 模型容量相關的超參數:
- 對於 MLP:隱藏層的數量和每個隱藏層的單元數量。
- 對於 CNN:卷積層的數量、每個卷積層的濾波器數量、濾波器大小。
- 對於 RNN:循環單元類型(LSTM, GRU)、隱藏狀態的維度、層數。
- 正則化相關的超參數:
- 權重衰減係數(L2 正則化)。
- Dropout 的保留機率(或丟棄機率)。
- 批量大小 (Batch Size): 雖然有時也被視為訓練設置的一部分,但它會影響梯度估計的質量和訓練的穩定性。
Q: 為什麼說學習率可能是最重要的超參數?如何有效地調整學習率?
A: 學習率之所以重要,是因為它控制了模型參數在每次迭代中更新的步長。
- 學習率太小: 模型收斂速度會非常緩慢,可能需要很長的訓練時間才能達到一個好的解。
- 學習率太大: 模型可能會在最優解附近震盪,甚至可能導致損失函數發散,無法收斂。
有效調整學習率的方法包括:
- 嘗試不同的數量級: 通常從一個較大的值(如 0.1)開始,然後以 10 的倍數減小(如 0.01, 0.001, 0.0001),觀察訓練過程中的損失變化。
- 繪製損失曲線: 監控訓練損失和驗證損失隨迭代次數的變化。如果損失下降緩慢,可能需要增大學習率。如果損失震盪或上升,則需要減小學習率。
- 學習率衰減 (Learning Rate Decay / Scheduling): 在訓練過程中逐漸降低學習率。常見的策略包括:
- 步進衰減 (Step Decay): 每隔一定的 epoch 數,將學習率乘以一個衰減因子。
- 指數衰減 (Exponential Decay): 學習率隨 epoch 指數級下降。
- 餘弦退火 (Cosine Annealing): 學習率按餘弦函數周期性變化。
- 學習率範圍測試 (Learning Rate Range Test): 從一個非常小的學習率開始,在每個小批量後逐漸增大學習率,並記錄損失。繪製損失與學習率的關係圖,可以找到一個合適的學習率範圍。
- 使用自適應學習率優化器: 像 Adam, RMSProp 這樣的優化器會自動調整每個參數的學習率,但它們仍然有一個全局的初始學習率需要設置。
Q: 表 11.1 總結了一些常見超參數的調整如何影響模型性能,請舉例說明一個超參數及其可能的影響。
A: (參見表 11.1 的內容,這裡舉一個例子)
- 超參數: 隱藏單元數量 (Number of Hidden Units)
- 影響:
- 增加隱藏單元數量:
- 優點: 增加模型容量,使其能夠學習更複雜的函數,可能降低訓練誤差。
- 缺點: 可能導致過擬合(如果數據量不足或正則化不夠),增加計算成本和訓練時間,增加內存消耗。
- 減少隱藏單元數量:
- 優點: 降低模型容量,可能減少過擬合,減少計算成本和訓練時間,減少內存消耗。
- 缺點: 可能導致欠擬合(如果模型容量太小,無法捕捉數據的複雜性),訓練誤差可能較高。
- 增加隱藏單元數量:
11.4.2 自動超參數優化算法
重點摘要: 由於手動調整超參數耗時且依賴經驗,自動超參數優化算法應運而生。
- 網格搜索 (Grid Search): 概念簡單,但計算成本高,尤其當超參數維度增加時。它可能在不重要的超參數上浪費大量計算。
- 隨機搜索 (Random Search): (Bergstra and Bengio, 2012) 通常比網格搜索更有效。它在指定的範圍內隨機選擇超參數組合。由於實踐中只有少數超參數對最終性能影響較大,隨機搜索更有可能在這些重要維度上採到較好的值。
- 基於模型的超參數優化 / 貝葉斯優化: 試圖從已評估的超參數點中學習一個關於超參數與性能之間關係的代理模型(如高斯過程),並利用這個模型來指導後續的搜索方向,選擇那些最有潛力改善性能或減少不確定性的超參數點進行評估。這種方法通常比隨機搜索需要更少的評估次數就能找到好的超參數。
Q: 什麼是網格搜索 (grid search)?它有哪些優點和缺點?
A: 網格搜索是一種自動超參數優化的方法。
- 工作原理:
- 為每個待調整的超參數定義一組離散的候選值。
- 遍歷所有這些候選值的組合(形成一個「網格」)。
- 對於網格中的每個超參數組合,訓練模型並在驗證集上評估其性能。
- 選擇在驗證集上性能最好的那個超參數組合。
- 優點:
- 概念簡單,易於實現。
- 如果網格足夠密集且包含最優值,理論上可以找到(離散化空間內的)最優超參數。
- 缺點:
- 計算成本高: 評估的組合數量隨超參數的數量和每個超參數的候選值數量呈指數級增長(維數災難)。
- 對超參數重要性不敏感: 它平等地對待所有超參數,可能會在那些對性能影響不大的超參數的不同取值上浪費大量計算。
- 離散化問題: 最優的超參數值可能位於網格點之間。
Q: 什麼是隨機搜索 (random search)?為什麼它通常比網格搜索更有效?
A: 隨機搜索是另一種自動超參數優化的方法。
- 工作原理:
- 為每個待調整的超參數定義一個搜索範圍(或一個分布)。
- 在指定的總評估次數內,每次都從這些範圍(或分布)中隨機採樣一組超參數組合。
- 對於每個隨機採樣到的超參數組合,訓練模型並在驗證集上評估其性能。
- 選擇在所有評估過的組合中性能最好的那個。
- 通常比網格搜索更有效的原因 (Bergstra and Bengio, 2012):
- 有效維度 (Effective Dimensionality): 在許多實際問題中,只有少數幾個超參數對模型的最終性能有顯著影響,而其他超參數的影響較小。
- 網格搜索的浪費: 網格搜索會在那些不重要的超參數維度上進行密集的、系統性的採樣,而這些採樣點對性能的改善貢獻不大。
- 隨機搜索的優勢: 隨機搜索在每個維度上獨立地進行隨機採樣。對於那些重要的超參數,隨機搜索更有可能通過多次獨立的隨機嘗試來覆蓋到其較好的取值範圍。而對於不重要的超參數,即使隨機採樣的值不是最優的,對整體性能的影響也較小。
- 在相同的計算預算下(即相同的評估次數),隨機搜索通常能探索到更廣闊的、更有潛力的超參數空間區域,從而更有可能找到接近最優的超參數組合。
Q: 什麼是基於模型的超參數優化(例如,貝葉斯優化)?它與網格搜索和隨機搜索有何不同?
A: 基於模型的超參數優化(其中貝葉斯優化是最流行的一類方法)是一種更智能的自動超參數搜索策略。
- 工作原理:
- 它維護一個關於「超參數組合到模型性能」這個未知函數的機率模型(稱為代理模型,surrogate model),例如高斯過程 (Gaussian Process)。
- 它還使用一個「採集函數 (acquisition function)」,該函數基於代理模型的預測和不確定性來決定下一個應該評估哪個超參數組合。採集函數通常會在「探索 (exploration)」新的、不確定性高的區域和「利用 (exploitation)」當前已知的、性能較好的區域之間進行權衡。
- 每次評估一個新的超參數組合後,將結果(性能)用於更新代理模型,然後再使用更新後的代理模型和採集函數來選擇下一個評估點。 這個過程迭代進行,直到達到預設的評估次數或滿足其他停止條件。
- 與網格搜索和隨機搜索的不同:
- 非盲目搜索: 網格搜索和隨機搜索在選擇下一個評估點時不利用先前評估點的信息(或者說,隨機搜索是完全隨機的,網格搜索是預先定義好的)。而基於模型的優化則是一個序貫的過程,它根據歷史評估結果來智能地指導後續的搜索方向。
- 樣本效率: 由於其智能的搜索策略,基於模型的優化通常比網格搜索和隨機搜索需要更少的評估次數(即更少的模型訓練和驗證)就能找到一組好的超參數,特別是當單次模型評估的成本非常高時(例如,訓練一個大型深度學習模型數天)。
- 處理複雜空間: 更適合處理高維、混合類型(連續和離散)以及條件依賴的超參數空間。
11.5 調試策略
重點摘要: 當機器學習系統效果不好時,很難判斷效果不好的原因是算法本身,還是實現中的錯誤。調試策略對於診斷和解決這些問題至關重要。
- 可視化激活值和梯度: 檢查網路中間層的激活值分布和梯度的幅度,有助於發現飽和的神經元、梯度消失/爆炸等問題。
- 用小數據集進行測試: 在一個非常小的人工數據集(例如,只有幾個樣本,甚至一個樣本)上訓練模型,看模型是否能夠過擬合這個小數據集。如果不能,通常意味著實現中存在錯誤,或者模型/優化器設置有嚴重問題。
- 比較反向傳播梯度與數值梯度: 使用有限差分法 (finite difference) 計算梯度的數值近似 (公式 11.5, 11.6, 11.7),並將其與反向傳播算法計算得到的解析梯度進行比較。如果兩者差異很大,說明反向傳播的實現可能存在錯誤。使用中心差分通常比單邊差分更準確。
- 監控損失函數和其他度量: 密切關注訓練過程中的訓練損失、驗證損失以及其他相關性能度量的變化。異常的行為(如損失不下降、驗證損失突然上升)通常指示存在問題。
- 從簡單模型開始: 先實現並調試一個簡單的基線模型,然後再逐步增加複雜性。
- 單元測試: 對模型的各個組件(如層的實現、損失函數、數據處理等)編寫單元測試。
Q: 當一個深度學習模型表現不佳時,有哪些常見的調試策略可以幫助我們找出問題所在?
A: 常見的調試策略包括:
- 從簡單開始: 先嘗試在一個非常小的、可控的數據集(甚至只有幾個樣本)上訓練模型,看它是否能夠過擬合這個小數據集。如果不能,通常意味著代碼實現、模型架構或優化設置存在根本性問題。
- 可視化:
- 數據可視化: 檢查輸入數據和標籤是否正確加載和預處理。
- 激活值可視化: 觀察網路中間層激活值的分布和範圍,可以幫助發現飽和的神經元(例如,sigmoid 或 tanh 單元的輸出接近其邊界值,導致梯度很小)或死亡的 ReLU 單元。
- 權重和梯度可視化: 觀察權重的大小和分布,以及梯度的大小和流動情況。梯度過大或過小都可能指示問題。
- 損失曲線可視化: 繪製訓練損失和驗證損失隨迭代次數的變化曲線,觀察其趨勢(是否下降、是否震盪、是否過擬合等)。
- 梯度檢查 (Gradient Checking): 使用數值方法(如有限差分)來近似計算梯度,並將其與反向傳播算法計算得到的解析梯度進行比較。如果兩者差異很大,說明反向傳播的實現可能存在錯誤。
- 檢查模型實現:
- 仔細檢查每一層的實現是否正確,特別是維度匹配、激活函數的使用、損失函數的計算等。
- 使用標準的、經過驗證的庫和組件,而不是從頭實現所有東西(除非有特殊需求)。
- 檢查超參數: 不合理的超參數設置(如學習率過大或過小、正則化係數不當)是導致模型表現不佳的常見原因。
- 逐步增加複雜性: 從一個已知的、能工作的簡單模型開始,然後逐步引入更複雜的組件或修改,並在每一步都進行測試和驗證。
- 比較與已知良好實現的差異: 如果可能,將自己的實現與一個已知的、在類似任務上表現良好的開源實現進行比較。
Q: 什麼是梯度檢查?它是如何工作的?為什麼它對調試反向傳播算法很重要?
A: 梯度檢查是一種驗證反向傳播算法實現是否正確的方法。
- 工作原理:
- 反向傳播計算梯度: 使用實現的反向傳播算法計算損失函數關於某個參數
θ
的梯度∂L/∂θ_analytical
。 - 數值近似梯度: 使用有限差分法來近似計算同一個梯度。例如,對於參數
θ_i
,可以計算:∂L/∂θ_i_numerical ≈ (L(θ_1, ..., θ_i + ε, ...) - L(θ_1, ..., θ_i - ε, ...)) / (2ε)
其中ε
是一個很小的擾動值(例如10^-4
或10^-5
)。這是中心差分公式,通常比單邊差分更準確。 - 比較: 比較解析梯度
∂L/∂θ_analytical
和數值梯度∂L/∂θ_i_numerical
。如果兩者非常接近(例如,它們的相對誤差很小),則說明反向傳播的實現可能是正確的。如果差異很大,則很可能存在錯誤。
- 反向傳播計算梯度: 使用實現的反向傳播算法計算損失函數關於某個參數
- 重要性: 反向傳播算法的實現很容易出錯(例如,鏈式法則應用錯誤、導數計算錯誤)。梯度檢查提供了一種獨立的、基於數值近似的方法來驗證反向傳播計算的梯度是否正確。由於梯度是模型學習的基礎,確保梯度計算的正確性至關重要。 注意: 梯度檢查計算成本很高(因為每次計算一個參數的數值梯度都需要兩次完整的前向傳播),所以通常只在開發和調試階段對模型的一小部分參數或在一個小批量數據上進行,一旦確認實現正確後就關閉它。
11.6 示例:多位數字識別
重點摘要: 本節以街景地址號碼 (Street View House Numbers, SVHN) 數據集的轉錄任務為例,詳細展示了應用上述實踐方法論的過程。
- 確定性能度量和目標: 目標是將街景圖像中的數字序列轉錄為正確的數字字符串。性能度量是序列級別的準確率。目標是達到或超過人類水平的準確率(約 98%)。
- 建立端到端基線:
- 最初嘗試了一個包含多個 softmax 輸出(每個對應序列中的一個數字位置)的卷積網路。這個初始模型性能不佳(覆蓋率低,準確率約 90%)。
- 問題診斷: 發現主要問題是定位數字困難,模型難以判斷序列的長度。
- 迭代改進:
- 改變模型架構: 引入一個額外的 softmax 輸出來預測序列的長度。這改進了性能,但仍然不高。
- 數據預處理/增強: 考慮了更複雜的數據預處理和增強方法,但決定先不投入過多精力。
- 增加模型容量: 嘗試增加模型深度和寬度。發現適度增加容量有益,但過度增加則幫助不大。
- 調整超參數: 手動調整學習率、動量等。
- 使用更強的正則化: Dropout 被證明非常有效。
- 改變損失函數: 考慮了不同的損失加權方案。
- 集成模型 (Ensemble): 訓練多個獨立模型並對其預測進行平均,顯著提升了性能。
- 預訓練: 考慮了在更大的字符級數據集上進行預訓練。 最終通過一系列的迭代和改進,包括模型架構調整、超參數優化、正則化、集成等,達到了超過 96% 的序列級別準確率。這個案例強調了系統性的實驗、性能監控和迭代改進在實踐中的重要性。
Q: 在 SVHN 數字轉錄任務的案例研究中,最初的基線模型遇到了什麼主要問題?
A: 最初的基線模型(一個帶有多個 softmax 輸出的卷積網路,每個 softmax 對應序列中的一個數字位置)遇到的主要問題是難以準確地定位圖像中的數字序列並確定序列的長度。這導致模型的覆蓋率很低(即很多圖像模型無法給出完整的轉錄),即使在給出轉錄的情況下,序列級別的準確率也不高。
Q: 為了改進 SVHN 任務的性能,案例中提到了哪些迭代改進的策略?請列舉至少三種。
A: 案例中提到的迭代改進策略包括:
- 改變模型架構以處理序列長度: 引入了一個額外的 softmax 輸出來明確地預測數字序列的長度,試圖解決定位和長度判斷的困難。
- 增加模型容量和調整超參數: 實驗了不同深度和寬度的卷積網路,並手動調整了學習率、動量等超參數。
- 使用更強的正則化方法: 發現 Dropout 對於提高模型性能和泛化能力非常有效。
- 集成模型 (Ensemble): 訓練多個獨立訓練的相同(或不同)架構的模型,然後將它們的預測結果進行平均或投票,這通常能帶來顯著的性能提升。
- (隱含的) 錯誤分析和問題分解: 雖然沒有明確作為一個獨立步驟,但從描述中可以看出,團隊通過分析模型的失敗案例(例如,定位困難)來指導後續的改進方向。
Q: 這個案例研究如何體現了本章前面討論的實踐方法論的重要性?
A: 這個案例研究很好地體現了本章實踐方法論的重要性:
- 確定目標和性能度量: 明確了任務是序列轉錄,性能度量是序列級別的準確率,目標是達到人類水平。
- 建立端到端基線: 快速搭建了一個初始模型並評估其性能,從而暴露了主要問題。
- 性能分析與瓶頸定位: 通過分析基線模型的表現,識別出數字定位和序列長度預測是主要的性能瓶頸。
- 迭代改進: 系統性地嘗試了多種改進策略(模型架構、超參數、正則化、集成等),並根據實驗結果不斷調整方向。
- (隱含的) 監控和調試: 雖然細節不多,但可以推斷團隊在每次改動後都會評估模型的性能變化,以判斷改動是否有效。 這個案例表明,解決複雜的機器學習問題通常不是一蹴而就的,而是需要一個系統性的、迭代的實驗和優化過程。