深度學習在美團配送ETA預估中的探索與實踐

美團技術團隊發表於2019-02-22

1. 背景

ETA(Estimated Time of Arrival,“預計送達時間”),即使用者下單後,配送人員在多長時間內將外賣送達到使用者手中。送達時間預測的結果,將會以"預計送達時間"的形式,展現在使用者的客戶端頁面上,是配送系統中非常重要的引數,直接影響了使用者的下單意願、運力排程、騎手考核,進而影響配送系統整體成本和使用者體驗。

對於整個配送系統而言,ETA既是配送系統的入口和全域性約束,又是系統的調節中樞。具體體現在:

  • ETA在使用者下單時刻就需要被展現,這個預估時長繼而會貫穿整個訂單生命週期,首先在使用者側給予準時性的承諾,接著被排程系統用作訂單指派的依據及約束,而騎手則會按照這個ETA時間執行訂單的配送,配送是否準時還會作為騎手的工作考核結果。

  • ETA作為系統的調節中樞,需要平衡使用者-騎手-商家-配送效率。從使用者的訴求出發,儘可能快和準時,從騎手的角度出發,太短會給騎手極大壓力。從排程角度出發,太長或太短都會影響配送效率。而從商家角度出發,都希望訂單被儘可能派發出去,因為這關係到商家的收入。

深度學習在美團配送ETA預估中的探索與實踐
ETA在配送系統中作用

在這樣多維度的約束之下,外賣配送的E他的建模和估計會變得更加複雜。與叫車場景中的ETA做對比,外賣場景的ETA面臨如下的挑戰:
  • 外賣場景中ETA是對客戶履約承諾的重要組成部分,無論是使用者還是騎手,對於ETA準確性的要求非常高。而在叫車場景,使用者更加關心是否能打到車,ETA僅提供一個參考,司機端對此也不是特別關注。

  • 外賣場景中ETA包含更多環節,騎手全程完成履約過程,其中包括到達商家、商家出餐、等待取餐、路徑規劃、不同樓宇交付等較多的環節,且較高的合單率使得訂單間的流程互相耦合,不確定性很大,做出合理的估計也有更高難度。

深度學習在美團配送ETA預估中的探索與實踐
外賣及叫車中的ETA

下圖是騎手履約全過程的時間軸,過程中涉及各種時長引數,可以看到有十幾個節點,其中關鍵時長達到七個。這些時長涉及多方,比如騎手(接-到-取-送)、商戶(出餐)、使用者(交付),要經歷室內室外的場景轉換,因此挑戰性非常高。對於ETA建模,不光是簡單一個時間的預估,更需要的是全鏈路的時間預估,同時更需要兼顧"單量-運力-使用者轉化率"轉化率之間的平衡。配送E他的演變包括了資料、特徵層面的持續改進,也包括了模型層面一路從LR-XGB-FM-DeepFM-自定義結構的演變。
深度學習在美團配送ETA預估中的探索與實踐
E他的探索與演變

具體ETA在整個配送業務中的位置及配送業務的整體機器學習實踐,請參看機器學習在美團配送系統的實踐:用技術還原真實世界》

2. 業務流程迭代中的模型改進

2.1 基礎模型迭代及選擇

與大部分CTR模型的迭代路徑相似,配送ETA模型的業務迭代經歷了LR->樹模型->Embedding->DeepFM->針對性結構修改的路徑。特徵層面也進行不斷迭代和豐富。

  • 模型維度從最初考慮特徵線性組合,到樹模型做稠密特徵的融合,到Embedding考慮ID類特徵的融合,以及FM機制低秩分解後二階特徵組合,最終通過業務指標需求,對模型進行鍼對性調整。

  • 特徵維度逐步豐富到使用者畫像/騎手畫像/商家畫像/地址特徵/軌跡特徵/區域特徵/時間特徵/時序特徵/訂單特徵等維度。

目前版本模型在比較了Wide&Deep、DeepFM、AFM等常用模型後,考慮到計算效能及效果,最終選擇了DeepFM作為初步的Base模型。整個DeepFM模型特徵Embedding化後,在FM(Factorization Machine)基礎上,進一步加入deep部分,分別針對稀疏及稠密特徵做針對性融合。FM部分通過隱變數內積方式考慮一階及二階的特徵融合,DNN部分通過Feed-Forward學習高階特徵融合。模型訓練過程中採取了Learning Decay/Clip Gradient/求解器選擇/Dropout/啟用函式選擇等,在此不做贅述。

2.2 損失函式

在ETA預估場景下,準時率及置信度是比較重要的業務指標。初步嘗試將Square的損失函式換成Absolute的損失函式,從直觀上更為切合MAE相比ME更為嚴苛的約束。在適當Learning Decay下,結果收斂且穩定。

同時,在迭代中考慮到相同的ETA承諾時間下,在前後N分鐘限制下,早到1min優於晚到1min,損失函式的設計希望整體的預估結果能夠儘量前傾。對於提前部分,適當降低數值懲罰。對於遲到部分,適當增大數值懲罰。進行多次除錯設計後,最終確定以前後N分鐘以及原點作為3個分段點。在原先absolute函式優化的基礎上,在前段設計1.2倍斜率absolute函式,後段設計1.8倍斜率absolute函式,以便讓結果整體往中心收斂,且預估結果更傾向於提前送達,對於ETA各項指標均有較大幅度提升。

深度學習在美團配送ETA預估中的探索與實踐
損失函式


2.3 業務規則融入模型

目前的業務架構是"模型+規則",在模型預估一個ETA值之後,針對特定業務場景,會有特定業務規則時間疊加以滿足特定場景需求,各項規則由業務指標多次迭代產生。這裡產生了模型和規則整體優化的割裂,在模型時間和規則時間分開優化後,即模型訓練時並不能考慮到規則時間的影響,而規則時間在一年之中不同時間段,會產生不同的浮動,在經過一段時間重複迭代後,會加大割裂程度。

在嘗試了不同方案後,最終將整體規則寫入到了TF模型中,在TF模型內部調整整體規則引數

  • 對於簡單的(ab+c)d等規則,可以將規則邏輯直接用TF的OP運算元來實現,比如當b、d為定值時,則a、c為可學習的引數

  • 對於過於複雜的規則部分,則可以藉助一定的模型結構,通過模型的擬合來代替,過多複雜OP運算元巢狀並不容易同時優化。

通過調節不同的擬合部分及引數,將多個規則完全在TF模型中實現。最終對業務指標具備很大提升效果,且通過對部分定值引數的更改,具備部分人工干涉模型能力。

深度學習在美團配送ETA預估中的探索與實踐
多目標補時結構

在這裡,整體架構就簡化為多目標預估的架構,這裡採用多工架構中常用的Shared Parameters的結構,訓練時按比例採取不同的交替訓練策略。結構上從最下面的模型中間融合層出發,分別在TF內實現常規預測結構及多個規則時間結構,而其對應的Label則仍然從常規的歷史值和規則時間值中來,這樣考慮了以下幾點:
  • 模型預估時,已充分考慮到規則對整體結果的影響(例如多個規則的疊加效應),作為整體一起考慮。

  • 規則時間作為輔助Label傳入模型,對於模型收斂及Regularization,起到進一步作用。

  • 針對不同的目標預估,採取不同的Loss,方便進行鍼對性優化,進一步提升效果。

模型結構在進行預估目標調整嘗試中:

  • 嘗試過固定共享網路部分及不固定共享部分引數,不固定共享引數效果明顯。

  • 通常情況下啟用函式差異不大,但在共享層到獨立目標層中,不同的啟用函式差異很大。

2.4 缺失值處理

在模型處理中,特徵層面不可避免存在一定的缺失值,而對於缺失值的處理,完全借鑑了《美團“猜你喜歡”深度學習排序模型實踐》文章中的方法。對於特徵x進入TF模型,進行判斷,如果是缺失值,則設定w1引數,如果不是缺失值則進入模型數值為w2*x,這裡將w1和w2作為可學習引數,同時放入網路進行訓練。以此方法來代替均值/零值等作為缺失值的方法。

深度學習在美團配送ETA預估中的探索與實踐
缺失值處理

3. 長尾問題優化

3.1 模型預估結果+長尾規則補時

基礎模型學習的是整體的統計分佈,但對於一些長尾情形的學習並不充分,體現在長尾情形下預估時間偏短(由於ETA擁有考核騎手的功能,預估偏短對騎手而言意味著很大的傷害)。故將長尾拆解成兩部分來分析:

  • 業務長尾,即整體樣本分佈造成的長尾。主要體現在距離、價格等維度。距離越遠,價格越高,實際送達時間越長,但樣本佔比越少,模型在這一部分上的表現整體都偏短。

  • 模型長尾,即由於模型自身對預估值的不確定性造成的長尾。模型學習的是整體的統計分佈,但不是對每個樣本的預估都有“信心”。實踐中採用RF多棵決策樹輸出的標準差來衡量不確定性。RF模型生成的決策樹是獨立的,每棵樹都可以看成是一個專家,多個專家共同打分,打分的標準差實際上就衡量了專家們的“分歧”程度(以及對預估的“信心”程度)。從下圖也可以看出來,隨著RF標準差的增加,模型的置信度和準時率均在下降。

深度學習在美團配送ETA預估中的探索與實踐
模型長尾因子
在上述拆解下,採用補時規則來解決長尾預估偏短的問題:長尾規則補時為 <業務長尾因子 , 模型長尾因子> 組合。其中業務長尾因子為距離、價格等業務因素,模型長尾因子為RF標準差。最終的ETA策略即為模型預估結果+長尾規則補時。

4. 工程開發實踐

4.1 訓練部分實踐

整體訓練流程

對於線下訓練,採取如下訓練流程:

Spark原始資料整合 -> Spark生成TFRecord -> 資料並行訓練 -> TensorFlow Serving線下GPU評估 -> CPU Inference線上預測

整個例行訓練億級資料多輪Epoch下流程持續約4小時,其中TF訓練中,考慮到TF實際計算效率並不是很高,有很大比例在資料IO部分,通過Spark生成TFRecord部分,在此可將速度加速約3.6倍。而在資料並行訓練部分,16卡內的並行度擴充套件基本接近線性,具備良好的擴充套件性。由於PS上引數量並未達到單機無法承受,暫時未對引數在PS上進行切分。Serving線下GPU評估部分,是整個流程中的非必需項,雖然在訓練過程中Chief Worker設定Valid集合可有一定的指標,但對全量線下,通過Spark資料呼叫Serving GPU的評估具備短時間內完成全部流程能力,且可以指定大量複雜自定義指標。

資料並行訓練方式

整個模型的訓練在美團的AFO平臺上進行,先後嘗試分散式方案及單機多卡方案。考慮到生產及結果穩定性,目前線上模型生產採用單機多卡方案進行例行訓練。

  • 分散式方案

採用TF自帶的PS-Worker架構,非同步資料並行方式,利用tf.train.MonitoredTrainingSession協調整個訓練過程。整個模型引數儲存於PS,每個Step上每個Worker拉取資料進行資料平行計算,同時將梯度返回,完成一次更新。目前的模型單Worker吞吐1~2W/s,億級資料幾輪Epoch耗時在幾小時內完成。同時測試該模型在平臺上的加速比,大約在16塊內,計算能力隨著Worker數目線性增加,16卡後略微出現分離。在目前的業務實踐中,基本上4-6塊卡可以短時間內完成例行的訓練任務。

  • 單機多卡方

採用PS-Worker的方案在平臺上具備不錯的擴充套件性,但是也存在一定的弊端,使用RPC的通訊很容易受到其他任務的影響,整個的訓練過程受到最慢Worker的影響,同時非同步更新方式對結果也存在一定的波動。對此,線上上生產中,最終選取單機多卡的方案,犧牲一定的擴充套件性,帶來整體訓練效果和訓練速度的穩定性。單機多卡方案採取多GPU手動指定OP的Device,同時在各個Device內完成變數共享,最後綜合Loss與梯度,將Grad更新到模型引數中。

深度學習在美團配送ETA預估中的探索與實踐
加速比曲線
TF模型整合預處理

模型訓練過程中,ID類特徵低頻過濾需要用到Vocab詞表,連續型特徵都需要進行歸一化。這裡會產生大量的預處理檔案,線上下處理流程中很容易在Spark中處理成Libsvm格式,然後載入到模型中進行訓練。但是線上上預測時,需要在工程開發端載入多個詞表及連續型特徵的歸一化預處理檔案(avg/std值檔案等),同時由於模型是按天更新,存在不同日期版本的對齊問題。

為了簡化工程開發中的難度,在模型訓練時,考慮將所有的預處理檔案寫入TF計算圖之中,每次線上預測只要輸入最原始的特徵,不經過工程預處理,直接可得到結果:

  • 對於ID類特徵,需要進行低頻過濾,然後製作成詞表,TF模型讀入詞表的list_arr,每次inference通過ph_vals,得到對應詞表的ph_idx。

tf_look_up = tf.constant(list_arr, dtype=tf.int64)
table = tf.contrib.lookup.HashTable(tf.contrib.lookup.KeyValueTensorInitializer(tf_look_up, idx_range), 0)
ph_idx = table.lookup(ph_vals) + idx_bias
  • 對於連續型特徵,在Spark處理完得到avg/std值後,直接寫入TF模型計算圖中,作為constant節點,每個ph_in經過兩個節點,得到相應ph_out。

constant_avg = tf.constant(feat_avg, dtype=tf.float32, shape=[feat_dim], name="avg")
constant_std = tf.constant(feat_std, dtype=tf.float32, shape=[feat_dim], name="std")
ph_out = (ph_in - constant_avg) / constant_std

4.2 TF模型線上預測

配送機器學習平臺內建了模型管理平臺,對演算法訓練產出的模型進行統一管理和排程,管理線上模型所用的版本,並支援模型版本的切換和回退,同時也支援節點模型版本狀態的管理。

ETA使用的DeepFM模型用TensorFlow訓練,生成SavedModel格式的模型,需要模型管理平臺支援Tensorflow SavedModel格式。

實現方案

線上服務載入TensorFlow SavedModel模型有多種實現方案:

  • 自行搭建TensorFlow Serving CPU服務,通過gRPC API或RESTful API提供服務,該方案實現比較簡單,但無法與現有的基於Thrift的模型管理平臺相容。

  • 使用美團AFO GPU平臺提供的TensorFlow Serving服務。

  • 在模型管理平臺中通過JNI呼叫TensorFlow提供的Java API TensorFlow Java API,完成模型管理平臺對SavedModel格式的支援。

最終採用TensorFlow Java API載入SavedModel在CPU上做預測,測試batch=1時預測時間在1ms以內,選擇方案3作為實現方案。

遠端計算模式

TensorFlow Java API的底層C++動態連結庫對libstdc++.so的版本有要求,需要GCC版本不低於4.8.3,而目前線上服務的CPU機器大部分系統為CentOS 6, 預設自帶GCC版本為4.4.7。如果每臺線上業務方伺服器都支援TensorFlow SavedModel本地計算的話,需要把幾千臺伺服器統一升級GCC版本,工作量比較大而且可能會產生其他風險。

因此,我們重新申請了幾十臺遠端計算伺服器,業務方伺服器只需要把Input資料序列化後傳給TensorFlow Remote叢集,Remote叢集計算完後再將Output序列化後返回給業務方。這樣只需要對幾十臺計算伺服器升級就可以了。

深度學習在美團配送ETA預估中的探索與實踐
線上序列化
線上效能

模型上線後,支援了多個業務方的演算法需求,遠端叢集計算時間的TP99基本上在5ms以內,可以滿足業務方的計算需求。

深度學習在美團配送ETA預估中的探索與實踐
線上效果

5. 總結與展望

模型落地並上線後,對業務指標帶來較大的提升。後續將會進一步根據業務優化模型,進一步提升效果:

  • 將會進一步豐富多目標學習框架,將取餐、送餐、交付、排程等整個配送生命週期內的過程在模型層面考慮,對訂單生命週期內多個目標進行建模,同時提升模型可解釋性。

  • 模型融合特徵層面的進一步升級,在Embedding以外,通過更多的LSTM/CNN/自設計結構對特徵進行更好的融合。

  • 特徵層面的進一步豐富。

作者簡介

基澤,美團點評技術專家,目前負責配送演算法策略部機器學習策略迭代工作。

周越,2017年加入美團配送事業部演算法策略組,主要負責ETA策略開發。

顯傑,美團點評技術專家,2018年加入美團,目前主要負責配送演算法資料平臺深度學習相關的研發工作。

相關文章