這個章節的主要目標是深入探討深度學習中的核心問題:如何有效訓練神經網路並防止過度擬合。透過這些內容,可以掌握多種重要的神經網路優化技術,並理解如何在實際應用中解決模型效能問題。第21章中學習使用簡單的人工生成資料集來練習各種技術的基本原理。可以從中學到訓練歷史的可視化方法,瞭解如何透過圖表觀察模型的過程。以及三種主要的過度擬合防治策略:權重正則化透過L2懲罰項限制模型複雜度、早期停止機制通過監控驗證損失來防止訓練過久、而Dropout技術則是隨機關閉部分神經元來增強模型的泛化能力。
Exercise則將這些理論知識應用到真實世界的資料集上,包括Forest Covertypes的分類問題和California Housing的回歸問題。這些實作可學習如何處理不同類型的機器學習任務,並比較各種技術在實際資料上的效果差異。另外還包含了使用Ray Tune進行超參數調整的進階技術,可進一步瞭解自動化模型優化的重要性。
OS: Windows 11 23H2
CPU: Intel Core i7-13700K
GPU: NVIDIA GeForce RTX 4070 SUPER 12G
RAM: DDR5 64G 5600MT/s
Python Package Manager: uv
Python Version: 3.10.16
Python Package: numpy, pandas, sklearn, rich, seaborn, matplotlib, PyTorch
IDE: Visual Studio Code
為方便查看運行結果,故額外使用rich函式庫建立兩個Function格式化印出指定內容。
21.8 Visualize Training History
Code:
Explanation:
這段程式碼使用pytorch建立一個簡單的二分類神經網路並視覺化訓練過程。首先透過make_classification方法生成合成資料集,並使用torch.nn.Sequential建立包含三個全連接層的神經網路,使用RMSprop優化器和二元交叉熵損失函數進行訓練。在每個epoch結束後,會計算並記錄訓練集和測試集的損失值,最後使用matplotlib繪製損失曲線圖,可直觀觀察到模型在訓練過程中的表現變化。
Discussion:
這種視覺化方法的優點是能夠直觀地監控模型訓練狀態,及早發現過擬合現象(當測試損失開始上升而訓練損失持續下降時)。然而,此方法的限制包括僅追蹤損失指標可能不夠全面,缺乏準確率等其他重要指標。
Result:
21.9 Reducing Overfitting with Weight Regularization
Code:
Explanation:
這段程式碼使用權重正規化(weight regularization)來減少神經網路過擬合的技術。首先建立了與上一小節中相同的三層神經網路架構,但主要差異在於優化器設定中加入了weight_decay參數。這個參數實現了L2正規化,會在損失函數中加入權重平方和的懲罰項,迫使模型學習較小的權重值。訓練過程中,正規化項會自動添加到梯度計算中,使模型傾向於學習更簡單、泛化能力更強的特徵表示。
Discussion:
權重正規化的優點是能有效防止過擬合,提升模型在未見資料上的泛化性能,且實現簡單只需調整一個超參數。然而此方法的限制包括需要仔細調節正規化強度,過強可能導致欠擬合;另外L2正規化無法完全消除不重要的特徵,僅是縮小其權重,在某些需要特徵選擇的場景中效果有限。
Result:
21.10 Reducing Overfitting with Early Stopping
Code:
Explanation:
這段程式碼使用早期停止(Early Stopping)技術來防止神經網路過擬合的方法。程式使用pytorch Lightning框架重新包裝了原本的神經網路,將其轉換為LightningModule類別,並設定EarlyStopping回調函數來監控驗證損失。當驗證損失在連續3個epoch內沒有改善時,訓練會自動停止,避免模型在訓練資料上過度學習。程式設定最大訓練1000個epoch,但實際訓練會在達到早期停止條件時提前結束。
Discussion:
早期停止的優點是能自動找到最佳停止點,避免過擬合同時節省訓練時間,且不需要額外的超參數調節。然而此方法的限制包括需要有效的驗證集來監控性能,若驗證集不具代表性可能導致過早停止。
Result:
21.11 Reducing Overfitting with Dropout
Code:
Explanation:
這段程式碼使用Dropout技術來減少神經網路過擬合的方法。透過在神經網路架構中加入nn.Dropout層,可在訓練過程中會隨機將指定%數的神經元輸出設為零。Dropout的核心概念是在每次前向傳播時隨機關閉部分神經元,迫使網路不能過度依賴特定的神經元組合,從而學習更加穩健的特徵表示。在測試階段,Dropout會自動停用,所有神經元都會參與預測,但輸出會按照保留機率進行縮放調整。
Discussion:
Dropout的優點是實現簡單且效果顯著,能有效防止神經網路對訓練資料的記憶化學習,提升泛化能力。此技術特別適用於深層網路和大型模型。然而其限制包括會增加訓練時間因為需要更多epoch才能收斂,且需要仔細調節dropout機率,過高可能導致欠擬合。
Result:
21.12 Saving Model Training Progress
Code:
Explanation:
這段程式碼在神經網路訓練過程中定期保存模型的狀態資訊。在每個epoch訓練完成後,使用torch.save方法將模型資訊儲存到model.pt檔案中,包括當前的epoch數、模型參數(model_state_dict)、優化器狀態(optimizer_state_dict)以及當前的損失值。這種檢查點機制讓我們能夠在訓練中斷時從上次保存的狀態恢復訓練,或者載入特定訓練階段的模型進行評估和部署。
Discussion:
模型保存的優點是能夠防止因程式崩潰或意外中斷導致的訓練進度丟失,並允許從任何保存點恢復訓練,這對長時間訓練特別重要。然而此實現方式的限制包括在每個批次都保存會產生大量重複檔案且影響訓練效率,更好的做法是定期保存或僅在驗證性能改善時保存。
Result:
21.13 Tuning Neural Networks
Code:
Explanation:
這段程式碼使用Ray Tune框架進行神經網路超參數自動調優的完整流程。首先定義了可變架構的神經網路(透過設定隱藏層layer_size_1與layer_size_2來決定架構),,然後設定超參數搜索空間:兩個隱藏層的神經元數量在4到256之間隨機選擇,學習率在0.0001到0.1之間對數均勻分佈。使用ASHAScheduler進行早期停止以提高搜索效率,最後執行超參數搜索並找出最佳配置。整個過程自動化地嘗試不同的超參數組合,並根據損失值選出最優模型。
Discussion:
自動超參數調優的優點是能系統性地探索大量參數組合,避免手動調參的盲目性和主觀性,並透過早期停止策略節省計算資源。此方法特別適合複雜模型的調優工作。然而限制包括需要大量計算資源和時間,搜索空間設計需要領域知識,且可能陷入局部最優解。
Result:
21.14 Visualizing Neural Networks
Code:
Explanation:
這段程式碼使用torchviz庫來視覺化pytorch神經網路的計算圖結構。首先建立並訓練一個三層神經網路,完成訓練後使用make_dot方法將網路的前向傳播過程和參數結構轉換為可視化圖表。函數接收模型的輸出tensor和所有參數字典作為輸入,自動追蹤計算過程中的每個操作和tensor流動,最終產生一個展示網路架構、數據流向和參數連接關係的PNG圖檔,可直觀地理解模型的內部結構。
Discussion:
神經網路視覺化的優點是能夠直觀地展示複雜模型的架構和數據流動,有助於調試模型結構錯誤、理解梯度傳播路徑,對教學和展示也很有價值。這對於複雜的深度學習模型特別有用。然而此方法的限制包括對於非常深層或複雜的網路,生成的圖表可能過於龐大難以閱讀,且僅能展示結構而無法顯示動態的訓練過程或權重變化情況。
Result:
Settings
這邊使用scikit-learn的real-world datasets中的Forest Covertypes(Classification)與California Housing(Regression)作為兩個不同數量級的對比資料集,對此章節中所有的神經網路模型調整各項參數進行訓練與比較差異。
Forest Covertypes 是一個著名的真實世界資料集,收錄於UCI機器學習儲存庫中。此資料集包含581,012筆觀測資料,每筆資料代表科羅拉多州羅斯福國家森林中30×30公尺的土地區塊。資料集包含54個特徵,主要來自地理製圖變數,如海拔高度、坡向、坡度、日照指數、土壤類型等,而非遠端感測資料。研究區域涵蓋四個原始荒野地區(Rawah、Neota、Comanche Peak及Cache la Poudre),這些地區受人為干擾極少,因此現有的森林覆蓋類型主要是生態過程的結果,而非森林管理實踐的產物。資料集的分類目標是預測七種不同的森林覆蓋類型,包括雲杉/冷杉、山松、黃松、棉白楊/柳樹、白楊、花旗松及高山矮松,使其成為一個多類別分類問題。
California Housing 是一個廣泛使用的真實世界資料集,源自1990年美國加州人口普查數據。此資料集包含20,640筆觀測樣本,每筆代表加州的一個人口普查區塊群(通常有600至3,000人口的地理單位)。資料集包含8個特徵變數,包括家庭收入中位數、房屋年齡中位數、每戶平均房間數、每戶平均臥室數、人口、平均住戶人數、以及地理位置(經度和緯度)。預測目標是每個區域的房屋價值中位數,以十萬美元為單位表示。此資料集特別適合用於迴歸問題,常被用於機器學習模型的訓練與測試,尤其是在房地產價格預測方面的應用。由於資料是按區域聚集的,所以數值代表該區域的平均值或中位數,這使得某些特徵(如平均房間數)在人口稀少的度假區可能會有意外高的數值。
Explanation:
首先透過fetch_covtype與fetch_california_housing方法來載入資料集,並透過StandardScaler方法進行標準化後,透過train_test_split方法切割為訓練集與評估集。
Code:
Explanation:
接著對此章節中的各種微調方式對兩個不同的資料集進行訓練,並記錄下每一種方法對於兩個資料集的影響與差別。
Code:
Forest Covertypes dataset
Result:
Discussion:
從原始MLP模型的訓練曲線可以觀察到,訓練損失呈現明顯的鋸齒狀波動模式,這種劇烈的震盪反映了模型在訓練過程中的不穩定性。相對而言,評估損失則表現出較為平滑的下降趨勢,從初始的1.47逐漸降低至約1.40。這種訓練損失與評估損失之間的差異模式,暗示著模型可能存在一定程度的過擬合現象,特別是在訓練後期階段。
當引入權重正則化技術後,可以發現模型的行為特徵發生了微妙但重要的變化。權重正則化通過在損失函數中加入權重衰減項,有效地約束了模型參數的幅度,從而降低模型複雜度。從圖中可以看出,儘管訓練損失仍然保持波動特性,但評估損失維持在相對穩定的水準約1.48左右。這種現象表明權重正則化成功地抑制了模型對訓練資料的過度記憶,雖然可能在一定程度上犧牲了對訓練資料的擬合能力,但提升了模型的泛化性能。
早停法的實施展現出了截然不同的訓練動態特徵。值得注意的是,這個實驗採用了不同的損失函數設置,因此損失值的絕對數值範圍與其他方法不可直接比較,但我們仍能從相對趨勢中獲得寶貴洞察。早停法通過監控驗證集上的表現來決定最佳停止時機,有效避免了過度訓練導致的泛化能力下降。從曲線可以看出,無論是訓練損失還是評估損失都呈現出穩定且持續的下降趨勢,這種平滑的收斂模式反映了早停法在控制訓練過程方面的卓越效果。
Dropout技術作為另一種重要的正則化方法,通過在訓練過程中隨機關閉部分神經元來強制模型學習更加魯棒的特徵表示。從實驗結果可以觀察到,加入Dropout的模型在訓練損失方面仍然保持了一定的波動性,但評估損失表現出了從1.44到1.39的穩定改善。這種改善反映了Dropout在減少特徵之間過度依賴方面的積極作用,使得模型能夠學習到更加一般化的模式。
綜合比較這四種方法的效果,可以發現每種技術都有其獨特的優勢和適用場景。原始MLP雖然在訓練過程中表現出不穩定性,但提供了基礎的比較標準。權重正則化通過參數約束實現了訓練穩定性與泛化能力之間的平衡。早停法展現了在適當時機終止訓練的重要性,避免了過度訓練的負面影響。而Dropout則可用來提升泛化性能。
California Housing dataset
Result:
Discussion:
從原始MLP模型的訓練曲線中,可以清楚看到一個典型的回歸模型學習過程。訓練損失呈現出劇烈的鋸齒狀波動,這種不規則震盪反映了模型在處理連續數值預測時的內在複雜性。相對而言,評估損失表現出較為穩定的下降趨勢,從初始的0.5逐步降至約0.3,這種相對平滑的曲線表明模型在未見資料上的泛化能力正在穩步提升。然而,訓練損失與評估損失之間的顯著差異仍然暗示著潛在的過擬合風險。
當引入權重正則化後,模型的行為特徵發生了微妙但重要的變化。權重衰減機制通過約束參數幅度,使得評估損失穩定維持在0.35至0.36的範圍內。雖然這個數值略高於原始模型的最終表現,但這種表面上的退步實際上代表了模型在穩定性與性能之間找到了更好的平衡點。權重正則化成功地抑制了模型對訓練資料的過度記憶,換取了更可靠的預測一致性。
早停法在此實驗中展現出截然不同的特徵,需要注意的是其損失函數設置與其他方法不同,因此絕對數值無法直接比較。然而,從相對趨勢來看,早停法產生了最為理想的訓練動態,無論訓練損失還是評估損失都呈現平滑且持續的下降模式。訓練過程在約6個epoch後適時停止,避免了過度訓練導致的性能惡化,這種精確的時機控制體現了早停法在防止過擬合方面的卓越效果。
Dropout技術在回歸任務中的表現呈現出獨特的特徵模式。訓練損失從極高的初始值開始並伴隨劇烈波動,而評估損失則相對穩定地維持在0.8至0.9的範圍內。這種巨大的差異反映了Dropout在回歸問題中的特殊影響,隨機神經元失活雖然增強了模型魯棒性,但也可能在連續數值預測任務中引入額外的不確定性。
綜合比較這四種方法,我們發現每種技術在回歸任務中都展現出與分類問題不同的特性。權重正則化提供了穩定但保守的改進,早停法實現了最優的訓練控制,而Dropout則在回歸場景下需要更謹慎的調參。選擇合適的正則化策略應該根據具體的資料特性和性能要求來決定,有時候組合使用多種技術能夠達到更好的整體效果。
Difficulties Encountered and Solutions
1. 在ray函式庫中使用tune.report失敗
Difficulties:使用tune.report方法時,傳入的參數原為loss=(loss.item()),但在新版本中必須以字典方式傳遞,否則會造成以下問題
Solution:在tune.report方法中改為傳入字典方式,即可解決此問題。
References
[1] Machine Learning with Python Cookbook-2nd, by Kyle Gallatin and Chris Albon, O'Reilly, 2023, ISBN: 9781098135720
[2] 全格局使用PyTorch:深度學習和圖神經網路, 李金洪, 深智數位, 2024, ISBN: 9786267569078
[3] 精通機器學習:使用Scikit-Learn, Keras與TensorFlow(第三版), Aurélien Géron, 歐萊禮, 2024, ISBN: 9786263246676
[4] Python機器學習:基於PyTorch和Scikit-Learn, (美)塞巴斯蒂安·拉施卡, 機械工業出版社, 2023, ISBN: 9787111726814
[5] 核心開發者親授!PyTorch深度學習攻略, Eli Stevens, 旗標, 2021, ISBN: 9789863126737