我們的世界正在經(jīng)歷一場由深度神經(jīng)網(wǎng)絡驅(qū)動的人工智能革命。隨著 Apple Intelligence 和 Gemini 的出現(xiàn),人工智能已經(jīng)普及到每個擁有手機的人。除了消費者人工智能之外,我們還將深度學習模型應用于汽車、金融、醫(yī)療、制造業(yè)等多個行業(yè)。這促使許多工程師學習深度學習技術(shù)并將其應用于解決項目中的復雜問題。為了幫助這些工程師,必須制定一些指導原則,以防止在構(gòu)建這些黑盒模型時出現(xiàn)常見的陷阱。
任何深度學習項目都涉及五個基本要素:數(shù)據(jù)、模型架構(gòu)、損失函數(shù)、優(yōu)化器和評估過程。設計和配置每個要素以確保模型正確收斂至關(guān)重要。本文將介紹與每個要素相關(guān)的一些推薦做法和常見問題及其解決方案。
數(shù)據(jù)
所有深度學習模型都需要大量數(shù)據(jù),至少需要數(shù)千個示例才能充分發(fā)揮其潛力。首先,重要的是確定不同的數(shù)據(jù)源,并設計適當?shù)臋C制來選擇和標記數(shù)據(jù)(如果需要)。這有助于建立一些啟發(fā)式數(shù)據(jù)選擇方法,并仔細考慮平衡數(shù)據(jù)以防止無意的偏差。例如,如果我們正在構(gòu)建一個用于人臉檢測的應用程序,重要的是確保數(shù)據(jù)中沒有種族或性別偏見,以及在不同的環(huán)境條件下捕獲數(shù)據(jù)以確保模型的穩(wěn)健性。亮度、對比度、照明條件、隨機裁剪和隨機翻轉(zhuǎn)的數(shù)據(jù)增強也有助于確保適當?shù)臄?shù)據(jù)覆蓋范圍。
下一步是小心地將數(shù)據(jù)分成訓練集、驗證集和測試集,同時確保沒有數(shù)據(jù)泄漏。數(shù)據(jù)分割應具有相似的數(shù)據(jù)分布,但訓練集和測試集中不應存在相同或非常密切相關(guān)的樣本。這很重要,因為如果訓練樣本存在于測試集中,那么我們可能會看到高測試性能指標,但生產(chǎn)中仍有幾個無法解釋的關(guān)鍵問題。此外,數(shù)據(jù)泄漏幾乎不可能知道模型改進的替代想法是否帶來了任何真正的改進。因此,代表生產(chǎn)環(huán)境的多樣化、防泄漏、平衡的測試數(shù)據(jù)集是提供強大的基于深度學習的模型和產(chǎn)品的最佳保障。
模型架構(gòu)
為了開始模型設計,首先要確定手頭任務的延遲和性能要求。然后,可以查看類似這樣的開源基準,以確定一些合適的論文。無論我們使用 CNN 還是 transformer,一開始就有一些預先訓練好的權(quán)重會有所幫助,以減少訓練時間。如果沒有可用的預訓練權(quán)重,那么對每個模型層進行合適的模型初始化對于確保模型在合理的時間內(nèi)收斂非常重要。此外,如果可用的數(shù)據(jù)集非常小(幾百個樣本或更少),那么訓練整個模型就沒有意義了,而應該只對最后幾個特定于任務的層進行微調(diào)。
現(xiàn)在,是否使用 CNN、Transformer 或兩者的組合取決于具體問題。對于自然語言處理,Transformer 已被確定為最佳選擇。對于視覺,如果延遲預算非常緊張,CNN 仍然是更好的選擇;否則,應該嘗試使用 CNN 和 Transformer 以獲得所需的結(jié)果。
損失函數(shù)
分類任務中最流行的損失函數(shù)是交叉熵損失,回歸任務中最流行的損失函數(shù)是是 L1 或 L2 (MSE) 損失。但是,為了在模型訓練期間保持數(shù)值穩(wěn)定性,可以使用某些變體。例如,在 Pytorch 中,BCEWithLogitsLoss 將 sigmoid 層和 BCELoss 合并為一個類,并使用對數(shù)和指數(shù)技巧,這使其比 sigmoid 層后跟 BCELoss 更具有數(shù)值穩(wěn)定性。另一個示例是 SmoothL1Loss,它可以看作是 L1 和 L2 損失的組合,并使 L1 損失平滑接近于零。但是,在使用平滑 L1 損失時必須小心,以適當設置 beta,因為其默認值 1.0 可能不適合在正弦和余弦域中回歸值。下圖顯示了 L1、L2 (MSE) 和平滑 L1 損失的損失值以及不同 beta 值下平滑 L1 損失值的變化。
優(yōu)化器
動量隨機梯度下降法傳統(tǒng)上是研究人員針對大多數(shù)問題非常流行的優(yōu)化器。然而,在實踐中,Adam 通常更易于使用,但存在泛化問題。Transformer 論文推廣了 AdamW 優(yōu)化器,它將權(quán)重衰減因子的選擇與學習率分離開來,并顯著提高了 Adam 優(yōu)化器的泛化能力。這使得 AdamW 成為當今優(yōu)化器的最佳選擇。
此外,沒有必要對整個網(wǎng)絡使用相同的學習率。通常,如果從預訓練的檢查點開始,最好凍結(jié)或保持初始層的低學習率,并為更深的任務特定層保持較高的學習率。
評價與概括
開發(fā)適當?shù)哪P驮u估框架是防止生產(chǎn)中出現(xiàn)問題的關(guān)鍵。這不僅應涉及完整基準數(shù)據(jù)集的定量和定性指標,還應涉及特定場景的定量和定性指標。這樣做是為了確保性能在每種情況下都是可接受的,并且不會出現(xiàn)倒退。
應謹慎選擇性能指標,以確保它們能夠恰當?shù)卮硪獙崿F(xiàn)的任務。例如,在許多不平衡的問題中,精度/召回率或 F1 分數(shù)可能比準確率更好。有時,我們可能有多個指標來比較替代模型,那么通常有助于提出一個可以簡化比較過程的單一加權(quán)指標。例如,nuScenes 數(shù)據(jù)集引入了 NDS(nuScenes 檢測分數(shù)),它是 mAP(平均精度)、mATE(平均平移誤差)、mASE(平均尺度誤差)、mAOE(平均方向誤差)、mAVE(平均速度誤差)和 mAAE(平均屬性誤差)的加權(quán)和,以簡化各種 3D 物體檢測模型的比較。
此外,還應盡可能可視化模型輸出。這可能涉及在輸入圖像上繪制邊界框(用于 2D 物體檢測模型)或在激光雷達點云上繪制長方體(用于 3D 物體檢測模型)。這種手動驗證可確保模型輸出合理,并且模型錯誤中沒有明顯的模式。
此外,密切關(guān)注訓練和驗證損失曲線有助于檢查是否存在過度擬合或欠擬合。過度擬合是一種問題,其中驗證損失與訓練損失不同并開始增加,表示模型的泛化能力不佳。通??梢酝ㄟ^添加適當?shù)恼齽t化(如權(quán)重衰減、drop-out 層)、添加更多數(shù)據(jù)增強或使用早期停止來解決此問題。另一方面,欠擬合表示模型沒有足夠的容量來擬合訓練數(shù)據(jù)的情況。這可以通過訓練損失下降不夠和/或在各個時期保持或多或少平穩(wěn)來識別??梢酝ㄟ^向模型添加更多層、減少數(shù)據(jù)增強或選擇其他模型架構(gòu)來解決此問題。下圖通過損失曲線展示了過度擬合和欠擬合的例子。
深度學習之旅
與傳統(tǒng)軟件工程不同,深度學習更具實驗性,需要仔細調(diào)整超參數(shù)。但是,如果上述基本原則得到照顧,這個過程會更易于管理。由于模型是黑匣子,我們必須利用損失曲線、輸出可視化和性能指標來了解模型行為并相應地采取糾正措施。希望本指南可以讓您的深度學習之旅不那么費力。