化學(xué)習(xí)全景梳理:從基礎(chǔ)概念到PPO與多AGV路徑規(guī)劃)
前兩天在一個(gè)技術(shù)交流群里看到有人問(wèn)“現(xiàn)在規(guī)則和規(guī)劃算法都這么成熟了還有人老老實(shí)實(shí)寫(xiě)強(qiáng)化學(xué)習(xí)嗎”群里立刻分成兩派一派說(shuō)業(yè)務(wù)里直接用規(guī)則加A*就夠另一派說(shuō)深度強(qiáng)化學(xué)習(xí)算法已經(jīng)卷出花了。我回了一句強(qiáng)化學(xué)習(xí)解決的從來(lái)不是“能不能動(dòng)”而是“在不確定性中怎么持續(xù)做對(duì)選擇”。這句話算是我這些年在機(jī)器人調(diào)度、游戲AI、仿真控制之間反復(fù)橫跳后最想表達(dá)的東西。這篇文章算是一份階段性的強(qiáng)化學(xué)習(xí)綜述也可以當(dāng)作一份給團(tuán)隊(duì)新人做入門(mén)地圖的內(nèi)容。我會(huì)先聊清楚強(qiáng)化學(xué)習(xí)到底在研究什么問(wèn)題再順著算法的發(fā)展脈絡(luò)梳理主流方法然后按在線、離線、基于模型、因果強(qiáng)化學(xué)習(xí)這幾個(gè)方向拆開(kāi)講最后用PPO跑通一個(gè)CartPole最小閉環(huán)并落到Gazebo仿真里的多AGV路徑規(guī)劃這類(lèi)實(shí)用場(chǎng)景。內(nèi)容覆蓋概念、公式直覺(jué)、代碼和踩坑經(jīng)驗(yàn)適合剛接觸強(qiáng)化學(xué)習(xí)的讀者也適合已經(jīng)跑過(guò)幾個(gè)環(huán)境但缺乏體系化脈絡(luò)的工程師。1. 從多臂老虎機(jī)到自動(dòng)駕駛強(qiáng)化學(xué)習(xí)到底解決的是什么問(wèn)題1.1 強(qiáng)化學(xué)習(xí)研究的不是“學(xué)一套答案”而是“學(xué)一套決策方式”你先忘掉那些復(fù)雜的神經(jīng)網(wǎng)絡(luò)想象一個(gè)最簡(jiǎn)單的場(chǎng)景面前有十臺(tái)老虎機(jī)每臺(tái)的中獎(jiǎng)概率不同但你不知道哪臺(tái)高。你手里有有限次機(jī)會(huì)怎么在“多試幾臺(tái)獲取信息”和“死磕已知最好的那臺(tái)拿收益”之間做權(quán)衡這就是經(jīng)典的多臂老虎機(jī)問(wèn)題也是強(qiáng)化學(xué)習(xí)Reinforcement Learning最樸素的原型。它研究的是如何在未知環(huán)境中通過(guò)試錯(cuò)來(lái)最大化長(zhǎng)期累積獎(jiǎng)勵(lì)。強(qiáng)化學(xué)習(xí)一般由四個(gè)基本要素組成狀態(tài)State智能體當(dāng)前觀察到的環(huán)境描述比如AGV小車(chē)的位置、速度、周?chē)系K物距離。動(dòng)作Action智能體可選的行為集合比如左轉(zhuǎn)、直行、剎車(chē)或者輸出一個(gè)連續(xù)的速度指令。獎(jiǎng)勵(lì)Reward環(huán)境對(duì)智能體行為的即時(shí)反饋一個(gè)標(biāo)量可以正可以負(fù)。策略Policy智能體從狀態(tài)到動(dòng)作的映射規(guī)則也就是“看到什么情況做什么決策”的核心。用學(xué)騎自行車(chē)來(lái)類(lèi)比。你剛騎上車(chē)時(shí)沒(méi)有任何經(jīng)驗(yàn)摔倒一次小腿疼一次大腦就知道這個(gè)彎不能轉(zhuǎn)這么急。再摔幾次以后你開(kāi)始能根據(jù)車(chē)身傾斜角提前調(diào)整重心科目就對(duì)應(yīng)狀態(tài)動(dòng)作是扭車(chē)把和踩踏板獎(jiǎng)勵(lì)是“沒(méi)摔”和“順利前進(jìn)”。你最終學(xué)到的不是某一幀畫(huà)面下該干什么而是一整套應(yīng)對(duì)不同路況的決策習(xí)慣這就是策略。1.2 和監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)的本質(zhì)區(qū)別很多人剛接觸強(qiáng)化學(xué)習(xí)時(shí)最迷惑的就是它和機(jī)器學(xué)習(xí)里其他兩派到底什么關(guān)系我自己總結(jié)過(guò)一個(gè)很直白的對(duì)比學(xué)習(xí)范式輸入信號(hào)目標(biāo)典型場(chǎng)景監(jiān)督學(xué)習(xí)帶標(biāo)簽的樣本擬合輸入到輸出的映射圖像分類(lèi)、文本分類(lèi)、回歸預(yù)測(cè)無(wú)監(jiān)督學(xué)習(xí)無(wú)標(biāo)簽的樣本發(fā)現(xiàn)數(shù)據(jù)內(nèi)部結(jié)構(gòu)聚類(lèi)、降維、異常檢測(cè)強(qiáng)化學(xué)習(xí)環(huán)境返回的獎(jiǎng)勵(lì)通過(guò)試錯(cuò)學(xué)習(xí)最優(yōu)決策序列游戲AI、機(jī)器人控制、調(diào)度優(yōu)化監(jiān)督學(xué)習(xí)像判斷題答案就在數(shù)據(jù)集里你只需要?dú)w納規(guī)律無(wú)監(jiān)督學(xué)習(xí)像看一堆拼圖你得自己找出哪塊和哪塊有關(guān)系強(qiáng)化學(xué)習(xí)更像闖關(guān)游戲沒(méi)有人告訴你每步怎么走才對(duì)只有系統(tǒng)在你做完動(dòng)作后給你一個(gè)分?jǐn)?shù)延遲還可能很長(zhǎng)——你可能連著做對(duì)了好幾步最后一步走錯(cuò)了才知道前面也該調(diào)整。這種“延遲獎(jiǎng)勵(lì)”和“序列決策”特性是強(qiáng)化學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)最不一樣的地方。比如棋類(lèi)對(duì)弈你沒(méi)法對(duì)每一步貼標(biāo)簽說(shuō)“這步是對(duì)是錯(cuò)”只有終局才見(jiàn)勝負(fù)。強(qiáng)化學(xué)習(xí)可以在這種長(zhǎng)鏈條反饋下把哪一步的價(jià)值都反向估計(jì)出來(lái)。1.3 哪些任務(wù)適合用強(qiáng)化學(xué)習(xí)哪些其實(shí)不適合從我實(shí)際項(xiàng)目經(jīng)驗(yàn)看適合用強(qiáng)化學(xué)習(xí)解決的任務(wù)一般滿足三個(gè)條件狀態(tài)可以被表達(dá)、動(dòng)作可以被執(zhí)行、目標(biāo)可以被量化成獎(jiǎng)勵(lì)信號(hào)。比如雅達(dá)利游戲、圍棋、機(jī)器人運(yùn)動(dòng)控制、倉(cāng)庫(kù)多AGV調(diào)度、換熱站溫度控制、推薦系統(tǒng)里的長(zhǎng)期價(jià)值優(yōu)化這些都有明確邊界和反饋信號(hào)。反過(guò)來(lái)有些任務(wù)用規(guī)則和傳統(tǒng)優(yōu)化方法反而更爽。比如單純的路徑最短問(wèn)題用A*或者Dijkstra幾分鐘就出結(jié)果非要上強(qiáng)化學(xué)習(xí)就是殺雞用牛刀。還有一些場(chǎng)景比如醫(yī)療決策錯(cuò)一次代價(jià)極高獎(jiǎng)勵(lì)函數(shù)很難定義強(qiáng)化學(xué)習(xí)在這里只能做輔助研究。我的判斷標(biāo)準(zhǔn)是如果環(huán)境交互成本低、試錯(cuò)空間大、獎(jiǎng)勵(lì)能清晰定義強(qiáng)化學(xué)習(xí)就能發(fā)揮價(jià)值如果三個(gè)條件缺了任何一個(gè)先想清楚再動(dòng)手。2. 主流的算法家族從表格型到深度網(wǎng)絡(luò)2.1 免模型與基于模型是一條分岔路強(qiáng)化學(xué)習(xí)算法最粗的分叉是免模型Model-Free和基于模型Model-Based。基于模型的方法是先去學(xué)習(xí)一個(gè)環(huán)境動(dòng)態(tài)模型也就是“做了動(dòng)作a環(huán)境大概會(huì)怎么反饋”然后在這個(gè)模型上規(guī)劃或優(yōu)化策略。典型的代表有PILCO、Dreamer、MuZero。優(yōu)勢(shì)是樣本效率高因?yàn)榭梢栽趯W(xué)到的虛擬模型里“腦補(bǔ)”很多數(shù)據(jù)劣勢(shì)是學(xué)模型本身很難模型不準(zhǔn)后面的策略就全歪了。免模型方法不顯式建模環(huán)境直接從交互數(shù)據(jù)中學(xué)策略或價(jià)值函數(shù)包括DQN、PPO、SAC、TD3等一大批主流算法。它們實(shí)現(xiàn)相對(duì)簡(jiǎn)單通用性強(qiáng)是工程落地的主力。代價(jià)是樣本消耗量通常很大所以仿真環(huán)境在強(qiáng)化學(xué)習(xí)項(xiàng)目里幾乎是標(biāo)配。2.2 價(jià)值型算法從Q-Learning到SAC早期表格型方法里最有名的就是Q-Learning。它維護(hù)一張Q表記錄每個(gè)狀態(tài)動(dòng)作對(duì)的長(zhǎng)期回報(bào)估計(jì)更新公式是Q(s, a) ← Q(s, a) α * [ r γ * max(a) Q(s, a) - Q(s, a) ]看起來(lái)簡(jiǎn)單但這套“拿下一步最優(yōu)Q值回傳當(dāng)前步”的思路到現(xiàn)在還在幾乎所有深度強(qiáng)化學(xué)習(xí)算法內(nèi)部跑著。當(dāng)狀態(tài)空間大到表格裝不下時(shí)就有深度Q網(wǎng)絡(luò)DQN。DQN把Q表?yè)Q成了神經(jīng)網(wǎng)絡(luò)用過(guò)的都知道兩個(gè)關(guān)鍵技巧不能少經(jīng)驗(yàn)回放和固定目標(biāo)網(wǎng)絡(luò)。這兩個(gè)設(shè)計(jì)解決的是樣本相關(guān)性和訓(xùn)練穩(wěn)定性問(wèn)題是深度強(qiáng)化學(xué)習(xí)算法的奠基性工作。再到連續(xù)動(dòng)作控制場(chǎng)景比如機(jī)器人關(guān)節(jié)速度輸出DQN沒(méi)法直接處理于是出現(xiàn)DDPG這類(lèi)確定策略梯度方法。但DDPG出了名地對(duì)超參數(shù)敏感所以后來(lái)TD3和SAC明顯更穩(wěn)。尤其SAC引入了最大熵思想讓它不只會(huì)最大化回報(bào)還會(huì)刻意保持策略隨機(jī)性避免過(guò)早收斂到次優(yōu)方案。我在仿真環(huán)境里做連續(xù)控制時(shí)第一選擇基本就是SAC。2.3 策略型算法策略梯度與Actor-Critic價(jià)值型方法先學(xué)“每個(gè)動(dòng)作有多好”再根據(jù)價(jià)值選動(dòng)作策略型方法更直接把策略本身參數(shù)化沿著“期望回報(bào)對(duì)策略參數(shù)的梯度”往上漲。最早的REINFORCE屬于蒙特卡洛策略梯度用整個(gè)回合的總回報(bào)來(lái)估計(jì)梯度直觀但方差極大。后來(lái)把價(jià)值網(wǎng)絡(luò)和策略網(wǎng)絡(luò)結(jié)合起來(lái)就有了Actor-Critic。Actor負(fù)責(zé)出動(dòng)作Critic負(fù)責(zé)給當(dāng)前狀態(tài)一個(gè)基線評(píng)分這樣策略網(wǎng)絡(luò)不用等完整回合就能每步更新大幅降低方差。A2C、A3C、PPO、SAC、TD3都算這個(gè)家族。PPO是目前工程里最常見(jiàn)的算法之一。它通過(guò)裁剪目標(biāo)函數(shù)讓策略更新不邁太大步防止一次更新過(guò)多破壞已有策略穩(wěn)定性非常好。我自己的感受是PPO可能不是每個(gè)任務(wù)上Test得分最高的但幾乎在所有任務(wù)上都“不會(huì)把你帶溝里”這是它能成為默認(rèn)起點(diǎn)的原因。2.4 算法選型速查算法適用動(dòng)作空間特點(diǎn)工程常見(jiàn)場(chǎng)景DQN離散引入經(jīng)驗(yàn)回放與固定目標(biāo)網(wǎng)絡(luò)棋類(lèi)、雅達(dá)利、簡(jiǎn)單離散控制DDPG連續(xù)確定性策略但對(duì)超參數(shù)敏感經(jīng)典連續(xù)控制TD3連續(xù)DDPG的穩(wěn)定版雙Critic延遲更新機(jī)器人運(yùn)動(dòng)控制SAC連續(xù)最大熵訓(xùn)練探索強(qiáng)且穩(wěn)定機(jī)械臂、仿真車(chē)輛控制PPO離散/連續(xù)穩(wěn)定、通用、易調(diào)游戲AI、AGV調(diào)度、多智能體場(chǎng)景IQL/CQL離線數(shù)據(jù)處理分布外動(dòng)作離線專(zhuān)用日志數(shù)據(jù)策略提取3. 數(shù)據(jù)流向決定派別在線、離線與基于模型3.1 在線閉環(huán)一個(gè)“采樣、評(píng)估、改進(jìn)”的循環(huán)在線強(qiáng)化學(xué)習(xí)的流程所有跑過(guò)代碼的人都很熟Agent在環(huán)境里探索收集狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)、下一狀態(tài)四元組扔進(jìn)回放緩沖區(qū)學(xué)習(xí)網(wǎng)絡(luò)從中采樣一批經(jīng)驗(yàn)用TD誤差更新價(jià)值函數(shù)或者策略網(wǎng)絡(luò)更新完繼續(xù)讓Agent帶著新策略和環(huán)境交互反復(fù)循環(huán)。這里最核心的矛盾是“探索”和“利用”如果一直利用當(dāng)前最優(yōu)策略可能錯(cuò)過(guò)更好的路線如果一直亂試?yán)鄯e獎(jiǎng)勵(lì)又上不去。常用的辦法是ε-greedy即以一個(gè)小概率隨機(jī)探索其余時(shí)間選擇當(dāng)前Q值最高的動(dòng)作。SAC這類(lèi)基于熵的算法更優(yōu)雅把探索作為目標(biāo)的一部分寫(xiě)進(jìn)優(yōu)化公式里。在線方法效果直觀但最現(xiàn)實(shí)的痛點(diǎn)是環(huán)境交互成本。真實(shí)機(jī)器人跑一步要好幾秒碰撞一次還要維修而仿真環(huán)境下幾分鐘能跑上萬(wàn)步。這也是為什么大家在做真實(shí)控制前一定先在Gazebo、MuJoCo這類(lèi)仿真器里訓(xùn)練模型訓(xùn)練好了再遷移到真實(shí)設(shè)備上。3.2 離線強(qiáng)化學(xué)習(xí)只有歷史日志也能學(xué)很多業(yè)務(wù)場(chǎng)景根本沒(méi)有“隨時(shí)在線試錯(cuò)”的許可。電商推薦系統(tǒng)不可能為了探索新策略就讓用戶刷到很多低質(zhì)量?jī)?nèi)容醫(yī)院也不允許算法在真實(shí)診療里胡試。這種時(shí)候就需要離線強(qiáng)化學(xué)習(xí)Offline RL也叫批處理強(qiáng)化學(xué)習(xí)只用一份已經(jīng)收集好的固定數(shù)據(jù)集不再與環(huán)境交互直接學(xué)一個(gè)策略出來(lái)。離線強(qiáng)化學(xué)習(xí)的最大難點(diǎn)叫分布外動(dòng)作。簡(jiǎn)單說(shuō)數(shù)據(jù)里沒(méi)有的狀態(tài)動(dòng)作組合訓(xùn)練時(shí)一旦網(wǎng)絡(luò)隨口說(shuō)某個(gè)未知?jiǎng)幼鳌皶?huì)值很多分”就會(huì)出現(xiàn)嚴(yán)重的Q值過(guò)估計(jì)。因?yàn)镼網(wǎng)絡(luò)是用貝爾曼方程遞推的對(duì)沒(méi)見(jiàn)過(guò)動(dòng)作的估值沒(méi)有真實(shí)反饋來(lái)糾正越迭代越離譜。IQLImplicit Q-Learning是一個(gè)很能說(shuō)明問(wèn)題的代表性算法。它避開(kāi)了“需要讀數(shù)據(jù)里沒(méi)出現(xiàn)過(guò)的動(dòng)作Q值”這個(gè)麻煩改為從隱式方式估計(jì)狀態(tài)價(jià)值只關(guān)注數(shù)據(jù)集內(nèi)部有樣本支撐的部分鼓勵(lì)學(xué)到數(shù)據(jù)集所表達(dá)的行為而不是盲目外推。CQL則從另一個(gè)角度下手在Q學(xué)習(xí)的目標(biāo)里加上一項(xiàng)對(duì)Q值期望的正則約束壓低那些沒(méi)有數(shù)據(jù)支撐的動(dòng)作的價(jià)值。兩種思路都屬于“保守估計(jì)”路線寧可少賺不賭未知。3.3 基于模型強(qiáng)化學(xué)習(xí)先把環(huán)境裝進(jìn)腦子里基于模型方法的核心是先學(xué)一個(gè)世界模型World Model讓Agent能“腦補(bǔ)”交互結(jié)果。Dreamer系列在這個(gè)方向上做得很典型先通過(guò)歷史經(jīng)驗(yàn)學(xué)出下一幀狀態(tài)預(yù)測(cè)模型然后在虛擬環(huán)境里基于隱空間做想象推演來(lái)訓(xùn)練策略。這樣大量策略更新都不需要跟真實(shí)環(huán)境通信樣本效率能提升一個(gè)數(shù)量級(jí)。MuZero更是把這套思路推進(jìn)到了棋類(lèi)和Atari等場(chǎng)景直接用神經(jīng)網(wǎng)絡(luò)做隱狀態(tài)轉(zhuǎn)移和價(jià)值預(yù)測(cè)不依賴(lài)精確規(guī)則也能拿到非常強(qiáng)的結(jié)果。這類(lèi)算法的工程直覺(jué)是既然真實(shí)環(huán)境交互貴那就先建一個(gè)便宜的高保真模擬器在模擬器里把試錯(cuò)成本降到接近零。3.4 因果強(qiáng)化學(xué)習(xí)在改什么再往深一層看最近我比較關(guān)注的還有因果強(qiáng)化學(xué)習(xí)Causal RL。傳統(tǒng)強(qiáng)化學(xué)習(xí)學(xué)到的很多關(guān)聯(lián)關(guān)系其實(shí)只是數(shù)據(jù)上的相關(guān)性而非因果性。比如AGV在某個(gè)畫(huà)面里頻繁撞到貨架畫(huà)面中的某個(gè)像素顏色和碰撞事件高度相關(guān)但真正導(dǎo)致碰撞的是機(jī)器人到貨架的距離和速度。如果只學(xué)到像素相關(guān)換一批貨架顏色可能就失效了。因果強(qiáng)化學(xué)習(xí)的核心機(jī)制是把因果推斷工具嵌入強(qiáng)化學(xué)習(xí)流程先識(shí)別出“哪個(gè)變量直接決定系統(tǒng)反饋哪個(gè)變量只是伴隨現(xiàn)象”再在環(huán)境模型或策略學(xué)習(xí)里保留因果結(jié)構(gòu)。一個(gè)典型做法是先結(jié)構(gòu)學(xué)習(xí)得到因果圖抽出因果特征再讓策略只依賴(lài)這些特征做決策丟掉那些虛假相關(guān)。這樣的策略更容易跨環(huán)境泛化也更容易被解釋。目前這個(gè)方法還在發(fā)育期但方向上我認(rèn)為值得持續(xù)關(guān)注。4. 用Python把PPO跑通一遍從Gym到自定義環(huán)境4.1 環(huán)境準(zhǔn)備不談安裝的教程都是耍流氓。先準(zhǔn)備環(huán)境我推薦直接用Miniconda建獨(dú)立虛擬環(huán)境避免包依賴(lài)沖突conda create -n rl python3.10 -y conda activate rl pip install gymnasium[classic-control] stable-baselines3gymnasium是之前OpenAI Gym庫(kù)的繼任者接口變化不大但維護(hù)更積極。stable-baselines3是SB3封裝了PPO、SAC、DQN等一堆成熟算法接口統(tǒng)一非常適合入門(mén)和做實(shí)驗(yàn)原型。如果你想自己寫(xiě)算法理解細(xì)節(jié)可以用PyTorch從零擼一個(gè)簡(jiǎn)單PPO但第一遍我建議先用SB3跑通流程再回頭讀源碼。4.2 最小閉環(huán)訓(xùn)練與推理下面這段代碼十幾行就能完成“定義環(huán)境、創(chuàng)建模型、訓(xùn)練、跑一次推理”的完整閉環(huán)import gymnasium as gym from stable_baselines3 import PPO # 創(chuàng)建倒立擺環(huán)境 env gym.make(CartPole-v1) # 初始化PPO使用兩層MLP策略網(wǎng)絡(luò) model PPO(MlpPolicy, env, verbose1, learning_rate3e-4, n_steps2048) # 訓(xùn)練20萬(wàn)步 model.learn(total_timesteps200_000) # 重置環(huán)境并讓模型跑一輪 obs, info env.reset() for _ in range(1000): action, _ model.predict(obs, deterministicTrue) obs, reward, terminated, truncated, info env.step(action) env.render() if terminated or truncated: break這里有幾個(gè)容易被忽略的細(xì)節(jié)learning_rate3e-4是我跑過(guò)很多環(huán)境后覺(jué)得在PPO里最穩(wěn)妥的起點(diǎn)盲目調(diào)大很容訓(xùn)練發(fā)散。n_steps2048是每次更新收集的步數(shù)太小會(huì)讓梯度噪聲過(guò)大。deterministicTrue表示推理時(shí)不再采樣隨機(jī)探索直接輸出當(dāng)前策略的確定性動(dòng)作評(píng)估模型時(shí)更穩(wěn)定。4.3 從CartPole到Gazebo和多AGV路徑規(guī)劃跑通CartPole之后絕大多數(shù)人下一步會(huì)想碰真實(shí)場(chǎng)景。做機(jī)器人方向的人通常繞不開(kāi)Gazebo它是ROS生態(tài)里最常用的物理仿真器之一可以加載機(jī)器人模型、傳感器仿真、障礙物布局。要做Gazebo里的強(qiáng)化學(xué)習(xí)最普遍的做法是寫(xiě)一個(gè)Python環(huán)境類(lèi)通過(guò)ROS訂閱激光雷達(dá)和里程計(jì)話題得到狀態(tài)通過(guò)發(fā)布速度指令話題作為動(dòng)作當(dāng)機(jī)器人收到碰撞傳感器信號(hào)時(shí)返回負(fù)獎(jiǎng)勵(lì)并回合結(jié)束。多AGV路徑規(guī)劃是這類(lèi)場(chǎng)景里挺典型的問(wèn)題。一個(gè)倉(cāng)庫(kù)里有若干輛AGV從不同起點(diǎn)去往不同卸貨點(diǎn)容易互相堵路甚至死鎖。用強(qiáng)化學(xué)習(xí)來(lái)求解時(shí)普通建模方式有兩種一種是把每個(gè)AGV當(dāng)作獨(dú)立智能體各自決定下一步往哪走這就成了多智能體強(qiáng)化學(xué)習(xí)問(wèn)題另一種是先把AGV的可能路徑離散成有限集合再讓策略從中選路徑配合交通管制規(guī)則避免死鎖。根據(jù)我自己的經(jīng)驗(yàn)多AGV強(qiáng)化學(xué)習(xí)項(xiàng)目里最影響效果的倒不是算法本身而是仿真保真度和獎(jiǎng)勵(lì)設(shè)計(jì)。比如Gazebo里如果沒(méi)開(kāi)好碰撞檢測(cè)那AGV撞了貨架也不報(bào)終止獎(jiǎng)勵(lì)信號(hào)全亂策略根本學(xué)不出來(lái)。所以我每次都先在Gazebo里手動(dòng)遠(yuǎn)程操控AGV跑幾遍確認(rèn)碰撞話題、里程計(jì)噪聲、障礙物布局都真實(shí)了再開(kāi)始訓(xùn)練策略。5. 實(shí)戰(zhàn)中的獎(jiǎng)勵(lì)設(shè)計(jì)、超參數(shù)與任務(wù)建模5.1 獎(jiǎng)勵(lì)設(shè)計(jì)稀疏獎(jiǎng)勵(lì)、獎(jiǎng)勵(lì)塑形與獎(jiǎng)勵(lì)黑客獎(jiǎng)勵(lì)函數(shù)是強(qiáng)化學(xué)習(xí)項(xiàng)目里影響最直接、也最容易被輕視的部分。第一個(gè)問(wèn)題是稀疏獎(jiǎng)勵(lì)如果AGV只在最終卸貨那一刻拿到一個(gè)“10”其他所有步都是0那你得試多少條路才偶然而一次正向信號(hào)可能幾萬(wàn)步都學(xué)不動(dòng)。解決辦法是獎(jiǎng)勵(lì)塑形給中間過(guò)渡提供密度更高的反饋比如每靠近目標(biāo)一步給一個(gè)小正分每碰撞一次給一個(gè)負(fù)分讓對(duì)方策略能一步步摸到目標(biāo)。但獎(jiǎng)勵(lì)塑形會(huì)引發(fā)新的問(wèn)題就是獎(jiǎng)勵(lì)黑客。你設(shè)計(jì)的靠近獎(jiǎng)勵(lì)可能讓AGV繞著目標(biāo)轉(zhuǎn)圈不沖進(jìn)去只為了每步都拿靠近獎(jiǎng)勵(lì)也可能讓它在離目標(biāo)很近但撞墻的位置卡住因?yàn)榭拷?jiǎng)勵(lì)大于碰撞處罰。我見(jiàn)過(guò)最典型的翻車(chē)案例給機(jī)械臂設(shè)計(jì)了一個(gè)“末端接近目標(biāo)減距離誤差”的獎(jiǎng)勵(lì)結(jié)果機(jī)械臂學(xué)會(huì)把目標(biāo)物體推遠(yuǎn)來(lái)減少誤差。所以要設(shè)一些容易判定的全局約束比如步數(shù)上限、距離閾值強(qiáng)制終止并對(duì)異常行為做合法性校驗(yàn)。5.2 需要盯住的超參數(shù)強(qiáng)化學(xué)習(xí)超參數(shù)很多但真正需要手工調(diào)的核心參數(shù)就那么幾個(gè)參數(shù)含義常見(jiàn)起點(diǎn)調(diào)高效果調(diào)低效果學(xué)習(xí)率網(wǎng)絡(luò)權(quán)重更新步長(zhǎng)3e-4學(xué)習(xí)快容易發(fā)散穩(wěn)定但收斂慢折扣因子γ未來(lái)獎(jiǎng)勵(lì)的重要性0.99更看重遠(yuǎn)期收益更看重眼前收益熵系數(shù)/熵權(quán)重策略隨機(jī)性懲罰SAC默認(rèn)自動(dòng)調(diào)探索更多接近確定性策略經(jīng)驗(yàn)回放容量舊樣本保留量100_000多樣性高占內(nèi)存樣本舊信息丟棄快梯度裁剪閾值防止梯度過(guò)大0.5或1.0容忍大更新更保守我見(jiàn)過(guò)太多人一上來(lái)就試圖把γ調(diào)到0.999結(jié)果策略過(guò)分關(guān)注遠(yuǎn)期短視任務(wù)怎么都學(xué)不好。先保持0.99起步觀察回報(bào)曲線是否平穩(wěn)上漲再根據(jù)需求更變。5.3 訓(xùn)練不穩(wěn)時(shí)的排查鏈訓(xùn)練過(guò)程中回報(bào)曲線震蕩是一個(gè)再普通不過(guò)的事。按照我自己的排查習(xí)慣順序大概是先確認(rèn)環(huán)境本身沒(méi)問(wèn)題手動(dòng)采樣動(dòng)作觀察獎(jiǎng)勵(lì)是否合理、回合是否正常結(jié)束這一步排掉80%的“學(xué)不動(dòng)”問(wèn)題??从?xùn)練時(shí)的平均回報(bào)曲線而不是單回合回報(bào)。單回合方差極大容易讓人誤判。檢查探索是否充足如果策略過(guò)早收斂到“一直輸出同一個(gè)動(dòng)作”往往是熵塌縮了需要提高熵系數(shù)或者提高學(xué)習(xí)率。檢查Q值或Critic loss如果Q值一路飆升但實(shí)際回報(bào)紋絲不動(dòng)基本就是過(guò)估計(jì)需要降低學(xué)習(xí)率、調(diào)大回放buffer或者換成更保守的目標(biāo)更新方式。最后檢查環(huán)境隨機(jī)種子是否固定不確定的隨機(jī)環(huán)境會(huì)直接導(dǎo)致復(fù)現(xiàn)困難。5.4 我的調(diào)試順序跑強(qiáng)化學(xué)習(xí)項(xiàng)目以來(lái)我逐漸形成一套固定節(jié)奏。第一步先把環(huán)境當(dāng)成隨機(jī)智能體跑幾百步只看數(shù)據(jù)流是否通、獎(jiǎng)勵(lì)是否合理。第二步用PPO或SAC跑一個(gè)小batch實(shí)驗(yàn)比如10萬(wàn)步觀察那條獎(jiǎng)勵(lì)曲線能不能在一個(gè)小時(shí)內(nèi)有明顯上升趨勢(shì)。第三步如果曲線沒(méi)動(dòng)靜我不去改網(wǎng)絡(luò)結(jié)構(gòu)先改獎(jiǎng)勵(lì)函數(shù)和狀態(tài)表征這兩項(xiàng)對(duì)訓(xùn)練效果的影響遠(yuǎn)大于網(wǎng)絡(luò)層數(shù)。第四步等基本能學(xué)通后再去做超參數(shù)小范圍網(wǎng)格搜索一次只改一個(gè)變量。這套流程看起來(lái)老套但對(duì)比“遇到問(wèn)題就加網(wǎng)絡(luò)”的野路子成功率提升非常大。6. 強(qiáng)化學(xué)習(xí)目前的三個(gè)瓶頸以及一些破局思路6.1 繞不開(kāi)的樣本效率深度強(qiáng)化學(xué)習(xí)算法的最大瓶頸還是樣本效率。一個(gè)標(biāo)準(zhǔn)的Atari游戲需要幾百萬(wàn)幀才能達(dá)到人類(lèi)水平真實(shí)機(jī)器人根本耗不起這個(gè)交互量這也是強(qiáng)化學(xué)習(xí)在工業(yè)里主要活在仿真場(chǎng)景的原因。破局思路目前有四條線一是基于模型方法用學(xué)出來(lái)的世界模型自動(dòng)補(bǔ)樣本二是離線強(qiáng)化學(xué)習(xí)把歷史日志數(shù)據(jù)用起來(lái)三是仿真到現(xiàn)實(shí)遷移把仿真里學(xué)到的策略做域隨機(jī)化再遷移到真實(shí)設(shè)備四是多智能體并行仿真同時(shí)開(kāi)幾十個(gè)Gazebo實(shí)例加速采樣。這幾個(gè)方向不是互斥的實(shí)際項(xiàng)目里經(jīng)常組合使用。6.2 獎(jiǎng)勵(lì)從哪來(lái)人寫(xiě)還是學(xué)獎(jiǎng)勵(lì)函數(shù)是很多項(xiàng)目推不動(dòng)的深層原因。尤其像“路徑規(guī)劃得好不好”“駕駛風(fēng)格冷不冷”這類(lèi)評(píng)價(jià)很難寫(xiě)成標(biāo)量函數(shù)。近幾年出現(xiàn)了逆強(qiáng)化學(xué)習(xí)IRL和偏好學(xué)習(xí)從專(zhuān)家示范數(shù)據(jù)里反推獎(jiǎng)勵(lì)或者讓人類(lèi)給成對(duì)軌跡打分再由算法擬合一個(gè)人的偏好模型。DeepMind在多機(jī)器人控制里還用過(guò)一個(gè)思路先學(xué)一個(gè)輔助價(jià)值函數(shù)來(lái)評(píng)估行為規(guī)范再把這個(gè)函數(shù)作為強(qiáng)化學(xué)習(xí)信號(hào)的一部分。從工程角度講與其絞盡腦汁手造獎(jiǎng)勵(lì)不如強(qiáng)化學(xué)習(xí)環(huán)境下同時(shí)采集導(dǎo)師反饋既高效又不容易被獎(jiǎng)勵(lì)黑客鉆空子。6.3 因果、世界模型和離線數(shù)據(jù)怎么走到一起把現(xiàn)階段幾個(gè)熱點(diǎn)放在一起看其實(shí)有一個(gè)共同趨勢(shì)都在想辦法讓強(qiáng)化學(xué)習(xí)不那么“白手起家”。因果強(qiáng)化學(xué)習(xí)給模型注入因果結(jié)構(gòu)讓策略基于真正起作用的變量做決策提高泛化能力基于模型的強(qiáng)化學(xué)習(xí)給策略一個(gè)可以反復(fù)演練的“沙盤(pán)”離線強(qiáng)化學(xué)習(xí)讓先前積累的數(shù)據(jù)具備再利用價(jià)值。三者在生產(chǎn)實(shí)踐里可以配合成一套管線先用離線數(shù)據(jù)學(xué)習(xí)一個(gè)可信的世界模型和保守策略再用因果工具剔除虛假相關(guān)特征最后在仿真沙盤(pán)里微調(diào)策略再到現(xiàn)實(shí)環(huán)境小成本驗(yàn)證。這基本就是我從科研項(xiàng)目轉(zhuǎn)向工業(yè)落地時(shí)最后沉淀下來(lái)的主流做法。6.4 入門(mén)資料怎么選避免只刷代碼最后分享一點(diǎn)學(xué)習(xí)路線方面的體會(huì)。很多人以為強(qiáng)化學(xué)習(xí)很難是數(shù)學(xué)勸退其實(shí)更準(zhǔn)確地說(shuō)是“直覺(jué)門(mén)檻”太高。Q值、TD誤差、策略梯度這些概念如果不結(jié)合具體環(huán)境去體會(huì)看公式會(huì)非常吃力。我推薦兩條路徑并行一邊讀Sutton的經(jīng)典紅寶書(shū)《Reinforcement Learning: An Introduction》這本書(shū)雖然老但對(duì)基本概念的直覺(jué)講得最好一邊在Gymnasium里跑SB3的現(xiàn)成實(shí)現(xiàn)把DQN、PPO、SAC都先當(dāng)成黑盒玩一遍再回去讀論文里的公式推導(dǎo)會(huì)順暢得多。市面上也有一些很適合中文讀者的開(kāi)源書(shū)籍比如“動(dòng)手學(xué)強(qiáng)化學(xué)習(xí)”我常把它當(dāng)作新人團(tuán)隊(duì)的百日入門(mén)手冊(cè)。我自己的習(xí)慣是“必須自己重寫(xiě)一遍核心算法”。哪怕寫(xiě)出來(lái)的版本比SB3慢十倍這個(gè)過(guò)程里能學(xué)到的東西遠(yuǎn)比調(diào)包跑幾千步要多。等你能從零寫(xiě)出一個(gè)能讓CartPole收斂的PPO再去看MuZero、Dreamer、IQL這些進(jìn)階方向會(huì)發(fā)現(xiàn)整個(gè)強(qiáng)化學(xué)習(xí)地圖已經(jīng)在腦子里成形了。剩下的無(wú)非是拿著地圖去你自己的場(chǎng)景里踩地平坑。