機器學習中的軟體測試
摘要
機器學習的實現需要使用軟體程式碼,從這一角度來說,機器學習也是軟體工程的一部分。針對軟體就會引入對軟體是否正確的檢驗,那麼在機器學習中如何進行軟體測試?相關原始碼
什麼是軟體測試
TDD-測試驅動開發
是指開發功能程式碼之前,先編寫測試程式碼,然後只編寫使測試通過的功能程式碼,從而以測試來驅動整個開發過程的進行。這有助於編寫簡潔可用和高質量的程式碼,有很高的靈活性和健壯性,能快速響應變化,並加速開發過程。
安照測試覆蓋面分白盒黑盒
安照測試階段分單元整合和整合測試
為什麼要進行軟體測試
- 編寫程式碼時因為個人習慣、手誤或分心等產生的問題
如===寫成==,for迴圈邊界問題
- 對程式語言、呼叫庫的特性不能足夠深入的瞭解
矩陣的例子
import numpy as np
arr = np.ones(12)
print(arr)
print(arr.transpose())
- 對演算法本身沒有足夠深入的瞭解
梯度的例子
機器學習中軟體測試的特點
總體來看,大部分機器學習模型本質上就是低穩定性和高隨機性的。主要原因在於資料計算部分(精度、溢位、計算本身的穩定性)
一般來說很難對整個測試集保證其正確或者錯誤,所以一般機器學習的測試集是用來測試根據訓練集得到的模型是否在測試集上執行良好,既符合期望。
如何進行機器學習軟體測試
白盒測試
- tensorflow測試
黑盒測試
一般機器學習的測試集是用來測試根據訓練集得到的模型是否在測試集上執行良好,既符合期望。
機器學習中的測試重點
程式碼邏輯驗證
特別是自己實現的條件和分支較多的程式碼。如tensorflow程式碼測試
演算法驗證
具體演算法具體分析。基本原則是通過另一條途徑,而非原始程式碼的實現路徑來進行驗證。
結論——如何防止機器學習編碼中產生bug
編碼模組最小化
這是軟體工程中對程式碼的要求。分模組,各個模組儘量單一,簡單。儘可能的將穩定性的程式碼從總體非穩定性程式碼中分離出來
儘量使用現有成熟庫和方法,而不要自己寫程式碼
現有成熟庫和方法針對專項功能進行了深度優化,遠比重新造輪子要快得多,也穩定得多。這樣在編碼效率、演算法開銷上都會提升
進行單元測試
使用現有機器學習框架所提供的測試功能,如TensorFlow的test_util.TensorFlowTestCase類
針對具體演算法做相應的演算法驗證
在程式碼中使用導數公式來實現反向傳播,驗證時就根據極限法則來驗證導數公式的正確性
參考資料
- 斯坦福教程-梯度檢驗
- UFLDL教程
- 梯度檢驗
- 計算梯度的三種方法: 數值法,解析法,反向傳播法
- 大規模Tensorflow網路的一些技巧
- Testing guide.
- 測試驅動開發