與工程落地)
JMLR 2023那篇關于通用異構多智能體合作場景的強化學習算法我翻來覆去讀了好幾遍。最初是沖著“通用”和“異構”這兩個關鍵詞去的因為這兩個特性一旦放到一起基本上把常見的多智能體強化學習套路全都推翻了。這篇內容不打算復述論文的證明和公式我更想以復現(xiàn)和工程落地的視角聊聊這套算法到底解決了什么問題、設計上有哪些值得借鑒的思路以及我在自己的仿真場景里跑通它時踩到的一堆坑。適合看這篇的人有三類一類是正在做多機器人協(xié)同控制的研究生一類是工作中需要處理異構智能體調度問題的工程師還有一類是對強化學習有一定基礎、想拓寬視野的算法愛好者。如果你是零基礎也能看懂整體思路因為這里的核心概念我都會用大白話拆開講。1. 為什么“通用異構合作”這三個詞湊在一起就讓主流方法失效1.1 主流多智能體算法默認的同構假設先說一下大多數(shù)多智能體強化學習方法的隱含前提。很多經(jīng)典方法在設計時就默認了所有智能體長得一樣觀測空間維度相同動作空間相同策略網(wǎng)絡可以完全共享一份權重。這就導致它們天然假設所有智能體可以互換位置而不影響功能。但現(xiàn)實場景根本不是這樣。舉個例子我在一次模擬的倉儲協(xié)作任務里同時用過三種機器人一臺四輪差速底盤負責搬運一臺帶機械臂的移動操作平臺負責抓取還有一臺只負責感知的巡檢設備。這三者觀測數(shù)據(jù)完全不一樣一個輸入的是激光雷達點云一個輸入的是相機圖像和關節(jié)角度還有一個輸入的是二維地圖坐標。動作空間更是天差地別底盤輸出左右輪速機械臂輸出關節(jié)目標角度巡檢設備干脆只需要導航指令。同構假設在這里直接崩掉。如果強行把所有觀測拼成同一個長度讓三個智能體共享策略網(wǎng)絡網(wǎng)絡內部的第一個全連接層就會因為輸入維度不匹配而出錯即使你用補零法把所有觀測強行拉到同一維度網(wǎng)絡也學不明白因為某個位置上的數(shù)值對不同智能體根本沒有可比性。1.2 合作不等于無私信用分配問題被異構放大了合作場景的經(jīng)典難點是全局獎勵下如何判斷“誰貢獻了什么”。假設一個團隊任務整體成功了給一個很大的共同獎勵但隊伍里有甲乙兩員大將甲的貢獻占八成乙一直在劃水它們拿到的卻是一樣的獎勵。這會導致劃水的乙永遠沒有改進動力而甲的積極性也會被慢慢磨掉。在異構場景里這個問題會更棘手。異構意味著不同智能體對全局目標的貢獻尺度本身就不同。一個機械臂可以把抓取成功率從三成提到九成對全局的邊際貢獻是顯著且直接的一臺巡檢設備只是多提供了一條局部信息貢獻是間接的、微弱的。如果信用分配機制不考慮這種異質性機械臂很快就會“擺爛”因為它發(fā)現(xiàn)自己無論怎么努力分到的獎勵和那臺默默無聞的巡檢設備差不多。1.3 通用性要求的不只是換個網(wǎng)絡結構這個標題里最扎眼的其實是“通用”兩個字。有些人覺得通用就是讓網(wǎng)絡參數(shù)多一點、結構復雜一點就能兼容異構輸入。這是誤解。通用性意味著三個層面的能力第一面對任意種類的異構觀測和動作空間不需要人為設計專門的適配層第二智能體數(shù)量可以變化新增一個智能體或臨時少一個智能體算法不需要重新訓練第三任務目標可以在一定范圍內遷移而不只是過度擬合某一個場景。我在復現(xiàn)初期犯過一個典型的錯誤給每個智能體手工設計了一個編碼器用if-else分支去處理三種不同類型的觀測。結果換一個場景或加一個新的智能體類型就得回去改代碼重新訓練。這和“通用”兩個字完全不沾邊。所以真正需要的是一個機制層面的方案而不是網(wǎng)絡結構層面的補丁。2. 整體設計思路把異構智能體“翻譯”到統(tǒng)一空間再協(xié)作2.1 集中訓練、分布執(zhí)行異構場景下的務實底座這套算法采用了我個人非常推崇的框架集中訓練、分布執(zhí)行。訓練的時候所有智能體的信息都可以被中心調用相當于大家坐在一張桌子上開會部署上線之后每個智能體只靠自己觀測到的局部信息做決策相當于散會后各回各家靠開會時學會的默契干活。這個框架的好處在于訓練階段可以利用全局信息來解決信用分配問題同時部署階段不需要強實時通信。異構場景里通信往往是奢侈的有的智能體帶寬高有的智能體連持續(xù)通信都做不到但集中訓練階段沒有這個限制因為數(shù)據(jù)都是離線收集的。所以這個底座選擇不是偶然而是被場景倒逼出來的。2.2 異構編碼器 共享決策層結構怎么搭這套方法在結構上給了我一個很重要的啟發(fā)把智能體分成“感知層”和“決策層”來解耦。感知層是異構的每個智能體用自己的編碼器把原始觀測轉化成統(tǒng)一長度的語義向量決策層是同構的所有智能體共享后續(xù)的策略網(wǎng)絡在語義向量空間里做決策。你可以把編碼器想象成翻譯器把德語、日語、中文先都翻譯成英語大家再用英語交流。關鍵是這里所說的“英語”不是某個自然語言而是一個語義特征空間。論文里的辦法是用一個映射函數(shù)把不同維度的觀測統(tǒng)一編碼到同一個維度之后所有下游網(wǎng)絡就有了統(tǒng)一的輸入接口。我當時在倉儲場景里按這個思路復現(xiàn)最直觀的收益是新增一種智能體類型只需要額外寫一個幾十行的觀測編碼器不需要改動任何決策網(wǎng)絡結構。這跟我之前的if-else方案完全不在一個復雜度級別。而且這還帶來一個額外好處決策層的參數(shù)可以在不同智能體之間共享參數(shù)規(guī)模大幅下降訓練數(shù)據(jù)利用率也更高。2.3 可變智能體數(shù)量的處理注意力機制的價值數(shù)量可變是通用性里最難啃的一塊。很多算法在模型輸入層面就寫死了最大智能體數(shù)量比如固定為5個或10個然后通過掩碼處理缺位。但真要部署到實際場景團隊規(guī)模浮動是非常正常的某個智能體突然掉線、臨時加入一個新成員都需要算法能在線適應。這套算法把數(shù)量可變問題交給了注意力機制。注意力機制天然支持任意數(shù)量的輸入每個智能體先計算出自己的查詢向量再和其他所有智能體的鍵向量做匹配最終得到加權聚合的信息。輸入多一個智能體或者少一個智能體只是注意力權重矩陣的尺寸變化網(wǎng)絡本身不需要改動。讓我用一個特別生活化的例子解釋注意力為什么有效你在一個嘈雜的會議里要聽清對面同事說話你不會把耳朵堵住讓音量平均而是會自動放大對面那個方向的聲音壓低其他聲音。注意力機制干的正是這件事每個智能體根據(jù)當前任務需要動態(tài)決定要重點關注哪個同伴的信息。相比把所有向量拼接在一起喂給固定維度的MLP這種動態(tài)加權的方式在數(shù)量變化和異構差異面前要魯棒得多。3. 策略學習里的三個關鍵機制表征、交互、信用分配3.1 觀測空間異構時策略網(wǎng)絡怎么輸出可比較的動作價值異構編碼器把觀測統(tǒng)一到同一個語義空間后下一步的難點是如何對異構動作空間做決策。機械臂的動作是個連續(xù)的關節(jié)角度向量底盤的動作是左右輪速它們根本不在同一個數(shù)學空間里沒法直接讓一個輸出層同時生成兩類動作。這套算法的做法是公共策略網(wǎng)絡只負責產(chǎn)生一個中間層特征最后一層根據(jù)每個智能體的實際動作空間掛一個獨立的小型輸出頭。這就好比公共大腦負責想“下一步該朝哪個方向努力”而每個智能體各自的“四肢”負責把這個意圖翻譯成自己身體能執(zhí)行的指令。我在復現(xiàn)時對這一點印象很深因為之前很多方法要么強行把異構動作向量拼接起來用一個超大輸出空間統(tǒng)一輸出導致訓練極其稀疏要么干脆給每個智能體單獨維護一套策略參數(shù)爆炸。這種“共享特征獨立頭”的折中方案在復雜度和性能之間取得了很好的平衡。3.2 智能體之間到底交互什么從向量拼接走向注意力融合在多智能體協(xié)作里每個智能體不能只盯著自己的觀測否則很容易做出局部最優(yōu)的決策。傳統(tǒng)做法是把所有智能體的觀測拼接成一個超長向量再送進網(wǎng)絡。這個方案在智能體數(shù)量少且固定的情況下還能用但在異構、數(shù)量可變的場景里就很別扭。這套算法里的交互單元選擇了注意力機制。具體流程大致是每個智能體把經(jīng)過編碼的語義向量通過三個線性映射分別生成查詢、鍵和值然后用查詢和所有鍵做點積歸一化得到權重最后對所有的值做加權求和。這個聚合結果會再次拼回自己的決策向量作為一個“協(xié)作上下文”。有一個細節(jié)值得單獨說注意力機制的掩碼設計。在訓練早期如果讓所有智能體互相看得太清每個智能體的輸入中來自他人的信息占比會相當高導致決策嚴重依賴隊友而忽略了自己的局部感知能力。這種過度耦合在分布式執(zhí)行時會帶來災難一旦部署時某個隊友暫時不可見策略立刻失靈。所以建議在訓練時對注意力層加入一個可調的隨機掩碼讓智能體學會不依賴某個特定隊友也能做出合理決策。這也是通用性的一個隱式保障。3.3 全局獎勵下的信用分配不能簡單算差值信用分配問題在這一類算法里通常是靠集中訓練的Critic來解決的。Critic可以獲取全局狀態(tài)和所有智能體的信息理論上可以對全局Q值進行精準評估。但真正的難點在于怎么把全局價值合理地歸因到每一個異構智能體上。早期的做法是計算一個智能體動作改變前后全局Q值的差值近似作為該智能體的貢獻。這在同構場景下勉強夠用但異構場景下因為不同智能體的價值尺度差距巨大這種差值往往方差很高無法穩(wěn)定指導策略更新。這套算法采用的是一種分布式價值分解的思路全局Q值不再是一個簡單數(shù)值而是通過一個聚合函數(shù)把每個智能體的個體Q值組合起來。組合函數(shù)的參數(shù)由全局狀態(tài)來調節(jié)從而可以自適應地體現(xiàn)異質性。比如當機械臂在關鍵抓取階段時全局狀態(tài)會讓組合函數(shù)給機械臂的個體Q值更高的權重而不是機械地求和求平均。我當時復現(xiàn)時對這一點特別留意因為很多實現(xiàn)偷懶直接用Q_tot sum(Q_i)這在同構任務里沒問題但在異構任務里會嚴重低估低動作維度智能體的貢獻導致只有動作空間大的智能體在持續(xù)學習。使用帶全局狀態(tài)調制權重的方式每個智能體都能獲得相對合理的梯度信號。4. 復現(xiàn)一個異構協(xié)作場景環(huán)境、配置、指標4.1 自建場景異構程度拉滿的搬運任務為了驗證這套算法我沒有直接使用現(xiàn)成的多智能體基準環(huán)境而是自建了一個模擬項目X專門用來逼出異構問題的各個層面。場景設定很簡單一個倉庫里有一臺四輪差速底盤、一臺帶四自由度機械臂的平臺、一架懸停的視覺偵查設備。任務是從兩個貨架分別取一件貨物放到指定出口區(qū)域。三個智能體的異構體現(xiàn)在四個維度觀測空間維度不同底盤是10維的測距傳感器向量機械臂平臺是關節(jié)狀態(tài)加一個小范圍視覺特征偵查設備是全局地圖坐標加目標位置動作空間類型不同底盤是2維連續(xù)輪速機械臂是4維連續(xù)關節(jié)增量偵查設備是3維連續(xù)速度指令動力學模型不同底盤不能原地轉向機械臂平臺可以原地轉向但速度慢偵查設備移動不受地面約束控制頻率也不同底盤和機械臂是低頻執(zhí)行偵查設備相對高頻。這個小場景其實很能說明問題。我同時用了一套只支持同構智能體的經(jīng)典多智能體算法做對照組結果對照組在訓練了同樣步數(shù)后任務成功率只有三成多一點而采用統(tǒng)一空間映射加注意力融合的這套方案成功率可以達到七成以上。差距主要來自對照組完全無法處理三個智能體觀測維度不一致的問題。4.2 關鍵超參數(shù)與訓練調度復現(xiàn)這套算法的過程中我總結了一份比較關鍵的配置參考表。雖然不同的實際場景可能需要微調但這組參數(shù)對“異構程度較高”的任務基本適用配置項參考值我的備注語義編碼維度64維度太低會丟失異構特征太高會導致訓練稀疏注意力層數(shù)2單層在簡單任務夠用復雜任務建議兩層注意力頭數(shù)4多頭能捕捉不同類型智能體之間的多種交互模式經(jīng)驗回放池大小100萬步異構數(shù)據(jù)豐富池子太小會造成采樣重復批量大小512批量太小會讓少數(shù)類型的智能體樣本主導更新學習率3e-4用Adam優(yōu)化器再大容易震蕩目標網(wǎng)絡更新系數(shù)0.001軟更新硬更新在異構任務里表現(xiàn)很差熵正則系數(shù)0.01訓練中期衰減到0.005保持一點探索梯度裁剪10異構智能體Q值尺度差異大裁剪必需訓練調度上也有講究。我一開始把所有智能體丟進同一個經(jīng)驗回放池隨機采樣更新結果訓練到一半時發(fā)現(xiàn)底盤的行為能力退化得厲害。原因是機械臂和偵查設備產(chǎn)生的樣本在回放池里占了大頭底盤的樣本被稀釋了。后來我改成按智能體類型分層采樣保證每類樣本有最低占比問題立刻緩解。4.3 評測方法為什么只看reward不夠很多人在評估多智能體算法時只盯著平均獎勵曲線。這個指標在異構合作場景里特別容易誤導因為獎勵數(shù)字的漲跌根本看不出是哪類智能體在進步。我自己設計了三類指標配合使用。第一類是協(xié)作任務成功率這個最直接任務完成就是成功就是1沒完成就是0。第二類是策略多樣性指標我用每個智能體動作分布的熵來衡量如果某個智能體的策略熵過早掉到接近0說明它可能根本沒學到有用的行為只是固化成了一種隨機動作。第三類是異構泛化指數(shù)具體做法是訓練完成后新加一種模擬的智能體類型不再訓練直接觀察原有策略在新智能體加入后任務成功率下降了百分之多少。這個指標非常殘酷但特別能檢驗“通用”二字是不是空話。我記得第一次跑完這套算法的評測三張曲線擺在一起才發(fā)現(xiàn)平均獎勵一直在漲但機械臂平臺的策略熵掉得異常快而底盤幾乎沒有在學。如果只看平均獎勵我根本不會意識到訓練出現(xiàn)了問題。所以強烈建議凡做異構多智能體訓練別省這三類指標的功夫。5. 真正落地時的經(jīng)驗教訓與排查思路5.1 觀測padding的假信號復現(xiàn)中遇到的第一個坑來自觀測拼接。我的三個智能體觀測維度不一樣最早我圖省事把所有觀測統(tǒng)一補零到同一個最長維度然后直接送進共享網(wǎng)絡。訓練出來的協(xié)作成功率很低而且現(xiàn)象很奇怪某種特定方向的信號會讓所有智能體都產(chǎn)生完全相同的反應。排查后才發(fā)現(xiàn)補零位置對應的權重沒有被充分訓練但網(wǎng)絡又把零值當成了有特定語義的“有效信號”。尤其是注意力機制里補零的維度也參與計算查詢和鍵的匹配導致注意力權重被無意義的零維度帶偏。解決方法是兩件事同時做一是在注意力打分階段加入一個有效信息掩碼讓補零位置的元素不參與權重計算二是在編碼器輸出后做層歸一化把真實特征和無效信息的尺度分開。這兩招加上之后訓練曲線明顯開始正常。5.2 訓練震蕩時我的排查順序異構多智能體訓練非常容易震蕩表現(xiàn)為獎勵曲線規(guī)律性地大起大落。我在這個過程里總結出一個固定排查順序每次都能產(chǎn)生效果。第一先查獎勵尺度。異構智能體各自執(zhí)行不同動作獲得的子獎勵數(shù)值差異可能高達幾十倍如果不做全局獎勵歸一化梯度更新會被數(shù)值大的智能體主導。我用的方法是對每個智能體的獎勵除以它自身歷史回報的標準差而不是除以全局標準差。第二查目標網(wǎng)絡更新頻率。異構場景下不同智能體的策略變化速度不一致目標網(wǎng)絡更新太頻繁會導致評價指標來回漂移。我最終把軟更新系數(shù)從0.01調低到0.001震蕩幅度立刻減少三分之一。第三查經(jīng)驗回放池中的類別均衡。前面已經(jīng)提到分層采樣的重要性這里不再重復但強調一點分層采樣只能保證數(shù)量均衡不能保證數(shù)據(jù)質量均衡建議再給每類智能體設定一個最小有效樣本門檻一批樣本的平均TD誤差過低就不允許參與更新。5.3 從仿真到實際應用的三個現(xiàn)實差距最后一個章節(jié)聊一下仿真和實際部署之間的落差。第一點是注意力機制的計算開銷。仿真里十幾個智能體還能跑得動但真實場景如果有幾十上百個節(jié)點全連接注意力矩陣的復雜度會爆炸。我的建議是采用鄰居采樣的近似方式每個智能體只和空間距離最近的K個其他智能體做交互實測在合作類任務里性能損失可以控制在可接受范圍內。第二點是仿真里的觀測是非常干凈的但真實傳感器的數(shù)據(jù)充滿了噪聲和缺失。我試過在仿真環(huán)境里直接給激光測距向量疊加高斯噪聲策略性能立刻跳水。所以在訓練時就該做噪聲注入和觀測遮擋訓練而不是等上了真機再補救。第三點是執(zhí)行頻率差異。仿真里所有智能體按同一頻率決策但真實系統(tǒng)里底盤和視覺設備的決策頻率并不同步。解決思路有兩種低頻率智能體把動作重復執(zhí)行幾次或者在模型輸入里加入時間戳特征。我個人試下來加入時間戳特征的方式更優(yōu)雅也能讓注意力機制感知到信息的新鮮程度。最后再分享一條個人經(jīng)驗這類面向通用異構多智能體合作的算法真正的難點從來不在網(wǎng)絡結構而在數(shù)據(jù)采樣和訓練穩(wěn)定性。如果你想要復現(xiàn)請從規(guī)模最小的異構場景開始先做對兩三個智能體再逐步擴大數(shù)量和新類型不要一上來就追求大而全。我當初就是因為一開始就把場景搞得過重浪費了大量時間在調試而不是理解核心機制上。等你把這類算法的訓練手感找到會發(fā)現(xiàn)它帶來的最大收益不是某張可視化圖表上的數(shù)值提升而是面對新任務時你不用再為每個新智能體重寫一套訓練邏輯。