如何從無到有設計機器學習專案

如何從無到有設計機器學習專案

2021, Aug 17    


前言

因為碩士班畢業後隨即進入machine learning相關部門工作,所以我其實未曾接觸過系統性的軟體專案開發。 幸虧有同事已經在軟體業沈浸十年,其豐富的經驗確實也引導了我進行機器學習專案開發。

故這篇文章我會用目前我的視角描述如何從接到需求開始設計機器學習專案!

機器學習專案 v.s 軟體專案

機器學習專案不同於軟體專案,一般來說我們在開發軟體的時候都是有deterministic的目標,且確定我們所設計的function都有確定的inputs & outputs,機器學習專案雖然也可以制定明確的目標與inputs,它的outputs卻是probabilistic,我們可以確保outputs的範圍是什麼,卻無法保證每次輸出都會是同樣的結果。

機器學習專案也像軟體專案一樣,都需要持續迭代以改善使用者體驗或效能,但機器學習專案的迭代不只牽涉到內部function的設計甚至還有模型、dataset的迭代。除此之外,因為模型效度會根據你所使用的dataset而改變,也會因為你的target dirtribution改變而降低效度(例如:推薦系統若不更新的話不會知道你的喜好已經改變),所以如何設計一個系統化的data收集與模型再訓練流程也是機器學習專案中非常重要的一環。

可惜的是,目前我的工作內容尚未牽涉到模型直接上線,故我並不熟悉實際上線後的維運及模型再訓練等流程。 接下來,我會一步一步地說明如何從零開始設計機器學習專案。

step1: 需求來臨

今天,其他BU的user們於一場會議中突然提到,「如果AI可以幫我們做文案生成的話,我們的同仁就可以省下大把的時間去做其他事情了」。會議結束後,你的老闆希望可以利用我們部門的專業滿足BU提出的這個需求,目前我們已知的資訊就是「要做一個XX文案生成器,而且要像是人寫的」。

這時候,我第一件做的事情是將需求format成一個軟體問題…

  • 目標: 生成像是人寫的文字
  • inputs: 某些condition,像是文字的風格、情緒正負向等等
  • outputs: 約五十字內的一段文字

step2: 閱讀資料

問題定義完成後,我們需要看看BU有沒有相關的data可以讓我們參考,在這個例子中BU提供了幾十筆文案。我們需要先利用EDA(Exploratory Data Analysis)觀察資料的特徵、資料的結構、有無異常值或空值等等。這時候腦海中應該會忍不住思考,這個問題能否用rule based的方法解決?還是需要用到NN? 根據不同資料/任務的特性,有可能你會遇到用rule based就可以解決的專案,那我就會推薦先以rule based的方式進行。因為machine learning其實非常仰賴資料的數量及品質,若你的資料量不足或是品質不夠,訓練出的模型也不會有太強的效果(即便你使用的是SOTA的演算法)。

除了user提供的資料外,我們也可以看看網路上是不是有相關的open data,若沒有的話有沒有其他類型的資料可以替代?或是有沒有辦法透過爬蟲等自動化工具自己收集?收集/處理資料的過程通常會佔據一個專案的大部分時間,且若我們又是用機器學習演算法的話,成敗也依賴資料的品質。

step3: 定義metrics

這邊所指的metrics包含我們學習machine learning時常見的metrics例如:F1-score, recall, precision, BLEU, ROUGE, accuracy…等等,但除此之外,不要害怕定義這份專案的專屬metric,因為主流的metrics不一定能滿足專案需求或是可能你缺少某些資料去計算。 舉例來說,文案生成,也可以說是Natural Language Generation (NLG)問題,目前學術上尚未有主流(dominate)的metric。在這個專案中,我先考慮了能否使用BLEU衡量我們生成出的文案與BU user自己撰寫的文案差異,但這件事情需要user花非常多時間去檢視每一個我們所生成的文案,現實中不太可能達成。

所以,我其實剛開始並沒有找到適合的metric,這也讓前期的開發不是非常順暢。

幸好,後來我們找到了幾個可以衡量文案生成品質的metrics,且他們都不太需要花費人力成本,可以自動化完成…

  • 相關度: 判斷生成文案與input condition的相關程度
  • 多樣性: 利用n-gram判斷文案們是否呈現出多樣性(創意???)
  • 語法正確性: 從語言學的角度判斷文案是否合乎人類常用語法

step4: 選擇model/algorithm

定義好問題與matrics後,我們可以開始根據資料特性選擇適合的模型,通常選擇模型時我們會考慮到以下幾點…

  • 模型能力: 這個模型目前是不是SOTA,它在類似的資料上效果如何
  • 資料適配性: 用這個模型是否需要額外資料處理?成本多高?(若需要重新label data的話其實就蠻高的)
  • 應用場域: 我們目標要把這個模型放在哪裡?user手機(edge device)上?還是server? 若是放在手機上的話還需要考慮模型的大小與效能問題

除此之外,通常若可以用rule based的方法處理的話就會先用,就算效果可能沒有nn來得好,也可以當作一個baseline! 但若rule based方法就可以高度滿足user的需求,那何樂而不為呢?

若你需要考慮使用nn,但一樣你需要明白以下幾點:資料有什麼特性?通常這類資料都用哪種model處理?目前SOTA的模型是什麼? 在這個例子中,我們的資料是一段句子,目標是做NLG,所以目前最常見且SOTA的方法就是transformer。

總而言之,在這個階段,你需要具備對資料與模型的認識,才能根據需求與限制尋找最合適的架構。

step5: 開發與測試

接下來就可以進行開發,開發時我們團隊利用VCS(version control system)進行版本控管與code review,故你可能會需要用到以下幾項工具…

  • autopep8: python formattor,確保code review時在程式碼每一位同仁的IDE上都可以正確呈現,也確保不會因為每個人的程式碼編排風格不同而造成review上的困難
  • pytest: 寫測試時非常好用的工具,測試可以幫助你每次改code時確保整份程式碼是正確的,也可以在你改錯的時候提示你哪邊可能有問題!(前提是你的測試coverage rate要夠高、夠全面)
  • bandit: 一個程式碼靜態掃描工具,可以幫助你找出程式中可能的安全性問題,以及相對應的建議解決方案。

除了這些常用的工具以外,架構你的程式碼時也必須使用易維護/閱讀的方式,這一塊我也還在學習,在這個過程中將會碰到許多OOP相關的技巧~

Future

開發完成一個prototype或是初版後就可以跟user開始確認是否符合需求,在這個過程中可能會需要常常修改程式碼,這時候若你有好的程式碼架構的話,會比較輕鬆一點。若user覺得也沒問題,接下來就是系統上線的問題了。是要做一個單機版?還是要部署到公司server?還是有需要做成手機APP? 這一塊目前我也還在摸索中,若有更深入瞭解的話再更新這篇文章~

結語

從無到有設計並完成一個專案並不是很容易的事情,過程中除了工程師本職的開發工作外,還是需要與需求方建立密切的連結,並時時溝通才不會讓專案方向跑偏。以前在學校時覺得machine learning其實就是把SOTA的模型套上自己的data,但在業界最常見的困境其實是你可能連data都沒有。

Photo by Alvaro Reyes on Unsplash