MindSpore模型精度调优实践
MindSpore模型精度調優實踐
引論:在模型的開發過程中,精度達不到預期常常讓人頭疼。為了幫助用戶解決模型調試調優的問題,為MindSpore量身定做了可視化調試調優組件:MindInsight。還梳理了針對常見精度問題的調試調優指南,將以“MindSpore模型精度調優實戰”系列文章的形式分享出來,希望能幫助用戶輕松定位精度問題,快速優化模型精度。
本文將分析精度問題的常見現象和原因,并給出一個整體的調優思路。本文分享假設腳本已經能夠運行并算出loss值。如果腳本還不能運行,請先參考相關報錯提示進行修改。
精度問題的常見現象和原因
模型精度問題和一般的軟件問題不同,定位周期一般也更長。在通常的程序中,程序輸出和預期不符意味著存在bug(編碼錯誤)。但是對一個深度學習模型來說,模型精度達不到預期,有著更復雜的原因和更多的可能性。由于模型精度要經過長時間的訓練才能看到最終結果,定位精度問題通常會花費更長的時間。
常見現象
精度問題的直接現象一般體現在loss(模型損失值)和metrics(模型度量指標)上。loss現象一般表現為(1)loss跑飛,出現NAN,+/- INF,極大值(2)loss不收斂、收斂慢(3)loss為0等。模型metrics一般表現為模型的accuracy、precision等metric達不到預期。
精度問題的直接現象較容易觀察,借助MindInsight等可視化工具,還可以在梯度、權重、激活值等張量上觀察到更多現象。常見現象如:(1)梯度消失(2)梯度爆炸(3)權重不更新(4)權重變化過小(5)權重變化過大(6)激活值飽和等。
常見原因
有果必有因,在現象的背后,是精度問題的原因,可以簡單分為超參問題、模型結構問題、數據問題、算法設計問題等類別:
超參問題
例如
學習率設置不合理,
loss_scale參數不合理,
權重初始化參數不合理等。
模型結構問題
例如
算子使用錯誤(使用的算子不適用于目標場景),
權重共享錯誤(共享了不應共享的權重),
權重凍結錯誤(凍結了不應凍結的權重),
節點連接錯誤(應該連接到計算圖中的block未連接),
loss函數錯誤,
優化器算法錯誤(如果自行實現了優化器)等。
數據問題
例如
數據缺失值過多,
每個類別中的樣本數目不均衡,
數據中存在異常值,
未對數據進行歸一化,
數據處理參數不正確等。
算法設計問題
算法本身設計有缺陷導致精度無法達到預期。
相同現象存在多個可能原因導致精度問題定位難
以loss不收斂為例(下圖),任何可能導致激活值飽和、梯度消失、權重更新不正確的問題都可能導致loss不收斂。例如錯誤地凍結了部分權重,使用的激活函數和數據不匹配(使用relu激活函數,輸入值全部小于0),學習率過小等原因都是loss不收斂的可能原因。
圖 1 相同現象存在多個可能原因導致精度問題定位難
調優思路概述
圖 2精度問題調優思路概述
針對上述精度問題的現象和原因,常用的幾個調優思路如下:檢查代碼和超參、檢查模型結構、檢查輸入數據、檢查loss曲線。若上述思路都未發現問題,可以讓訓練執行到最后,檢查精度(主要是模型metrics)是否達到預期。
其中,檢查模型結構和超參重在檢查模型的靜態特征;檢查輸入數據和loss曲線則是將靜態特征和動態訓練現象結合檢查;檢查精度是否達到預期則是對整體精度調優過程重新審視,并考慮調整超參、解釋模型、優化算法等調優手段。
為了幫助用戶高效實施上述的精度調優思路,MindInsight提供了配套的能力,如下圖。后面會展開介紹精度調優的準備工作,每個調優思路的細節,以及如何使用MindInsight的功能實踐這些調優思路。
圖 3精度問題定位思路及MindInsight對應能力
總結
以上是生活随笔為你收集整理的MindSpore模型精度调优实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 保存和加载模型
- 下一篇: MindSpore 高阶优化器