深度強化學習在滴滴路徑規劃中的探索

當我們打開滴滴使用網約車服務時,出發前我們往往會關注要走哪條路,這條路要花多長時間,要花多少錢,有多少個紅綠燈,路況是否擁堵…這些都與路徑規劃密切相關。路徑規劃對滴滴來說十分重要,它是網約車服務的重要一環,與用戶體驗直接相關,一次糟糕的“繞路”可能會引起一次投訴進線,甚至影響用戶留存;而良好的路徑規劃不僅可以顯著提升司乘雙方的使用體驗,還能讓司機少堵在路上,進一步提升整體出行效率。

滴滴路徑規劃的背景以及業務邏輯的複雜性

類似於語言任務中的token,物理世界的道路會被建模成一段一段的link,這些link都具有唯一的id以及對應的道路屬性,比如長度,方向,道路等級等。對於路口來說,進入路口的link和出路口的link往往都有多個。拿北京舉例,北京的路網包含大約200W個link,網約車訂單可能會包含數十甚至上百個路口,在如此龐大且複雜的路網中和較爲苛刻的時間限制下,規劃出高質量的路線絕非易事。

圖中每一個帶箭頭的紅色線段表示一個link,可以看出不同link之間的長度差別是比較大的。

此外,我們知道物理世界的道路是會發生改變的,這種改變可能是永久的,比如修路,也可能是臨時的,比如交通管制。所以路網數據也是動態的,實際上目前我們地圖的路網數據是天級更新的,這也加大了路徑規劃任務的複雜度。

從實際業務來看,和自駕推薦走更快,更通暢的路線不同,由於網約車會基於里程、時長計費,我們需要同時考慮時間、距離、價格、安全因素,推薦相對快又相對便宜的路線。考慮用戶的偏好,讓用戶在安全、快速到達目的地的同時,讓行駛距離儘量短,總花費盡量少,是我們路徑規劃的核心原則。但很多時候“快”和“近”很難同時滿足。距離更短的路往往是次幹路或者支路,紅綠燈多,堵車可能性更大;而繞遠的高速路或者環路,通行能力更強,只要不極擁堵,車速通常更快,反倒用時更短。

有乘客希望更快,也有乘客希望不繞遠。爲了儘量平衡,從去年3月起,我們率先在網約車上線了“選擇路線”功能,充分考慮乘客的出行偏好,提供最多三條路線供乘客選擇(拼車、一口價訂單司機需按照平臺指定路線行駛);並聯動司機服務部鼓勵司機主動詢問乘客是否有常走路線。今年8月,我們還進一步在北京、杭州、深圳、南京、西安、廈門等28個城市試行“行前多路線選擇”功能。乘客實時呼叫網約車,發單前可以根據路線標籤、預估里程、行駛時長等信息選擇最合適的路線,系統自動同步至司機端導航。

綜上,想要做好讓司乘雙方都滿意的路徑規劃是一件極具挑戰的事情,但是這也爲我們進一步提高出行服務質量提供了機遇。

路徑規劃算法和AI技術的融合

路徑規劃是指給定起終點的情況下,規劃出一條或多條由起點到終點的路線。傳統的路徑規劃是一個圖論問題,當路網中的權值都是靜態的時候,使用dijkstra等算法就可以求出權值之和最小的路線,比如求出兩點之間距離最短的路線是容易的。然而在很多場景需要動態權值,調整權值大小也需要大量經驗,目前線上採用的方式是先使用基於圖論的算法生成一批低權值的路線,然後再經過基於機器學習算法的排序模型的篩選,這個過程涉及到粗排,精排,rerank,最後將排名靠前的路線透出給用戶選擇。這個路線規劃系統涉及的鏈路還是比較長的,不同於基於圖論算法生成高權值的路線,我們嘗試探索一種基於AI算法的路線生成方式。

得益於滴滴海量的出行數據尤其是高質量的軌跡數據,我們可以利用深度學習技術去挖掘和學習司機的駕駛行爲以及用戶對路線的偏好,藉助訓練出的深度模型在短時間內爲用戶規劃出滿意的路線,降低線上的偏航率。

我們這裏可以把尋路的過程和AlphaGo下圍棋的場景進行類比,司機在路網中行駛猶如棋手在棋盤上落子,初級棋手往往通過記憶棋譜來獲取暫時的領先,而最終贏棋往往要求棋手有“大局觀”,每一步的落子考慮到之後棋局的演變,關鍵在於最終贏棋,而不在於一時的得失。尋路過程也是需要往後多看幾步的,因爲在某個路口的選擇眼前可能看是最優的,放在全局看則不一定是最好的選擇。我們探索路線生成的過程是和AlphaGo“進化”過程是相似的,是一個從監督學習到強化學習的過程。

規劃最符合司乘習慣的路線:從監督學習到強化學習

一.“克隆”高質量的歷史軌跡

我們最先想到的是使用行爲克隆(behavior clone)的方式解決尋路問題,這裏可以將尋路看作一個連續決策的過程,把用戶的歷史真實軌跡當做專家軌跡,在每個路口(對應一個狀態)用戶作出的選擇看作是一個近似最優的動作(action),接下來我們就可以在每個決策點做分類,專家行爲作爲正樣本,非專家行爲作爲負樣本,讓分類模型去判斷某個決策是否符合用戶習慣,分類器會輸出對一個狀態和動作對輸出一個概率值,這個概率越大代表用戶越有可能在該狀態採取對應的動作。這點與AlphaGo中的走子網絡是類似的:通過專業棋手的棋譜數據來訓練模型,讓它學習專業棋手的下棋行爲。

在實際處理中,因爲路線是被建模成連續的link序列,所以我們在網絡結構中引入了在序列預測上表現強大的lstm,用lstm可以更好地建模用戶從起點到當前位置的狀態信息,在經過百萬量級條軌跡訓練後,我們的模型在每個路口的決策準確率達到了98%+,我們將這個能夠在每個路口輸出決策概率的模型稱作尋路agent,它已經基本可以模擬用戶的真實選擇。

如果在每一次決策都選擇概率最大的那一個link(即貪心搜索)往往只能找到局部最優解,比如一條路前半段看起來更優,但是後半段可能不是最佳的。爲了儘可能找到最符合用戶習慣(即整條路線的概率最大),我們使用了beam search搜索策略,其主要思想就是在尋路過程中維護若干個(即beam size)最優的候選集,這種方式相比窮舉法大大縮減了需要探索的空間,相比於貪心搜索考慮的情況更多,往往能夠找到得分更高的路線,在自然語言處理領域,比如機器翻譯任務中被大量使用。可以通過下面簡單的例子理解beam search的過程。

圖中移動的小車展示了beam search在路徑規劃中的應用,在小車前進的過程中,我們可以給不同的路線打分,維護得分最高的topK路線,直到小車抵達終點。紅色的路線表示最終得分最高的路線,也是最符合用戶習慣的路線。

二.行爲克隆的問題

行爲克隆實際上屬於監督學習的範疇,在AlphaGo中如果讓agent純粹的去學習棋譜中的走法,它很難打敗更加專業的棋手,所以AlphaGo引入了強化學習並搭配MCTS這一搜索策略,從而大大提升了對弈的勝率。同樣的,純粹的擬合專家軌跡是存在問題的:當尋路agent在某個路口判斷錯誤,那麼就會進入到沒有遇到過的狀態,在這種狀態下agent的判斷容易出錯,而錯誤的累積會容易導致尋路過程演變成“一步錯步步錯”的結果。雖然我們的模型具有一定的泛化能力,尋路agent也可以找到終點,但由於我們沒有顯示的引入偏航後的監督信號,尋路agent往往需要更多不必要的“繞路”才能回到理想的路線上來。圖中藍色軌跡是小車偏航後所致,小車既有可能回到demo軌跡(紅色路線)上來,也有可能越來越遠,偏離demo軌跡,因爲模型並沒有學習到發生偏航後該如何快速糾正。

三.強化學習的應用

強化學習是近年來解決行爲克隆帶來的問題的熱門方向。在文本生成領域,seqGAN通過判別器(簡稱D)來指導生成器(簡稱G)的訓練,在G生成下一個單詞時,使用MCTS和D來評估這個單詞的好壞,通過reward作爲反饋,使用Policy Gradient來更新G的參數,從而增加reward大的單詞的生成概率。與此方法類似的還有在遊戲系列數據集上表現優秀的GAIL,AIRL,這些方法的主要思想是另外訓練一個能夠指導生成網絡更新的評估網絡,缺點在於略顯複雜,訓練難度和計算量較大。

AlphaGoZero通過“自己與自己對弈”的過程大大增強了棋力,類似的,我們想要通過生成學習的方式來增強路線引擎的能力。這裏我們採用Q-learning的方式來學習一個尋路策略,爲了加速模型收斂的速度,我們這裏先使用前文提到的行爲克隆的方式訓練一個能夠容易走到目的地的基礎模型,然後使用該基礎模型在路網上尋路,生成大量的採樣軌跡,如果在某個狀態,模型採取的動作與用戶一致,則給該狀態-動作對以+1的reward,相反如果在該狀態模型採取的動作與用戶不一致,則給該狀態-動作對的reawrd爲0。這種人爲設定reward的方式既沒有引入對抗學習的過程,也不要額外學一個reward函數,計算量大幅度減小,同時它可以有效克服行爲克隆帶來的狀態分佈偏移的問題。

圖中大致展示了我們的訓練流程,通過老模型的self-play獲取新的軌跡數據,將採樣得到的新軌跡和真實軌跡融合訓練,更新我們的策略模型,該過程是可以不斷迭代的。經過多輪迭代後,路線生成模型的分類準確率雖然沒有明顯提升,但是生成軌跡質量更高:與真實軌軌跡的重合率明顯提高,偏航後返回到demo軌跡的速度更快。這是讓人驚喜的結果。

總結

滴滴的路線引擎每天需要處理超過400億次的路線規劃請求,我們致力於爲平臺用戶提供安全,快捷的路線服務。本文介紹的路線生成方式是深度強化學習在路徑規劃業務上落地的一次探索,主要用來降低偏航率。考慮到路徑規劃業務的複雜性,我們會從更多的方向(比如躲避擁堵)來打磨我們的路線引擎,讓它變得更加智能。

當然目前路線引擎還有它不完善的地方,還需要持續的迭代和優化,也歡迎大家給我們提供寶貴的意見。我們團隊將會持續優化路線引擎系統的性能,迭代路線規劃的算法,爲司機和乘客創造更大的用戶價值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章