首頁>科技>

全文共2619字,預計學習時長7分鐘

筆者去初創公司工作主要是為了做專案,所以儘管任務緊急、團隊又小,還伴隨著頻繁改動的專案要求以及其它瑣事,筆者還是去了。不走運的是,筆者作為一名機器學習工程師著手的第一份專案並不那麼容易上手。

那是一個大專案,背後有個大客戶,意味著要擔很大的責任,但是卻只有一個小團隊負責此專案,團隊其中一員就是筆者這個新手。專案負責人安排筆者去處理十二個模型的那一天,光是想想都心有餘悸。更糟糕的是,當筆者團隊中的一個人被調去另一個專案時,他的工作量落到了筆者頭上。

但筆者不是來向你們傾吐苦水的。儘管這個過程頗為曲折,但是也讓筆者收穫了很多意料之外的經驗。

不斷研究

筆者犯過最大的一個錯誤就是僅僅因為某種方法最適合一些特定的資料,就用這一種方法去處理所有資料。換句話說,筆者僅在專案伊始做了一個試驗。在找到捷徑以後,即使資料增長的越來越大,筆者依然堅持使用那一種方法。

筆者認為那是當時最有效的方法。然而作為一名機器學習工程師,不僅要建構一個系統,還要持續不斷地提升它的效能。筆者花了一個月的時間才接受這一事實。

筆者的前任主管曾說,機器學習工程師既是軟體工程師也是研究員。研究和軟體工程可不一樣。就算系統已經構建成功且沒有bug,研究也不會就此止步。研究是一個永無止境的過程,只要睜大雙眼,總會發現可以嘗試的新事物。

不要在模型學習的時候無所事事

“模型執行著吶!就讓我休息一會兒吧!”隨著資料增長的越來越大,使用的方法也變得越來越複雜。一個完整的訓練過程可以達到2至3小時。

當程式執行的時候,筆者常常藉此拖延工作,現在我無比悔恨。有好幾次都出現了意外,比如執行程序接近尾聲的時候出現了程式錯誤、得分比之前更低了、記憶體錯誤以及其它在快結束時才意識到的愚蠢失誤。

在模型學習的這段時間,明明可以做許多有意義的事情。

可以提前計劃工作步驟。一個程式開始成功執行後,就用不同的方法著手下一個程式。等第一個程式執行完畢,另一個程式就可以開始運行了。在新程式執行的時候,則可以評估分析前一個程式執行的結果。所以如果發現前一個模型的任何可改進之處,就可以立即修正然後重新執行。

做出明智的選擇

某些情況下,不同的方法得出的結果差別可能不是那麼明顯。產出的成果相較其它方法的成果稍微優秀一點,這樣的方法是不是就足夠好到成為最終選擇了?不是。許多因素都應該被考慮在內。分析的過程不僅僅是從一個單一的角度找出最佳方法,分析是一個細水長流的過程。

例如,假設有兩個垃圾郵件分類模型,它們的F1值分別為0.95和0.96。第二個模型的精確率很低,召回率卻很高,而第一個模型的精確率和召回率則比較平衡。

在這種情況下,第一個模型比第二個更好,因為它能更好地處理垃圾郵件分類。第二個模型更容易把將普通文件歸類為垃圾郵件,這樣就會有更多的非垃圾郵件文件將被劃為垃圾郵件,這非常糟糕。

其他需要考慮的是與產出有關的重要事宜。某些情況下,如果資源和時間有限,選擇一個簡便的模型會助你一臂之力。前提是模型的效能仍然良好,並且與較複雜的模型沒有太大區別。

切莫混淆資料

資料顯然是影響模型效能的重中之重。因此,在專案執行之初就必須一絲不苟地建立一個詳備的資料集,包括需要提取的資訊型別、註釋指南、各個資料類別之間的平衡以及視需求而定的其它重要事項。

如果使用標註工具(annotator)來構建資料集,特別是對於NLP模型,則要確保技術和語言學兩方面認知的同步。有時候,語言學人員不明白某個特定的標註方法對現有的模型是否可行。同樣地,工程師有時候也不理解語言學的內容。

需要注意的是,並不是資料越多越好。如果不能有效地反映所有的真實情況,再多的資料訓練也是白費功勞。除此之外,資料標籤的不一致也是個大問題。

另外,每次實驗,訓練、驗證以及測試資料的結構和比例必須相同,特別是當資料逐漸增多時。為了確保模型的效能,還必須考慮案例型別的分佈。如果有專門的測試資料再好不過,這有助於新增訓練資料後比較模型效能。

把步驟銜接起來

能夠構建端到端系統是作為機器學習工程師必備的另一項重要技能。更重要的是,如果同時處理多個模型,那麼使用管線(pipeline)會方便很多。載入資料集、預處理和特徵提取、訓練和評估模型,以及做出預測都可以簡化到只使用單個指令。

不要指望一次就能得到滿意的結果。此外,長時間重複做某事確實會有壓力。因此,使機器學習工作流程自動化非常重要,這樣能節省時間、減輕壓力。

其他框架和工具

筆者也會因為出現錯誤而大呼小叫。在把系統部署到生產環境這一步驟出錯後,筆者再一次陷入懊惱。因此,瞭解一些可用於部署的實用框架和有效工具十分有必要。可以把一些接觸過的框架和工具拿來做個比較,再根據需要選出最適合的。

對於筆者來說,Docker在部署中非常重要。它幫助筆者在容器中部署多個模組。除此之外,Tensorflow Serving也非常好用,它可以很方便地使訓練好的模型應用於預測請求。

使人人都可以理解

寫文件不僅是為了自己,也是為了他人。如果其他工程師想要繼續試驗,或者只是想使用你的程式,你建立的文件都能幫上他們。如果文件也方便專業之外的人員閱讀和理解,那就更好了。

一份好的文件通常包含超引數(hyperparameter)的配置、時期(epoch)、方法、資料和分數等資訊。此外,提供自動化的指令碼來執行程式對其他工程師很有幫助,這樣就不必先閱讀整個程式碼了。

誠然,筆者還有許多東西需要學習。但最應該明白的是,不要害怕失敗。因為研究和試驗本身就是一個嘗試、失敗、再嘗試的過程。

我們一起分享AI學習與發展的乾貨

8
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 阿里涉嫌壟斷被調查引起熱議,雲紙正默默開創新天地