「回顧」演算法工程師的技術成長之路

  • 2019 年 11 月 23 日
  • 筆記

今天分享的內容分為以下幾個部分,首先Beta階段可以認為是研究生階段和演算法工程師實習生階段,接下來是特徵調研、在線應用、模型訓練。這四個部分是我在演算法領域的技術成長中不同階段的相關工作總結。最後一部分是深度學習,深度學習模型雖是眾多模型中的一種,由於最近比較火所以特意專門分享一下。

1. Beta階段

Beta階段就是在研究所做研究或者去公司實習做模型調研性質工作,主要偏學術,與工業界存在一定差距。這個階段的一個主要工作是嘗試不同的模型。學術界可以嘗試使用和改進很多複雜的模型而工業界換模型比較困難,原因有:

1. 學術界實驗數據一般是固定的,如參加比賽數據是現成的,可以直接使用訓練工具或平台訓練出模型;工業介面臨的問題就是機器有限,數據足夠多,很多時候一個簡單的模型用足夠多的訓練數據訓練出來的效果不一定比複雜的模型差。還有一個就是時間成本,一般越簡單的模型訓練時間越短。學術界可能訓練一個模型可以用幾天,但是工業界很難接受。工業界的問題對模型時效性都有要求。

2. 學術界比如比賽過程中評估的標準和模型的目標非常一致,而工業界把模型應用到一個系統中,系統收益的評估標準和模型目標不一定很一致。以廣告系統的CTR預估為例。整個廣告系統是非常複雜,CTR預估只是其中的一部分。一個簡單的廣告系統CTR預估越準確,點擊率和收入提升也越明顯。但是實際系統中CTR預估後有很多後續處理,假設有一些業務對預估CTR的穩定性要求很高可能對CTR預估結果分段處理,CTR預估精度提升並不能帶來點擊率和收入的明顯提升。

3. 實際系統中線上換模型,實現是有成本的,因此工業界換模型比較慎重。

Beta階段的工作除了嘗試不同的模型外,一個重要的工作就是調參,主要是需要人工設置的超參。超參有模型結構的參數,如LR模型的正則化係數,GBDT模型樹的深度和個數;還有優化演算法的參數,如學習率、步長等。Beta階段工作的模型評估的特點是:主要是離線指標,一般不涉及線上應用。實際上離線指標與線上指標差異比較大,離線評估的好,線上不一定好。總結一下:Beta階段的工作重點是嘗試不同的模型和調參,而實際上工業界的演算法工程師的重點並不在這一塊,而是數據和特徵工程。

2. 特徵調研

當前是一個大數據時代,數據是承載資訊的載體,大數據特點是數據量大、維度多。大數據常見的處理方式是分散式處理,經常使用的平台有Hadoop、Spark,也可能用到Hive, 避免直接寫MapReduce。大數據分散式處理是一個演算法工程師基本的工作技能,模型訓練是有監督的,需要有樣本,樣本要包含label,要得到label涉及到的基本操作有拼接,有時候也需要將不同維度的數據拼接到一起。高級處理有去噪、取樣、SA演算法,因為實際業務數據可能含有大量雜訊和具有不平衡的特點。

有了大數據處理能力,接下來就是特徵調研。這一階段就是通過增加特徵提高模型精度,這一階段的特點就是要高效,只有為了性能問題才會去刪減特徵,正常的都是增加特徵。加特徵要考慮便捷性問題,能改配置文件的盡量別改程式碼,如果需要改程式碼要考慮是不是可以簡單實現,還有就是程式碼改動後能夠很快的跑出特徵,但是現在數據海量,模型訓練數據時間周期長,有可能是半月或幾個月,所以特徵抽取的性能很關鍵。因此為了方便加特徵,一般都會開發一些通用的特徵抽取框架,目的就是為了加特徵變的很方便。為了高效跑出模型,特徵抽取的性能很關鍵,除了優化特徵抽取框架本身的性能和特徵抽取過程的性能外,還有一些技巧比如只抽取新增加的特徵,然後與基準線做一個拼接,這樣的好處第一個是快,第二個是避免多次抽取基準線特徵。多次抽取基準線特徵會有兩個問題:

1. 多次抽取不一定抽取的都對,存在一些連續值特徵的時候可能不小心特徵會抽錯;

2. 一個團隊如果好多人同時做特徵調研,每個人都跑出所有的特徵,這是對計算資源和存儲資源的一種很大的浪費。

接下來介紹下特徵調研的一些事情,主要是特徵設計和特徵分類。特徵設計沒有通用的方法論,特徵的設計依賴於對產品的理解。如果不想在特徵設計上花費太多時間,簡單的方法就是引入更多的數據,還有就是利用端到端的深度學習去學習進行特徵設計,但是它不能完全取代特徵設計,有時還是需要人工進行特徵組合。

特徵分類有連續值和離散值,大數據中大部分數據(比如IP、作業系統、機型)是離散的,因此離散模型在工業界較多,如LR模型、FM等。特徵分類也可以分成單邊特徵和組合特徵,單邊特徵就是一些原始欄位,組合特徵就是多個維度去組合。剛開始做特徵調研由於特徵較少不會去做特徵選擇,但是隨著特徵增多必然會刪減特徵。特徵選擇分為兩類,一種是刪掉一些特徵類;第二種就是特徵值的選擇,就是特徵類不變,刪除無用的特徵值:有兩種方法,一種是模型的正則化,這類方法壞處就是訓練完才知道特徵無用,還有一種方法是訓練前,如Fea-G演算法,以及基於新特徵過濾的方法。

3. 在線應用

訓練出模型後應用到線上,如果演算法工程師生成一個模型後不管了,生成的是一些模型文件,這對演算法工程師成長是不利的,演算法工程師對整個系統的影響也是無法控制的。模型優化沒有帶來產品指標的提升不一定是模型的問題,有可能是應用出問題。

常見的問題第一個就是一致性問題,最嚴格的就是打分一致性。但是有時並不一定能完全實現,比如預測的時候只能用請求的時間,可能訓練的時候用的是曝光的時間;還有就是位置,預測的時候還不知道位置。特徵一致性就是模型訓練的特徵和在線打分的特徵要一致,正常情況下絕大部分特徵是要做到離線和在線一致的。還有一種一致性就是離線和在線的AUC的一致性。解決特徵一致性最根本的解決方法是在線預測的時候把特徵列印出來,離線不再抽取特徵,實際中要解決在線列印特徵的性能問題。

第二個就是關注應用場景,分兩點介紹,第一個就是對系統影響有多大,比如CTR預估,從N條素材中選一條,N有多大決定選擇的空間。第二個就是預測出的打分如何被使用,如果打分高的排在後面,這種預測越精準效果越差。不同產品要求不同,比如話語權較高的廣告商的廣告位置變化不能太大,但是CTR預估是不能保證這一點的,這就需要在後續做一些處理。

還有一個快速迭代實驗也是比較關鍵的,模型訓練上線,要做多個實驗,這樣能夠提高效率,依據你的流量大小看同時能做多少組A/Btest。第一個就是一個業務有很多環節,多個環節是否能並行做實驗,因此不能所有的實驗都平分百分之百的流量,這樣就要分層進行實驗。第二個就是要關註上線的實驗效率,最好的模式是模型訓練後直接修改配置文件就可以上線。第三點就是實驗數據的置信度,雖然系統運行能支援並行,效率也很高,但是實驗要觀察多少時間,數據可不可信。一種簡單有效的方法是可以做AA實驗,看策略上相同的實驗需要觀察多長時間數據效果一樣。最後就是線上性能問題,第一點就是在線打分性能情況,面臨的是一個超時問題,超時一般發生在候選隊列很長,競爭激烈,這樣意味著都是商業價值高的請求,這種對線上的損失比較嚴重,因為最有商業價值的流量減少。第二點是模型大部分是單機存儲,要關注模型的載入方式。第三點就是模型的更新方式,一個是更新頻率,另一個是全量更新還是增量更新。

4. 模型訓練

模型訓練的數據處理能力和訓練速度很重要。海量數據一般是採用分散式訓練的方式,實現方法要保證數據量增加了通過增加機器仍然可以訓練出模型。第二個就是提高訓練速度,以及提高收斂的速度,優化演算法有GD、LBFGS等,除了優化演算法實際過程中還有一些經驗。如模型訓練初始權重不要設為0或者隨機,基準線特徵權重不要設為0,利用老的模型能夠加快收斂速度和使用更少的歷史數據。另外一種方法就是增量訓練,只用最新一天的數據,同時注意老數據的衰減。

在線訓練一定程度降低了資源需求,可以提高模型更新的頻率,在實際應用中對模型的時效性都是有要求;簡單模型如果更新頻率較快也不比複雜模型效果差。學習演算法典型的就是FTRL,SOA演算法。演算法工程師對模型訓練工具的開發必須具備訂製需求升級能力,你並不需要重新開發一個工具或平台,但在實際應用都需要一些訂製需求。

5. 深度學習

深度學習火熱的一個原因就是它解決了特徵學習的問題,特徵挖掘方面比較典型的就有DANOVA演算法。深度學習除了可以做各種預估,還可以生成一些向量化的東西,隱層輸出可以是User/Ad/Doc/Image的矢量化vector,這個可以用到召回階段,還可以做聚類。如果映射的vector在空間都可比,應用場景會更廣。在實際應用中DNN也會遇到各種問題,常見的就是在線打分性能問題,在線預測可以看成是一個矩陣運算;還有一個就是其收益不一定很大,DNN模型複雜,但是需要足夠的數據量,數據量不夠不一定能體現DNN優勢。第三個就是參數很多,需不需要花費大量精力去調參,還有一個就是穩定性,DNN對數據不一致性、數據雜訊更敏感。

DNN也可以和其他模型進行融合,如可以和寬度模型結合。實際的廣告系統中除了CTR預估,還有就是機制、預算控制、自動調價等,對線上影響更為直接,這樣的場景更適合用強化學習。最後就是深度學習與強化學習如何結合的問題。

作者介紹:

曾祥林,2009年碩士畢業於中科院自動化研究所模式識別國家重點實驗室,先後在百度鳳巢、搜狗搜索廣告、獵豹移動商業部門從事廣告演算法技術工作,目前任職於網易廣告演算法總監。

本文根據網易廣告演算法總監曾祥林老師在DataFun AI Talk中分享的《大數據時代-演算法工程師的技術成長之路》編輯整理而成。