大數據文摘出品
編譯:fuma,錢天培
軟體工程師和數據科學家一起工作時,會擦出什麽火花呢?
作為Java / Kotlin開發人員,一位名叫Ben Da年l的小哥為我們講述了他與數據科學家合作的有趣經歷。
在一年中,這位小哥從零開始學習機器學習,和數據科學家不斷交流合作,一起碼出了一個機器學習模型的原型,並成功把這個模型做上線。真是成就滿滿呢!
前情提要
大家好,我叫Ben Daniel,是一名安卓工程師。2017年末,我開始對機器學習領域產生興趣。機器學習這個領域充滿了有趣的挑戰,因此也就需要大量的學習。今天,我就給大家講述我和我司數據科學家一起攻克機器學習難題的經歷。
我還記得,我曾試圖解決我們的某個應用程式中出現的影像分類問題。我們需要根據一組規則區分有效和無效影像。於是我從深度學習領域中修改了dl4j這個例子,並試圖用它來處理分類任務。雖然結果不夠理想,但是我的心態還不錯。畢竟第一次嘗試嘛。
Dl4j例子鏈接:
https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/AnimalsClassification.java
由於精度和最終模型的大小不符,我使用dl4j代碼的方法是不可取的。面向移動設備,我們需要一個檔案大小緊湊的模型,很遺憾,這個功能無法實現。
數據科學家來啦
正巧,這個時候,我們聘請了一位數據科學家,他帶來了許多有趣的經驗,也教會我們很多。我逐漸發現,大多數機器學習問題都可以通過Python解決,而且Python社區中已經有了對機器學習的巨大支持。雖然不太情願,但我還是開始了Python的學習。
我從小型的機器學習課程開始學起。與此同時,我的其他團隊成員也很感興趣,並一起加入了學習的大軍。新入職的數據科學家向我們介紹了Jupyter notebook和雲機器學習引擎。我們通過使用花卉數據集示例嘗試影像分類,並很快沉迷其中。
在團隊中的每個人都接受了培訓和模型的基礎知識後,我們開始處理文章開始提到的遺留問題。作為一名團隊成員,我主要專注於兩項任務:影像分類問題和影像分割問題。之後,這兩個問題都被我們用卷積神經網絡(CNN)解決了。
準備訓練數據真心難
這兩項任務(影像分類問題和影像分割問題)都需要大量的訓練數據。我有兩個消息——好消息是我們的確有很多數據。壞消息是它們要麽是未分類要麽是未注釋。我終於明白了機器學習專家們所說的,機器學習項目中大部分時間將用來準備訓練數據而不是訓練模型本身。
對於影像分類分類問題,我們需要將數十萬個影像排列成不同的類。這是一項繁瑣的工作。我不得不調用我的Java Swing技能,來構建使這項任務更容易的GUI,但總的來說,標記數據這個任務真的很單調,很無聊。
分割問題就要複雜一些了。我們很幸運地發現了一些擅長分割的模型,但不幸的是,這些模型太佔記憶體了。我們還希望該模型能夠在規格非常低的安卓設備上運行。這時,數據科學家建議我們使用龐大的模型來生成數據,用以構建我們自己的移動網絡。
訓練
我們最終切換到了AWS Deep Learning AMI。訓練影像分割模型的過程完全由我們的數據科學家處理,我只需要站在他身邊,做筆記嘻嘻:)。
(其實我不在記筆記,哈哈哈哈哈哈哈哈)
訓練這個模型是一項計算密集型任務,需要足夠GPU和RAM。我們便採用了GPU和RAM,因此很快就完成了模型訓練。如果不是這樣的話,我們可能要花費數月來訓練這個模型。
我負責了影像分類模型的訓練。不過,我並沒有在雲上訓練,而是只在我的Macbook pro上訓練。這是因為,我只是訓練神經網絡的最後一層,而不是我們為分割模型所做的全網絡訓練。
順利完成!
兩種模型經過嚴格的測試後,都成功進入了我們的產品線。在這一步,團隊成員的任務是構建Java wrapper庫。這樣一來,我們就可以把模型繁複的細節隱藏起來。在使用時,我們只需輸入圖片,這個wrapper庫就會輸出一個概率 張量,也就是模型在單個影像上預測的結果陣列。我也參與了這一過程,因為我之前的一些寫碼經驗有用武之地。
人生處處是挑戰
“挑戰讓生活變得有趣,克服挑戰則讓生活變得有意義”。
在這個項目中,我面臨的最大挑戰是嘗試使用Bazel從源代碼構建用於32位系統的Tensorflow Java庫。整個過程實在是跌跌撞撞。
我也遇到過其他挑戰,比如,將Python解決方案轉換為Java。由於Python已經內置了對數據科學任務的支持,因此Python中的代碼感覺更加簡潔。每次在嘗試逐字翻譯命令時,我都會抓耳撓腮。比如,縮放2D陣列並將其作為透明層添加到影像中這一步就異常艱難。不過我們最終把這事兒搞定了!
現在我們上線的模型表現很好,但是當它們產生錯誤的結果時,那些錯誤的結果是荒謬無比的。
它讓我想起了我之前讀過的一句話:
“...如果沒有源源不斷的新數據,模型品質會迅速降低。這是著名的概念漂移(concept shift),這意味著,隨著時間的推移,靜態機器學習模型提供的預測變得不那麽準確,並且不太有用。在某些情況下,甚至可能在幾天內發生。 - David Talby
因此,我們必須不斷改進模型,並且永遠得不到一個一勞永逸的模型。其實還挺有趣的。
因為我本人主要關注移動開發,所以我甚至不確定自己有資格被稱為機器學習的新手。然而,通過與數據科學家的合作,我在今年成功上線了一個機器學習模型。回想起來,相當激動呢!