百萬騎手“火速送達(dá)”背后的人工智能應(yīng)用實(shí)踐
大部分人都點(diǎn)過外賣,現(xiàn)在外賣成了中國人吃飯的另一種方式,今天分享的主題是人工智能在 “餓了么” 的應(yīng)用實(shí)踐。
今天的內(nèi)容主要分為三個(gè)部分:
- “餓了么” 簡介。
- AI 在“餓了么” 的應(yīng)用場景。
- 運(yùn)籌優(yōu)化與機(jī)器學(xué)習(xí)的應(yīng)用實(shí)例。
關(guān)于“餓了么”
大部分人都點(diǎn)過外賣,現(xiàn)在外賣成了中國人吃飯的另一種方式。點(diǎn)外賣是什么樣的量級(jí),說起來嚇大家一跳。
中國最大領(lǐng)域是電商,淘寶、京東,其次就是出行行業(yè),滴滴、UBER,緊接著是共享單車,這幾家公司加起來是一天兩三千萬的訂單量左右。
而在外賣行業(yè),到今天為止已經(jīng)每天達(dá)到 2500 萬單,可以看到這個(gè)行業(yè)正在飛速發(fā)展。
為什么數(shù)據(jù)和算法能起到那么大的作用?因?yàn)槲覀兌贾涝?ldquo;互聯(lián)網(wǎng)+”的背景下,有這么大的訂單量,至少是在數(shù)據(jù)行業(yè)我們有非常多事情要做。
2500 萬訂單量里面 “餓了么” 是什么樣的場景?我們把手機(jī) APP 打開,可以找到自己喜歡的餐廳,大家選擇一個(gè)餐廳,選擇喜歡吃的東西,這個(gè)行為雖然是點(diǎn)一個(gè)菜,但是實(shí)際上跟大家在淘寶買衣服和在攜程買機(jī)票是一樣的。
前面是電商交易平臺(tái)所交易的食品,現(xiàn)在不僅是食品,還可以在上面買鮮花、買藥品,同時(shí)還有本地的幫買幫送等等。所以電商只是第一部分,電商到了什么規(guī)模?
“餓了么”C 端注冊用戶 2.6 億,B 端商家目前已經(jīng)是 130 萬,每年是千萬級(jí)別的定單情況,這個(gè)是我們外賣行業(yè)的一部分,基于電商交易平臺(tái)。
第二部分就是大家可以看見上圖中騎手小哥拿著箱子,要么走路或者騎著電動(dòng)車,這就是本地物流平臺(tái)。
為什么要強(qiáng)調(diào)本地,因?yàn)槲覀冃袠I(yè)的特殊性跟其他物流行業(yè)不一樣。他們幾天時(shí)間到達(dá),我們這個(gè)行業(yè)的本地物流是希望 30 分鐘能送到用戶手里。
所以我們在設(shè)計(jì)這個(gè)架構(gòu)的時(shí)候就有很大的挑戰(zhàn),這個(gè)有一些不同,一會(huì)兒講到算法模型的時(shí)候就清楚了,我們是做一些本地的物流,所以時(shí)間上有非常嚴(yán)格的限制。
到今天為止,我們配送員已經(jīng)達(dá)到 300 萬,平均每天在任何時(shí)刻,全國都有 30 萬到 40 萬的騎手活躍線下,隨時(shí)準(zhǔn)備接單。這個(gè)跟滴滴是一樣的運(yùn)營模式,現(xiàn)在已經(jīng)覆蓋了全國 2 千多個(gè)城市。
AI 在“餓了么”的應(yīng)用場景
外賣這個(gè)行業(yè)為什么需要人工智能呢?作為本地生活的平臺(tái),我們都知道衣食住行是非常需要的。
在每個(gè)方向都有很多大的商家,他們在技術(shù)上的挑戰(zhàn)有什么不同,一定取決于他們的業(yè)務(wù)形態(tài)。
首先是淘寶,淘寶是大家在線上買東西最常用的一個(gè)平臺(tái),里面主要是以用戶和商戶為主,線下是同城當(dāng)日達(dá),更多定單是走開放平臺(tái)。
大家下了定單,東西送到大家的手里,這個(gè)是三通一達(dá)。也可以是菜鳥或者順豐,它們是開放平臺(tái),最重要的一點(diǎn)是時(shí)效性,通常以天來計(jì)算,超時(shí)不會(huì)有所謂的賠償,這個(gè)是淘寶的情況。
我們再看攜程,它可以定旅館、酒店,線上以用戶和商戶為主,不會(huì)有線下的訂單。
跟外賣行業(yè)特別接近的就是滴滴,從業(yè)務(wù)形態(tài)來講,像滴滴這類出行和外賣是非常接近的。
滴滴線下線上始終是用戶和司機(jī),定單形式也是眾包的形式,要么通過加盟商,要么通過司機(jī)網(wǎng)上注冊來承擔(dān)運(yùn)力,超時(shí)也不會(huì)懲罰司機(jī)。
因?yàn)檎l也不會(huì)預(yù)料到會(huì)不會(huì)出現(xiàn)車禍,這個(gè)時(shí)效沒有保證,所以說它和餓了么是極其相似的。
最后提到 “餓了么” 和外賣行業(yè)。首先線上以用戶和商戶為主,線下訂單部分比較多,藍(lán)色騎手有一部分是 “餓了么” 的員工,就是自營,還有團(tuán)隊(duì)和加盟商的形式,當(dāng)然還有一種是眾包。
比如說今天開一個(gè)會(huì),下午還有四個(gè)小時(shí),我可以送幾單,這是一種眾包的形式。
時(shí)效性是以分鐘來計(jì)算的,我們的目標(biāo)在很長時(shí)間已經(jīng)做到了,全國平均半個(gè)小時(shí)可以把訂單送到手里。
還有超時(shí)賠付,如果 30 分鐘之后超過 10 分鐘沒有送到,就有一個(gè)紅包的賠償,超時(shí)賠付的壓力是比較大的,不過這樣做對(duì)客戶來說算是一種服務(wù)不足的補(bǔ)償。
根據(jù)上面所述,我們進(jìn)入了一個(gè)大的框架,就是在外賣這個(gè)行業(yè)是三個(gè)大框架,一個(gè)是機(jī)器學(xué)習(xí),一個(gè)是大數(shù)據(jù),再一個(gè)運(yùn)籌優(yōu)化跟機(jī)器學(xué)習(xí)也是密不可分的。
講到運(yùn)籌優(yōu)化,大數(shù)據(jù)作為運(yùn)籌優(yōu)化的基礎(chǔ)起到了非常關(guān)鍵的作用,現(xiàn)在大家看這個(gè)圖挺有意思,我會(huì)多花兩分鐘講一講在業(yè)務(wù)中的算法問題,大概有三個(gè)層面。
底層的外賣行業(yè)希望 30 分鐘把食物送到用戶手里,不可能送到二十或者三十公里之外,除非你會(huì)飛,否則半個(gè)小時(shí)不可能送 10 公里。
基于這種情況,所有行業(yè)都是基于當(dāng)前打開 APP 的位置,定位可能 3 公里或者 5 公里的半徑,LBS 保證在運(yùn)營商網(wǎng)絡(luò)做各種推薦或者搜索為基礎(chǔ),再往上兩層就是機(jī)器學(xué)習(xí)和優(yōu)化,所以具體講一下這三部分。
交易
如下圖,大家可以看到中間這個(gè)模塊是用戶商戶分層,推薦搜索以及智能補(bǔ)貼,這幾個(gè)大的方向是任何電商都必須做的。
在有很精細(xì)的用戶畫像體制上,我們希望對(duì)用戶和商戶的生命周期做嚴(yán)格的管理,在這個(gè)基礎(chǔ)上我們做相應(yīng)的推薦、搜索、補(bǔ)貼。
比如說有一個(gè)用戶進(jìn)入沉睡期,我們會(huì)通過一定的方式對(duì)客戶進(jìn)行刺激。
線下
當(dāng)交易行為發(fā)生時(shí),我們希望 30 分鐘將外賣送到用戶手里,這里面涉及到機(jī)器學(xué)習(xí)的規(guī)劃,我會(huì)詳細(xì)講智能的調(diào)度,也會(huì)詳細(xì)講到出餐時(shí)間和送餐時(shí)間的預(yù)估,以及動(dòng)態(tài)定價(jià)等這幾個(gè)模塊。
智能調(diào)度是調(diào)度的一部分,我們這 30 分鐘包括了準(zhǔn)備的時(shí)間和路上的時(shí)間,甚至保證了送到樓下,等電梯到你手上的時(shí)間等等。所以這 30 分鐘有很多不可預(yù)估的東西。
那么壓力平衡是什么意思?大家都知道,線上交易和我們物流是矛盾的,對(duì)于線上交易來說我們當(dāng)然希望訂單越多越好,我們希望有上千萬的用戶幾秒鐘一下子全進(jìn)來。
但是 30 分鐘內(nèi)把訂單全部送出去,這個(gè)是不太可能一下子解決的問題,為了達(dá)到壓力平衡,就要保證交易和物流、配送等保持平衡,既達(dá)到交易質(zhì)量,也不損失用戶的積極性。
底層
講到交易和線下這兩個(gè)之后就是一些底層的東西,現(xiàn)在讓我們看上面那張圖,左邊包括選址推薦等等。
剛才講到配送是本地,當(dāng)一個(gè)商家定下準(zhǔn)備配送的地方就會(huì)畫一個(gè)圈,比如說我送一個(gè)圓圈或者六邊形,這個(gè)不是隨便畫的。
首先有可能這個(gè)地方是高速路或者高架橋,不是每個(gè)人的平臺(tái)都是一樣的,有的用戶也有可能老是定便宜訂單,我們在網(wǎng)格和站點(diǎn)規(guī)劃的時(shí)候會(huì)考慮所有因素。
這個(gè)涉及很多運(yùn)籌優(yōu)化的問題,最后一個(gè)例子就會(huì)講到選址和網(wǎng)格規(guī)劃的問題。
下面簡單講一下我們在人工智能方面所有的一些嘗試,這對(duì)我們業(yè)務(wù)是非常重要的。
運(yùn)籌優(yōu)化與機(jī)器學(xué)習(xí)的應(yīng)用實(shí)例
這一部分我會(huì)分兩種來說:
- 機(jī)器學(xué)習(xí)的應(yīng)用案例。
- 機(jī)器學(xué)習(xí)應(yīng)酬優(yōu)化的案例。
案例 1 : 出餐時(shí)間預(yù)估
第一個(gè)是出餐時(shí)間的預(yù)估,我在這里用滴滴做比較,什么是等待時(shí)間預(yù)估。
比如我們在滴滴場景下下了一個(gè)訂單,說我想去浦東機(jī)場,它會(huì)告訴你這個(gè)車離這里兩公里,3 分鐘會(huì)到,這個(gè)3 分鐘就是等待時(shí)間預(yù)估。
“餓了么” 相當(dāng)于下了一個(gè)單,大概 20 分鐘才能做好,我們希望的是來的早不如來的巧。
作為我們平臺(tái)的騎手剛好在 20 分鐘就到,如果早了騎手等在那兒是浪費(fèi),但是去晚了,就可能訂單超過了時(shí)間。
這個(gè)出餐時(shí)間的準(zhǔn)確性是關(guān)鍵,當(dāng)訂單完成之后,怎么知道訂單花多長時(shí)間完成?
這個(gè)餐廳受很多因素的影響,餐廳的備餐時(shí)間和食堂吃的用戶數(shù)、餐品類型、烹飪方式、訂單大小等且備完餐后無通知。
比如說餐廳客戶特別多,平時(shí)可能 5 分鐘做出來,可能人多了就 5 分鐘做不出來。
還有產(chǎn)品品類的問題,甚至包括一天的天氣各種原因,包括餐廳的出勤率,餐廳廚師請假突然少了幾個(gè)人,這些都是造成預(yù)估不準(zhǔn)確的原因之一。
我們想過為什么不讓餐廳做好了后直接告訴我們,然后我們就去取餐,這個(gè)理論是可行。
但是大家想象一下在餐廳場景里面,廚房是什么樣的情況?你想象一下一個(gè)廚師滿手都是油,出來點(diǎn)一下這個(gè)訂單好了,然后看下一個(gè)訂單,這個(gè)是很難想象的事情,我們沒有得到這方面的數(shù)據(jù)。
這個(gè)是一個(gè)前提,我們的解決方案毫無疑問是機(jī)器學(xué)習(xí),最簡單版本就是線性模型。
一開始效果不是特別好,但逐漸演進(jìn)到后面的 GBDT ,在場景下做到平均不是特殊平均,加上出餐時(shí)間是 10 分鐘,我們可以固定 7 分鐘到 13 分鐘,這個(gè)準(zhǔn)確率比較高。
我強(qiáng)調(diào)是平均,因?yàn)橛泻芏嗵厥鈭鼍?,如果廚師出了什么事情,我們也不知道,因?yàn)闄C(jī)器學(xué)習(xí)只能根據(jù)過去的事情來預(yù)測將來。
在突發(fā)事件有一些產(chǎn)品的方案,比如說看到這個(gè)餐廳出餐量和訂單量并沒有呈線性的增長,前面出現(xiàn)了堵塞情況,我們根據(jù)數(shù)據(jù)對(duì)平臺(tái)進(jìn)行實(shí)時(shí)調(diào)整。
最后我們的方法是深度學(xué)習(xí),用的是 LSTM。我們通過時(shí)間相關(guān)性把預(yù)測做的更加準(zhǔn)確,毫無疑問出餐時(shí)間一定會(huì)跟過去訂單有關(guān)系,這個(gè)不用解釋。
但是為什么跟未來有關(guān)系,我們預(yù)估未來 3 到 5 分鐘有新的訂單,但是跟現(xiàn)有的訂單有共同之處,有可能是同樣的菜品,有可能是共同的地方,同樣的菜品對(duì)廚房是一個(gè)訂單,可以把菜一起做。
我們學(xué)到了,通過這個(gè)模型也可以捕捉這些特征,對(duì)訂單分配有一定的幫助,同樣對(duì)訂單打包也有一定的幫助。
案例 2 :行程時(shí)間預(yù)估
行程時(shí)間的預(yù)估就是當(dāng)訂單完成了以后,騎手把訂單拿到手里,他會(huì)跑到辦公室或者家里也好,這個(gè)是行程時(shí)間的預(yù)估。
例如滴滴從 A 點(diǎn)到 B 點(diǎn),交通方式肯定就是車,而且有大量的地圖數(shù)據(jù),像高德或者谷歌地圖或者百度地圖,這些數(shù)據(jù)會(huì)實(shí)時(shí)上傳給服務(wù)器。
在這種交通情況預(yù)測已經(jīng)是比較準(zhǔn)確的,但是相對(duì) “餓了么” 場景遠(yuǎn)遠(yuǎn)沒有那么多的信息。
首先騎手可能步行,走電梯、走上下樓梯、騎電動(dòng)車或者換交通工具,這個(gè)直接造成了我們的數(shù)據(jù)搜集是極不準(zhǔn)確的,還有一點(diǎn)在樓宇內(nèi)的交通復(fù)雜,這個(gè)數(shù)據(jù)很難獲取。
我們上班的時(shí)候,餐廳和顧客都是在大樓里面,大樓里面沒有 GPS 信號(hào)或者信號(hào)不大好,我們收到的數(shù)據(jù)或者定位誤差高達(dá)幾百米。
所以提前時(shí)間預(yù)估,我們需要把軌跡建立起來,因?yàn)闀r(shí)間預(yù)估在高德地圖或者騰訊百度地圖是基于歷史數(shù)據(jù)的。
我們第一步做的是歷史數(shù)據(jù)清洗,室內(nèi)定位不準(zhǔn)甚至完全缺失,這個(gè)情況下我們想了各種各樣的辦法,我們用 WiFi 信號(hào),GPS 信號(hào)或者大家互相定位,最大程度減少定位缺失的問題。
其次,即使定位有了,它的位點(diǎn)也是有 GPS 軌跡的,也有很多的噪音,所以需要去噪。我們通過定位的算法把相關(guān)的時(shí)間,把 O 點(diǎn)和 D 點(diǎn)合起來,最后進(jìn)行軌跡聚類。
案例 3 :智能分單
滴滴與我們的分單難度不一樣,滴滴場景下要配一個(gè)司機(jī),最多接兩三單。
在 “餓了么” ,一個(gè)騎手一個(gè)包同時(shí)背 5 到 10 單,而且訂單之間有時(shí)間限制,涉及大量的時(shí)效要求。
我講兩個(gè)方案,第一個(gè)方案是路徑規(guī)劃的問題,很傳統(tǒng)的 VIP。
當(dāng)你給一個(gè)訂單,在騎手容量和成本固定的情況下,我們需要找到匹配的線路,每個(gè)訂單承諾時(shí)間是不一樣的,就是保證不能超時(shí)。
默認(rèn)模式下, 一個(gè)騎手可以同時(shí)送 5 到 10 單, 每單都有嚴(yán)格的時(shí)效要求, 并且訂單在午間高峰爆發(fā)式增加。
方案 1 就是車輛路徑規(guī)劃:
- 輸入:訂單,騎手,容量,成本。
- 輸出:訂單和騎手間的匹配以及行走路線。
- 優(yōu)化目標(biāo):最小化時(shí)間或者行駛距離。
- 約束條件:騎手背單數(shù)、騎手?jǐn)?shù)量、最晚到達(dá)時(shí)間等。
我們用了模擬退火算法,模擬退火算法 ( Simulated Annealing,SA ) 是基于 Monte-Carlo 迭代求解策略的一種隨機(jī)尋優(yōu)算法。
通過賦予搜索過程一種時(shí)變且最終趨于零的概率突跳性,從而可有效避免陷入局部極小并最終趨于全局最優(yōu)的串行結(jié)構(gòu)的優(yōu)化算法。
從理論上來說這個(gè)算法具有概率的全局優(yōu)化性能,目前已在工程中得到了廣泛應(yīng)用,諸如 VLSI ,生產(chǎn)調(diào)度、控制工程、機(jī)器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)、信號(hào)處理等領(lǐng)域就是用它來做訂單的分配。
但是最后結(jié)果不是特別好,因?yàn)闀r(shí)間預(yù)估存在不準(zhǔn)備性,在路徑規(guī)劃的時(shí)候,先走 A 單還是 B 單,在時(shí)間一旦出現(xiàn)誤差的情況下,這個(gè)路徑規(guī)劃會(huì)非常差。
最后用的是第二個(gè)算法,也是一種基于大量函數(shù)的組合算法。
左下角是個(gè)矩陣,每一行是一個(gè)訂單,每一列是一個(gè)騎手,我們希望通過一些規(guī)則和一些機(jī)器學(xué)習(xí)的算法算出來,右邊是一個(gè)定單匹配的結(jié)果。
最優(yōu)匹配就是 KM 算法,調(diào)度算法的演進(jìn)最早是 VRP。
后來采用的是 KM 算法,但是這個(gè)基礎(chǔ)框架界定了以后,還有很多工作需要做。
訂單實(shí)際上有相似性,因?yàn)橛唵问强梢源虬?,一個(gè)人稍微等幾分鐘,也許這個(gè)訂單出來跟那個(gè)訂單很相似的性質(zhì),就是去同一個(gè)地方,就可以把訂單給同一個(gè)人拿走。
所以訂單打包和吸水是我們做的第一件事情,但是訂單靠什么規(guī)則在高峰期和非高峰期的時(shí)候是不一樣的,這里存在兩個(gè)方向的路和兩個(gè)方向的夾角不一樣的地方,所以定單匹配模型是在 2.2 版本之上做出來的。
用機(jī)器學(xué)習(xí)通過歷史數(shù)據(jù)來訓(xùn)練,在這里我們也碰到一些挑戰(zhàn),由于在不同的站點(diǎn)配送員習(xí)慣不一樣,我們推廣的時(shí)候會(huì)遇到一個(gè)問題,在 A 站點(diǎn)大家覺得是 OK,但是在 B 站點(diǎn)不行。
我們現(xiàn)在做到千站千面的東西,根據(jù)類似的站點(diǎn)歷史過去分擔(dān)一些情況,我們把這些模型用來做訓(xùn)練,做到類似的站點(diǎn)它有類似分單的方式。
所以不會(huì)出現(xiàn)說你特別不喜歡這個(gè)分單的方式,多多少少有一點(diǎn)類似性,后來做到了 2.3 這個(gè)版本。
現(xiàn)在做的版本就是增強(qiáng)學(xué)習(xí),我們根據(jù)實(shí)時(shí)的情況來進(jìn)行動(dòng)態(tài)地調(diào)整。
餐廳選址就不詳細(xì)講了,我們也和商家開始合作開一些餐廳,我們都希望選最好的地方,餐廳覆蓋最多的用戶,菜品不一樣,用戶群不一樣,所以這個(gè)選址是很重要的。
總結(jié)
我做機(jī)器學(xué)習(xí)十幾年,個(gè)人感受,工作挑戰(zhàn)是來自于基礎(chǔ)數(shù)據(jù)的完整性和準(zhǔn)確性。
剛才講到數(shù)據(jù)不準(zhǔn)確,餐廳不規(guī)則的情況,我們無法知道一些準(zhǔn)確的情況,我們花了大量時(shí)間來做基礎(chǔ)數(shù)據(jù)的調(diào)整。
第二點(diǎn)我講到算法的提升和對(duì)人的行為的理解比較重要,因?yàn)樵谕赓u行業(yè)都需要人去執(zhí)行,以前人工分配通過打電話,有大量溝通在里面。
現(xiàn)在機(jī)器一下子分?jǐn)偭耍麄冸y以理解,而且機(jī)器考慮全局最優(yōu)而不是局部最優(yōu),人是做不到這點(diǎn)。
在算法提升和產(chǎn)品運(yùn)營綜合起來,才能把這個(gè)事情最后推下去讓大家形成習(xí)慣。
第三點(diǎn)優(yōu)化算法與機(jī)器學(xué)習(xí)在我們行業(yè)是相輔相成的,不僅是機(jī)器學(xué)習(xí),更重要的是我們在這么短時(shí)間怎么樣把人力分布最好,在最少的時(shí)間情況下把訂單完成。
張浩,餓了么技術(shù)副總裁,曾任滴滴研究院高級(jí)總監(jiān),美國 Uber 大數(shù)據(jù)部、LinkedIn 搜索與分析部資深數(shù)據(jù)科學(xué)家、Microsoft 語音識(shí)別組高級(jí)數(shù)據(jù)工程師,現(xiàn)負(fù)責(zé)餓了么人工智能與大數(shù)據(jù)建設(shè),帶領(lǐng)團(tuán)隊(duì)將機(jī)器學(xué)習(xí)應(yīng)用在物流調(diào)度、壓力平衡、推薦搜索等場景,通過數(shù)據(jù)挖掘建立完整的數(shù)據(jù)運(yùn)營體系,提高運(yùn)營效率,用數(shù)據(jù)和智能驅(qū)動(dòng)業(yè)務(wù)發(fā)展,擁有十余年機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、分布式計(jì)算的實(shí)際經(jīng)驗(yàn)。