從開發(fā)到產(chǎn)出:關(guān)于機器學習的七則干貨建議
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)
筆者去初創(chuàng)公司工作主要是為了做項目,所以盡管任務(wù)緊急、團隊又小,還伴隨著頻繁改動的項目要求以及其它瑣事,筆者還是去了。不走運的是,筆者作為一名機器學習工程師著手的第一份項目并不那么容易上手。
那是一個大項目,背后有個大客戶,意味著要擔很大的責任,但是卻只有一個小團隊負責此項目,團隊其中一員就是筆者這個新手。項目負責人安排筆者去處理十二個模型的那一天,光是想想都心有余悸。更糟糕的是,當筆者團隊中的一個人被調(diào)去另一個項目時,他的工作量落到了筆者頭上。
但筆者不是來向你們傾吐苦水的。盡管這個過程頗為曲折,但是也讓筆者收獲了很多意料之外的經(jīng)驗。
不斷研究
筆者犯過最大的一個錯誤就是僅僅因為某種方法最適合一些特定的數(shù)據(jù),就用這一種方法去處理所有數(shù)據(jù)。換句話說,筆者僅在項目伊始做了一個試驗。在找到捷徑以后,即使數(shù)據(jù)增長的越來越大,筆者依然堅持使用那一種方法。
筆者認為那是當時最有效的方法。然而作為一名機器學習工程師,不僅要建構(gòu)一個系統(tǒng),還要持續(xù)不斷地提升它的性能。筆者花了一個月的時間才接受這一事實。
筆者的前任主管曾說,機器學習工程師既是軟件工程師也是研究員。研究和軟件工程可不一樣。就算系統(tǒng)已經(jīng)構(gòu)建成功且沒有bug,研究也不會就此止步。研究是一個永無止境的過程,只要睜大雙眼,總會發(fā)現(xiàn)可以嘗試的新事物。
不要在模型學習的時候無所事事
“模型運行著吶!就讓我休息一會兒吧!”隨著數(shù)據(jù)增長的越來越大,使用的方法也變得越來越復雜。一個完整的訓練過程可以達到2至3小時。
當程序運行的時候,筆者常常借此拖延工作,現(xiàn)在我無比悔恨。有好幾次都出現(xiàn)了意外,比如運行進程接近尾聲的時候出現(xiàn)了程序錯誤、得分比之前更低了、內(nèi)存錯誤以及其它在快結(jié)束時才意識到的愚蠢失誤。
在模型學習的這段時間,明明可以做許多有意義的事情。
可以提前計劃工作步驟。一個程序開始成功運行后,就用不同的方法著手下一個程序。等第一個程序運行完畢,另一個程序就可以開始運行了。在新程序運行的時候,則可以評估分析前一個程序運行的結(jié)果。所以如果發(fā)現(xiàn)前一個模型的任何可改進之處,就可以立即修正然后重新運行。
這個時間用來和主管或者其它工程師討論新方法、新點子也是極好的??傊灰速M時間。
做出明智的選擇
某些情況下,不同的方法得出的結(jié)果差別可能不是那么明顯。產(chǎn)出的成果相較其它方法的成果稍微優(yōu)秀一點,這樣的方法是不是就足夠好到成為最終選擇了?不是。許多因素都應該被考慮在內(nèi)。分析的過程不僅僅是從一個單一的角度找出最佳方法,分析是一個細水長流的過程。
例如,假設(shè)有兩個垃圾郵件分類模型,它們的F1值分別為0.95和0.96。第二個模型的精確率很低,召回率卻很高,而第一個模型的精確率和召回率則比較平衡。
在這種情況下,第一個模型比第二個更好,因為它能更好地處理垃圾郵件分類。第二個模型更容易把將普通文檔歸類為垃圾郵件,這樣就會有更多的非垃圾郵件文檔將被劃為垃圾郵件,這非常糟糕。
其他需要考慮的是與產(chǎn)出有關(guān)的重要事宜。某些情況下,如果資源和時間有限,選擇一個簡便的模型會助你一臂之力。前提是模型的性能仍然良好,并且與較復雜的模型沒有太大區(qū)別。
切莫混淆數(shù)據(jù)
數(shù)據(jù)顯然是影響模型性能的重中之重。因此,在項目執(zhí)行之初就必須一絲不茍地建立一個詳備的數(shù)據(jù)集,包括需要提取的信息類型、注釋指南、各個數(shù)據(jù)類別之間的平衡以及視需求而定的其它重要事項。
如果使用標注工具(annotator)來構(gòu)建數(shù)據(jù)集,特別是對于NLP模型,則要確保技術(shù)和語言學兩方面認知的同步。有時候,語言學人員不明白某個特定的標注方法對現(xiàn)有的模型是否可行。同樣地,工程師有時候也不理解語言學的內(nèi)容。
需要注意的是,并不是數(shù)據(jù)越多越好。如果不能有效地反映所有的真實情況,再多的數(shù)據(jù)訓練也是白費功勞。除此之外,數(shù)據(jù)標簽的不一致也是個大問題。
另外,每次實驗,訓練、驗證以及測試數(shù)據(jù)的結(jié)構(gòu)和比例必須相同,特別是當數(shù)據(jù)逐漸增多時。為了確保模型的性能,還必須考慮案例類型的分布。如果有專門的測試數(shù)據(jù)再好不過,這有助于添加訓練數(shù)據(jù)后比較模型性能。
把步驟銜接起來
能夠構(gòu)建端到端系統(tǒng)是作為機器學習工程師必備的另一項重要技能。更重要的是,如果同時處理多個模型,那么使用管線(pipeline)會方便很多。加載數(shù)據(jù)集、預處理和特征提取、訓練和評估模型,以及做出預測都可以簡化到只使用單個指令。
不要指望一次就能得到滿意的結(jié)果。此外,長時間重復做某事確實會有壓力。因此,使機器學習工作流程自動化非常重要,這樣能節(jié)省時間、減輕壓力。
其他框架和工具
筆者也會因為出現(xiàn)錯誤而大呼小叫。在把系統(tǒng)部署到生產(chǎn)環(huán)境這一步驟出錯后,筆者再一次陷入懊惱。因此,了解一些可用于部署的實用框架和有效工具十分有必要??梢园岩恍┙佑|過的框架和工具拿來做個比較,再根據(jù)需要選出最適合的。
對于筆者來說,Docker在部署中非常重要。它幫助筆者在容器中部署多個模塊。除此之外,Tensorflow Serving也非常好用,它可以很方便地使訓練好的模型應用于預測請求。
使人人都可以理解
寫文檔不僅是為了自己,也是為了他人。如果其他工程師想要繼續(xù)試驗,或者只是想使用你的程序,你創(chuàng)建的文檔都能幫上他們。如果文檔也方便專業(yè)之外的人員閱讀和理解,那就更好了。
一份好的文檔通常包含超參數(shù)(hyperparameter)的配置、時期(epoch)、方法、數(shù)據(jù)和分數(shù)等信息。此外,提供自動化的腳本來運行程序?qū)ζ渌こ處熀苡袔椭?,這樣就不必先閱讀整個代碼了。
誠然,筆者還有許多東西需要學習。但最應該明白的是,不要害怕失敗。因為研究和試驗本身就是一個嘗試、失敗、再嘗試的過程。