駕駛行為決策中的工程落地與調(diào)優(yōu)實(shí)踐)
1. 為什么在自動(dòng)駕駛里聊蒙特卡洛搜索樹第一次在自動(dòng)駕駛規(guī)劃模塊的評審會(huì)上聽到有人提蒙特卡洛搜索樹MCTS我的反應(yīng)是這不是AlphaGo下圍棋用的東西嗎怎么跑到車道上來了。后來真正把一段城區(qū)無保護(hù)左轉(zhuǎn)的決策邏輯拆開看才發(fā)現(xiàn)這個(gè)疑問本身問得不對——MCTS從來不是某個(gè)特定領(lǐng)域的專屬算法它是一套在巨大且不確定的搜索空間里做序貫決策的通用框架。圍棋的狀態(tài)空間大到無法窮舉自動(dòng)駕駛的交互博弈同樣如此你不知道對向那臺車會(huì)不會(huì)搶行不知道旁邊車道那臺車下一秒會(huì)不會(huì)并線也不知道路口那個(gè)行人會(huì)不會(huì)突然邁步。這種別人也在做決策、而且我看不透他的場景恰恰是MCTS最擅長處理的地帶。這篇東西不是教科書式的算法推導(dǎo)而是把我自己在做行為決策模塊時(shí)圍繞MCTS踩過的坑、做過的取舍、以及最后落地的工程方案完整講一遍。核心關(guān)鍵詞就幾個(gè)蒙特卡洛搜索樹、UCT、rollout、行為決策、博弈交互、置信上界、剪枝。如果你正在做自動(dòng)駕駛的決策規(guī)劃或者對序貫決策算法怎么從論文落到車上感興趣這篇應(yīng)該能給你省不少試錯(cuò)時(shí)間。我會(huì)從整體設(shè)計(jì)思路講到具體實(shí)現(xiàn)再到實(shí)際調(diào)試中那些文檔里不會(huì)寫的坑盡量做到你看完能直接對著改自己的代碼。先說清楚MCTS在自動(dòng)駕駛里到底解決什么問題。傳統(tǒng)的規(guī)則式?jīng)Q策比如有限狀態(tài)機(jī)本質(zhì)上是把什么情況做什么動(dòng)作提前寫死。直行、跟車、換道、左轉(zhuǎn)每個(gè)狀態(tài)配一套觸發(fā)條件。這套東西在結(jié)構(gòu)化高速場景里夠用因?yàn)榻换ズ唵?、參與者行為規(guī)范。但一到城區(qū)復(fù)雜路口狀態(tài)機(jī)的組合爆炸就壓不住了對向車、行人、非機(jī)動(dòng)車、相鄰車道每個(gè)參與者都有多種可能行為狀態(tài)數(shù)呈指數(shù)增長你根本寫不完規(guī)則。MCTS的價(jià)值在于它不需要你窮舉所有情況而是通過采樣的方式把計(jì)算資源集中投到看起來有希望的分支上用有限的算力逼近一個(gè)足夠好的決策。這就是它和窮舉搜索、和純規(guī)則方法的根本區(qū)別。2. 蒙特卡洛搜索樹的核心機(jī)制拆解2.1 四個(gè)階段到底在干什么MCTS的經(jīng)典流程分四步選擇、擴(kuò)展、模擬、回溯。很多人背得滾瓜爛熟但真到用的時(shí)候說不清每一步為什么這么設(shè)計(jì)。我用自動(dòng)駕駛左轉(zhuǎn)博弈的場景把它串一遍。選擇階段從根節(jié)點(diǎn)出發(fā)每次挑一個(gè)子節(jié)點(diǎn)往下走挑的依據(jù)是UCT公式。這個(gè)公式是MCTS的靈魂它把利用和探索兩件事捏在一起。利用就是選當(dāng)前看起來勝率高的分支探索就是給訪問次數(shù)少的分支一點(diǎn)機(jī)會(huì)。公式長這樣UCT Q/N c * sqrt(ln(N_parent) / N)Q是累計(jì)收益N是訪問次數(shù)c是探索常數(shù)。第一項(xiàng)Q/N是平均收益代表利用第二項(xiàng)是探索項(xiàng)訪問次數(shù)越少這項(xiàng)越大。c控制兩者的平衡c大偏探索c小偏利用。在自動(dòng)駕駛里這個(gè)c的取值非常講究后面我會(huì)專門講。擴(kuò)展階段走到一個(gè)還有未展開子節(jié)點(diǎn)的節(jié)點(diǎn)時(shí)生成一個(gè)新節(jié)點(diǎn)。在圍棋里就是落一子在自動(dòng)駕駛里就是執(zhí)行一個(gè)動(dòng)作——加速、減速、保持、左轉(zhuǎn)一點(diǎn)、右轉(zhuǎn)一點(diǎn)。這里的關(guān)鍵是動(dòng)作空間怎么定義定義粗了決策不精細(xì)定義細(xì)了樹爆炸。模擬階段也叫rollout從新節(jié)點(diǎn)開始用一套快速策略一路走到終局得到一個(gè)收益值。圍棋里是隨機(jī)落子到終局自動(dòng)駕駛里則是用簡化模型快速推演未來幾秒的演化。這一步是MCTS算力消耗的大頭也是工程上最需要優(yōu)化的地方?;厮蓦A段把模擬得到的收益沿著路徑往回傳更新每個(gè)節(jié)點(diǎn)的Q和N。這樣下一次選擇時(shí)好分支的Q/N會(huì)更高自然被優(yōu)先選到。注意四步里最容易出問題的是模擬階段。很多人直接照搬圍棋的隨機(jī)rollout結(jié)果在自動(dòng)駕駛里完全不可用因?yàn)檐囕v運(yùn)動(dòng)有動(dòng)力學(xué)約束隨機(jī)動(dòng)作根本走不出合理軌跡。這個(gè)坑我在第三節(jié)會(huì)詳細(xì)講怎么填。2.2 UCT公式里那個(gè)c到底怎么調(diào)c這個(gè)探索常數(shù)理論上有個(gè)推薦值sqrt(2)但那是針對收益歸一化到[0,1]且獎(jiǎng)勵(lì)分布比較規(guī)整的場景。自動(dòng)駕駛的收益函數(shù)往往不是這個(gè)量級而且不同場景下收益的方差差別很大。我實(shí)測下來的經(jīng)驗(yàn)是c不能設(shè)成固定值要跟收益的量綱掛鉤。具體做法是先把收益歸一化。比如把安全、效率、舒適三個(gè)維度的加權(quán)得分映射到[0,1]區(qū)間然后c取0.5到1.5之間。城區(qū)復(fù)雜交互場景c取大一點(diǎn)鼓勵(lì)探索因?yàn)閷κ中袨椴淮_定性高多試幾個(gè)分支更穩(wěn)妥高速巡航場景c取小一點(diǎn)因?yàn)榻换ズ唵慰焖偈諗康阶顑?yōu)跟車策略更重要。還有一個(gè)更細(xì)的點(diǎn)c可以隨搜索深度衰減。淺層節(jié)點(diǎn)多探索深層節(jié)點(diǎn)多利用。因?yàn)樵酵钐幠M的誤差越大過度探索深層分支意義不大。我一般讓c從根節(jié)點(diǎn)的1.2線性衰減到葉節(jié)點(diǎn)的0.6左右實(shí)測決策穩(wěn)定性有明顯提升。2.3 收益函數(shù)怎么設(shè)計(jì)才不翻車MCTS最終選哪個(gè)動(dòng)作取決于收益函數(shù)怎么定義。這是整個(gè)算法里最玄學(xué)也最考驗(yàn)工程經(jīng)驗(yàn)的部分。自動(dòng)駕駛的收益至少要覆蓋三個(gè)維度安全、效率、舒適。安全維度核心指標(biāo)是碰撞風(fēng)險(xiǎn)和最小安全距離。我一般用負(fù)的碰撞概率加上一個(gè)距離懲罰項(xiàng)距離越近懲罰越大而且是非線性增長接近碰撞時(shí)懲罰急劇上升。效率維度用通行時(shí)間或者速度保持度衡量鼓勵(lì)盡快通過路口。舒適維度用加速度變化率、 jerk、方向盤轉(zhuǎn)角變化率來懲罰避免決策出來的軌跡讓乘客難受。難點(diǎn)在于三個(gè)維度的權(quán)重怎么定。我的做法是分層加權(quán)安全是硬約束權(quán)重給到壓倒性的大一旦有碰撞風(fēng)險(xiǎn)其他維度得分再高也直接判負(fù)效率和舒適在安全滿足的前提下做權(quán)衡城區(qū)擁堵場景效率權(quán)重高一點(diǎn)高速巡航舒適權(quán)重高一點(diǎn)。這個(gè)權(quán)重不是拍腦袋定的是拿大量仿真場景跑回歸調(diào)出來的后面實(shí)操部分我會(huì)講怎么調(diào)。3. 把MCTS落到自動(dòng)駕駛決策模塊的完整方案3.1 動(dòng)作空間設(shè)計(jì)離散還是連續(xù)這是落地第一個(gè)要拍板的事。圍棋是離散的361個(gè)點(diǎn)選一個(gè)。自動(dòng)駕駛的動(dòng)作空間本質(zhì)是連續(xù)的——加速度連續(xù)、曲率連續(xù)。直接上連續(xù)空間MCTS的擴(kuò)展和模擬都會(huì)變得極其復(fù)雜。我的選擇是離散化加動(dòng)作原語。具體做法把動(dòng)作拆成橫向和縱向兩組原語??v向原語包括急減速、緩減速、保持、緩加速、急加速五檔對應(yīng)加速度大概-3、-1.5、0、1.5、3 m/s2。橫向原語包括左轉(zhuǎn)大、左轉(zhuǎn)小、保持、右轉(zhuǎn)小、右轉(zhuǎn)大五檔對應(yīng)曲率變化。兩組組合起來是25個(gè)動(dòng)作但實(shí)際不會(huì)全用根據(jù)當(dāng)前場景裁剪掉明顯不合理的比如已經(jīng)在最左車道就不會(huì)有左轉(zhuǎn)動(dòng)作。為什么用五檔而不是更細(xì)因?yàn)樵偌?xì)下去相鄰檔位的收益差異會(huì)被模擬噪聲淹沒MCTS根本區(qū)分不出來反而浪費(fèi)算力。五檔是實(shí)測下來既能保證決策精度、又不至于讓樹爆炸的平衡點(diǎn)。當(dāng)然如果你的算力充裕可以做到七檔但收益提升很有限。3.2 模擬策略從隨機(jī)到啟發(fā)式前面說了直接隨機(jī)rollout在自動(dòng)駕駛里不可用。我的方案是啟發(fā)式快速模擬。具體講從擴(kuò)展節(jié)點(diǎn)開始不再隨機(jī)選動(dòng)作而是用一套簡化的規(guī)則策略推演默認(rèn)保持當(dāng)前動(dòng)作如果預(yù)測到碰撞風(fēng)險(xiǎn)就減速如果前方空曠就加速。這套規(guī)則比完整決策模塊簡單得多但比隨機(jī)強(qiáng)太多能在毫秒級推演出未來3到5秒的演化。模擬的步長也有講究。太細(xì)比如0.1秒一步5秒要模擬50步算力吃不消太粗比如1秒一步又會(huì)漏掉關(guān)鍵的動(dòng)態(tài)變化。我一般用0.2到0.5秒的變步長交互激烈時(shí)用0.2秒平穩(wěn)時(shí)用0.5秒。模擬的終止條件也要設(shè)計(jì)好要么到達(dá)預(yù)測時(shí)域終點(diǎn)要么發(fā)生碰撞要么進(jìn)入一個(gè)明確的終局狀態(tài)比如完成左轉(zhuǎn)。提示模擬策略的質(zhì)量直接決定MCTS的上限。我見過有人為了省算力用純隨機(jī)模擬結(jié)果搜索出來的決策還不如規(guī)則方法。啟發(fā)式模擬雖然寫起來麻煩但這是繞不過去的投入。3.3 樹的規(guī)??刂婆c實(shí)時(shí)性保障自動(dòng)駕駛是硬實(shí)時(shí)系統(tǒng)決策周期通常要求100毫秒以內(nèi)留給MCTS的時(shí)間可能只有幾十毫秒。這個(gè)時(shí)間預(yù)算下樹不可能長得很大。我的經(jīng)驗(yàn)是單次決策的模擬次數(shù)控制在500到2000次之間具體看算力平臺。超過這個(gè)量級實(shí)時(shí)性就保不住了??刂茦湟?guī)模有幾個(gè)手段。一是深度限制搜索深度一般不超過5到6層對應(yīng)未來2到3秒的決策。再深下去預(yù)測誤差太大搜了也沒意義。二是寬度限制每個(gè)節(jié)點(diǎn)最多保留5到8個(gè)子節(jié)點(diǎn)用先驗(yàn)知識或者快速評估篩掉明顯差的。三是時(shí)間預(yù)算硬截?cái)嗖还芩训侥囊徊綍r(shí)間到了立刻返回當(dāng)前最優(yōu)這是實(shí)時(shí)系統(tǒng)的鐵律。還有一個(gè)工程技巧復(fù)用上一周期的搜索結(jié)果。決策是周期性執(zhí)行的上一周期搜過的子樹這一周期可以直接拿來當(dāng)先驗(yàn)省掉大量重復(fù)搜索。這個(gè)優(yōu)化在實(shí)測中能把有效模擬次數(shù)提升30%以上。4. 實(shí)操過程與關(guān)鍵環(huán)節(jié)實(shí)現(xiàn)4.1 節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)與內(nèi)存管理先看節(jié)點(diǎn)怎么定義。每個(gè)節(jié)點(diǎn)至少要存這些信息狀態(tài)自車位置、速度、周圍參與者狀態(tài)、動(dòng)作從父節(jié)點(diǎn)到本節(jié)點(diǎn)的動(dòng)作、訪問次數(shù)N、累計(jì)收益Q、子節(jié)點(diǎn)列表、父節(jié)點(diǎn)指針。用C寫大概長這樣struct MCTSNode { State state; // 該節(jié)點(diǎn)對應(yīng)的場景狀態(tài) Action action; // 從父節(jié)點(diǎn)到本節(jié)點(diǎn)的動(dòng)作 double Q; // 累計(jì)收益 int N; // 訪問次數(shù) MCTSNode* parent; // 父節(jié)點(diǎn)指針 std::vectorMCTSNode* children; // 子節(jié)點(diǎn) std::vectorAction untried; // 未擴(kuò)展的動(dòng)作 };內(nèi)存管理是個(gè)容易被忽視的坑。MCTS每周期要?jiǎng)?chuàng)建和銷毀大量節(jié)點(diǎn)如果直接用new/delete內(nèi)存碎片和分配開銷會(huì)拖垮實(shí)時(shí)性。我的做法是預(yù)分配對象池啟動(dòng)時(shí)一次性申請一大塊內(nèi)存節(jié)點(diǎn)從池里取用完還回去避免頻繁的系統(tǒng)調(diào)用。對象池大小根據(jù)最大模擬次數(shù)和平均樹規(guī)模估算一般留2到3倍余量。4.2 選擇階段的實(shí)現(xiàn)細(xì)節(jié)選擇階段從根節(jié)點(diǎn)往下走每步用UCT選子節(jié)點(diǎn)。實(shí)現(xiàn)時(shí)有個(gè)細(xì)節(jié)未完全擴(kuò)展的節(jié)點(diǎn)要優(yōu)先擴(kuò)展而不是直接進(jìn)選擇。也就是說如果當(dāng)前節(jié)點(diǎn)還有untried動(dòng)作先擴(kuò)展一個(gè)而不是繼續(xù)往下選。這是標(biāo)準(zhǔn)MCTS的做法保證樹是逐步長全的。UCT計(jì)算要注意數(shù)值穩(wěn)定性。當(dāng)N為0時(shí)探索項(xiàng)會(huì)除零所以要特判N為0的節(jié)點(diǎn)直接給無窮大收益優(yōu)先訪問。另外ln(N_parent)當(dāng)N_parent為1時(shí)是0探索項(xiàng)為0這時(shí)候只能靠利用項(xiàng)區(qū)分所以根節(jié)點(diǎn)第一次擴(kuò)展后要盡快讓各子節(jié)點(diǎn)都至少訪問一次。4.3 模擬階段的加速技巧模擬是算力大頭加速手段主要有三個(gè)。第一用簡化動(dòng)力學(xué)模型完整模型要考慮輪胎側(cè)偏、懸架等模擬時(shí)用自行車模型甚至更簡單的點(diǎn)質(zhì)量模型就夠了精度損失在可接受范圍。第二并行模擬如果平臺支持多線程把不同rollout分到不同線程實(shí)測能接近線性加速。第三提前終止模擬過程中一旦檢測到碰撞或者明顯劣勢立刻終止并返回低收益不用跑完全程。我實(shí)測過一組數(shù)據(jù)單線程純串行模擬1000次rollout大概要80毫秒改成四線程并行降到25毫秒左右再加上提前終止能壓到15毫秒以內(nèi)。這個(gè)提升對實(shí)時(shí)性來說是決定性的。4.4 收益計(jì)算與回溯回溯就是把模擬得到的收益沿著路徑往回傳更新每個(gè)節(jié)點(diǎn)的Q和N。這里有個(gè)細(xì)節(jié)收益要不要打折。也就是說深層節(jié)點(diǎn)的收益?zhèn)鞯礁?jié)點(diǎn)時(shí)要不要乘一個(gè)折扣因子。我的做法是要打折折扣因子取0.9到0.95。因?yàn)樵缴畹哪M誤差越大對當(dāng)前決策的參考價(jià)值越低打個(gè)折更合理。收益計(jì)算本身要封裝成一個(gè)獨(dú)立函數(shù)輸入是模擬終局的狀態(tài)輸出是一個(gè)標(biāo)量收益。這個(gè)函數(shù)要處理各種邊界情況碰撞了返回負(fù)無窮到達(dá)目標(biāo)返回正收益超時(shí)返回中性收益。寫的時(shí)候要特別注意數(shù)值范圍避免出現(xiàn)inf或者nan污染整棵樹。5. 常見問題與排查技巧實(shí)錄5.1 決策抖動(dòng)怎么破這是MCTS落地最常見的問題相鄰兩個(gè)決策周期選出來的動(dòng)作來回跳一會(huì)兒加速一會(huì)兒減速乘客體驗(yàn)極差。根因通常是搜索的隨機(jī)性加上收益接近時(shí)的平局。解決辦法有幾個(gè)。一是增加模擬次數(shù)讓收益估計(jì)更穩(wěn)定但受實(shí)時(shí)性限制。二是動(dòng)作平滑對連續(xù)幾個(gè)周期的決策結(jié)果做低通濾波但這會(huì)引入延遲。三是在收益函數(shù)里加動(dòng)作一致性懲罰如果本周期動(dòng)作和上周期差異大扣分。我用的是組合方案適度增加模擬次數(shù)加動(dòng)作一致性懲罰實(shí)測抖動(dòng)明顯減少同時(shí)延遲可控。5.2 搜索陷入局部最優(yōu)MCTS理論上會(huì)收斂到全局最優(yōu)但前提是模擬次數(shù)足夠多。實(shí)際算力受限時(shí)容易陷在某個(gè)局部最優(yōu)分支里出不來。表現(xiàn)就是決策一直很保守比如明明可以走的空檔它非要等。排查思路先看探索常數(shù)c是不是太小太小會(huì)導(dǎo)致探索不足。再看先驗(yàn)知識是不是把某些分支過早剪掉了剪枝太激進(jìn)會(huì)誤殺好分支。我的經(jīng)驗(yàn)是保留一定的探索比例即使某個(gè)分支當(dāng)前看起來差也給它少量訪問機(jī)會(huì)避免過早下定論。5.3 實(shí)時(shí)性不達(dá)標(biāo)實(shí)時(shí)性問題是工程落地的大敵。排查順序先看單次模擬耗時(shí)如果單次就超預(yù)算說明模擬策略太重要簡化。再看模擬次數(shù)是不是設(shè)太多適當(dāng)降低。然后看內(nèi)存分配有沒有瓶頸對象池是不是夠大。最后看有沒有不必要的拷貝狀態(tài)傳遞盡量用引用或者移動(dòng)語義。我整理了一個(gè)排查速查表現(xiàn)象可能原因排查方向單次決策超時(shí)模擬次數(shù)過多降低rollout上限單次模擬過慢動(dòng)力學(xué)模型太重?fù)Q簡化模型內(nèi)存增長異常節(jié)點(diǎn)未回收檢查對象池歸還邏輯決策抖動(dòng)收益接近隨機(jī)性加一致性懲罰決策保守探索不足調(diào)大c或增加探索樹規(guī)模失控寬度未限制加子節(jié)點(diǎn)數(shù)上限5.4 與下游規(guī)劃模塊的接口MCTS輸出的是一個(gè)決策動(dòng)作或者一條粗略軌跡下游規(guī)劃模塊要把它細(xì)化成可執(zhí)行的平滑軌跡。接口設(shè)計(jì)要注意MCTS輸出的動(dòng)作要帶置信度規(guī)劃模塊根據(jù)置信度決定是直接執(zhí)行還是再優(yōu)化。如果MCTS自己都不確定比如兩個(gè)分支收益接近規(guī)劃模塊應(yīng)該更保守。還有一個(gè)坑MCTS的決策周期和規(guī)劃模塊的周期可能不一致。MCTS可能100毫秒一次規(guī)劃可能50毫秒一次。這時(shí)候要做決策保持規(guī)劃模塊在兩次MCTS決策之間沿用上一次的決策避免頻繁切換。6. 參數(shù)調(diào)優(yōu)與場景適配經(jīng)驗(yàn)6.1 不同場景的參數(shù)配置MCTS的參數(shù)不是一套走天下要按場景配。我一般分三檔高速巡航、城區(qū)跟車、復(fù)雜路口交互。高速巡航場景交互簡單c取0.6模擬次數(shù)800深度4層收益里效率權(quán)重高。城區(qū)跟車c取0.9模擬次數(shù)1200深度5層舒適權(quán)重提上來。復(fù)雜路口c取1.3模擬次數(shù)2000深度6層安全權(quán)重壓倒一切同時(shí)開啟更激進(jìn)的剪枝控制樹規(guī)模。這套配置是拿仿真回歸跑出來的每個(gè)場景跑幾千個(gè)case看決策成功率、碰撞率、通行效率幾個(gè)指標(biāo)逐步調(diào)出來的。沒有捷徑就是堆場景堆時(shí)間。6.2 先驗(yàn)知識怎么注入純MCTS從零開始搜效率低。注入先驗(yàn)知識能大幅加速收斂。注入方式有兩種一是初始化時(shí)給子節(jié)點(diǎn)賦先驗(yàn)收益讓搜索一開始就偏向合理分支二是剪枝時(shí)用先驗(yàn)篩掉明顯不合理的動(dòng)作。先驗(yàn)知識從哪來可以從規(guī)則策略來比如規(guī)則說該減速了那減速分支給高先驗(yàn)。也可以從學(xué)習(xí)模型來用一個(gè)輕量網(wǎng)絡(luò)預(yù)測各動(dòng)作的勝率。我用的是規(guī)則先驗(yàn)為主簡單可靠不依賴訓(xùn)練數(shù)據(jù)。注意先驗(yàn)不能太強(qiáng)否則會(huì)壓制探索退化成規(guī)則方法。先驗(yàn)收益的權(quán)重要控制好一般不超過總收益的30%。6.3 和其他決策方法的對比MCTS不是唯一選擇也不是所有場景都最優(yōu)。我做個(gè)橫向?qū)Ρ确椒▋?yōu)勢劣勢適用場景有限狀態(tài)機(jī)簡單、可解釋、實(shí)時(shí)性好組合爆炸、難覆蓋復(fù)雜交互高速結(jié)構(gòu)化場景博弈論方法理論完備、交互建模清晰計(jì)算復(fù)雜、假設(shè)強(qiáng)兩車博弈學(xué)習(xí)方法端到端、泛化潛力大數(shù)據(jù)依賴、可解釋差數(shù)據(jù)充足場景MCTS處理不確定性強(qiáng)、無需大量數(shù)據(jù)算力消耗大、調(diào)參復(fù)雜復(fù)雜交互決策實(shí)際項(xiàng)目中我很少單用某一種而是混合架構(gòu)規(guī)則做兜底和安全校驗(yàn)MCTS做復(fù)雜場景的決策學(xué)習(xí)模型做先驗(yàn)加速。各取所長。7. 一些踩坑之后的個(gè)人體會(huì)MCTS在自動(dòng)駕駛里能不能用好算法本身只占三成剩下七成是工程。我見過太多人把論文里的MCTS直接搬過來結(jié)果實(shí)時(shí)性崩了、決策抖了、場景覆蓋不了最后歸咎于算法不行。其實(shí)問題往往出在模擬策略太粗糙、收益函數(shù)沒調(diào)好、樹規(guī)模沒控制住這些工程細(xì)節(jié)上。我個(gè)人最大的體會(huì)是先把模擬策略和收益函數(shù)做扎實(shí)再談搜索優(yōu)化。模擬策略決定了搜索的上限收益函數(shù)決定了搜索的方向這兩個(gè)不對搜索再快也是白搭。我早期為了追求搜索速度用了很粗糙的模擬結(jié)果決策質(zhì)量還不如規(guī)則方法后來老老實(shí)實(shí)把模擬策略重寫了一遍效果立竿見影。另一個(gè)體會(huì)是不要迷信單次決策的最優(yōu)性。自動(dòng)駕駛是連續(xù)決策單次最優(yōu)不等于全局最優(yōu)。有時(shí)候當(dāng)前看起來次優(yōu)的決策反而給后續(xù)留了更大空間。所以我在收益函數(shù)里會(huì)加一個(gè)未來可選性的考量鼓勵(lì)決策保留更多后續(xù)選擇而不是把路走死。最后分享一個(gè)小技巧用日志回放做離線調(diào)參。把實(shí)車或者仿真的場景數(shù)據(jù)錄下來離線反復(fù)跑MCTS調(diào)參數(shù)、改收益函數(shù)比在線調(diào)效率高得多。我一般會(huì)攢幾百個(gè)典型場景做回歸集每次改完參數(shù)跑一遍看各項(xiàng)指標(biāo)有沒有退化避免改一個(gè)場景好了、另一個(gè)場景崩了。這套流程雖然土但真的管用。