在機器學習路上, 如何折騰自己?

或者, 如何避坑?

剛接觸機器學習專案時, 因為個人有點 Java 程式開發的經驗, 也粗略理解所謂的機器學習或是深度學習其實骨子裡是數學最佳化的演算法問題, 土法煉鋼, 用盡各種詭異姿勢, 結果當然沒有多麼的理想.

經驗分享一些自我折騰經驗, 也許可以讓剛接觸 AI 專案少踩幾次坑:

專案中至少一位具備 Python 程式開發技能的成員

在AI領域的一個大分支, 自然語言處理(NLP)有關的需求, 很容易就會採用諸如 Apache OpenNLP, 或者 Stanford CoreNLP, 針對中文也有FudanNLP, 上述都是 Java 語言. 而當我們要進行資料處理時需要與企業應用對接取得資料, 而企業應用, 至今 Java 仍有相當高的份額.

如果專案剛好與大數據有關很難完全避開諸如: hadoop, hive, spark 等等Java框架. 如果剛好又有 Android App 的 需求, 那更有可能已經有 Java 的高手在專案組裡了.

那是不是進行 AI 專案時直接限定使用 Java, 這樣就可以避免專案 skill set 發散. 在 Java 有 Eclipse Deeplearning4J (DL4J) ,

如果看到 DL4J下面範例程式:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()

.seed(rngSeed) //include a random seed for reproducibility

.activation(Activation.RELU)

.weightInit(WeightInit.XAVIER)

.updater(new Nadam())

.l2(rate * 0.005) // regularize learning model

.list()

.layer(new DenseLayer.Builder() //create the first input layer.

.nIn(numRows * numColumns)

.nOut(500)

.build())

.layer(new DenseLayer.Builder() //create the second input layer

.nIn(500)

.nOut(100)

.build())

.layer(new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) //create hidden layer

.activation(Activation.SOFTMAX)

.nOut(outputNum)

.build())

.build();


MultiLayerNetwork model = new MultiLayerNetwork(conf);

model.init();

是否很鼓舞? 幾乎與 Keras 一樣簡易. 但是你還需要的社群支援可能就遠遠低於 PyTorch 或是 Tensorflow 等 Python 框架. 如果沒有很強烈的理由, 初進入機器學習, 由 Python 相關框架切入, 那怕團隊裡並無 Python 開發人員, 都值得費力氣從頭開始學Python, 會比單獨摸索 DL4J 的學習曲線平順多了, 尤其遇到要堆砌一個嶄新模型時, 拿 Python 已經有人發表的程式碼小修小改, 輕鬆許多, 運氣好一點也許還可以回饋新改良模型呢!

GPU 的需求如何滿足?

面對 GPU 需求, 我們馬上可以取得Nvidia 有專用的機器 NVIDIA DGX A100 可能要數百萬預算; 或者 組個級遊戲PC RTX 3090 其實在資料規模不大的時期絕大多數的案子都能滿足, 最多萬預算, 當然降階一點, 很可能十萬預算也可滿足需求. 有錢好辦事, 不過當挖礦很夯的時期, 怎麼辦?

要評估訓練規模使用的頻率, 很可能專案就在 Google, Microsoft 或是 Amazon 的雲端計算平台來達成即可. 三者使用的門檻差異不大, 而且所需的環境我相信 99.9% 以上的機率都可輕易配置以符合需求.

可區分兩部分來處理

訓練階段:

通常頻率不高, 且不需即時, 但是所需硬體規格很可能成本相當高昂. 如果特別採購設備可能發生利用率低的效益問題.

上線後的使用情境:

上線後進行預測的頻率高 且需即時, 考慮在本地架設工作站. 規格通常低於訓練時所需, 成本低.

專案進行中, 尤其還未評估數據規模與模型架構, 建議先使用雲端GPU計算服務, 累積一定經驗值, 再評估是要採購硬體設備.

完整的機器學習知識體系很重要

Keras 是個好東西, 對於略懂 Python 與深度學習的入門者, 很快可以上手.

但是在真正專案時, Keras 並不會幫助你用較佳的策略來處理數據, 選擇哪個模型,

...Under Construction


有略懂 Linux 知識的人員幫助很大

GPU 計算需求很容易是在 Linux 上運行, 尤其考慮採用雲端計算服務時. 例如在 國網中心 (相信學術界接觸 AI專案都會考慮選用) 的 GPU 計算平台是 Linux 運作的. 完全不瞭解 Linux 要進行一些操作會有點小問題.

另外許多框架或是模型都會提供 Docker 來複現環境, 會點 Linux 的人員就可以快速使用.

數據的預處理是關鍵

非資深專家如何讓深度學習專案落地洋洋灑灑以圖像分類進行瑕疵檢測舉例: 要避免倖存者偏差; 數據分類各類別儘量要均衡, 等等.

經常同樣的時間限制下, 把數據預處理好可能比花很大的力氣去找 最好的模型 還要有效.

不要輕易放棄某模型, 很可能是你的努力 (調整超參數)不夠

Under Construction!!