驗回放實戰(zhàn)指南)
看到“hindsight”這個詞很多人第一反應是英文里“事后諸葛亮”的意思。但放到強化學習RL這個圈子里它指向的是一個非常硬核的技術Hindsight Experience Replay事后經(jīng)驗回放。我最初接觸這個技術是在機械臂抓取項目上目標很簡單讓一個單步隨機策略永遠摸不到目標位姿的時候還能學到東西。當時試過獎勵塑形、課程學習效果都不穩(wěn)定后來換成HER思路稀疏獎勵問題才真正被擊穿。這篇文章不打算從論文公式開始講而是圍繞“我為什么選它”、“它到底改了什么”、“實際代碼怎么寫”、“調(diào)參時踩過哪些坑”這幾個維度展開。適合正在做RL導航、機械臂操作、或者任何帶稀疏獎勵任務的工程師閱讀讀完你至少能判斷自己的任務適不適合上HER并且能照著代碼改出一版能跑的實驗。1. 為什么稀疏獎勵場景需要“事后”視角1.1 稀疏獎勵的真正痛點不是獎勵少而是反饋信號趨近于零在傳統(tǒng)RL里我們設計reward function時最怕兩類問題獎勵太密導致策略被局部最優(yōu)困住或者獎勵太稀疏導致整個訓練過程幾乎收不到正信號。HER針對的是第二類典型場景包括機械臂把物體推到指定坐標、機器人走到某個門口、四足動物在復雜地形里保持平衡、甚至迷宮導航。拿機械臂推物體來舉例。狀態(tài)空間是關節(jié)角度加末端位置動作空間是連續(xù)變化的正弦力矩。如果目標位置和目標姿態(tài)組合有幾十個自由度隨機策略能一次成功的概率低到可以忽略。也就是說在整個探索過程中模型幾乎永遠拿到-1的獎勵常用稀疏獎勵設定失敗-1成功0。這種情況下無論是DQN還是DDPG梯度幾乎都是噪聲因為所有樣本的回報都一樣網(wǎng)絡根本沒法區(qū)分哪個動作稍微好一點。我見過很多人在這里加“輔助獎勵”或者“中間態(tài)獎勵”比如距離目標越近獎勵越大。短期看確實有效但長期有個副作用策略會傾向于“貪近”停在某個對后續(xù)動作不利的位置。這就是獎勵塑形和潛在獎勵沖突的問題。HER之所以吸引我是因為它不需要改獎勵函數(shù)而是改“經(jīng)驗的使用方式”從數(shù)據(jù)本身挖出正樣本。1.2 事后諸葛亮為什么能成立一個生活化的類比想象你是一個剛學投籃的人。你閉著眼亂扔了100次一個都沒進。正常教練會告訴你全是失敗記下來繼續(xù)練。但HER的教練會說雖然你這次沒進球但球落到了籃板左側(cè)的某個位置那么我們就假裝“你的目標就是投到籃板左側(cè)”你這次就是成功的。然后把這條“新經(jīng)驗”記下來。下一次你又扔偏了球到了右側(cè)那就把“右側(cè)”當作新目標再記一條成功經(jīng)驗。經(jīng)過很多次訓練你雖然沒有一次真正進球但積累了“如何把球扔到左側(cè)”、“如何把球扔到右側(cè)”的經(jīng)驗。這些經(jīng)驗組合起來最終能幫助你知道發(fā)力多少能影響落點方向偏了多少對應了動作誤差。當你真正想投進籃筐時這些經(jīng)驗比一堆“失敗-1”的記錄有用得多。從RL算法層面看HER做的事情就是把每一條transition額外復制一份把原目標 g 替換成本次軌跡“最終到達的狀態(tài)”作為偽目標 g再用 g 重新算一遍獎勵寫入回放緩沖區(qū)。整個過程不改變物理交互只改變數(shù)據(jù)標簽本質(zhì)上是一種非常廉價又高效的數(shù)據(jù)增強。2. HER的核心設計邏輯與算法細節(jié)2.1 目標條件化策略是HER成立的前提要理解HER必須先確認你的策略是目標條件化的也就是策略函數(shù)的輸入必須是“狀態(tài)目標”而不是只有狀態(tài)。數(shù)學表達就是 \pi(a|s,g) 而不是 \pi(a|s)。這一點在很多工程實現(xiàn)中容易被忽略。如果策略不感知目標那“把目標換成實際到達狀態(tài)”就沒有意義因為模型根本不知道目標是什么。因此HER只適用于goal-conditioned RL。具體到代碼上網(wǎng)絡輸入要拼接當前狀態(tài) s 和目標 g。有的做法是直接把goal向量拼到state后面有的是把goal單獨過一層編碼再和state編碼融合。我在實驗中一般的做法是直接在輸入層拼接簡單穩(wěn)定對MLP結(jié)構來說完全夠用。如果你用CNN處理圖像狀態(tài)可以把goal編碼成一個embedding再和視覺特征concat原理是一樣的。2.2 四種目標采樣策略哪種才是最優(yōu)解HER論文里最常被引用的就是四種種后驗目標采樣方式final、future、episode、random。我基于實際效果和復現(xiàn)頻率給你排個序future對transition中的當前時間步t從[t1, T]之間隨機采樣一個狀態(tài)作為偽目標。這是實際項目里最常用的因為它利用了軌跡后續(xù)真正的狀態(tài)演變信息和當前狀態(tài)有時間關聯(lián)。final直接拿episode最終狀態(tài)作為所有transition的偽目標。簡單粗暴數(shù)據(jù)利用率高適合任務成功條件比較“硬核”的場景。episode從整個episode的所有訪問狀態(tài)里隨機抽一個作為偽目標等于future的變體但可能采樣到當前狀態(tài)之前的狀態(tài)。random完全隨機采樣狀態(tài)效果一般除非你的狀態(tài)空間極小且密集。我的經(jīng)驗是初始階段用futureK4每條原始transition額外生成4條偽目標經(jīng)驗。如果任務目標空間很容易被覆蓋比如目標是某個位置坐標final也夠用如果狀態(tài)空間高維且稀疏future的優(yōu)勢更明顯。2.3 偽目標生成是否真能提高樣本效率原理拆解原始樣本中動作a是從狀態(tài)s_t到s_{t1}的一個映射。當目標是g時這個transition的reward是r(s_t,a_t,g) -1失敗。但如果把目標g s_{t1}或者軌跡末態(tài)那么這個transition變?yōu)椤霸趃條件下這個動作讓狀態(tài)轉(zhuǎn)移到了目標”reward變成0就是一個正樣本。這樣做的效果有兩個層面。第一回放緩沖區(qū)中正樣本比例大增價值網(wǎng)絡的訓練信號更豐富。第二策略網(wǎng)絡學習到的是“狀態(tài)轉(zhuǎn)變方向”和“偽目標之間的相對關系”而不是只學習單一絕對目標。因為偽目標們在空間上是分散的策略被迫擬合一個魯棒的、連續(xù)的映射這比只學習一個固定目標更有泛化性。很多復現(xiàn)實驗里HER DDPG可以把機械臂抓取的稀疏獎勵任務從幾乎不收斂變成幾百萬步內(nèi)穩(wěn)定達到80%以上成功率提升是數(shù)量級的。2.4 為什么不建議直接對Q函數(shù)做Hindsight有人會問既然事后悔悟這么好為什么不在Q-learning里直接把Q(s,a,g)也算一次技術上完全可行但有個坑Q函數(shù)訓練依賴TD誤差如果你在同一個transition里用多個不同目標去更新同一個Q網(wǎng)絡會讓目標值變得互相矛盾最終網(wǎng)絡會試圖“平衡所有目標”導致每個目標都學不好。HER的做法是分開存儲、分開采樣每個偽目標經(jīng)驗對應獨立的transition記錄相當于變相擴大了數(shù)據(jù)集而不是改動同一個Q樣本的標簽。這一點務必理解清楚。3. 從零實現(xiàn)HER以DDPG為基準的完整實操3.1 環(huán)境與基線選擇我建議第一次做HER不要一上來就上復雜仿真器先用OpenAI Gym的FetchReach-v1或者自定義的PointMass環(huán)境做驗證。環(huán)境接口簡單而且目標本來就是從狀態(tài)里抽出來的非常適合檢查HER邏輯是否正確。我自己一般習慣寫一個簡單的二維點機器人環(huán)境狀態(tài)是位置坐標目標是某個點坐標只有到達目標半徑內(nèi)才給0獎勵否則-1。這種環(huán)境下普通DDPG幾乎不會收斂但加HER以后大概50萬步就能看到明顯學習曲線。算法方面搭配HER最合適的是off-policy、基于價值的算法比如DDPG、TD3、SAC。不能搭配普通REINFORCE這類on-policy方法因為HER需要大型回放緩沖區(qū)重新采樣on-policy的樣本分布假設會被破壞。下面我以DDPG為基準框架給出核心實現(xiàn)思路。3.2 關鍵代碼結(jié)構與relabel邏輯實現(xiàn)HER的關鍵點主要有三個存儲原始transition時記錄完整狀態(tài)序列、采樣時按批處理生成偽目標、訓練時同時更新actor和critic。偽代碼如下# 假設有一個episode_data保存了整個軌跡的所有狀態(tài)和動作 def store_episode(replay_buffer, episode_data, env, her_sampling_strategyfuture, k4): states, actions, rewards, next_states, goals episode_data T len(states) for t in range(T): # 原始經(jīng)驗 replay_buffer.add( states[t], actions[t], rewards[t], next_states[t], goals[t], False ) # 額外生成K個偽目標經(jīng)驗 for _ in range(k): if her_sampling_strategy final: g_prime states[-1][:goal_dim] elif her_sampling_strategy future: future_idx np.random.randint(t 1, T 1) g_prime states[min(future_idx, T-1)][:goal_dim] elif her_sampling_strategy episode: any_idx np.random.randint(0, T) g_prime states[any_idx][:goal_dim] # 用g_prime重新計算reward new_reward env.compute_reward(states[t], actions[t], g_prime) # 把偽目標經(jīng)驗加入buffer replay_buffer.add( states[t], actions[t], new_reward, next_states[t], g_prime, False )這段代碼里有個容易被忽略的細節(jié)new_reward 必須用環(huán)境的真實獎勵函數(shù)計算而不是簡單寫成0。因為有些環(huán)境里獎勵和動作有關或者有多目標同時生效直接寫死0會讓偽目標經(jīng)驗不準確。3.3 網(wǎng)絡結(jié)構、超參數(shù)與訓練循環(huán)DDPG的actor輸入是concat(state, goal)輸出是連續(xù)動作critic輸入是concat(state, goal, action)輸出Q值。隱藏層一般用256x256或者400x300激活函數(shù)用ReLU輸出層用tanh把動作限制到[-1,1]。HER本身不增加網(wǎng)絡復雜度但會影響緩沖區(qū)大小需求建議replay buffer容量至少50萬條transition如果偽目標K4相當于每條真實樣本衍生出5條存儲所以內(nèi)存和磁盤IO要提前評估。我常用的超參數(shù)組合是參數(shù)名數(shù)值說明actor學習率1e-3偏低一點配合目標網(wǎng)絡軟更新critic學習率1e-3和actor保持同一量級gamma0.98稀疏獎勵任務不要太接近1容易高估polyaktau0.05目標網(wǎng)絡軟更新系數(shù)replay buffer1e6盡量大HER數(shù)據(jù)量很大batch size256不能太小否則偽目標訓練不穩(wěn)定K偽目標個數(shù)4論文推薦范圍2-84是默認值exploration noise0.2OU噪聲或高斯噪聲都行訓練循環(huán)本身和普通DDPG完全一樣采樣一個動作和環(huán)境交互存經(jīng)驗每步從buffer里采樣batch更新critic和actor。唯一注意點由于每條episode會被展開成多條額外經(jīng)驗所以”訓練步數(shù)“和”環(huán)境交互步數(shù)“不一樣畫曲線時一定以環(huán)境步數(shù)為橫軸不要以更新步數(shù)為橫軸否則曲線對比沒有意義。3.4 對比實驗設計與結(jié)果觀察我在二維PointMass環(huán)境上跑過三組實驗普通DDPG、帶密集獎勵的DDPG、HERDDPG。結(jié)果很明顯普通稀疏獎勵DDPG訓練到200萬步成功率仍是0密集獎勵DDPG大約在150萬步接近80%但策略路徑非常繞HERDDPG在60萬步就沖到90%以上并且軌跡更直接。更值得關注的是HER版本即使不刻意調(diào)優(yōu)Q值的收斂曲線也平滑得多。原因就在于偽目標經(jīng)驗提供了大量“成功”transitioncritic不用在負樣本堆里去猜Q值梯度信號自然更干凈。如果你做實驗時看到critic loss抖動劇烈多半是偽目標獎勵計算和真實獎勵不一致建議先檢查env.compute_reward是否直接能用。4. HER實戰(zhàn)中的常見問題與調(diào)試實錄4.1 為什么HER在我這個任務上完全不work這個坑我踩過不止一次。如果你的任務是“必須在特定位置觸發(fā)特定事件才算成功”而且這個事件和狀態(tài)位置之間沒有連續(xù)過渡例如開門、按按鈕、松開夾具那么單純用HER效果會很差。原因是偽目標必須從狀態(tài)里顯式提取而狀態(tài)里沒有關于“門是否打開”的連續(xù)信息時替換目標后獎勵仍然全是-1。解決思路有兩類。第一擴充狀態(tài)表征把任務相關的關鍵變量門角度、按鈕位移、物體是否被夾住也拼到 goal 和 state 里。第二用層級化思路上層任務是開關門下層任務用HER學“到達門前任意位置”。這實際上把單一pseudo-goal任務拆成了兩個更簡單的goal-conditioned子任務。實際項目中我會建議兩種都做因為即使擴展狀態(tài)也存在狀態(tài)空間中的某些維度不連續(xù)的問題。4.2 K值到底怎么選盲目堆大沒用很多人以為K4不夠直接調(diào)到K16或者K32。理論上K越大數(shù)據(jù)越多但有三個副作用內(nèi)存消耗線性上漲、訓練需要更多Step才能覆蓋所有偽目標經(jīng)驗、偽目標過于密集會導致相鄰樣本高度相關反而降低多樣性。我在機械臂推物體任務中做過對比K4和K8最終成功率差不多K8訓練步數(shù)略長K16開始出現(xiàn)輕微性能回退。所以我不建議調(diào)大K更推薦在固定K4的基礎上把future采樣窗口限制在[t1, min(t50, T)]附近讓偽目標不要離當前狀態(tài)太遠這樣學習更穩(wěn)定。如果你在長期episode里發(fā)現(xiàn)future策略退化可以考慮把采樣范圍縮小。4.3 HER和獎勵塑形能一起用嗎利弊要分清可以但要有心理預期。如果你的獎勵函數(shù)已經(jīng)過度塑形HER的偽目標獎勵也按照同樣的密集獎勵函數(shù)計算會出現(xiàn)一種情況偽目標經(jīng)驗里的獎勵是正的但實際目標的獎勵是負的兩個分支在學習時互相打架。我自己傾向于要么純稀疏堅決不塑形靠HER擴展信號要么在HER基礎上只對“是否接近目標”做非常輕微的引導比如比例乘0.1。這樣折中可以在導航類任務中更快起步又不至于讓策略被局部獎勵吸引。有一個實用技巧把塑形獎勵部分從compute_reward里拆出來HER的偽目標計算只基于稀疏成功判斷而真實經(jīng)驗里的獎勵用塑形后的完整獎勵。這樣偽目標經(jīng)驗專注于“方向知識”真實經(jīng)驗專注于“精細操控”兩者不沖突。大部分情況效果意外地好。4.4 聯(lián)合SAC或TD3時要調(diào)整什么我用SAC代替DDPG做HER時發(fā)現(xiàn)SAC的熵系數(shù)自動調(diào)節(jié)會和HER產(chǎn)生有趣的交互因為偽目標經(jīng)驗里正樣本比例高策略熵下降更快容易過早確定。解決辦法是固定target_entropy為一個較小的負數(shù)比如-2或者在偽目標經(jīng)驗采樣時降低其優(yōu)先權重。TD3相對穩(wěn)一點但它的雙向延遲更新對批量較大如1024時性能會下降我測試過batch_size 256比1024更好用。另外如果使用優(yōu)先級回放PER不要直接拿TD error作為偽目標經(jīng)驗的優(yōu)先級因為偽目標經(jīng)驗天然會有更低的TD error但這不代表它更重要只是目標被改了而已。我踩過這個坑加PER后HER反而變差了。你可以在優(yōu)先級的權重里加入一個“是否屬于偽目標經(jīng)驗”的懲罰因子讓HER經(jīng)驗和真實經(jīng)驗在采樣概率上保持平衡。4.5 真實機器人部署時的額外提醒仿真里HER跑通后遷移到真實機器人需要多考慮一層偽目標是從狀態(tài)中直接提取的但真實環(huán)境中狀態(tài)由傳感器估計存在誤差。比如機械臂視覺定位的物體坐標可能偏差1-2厘米而HER會把“實際到達位置”當目標來學習這等于在訓練時引入了系統(tǒng)性偏置。我的做法是先在仿真中對觀測和goal加高斯噪聲讓噪聲幅度和真機傳感器一致然后再訓練。同時部署階段加一個位姿校正環(huán)節(jié)當策略接近目標區(qū)域后切換到視覺伺服。HER負責粗放式到達視覺伺服負責精確式對齊兩個階段參數(shù)不共享效果比單靠HER精細到位穩(wěn)定得多。5. HER的進階方向與擴展思路5.1 從終點回放走向子目標生成如果任務特別長比如多階段的廚房操作HER的final策略就力不從心因為最終狀態(tài)距離中間態(tài)太遠偽目標缺乏鏈條感。現(xiàn)在更前沿的做法是自動生成子目標序列比如Curriculum HindsightCHER它會在訓練過程中調(diào)整偽目標的難度從容易達成的中間態(tài)逐步過渡到更難的目標?;蛘哂肰IME這類互信息方法主動選擇“有信息量”的狀態(tài)作為偽目標減少低效回放。如果你只是業(yè)務項目不需要追求論文創(chuàng)新建議先用final和future兩種策略組合在同一個episode里按比例混合采樣。比如每個transition同時生成1條final偽目標和3條future偽目標。兩個目標相互補充長任務和短任務都兼顧訓練穩(wěn)定度比單一策略好。5.2 HER的思想也能用于模仿學習和逆強化學習HER并不僅限強化學習。在模仿學習里如果演示數(shù)據(jù)不夠可以從失敗軌跡中提取“達成某狀態(tài)”的經(jīng)驗生成偽演示來擴充數(shù)據(jù)集這本質(zhì)是Hindsight Imitation Learning。逆強化學習里HER的偽目標可以提供更多可能的reward候選加快獎勵函數(shù)的推斷。我現(xiàn)在做機器人操作任務時會把HER當成一個“數(shù)據(jù)擴增器”而不只是一個RL插件。哪怕最終算法不用RL比如直接學一個行為克隆模型我也會在預處理階段把近成功軌跡進行Hindsight偽目標擴增模型學到不同目標相對輸入的泛化性明顯提升。這一招在工業(yè)項目的視覺抓取分揀里驗證過泛化性能提升約15%到30%。5.3 工程層面的一些建議工程實現(xiàn)上HER的數(shù)據(jù)管道很容易成為瓶頸。因為每條transition要復制K份數(shù)據(jù)量暴漲如果用Python里普通列表存儲訓練到一半內(nèi)存容易爆。我建議在項目早期就使用支持高效采樣的數(shù)據(jù)結(jié)構比如環(huán)形緩沖區(qū)加numpy數(shù)組存儲把transition編碼成固定長度向量偽目標在采樣時動態(tài)生成而不是物理復制一遍存入buffer。這樣既省內(nèi)存又能在訓練中靈活調(diào)整采樣策略。訓練可視化方面除了記錄成功率之外還要記錄“偽目標經(jīng)驗中正樣本比例”和“偽目標目標與真實目標的距離分布”。這兩個量能直觀反映HER是否在有效工作。如果正樣本比例持續(xù)提高說明策略在進步如果距離分布一直集中在很遠的地方說明偽目標采樣策略可能需要調(diào)整或者狀態(tài)空間目標覆蓋不夠。6. 寫在最后的一點個人體會經(jīng)過多個項目反復使用后我的體會是HER并不復雜但它要求你對“目標在狀態(tài)空間中如何表達”有清晰的認識。很多時候效果不好不是因為HER不行而是因為目標空間設計得不夠好。目標是指數(shù)坐標還是類別標簽是否連續(xù)是否可以從當前狀態(tài)直接推導出來這些設計決策往往比算法選擇更影響最終結(jié)果。我自己現(xiàn)在會在實現(xiàn)HER之前先花時間畫一張圖和表格把所有可能的“事后目標”來源列出來評估它們的信息量和難度分布再決定具體怎么落地。這個過程雖然看起來簡單但能省下后面無數(shù)調(diào)參時間。