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