指南)
1. 項目概述別讓“事后諸葛亮”背鍋它其實是強化學習的救星很多人看到 hindsight 這個詞第一反應是“后見之明”、“馬后炮”常帶點貶義。但在強化學習這塊hindsight 恰恰是個寶貝——它對應的技術叫hindsight relabeling后見之明經驗回放專門用來治稀疏獎勵問題。我最早接觸它是在做機器人抓取任務時智能體試了大半天成功率還是零整個訓練基本就是“瞎子摸象”。后來把 hindsight relabeling 接進去訓練曲線才開始有了像樣的上升趨勢??梢哉f這個思路幫我省下了至少一個月的調參時間。這篇內容適合誰看正在做goal-conditioned RL目標條件強化學習、被稀疏獎勵坑得滿頭包的人或者你只是想搞清楚 HERHindsight Experience Replay到底怎么work、怎么復現都可以參考。我會從最核心的思路講到可落地的實現細節(jié)再到我實際踩過的坑盡量把每個“為什么”都講清楚。hindsight relabeling 解決的核心問題一句話就能概括在目標任務上失敗的經驗放到另一個更簡單的目標上其實是一次完美的成功。這個“另一個目標”就是我們事后看到的真實終點。好比學生考完試對著答案發(fā)現自己做錯了但這道題本身也是知識點的訓練——你重新調整目標把“考高分”換成“把這道題搞懂”那剛才的失敗就變成了寶貴的學習樣本。強化學習也一樣拿失敗經驗換個目標重新學習往往比硬剛原目標高效得多。2. 核心思路拆解為什么稀疏獎勵會讓強化學習寸步難行2.1 先從問題本身說起稀疏獎勵到底難在哪做強化學習的人都清楚reward 設計是個玄學。幸運的是很多任務能設計出稠密獎勵比如跑步有速度獎勵、機械臂有距離獎勵。但現實里大量任務沒法這么做——拿“把方塊推到目標位置”來說你可以設計“離目標越近獎勵越高”可一旦目標換成一幅復雜裝配圖距離函數根本寫不出來。這時候只能用稀疏獎勵成功給 1失敗給 0。稀疏獎勵帶來的問題是探索極其低效。智能體隨機探索時要碰巧做出一個能獲得正獎勵的動作概率低到離譜。沒有正獎勵policy 就得不到任何有意義的梯度最終策略會退化到隨機游走。形象點說你在大草原上找一枚丟了的戒指找對了方向沒有任何反饋只有踩到戒指才算成功——你大概率永遠找不到。常見解決辦法有三類。第一類是reward shaping人工構造稠密獎勵但任務復雜時根本構造不出來而且設計不好會引入局部最優(yōu)。第二類是curriculum learning從簡單任務開始逐漸變難但需要人為設計課程且課程進度不易控制。第三類是curiosity-driven exploration讓智能體因為“好奇心”去探索新狀態(tài)但在目標條件任務里容易分心——到處亂逛就是不干正事。hindsight relabeling 走的是另一條路不改變環(huán)境不改變獎勵直接改造 replay buffer 里的數據。它認為“失敗的經驗不是沒用而是目標定錯了”。這讓我當時眼前一亮因為它把問題從“如何探索得更聰明”變成了“如何利用已有數據更聰明”后者顯然更可控。2.2 Hindsight 的核心假設從失敗里提取“隱式成功”hindsight relabeling 的關鍵動作是當一條經驗transition在原始目標 g 上失敗時把它重新標注成在另一個目標 g 上的成功經驗。這個 g 通常是這條經驗結束后智能體實際到達的狀態(tài)。這樣一來同一段軌跡就有了雙重身份對原目標是失敗對新目標是成功。policy 能從新目標里學到“這個動作序列能夠完成 g”這是實打實的正樣本。它的核心假設是目標空間存在某種連續(xù)性或可遷移性學會把物體推到位置 A會幫助你學會推到位置 B學會抓取某個杯子會幫助你學習抓取另一個杯子。很多操作任務天然滿足這個性質所以效果出奇地好。但如果目標任務之間毫無相似性比如“開門”和“倒水”這種完全不同的操作HER 的收益就很有限。還有一個非常重要的點hindsight 必須配合 off-policy 算法使用。因為 relabeling 本質上是改了 reward 和 goal生成這條經驗時的行為和現在的 policy 已經不是同一個分布了只能用 off-policy 算法從 replay buffer 里反復學習。我當時用的是DDPG HER的組合也有人用 SAC HER都可以。on-policy 算法如 PPO基本與 HER 無緣道理就在這里。2.3 為什么選擇 hindsight 而不是別的方案單看思路有人會問這不會讓目標變得太簡單嗎會不會學偏我也糾結過這個問題。實際用下來發(fā)現只要控制好“重標注的比例”和“新目標的選擇策略”偏不偏其實是可控的。對比 reward shapingHER 的顯著優(yōu)勢是不需要任何環(huán)境先驗知識不需要你手動設計獎勵函數省掉一大塊人工成本。對比 curriculum learningHER 是“自動生成課程”——從簡單目標開始離終點近的狀態(tài)逐步逼近真實目標原本想完成的目標省去了人為編排課程的麻煩。對比 curiosityHER 直接利用真實經驗不引入額外探索噪聲訓練更穩(wěn)定。但 HER 也不是銀彈。我后面做機械臂任務時發(fā)現如果目標空間維度特別高比如圖像級目標或者目標超出智能體當前能力范圍太多HER 的重標注目標會嚴重偏離原始任務分布訓練反而會變得不穩(wěn)定。所以實戰(zhàn)中我一般把 HER 作為基礎框架再疊加其他策略比如輔助獎勵、狀態(tài)歸一化來穩(wěn)住訓練。3. 核心實現細節(jié)與實操要點手把手拆解 HER 的每個環(huán)節(jié)3.1 完整算法流程從采樣到重標注的七步走一個標準的 HER 訓練循環(huán)大概是這個樣子。我以 DDPG 結構為例換 SAC 也一樣核心思想不變從環(huán)境中采樣一批經驗每條經驗包括狀態(tài) obs、動作 act、獎勵 reward、下一狀態(tài) next_obs、完成標志 done、原始目標 goal g。把原始經驗存入 replay buffer同時記錄這條軌跡的序號。訓練更新時從 replay buffer 里隨機抽出一個 batch但每條經驗不是直接用來計算 loss而是有概率被“重標注”。對選中的經驗設定一個新目標 g。常用策略是從這條軌跡后續(xù)的未來狀態(tài)中隨機選一個狀態(tài)future strategy或者用軌跡最終狀態(tài)final state甚至直接隨機采一個已經達到過的狀態(tài)。根據新目標 g重新計算這條經驗的獎勵 reward R(s, a, s, g) 和 done 標志obs 和 action 不變。把重標注后的目標 g 也拼進 observation 里形成新的輸入向量交給 actor 和 critic 計算梯度。更新 critic 時用重標注后的目標去算 TD 誤差更新 actor 時用當前目標下的 Q 值梯度回傳。核心點在于obs 里通常拼接了 goal所以重標注不光是改 reward還要同步換掉 obs 和 next_obs 里的 goal 部分。這一步容易被忽略一旦忘了模型看到的還是舊目標獎勵又是新目標整個訓練就會邏輯錯亂。3.2 目標重標注的四種策略我用下來哪種最穩(wěn)看論文和源碼時會發(fā)現目標重標注有四種常見策略官方叫法一般叫final、episode、random、future策略做法特點我的評價final直接用整條軌跡的最終狀態(tài)作為新目標最簡單成功概率高適合短軌跡任務軌跡長了會丟中間信息episode從當前時刻所在的整個 episode 狀態(tài)里隨機挑一個簡單覆蓋范圍廣中等任務可用但可能選到太早的狀態(tài)目標太簡單random從已經見過的所有狀態(tài)里隨機挑一個覆蓋歷史分布不太推薦容易選到和目標空間無關的狀態(tài)future從當前時刻之后的未來狀態(tài)里隨機挑 k 個之一目標難度自然遞進課程學習效果最穩(wěn)尤其配合未來狀態(tài)集合采樣我用下來最順手的是future 策略尤其配合一個參數future_k。做法是這條軌跡從當前時間步往后數收集接下來的 k 個狀態(tài)在這 k 個狀態(tài)里隨機選一個重新作為當前經驗的目標。k 通常取 4也可以根據軌跡長度調整。之所以效果最好是因為它把“簡單目標”和“原始目標”自然過渡起來——剛開局時目標容易后段逐步逼近真實目標天然形成課程。另一個隱蔽但重要的點是不是每條經驗都要重標注。代碼里一般用一個概率值控制比如每條經驗有 80% 的概率執(zhí)行重標注剩下 20% 保留原始目標。這么做可以確保 agent 不忘記真實任務也避免重標注目標分布和真實目標分布偏差太大。3.3 獎勵函數怎么設計稀疏還是稠密的取舍HER 最純正的用法是配合稀疏獎勵這也是論文里強調的。但我在實際項目里發(fā)現如果你的任務能寫出“半稠密”獎勵混著用反而更好。這里說的“半稠密”指的是主獎勵還是稀疏的成功/失敗但額外給一個距離或進展的小信號。比如抓取任務成功給 1失敗給 0但如果手爪離物體近了額外加一個0.1 * max(0, old_dist - new_dist)這樣的小獎勵。這個信號不是為了給 agent 詳細指導而是讓訓練早期更容易有梯度。不過要小心如果這個“進展獎勵”設計得不好agent 可能會鉆空子比如故意把手靠近再遠離反復刷距離差。我的經驗是進展獎勵的系數要遠小于主獎勵確保最終目標還是“完成任務”而不是“刷進度條”。另外在某些任務里HER 和稠密獎勵其實是沖突的——因為重標注后新目標不同稠密獎勵函數在不同目標之間可能不可比較導致 Q 值估計不穩(wěn)定。所以如果你用 HER我建議初始版本老老實實做稀疏獎勵等穩(wěn)定了再考慮加輔助獎勵。3.4 網絡輸入和狀態(tài)處理Goal 怎么拼進去效果最好目標條件 RL 里policy 和 Q 函數通常輸入的是“觀測 目標”的拼接向量。以機械臂為例observation 是機械臂關節(jié)角度、末端位置、物體位置等goal 是目標位置直接把兩者 concat 起來喂給網絡是最常見的做法。但這里有一個我踩過的坑observation 里可能已經包含了當前物體位置而 goal 又是目標物體位置兩者數值范圍可能差異很大。比如關節(jié)角是弧度制范圍在 -3 到 3 之間而目標位置是米范圍在 -0.5 到 0.5 之間直接 concat 會讓網絡訓練時尺度失衡早期梯度全被大數值特征主導。解決辦法很簡單分別對 obs 和 goal 做歸一化或者至少統(tǒng)一量綱。我習慣把 obs 和 goal 都用 running mean/std 歸一化效果很顯著。還有一點如果你的任務里用了圖像觀測HER 的實現會復雜很多因為“目標”本身就是一張圖。這種情況下不能簡單 concat通常要引入目標編碼器把圖像編碼成向量再拼到 policy 輸入里。這類任務里 HER 依然有效但工程復雜度會翻倍我建議新手先別碰圖片輸入從向量狀態(tài)的仿真環(huán)境開始練手。3.5 一個可直接參考的 HER 核心偽代碼下面這段偽代碼是我在項目里服役過很久的版本經過刪減只留主干方便大家對照理解# 假設采用 DDPG HER(future) replay_buffer ReplayBuffer(capacity1_000_000) future_k 4 relabel_prob 0.8 for episode in range(total_episodes): trajectory [] # 記錄本回合所有 transition obs env.reset() goal env.goal # 原始目標 for t in range(max_steps): goal_input concat(obs, goal) action actor(goal_input) noise next_obs, reward, done, info env.step(action) # 原始經驗先存一份后面可能被重標注 trajectory.append({ obs: obs, next_obs: next_obs, action: action, reward: reward, done: done, goal: goal }) obs next_obs if done: break # 把原始軌跡放入 buffer for transition in trajectory: replay_buffer.push(transition) # 重標注對軌跡中的每條 transition 都可能做一次 for t, transition in enumerate(trajectory): if random.random() relabel_prob: continue # 采集 future 狀態(tài)池從 t1 到回合末尾的 next_obs 里隨機抽 future_states [trajectory[i][next_obs][:goal_dim] for i in range(t, len(trajectory))] if len(future_states) 0: continue # 隨機抽 future_k 個候選再隨機選一個 candidates random.sample(future_states, min(future_k, len(future_states))) new_goal random.choice(candidates) # 重算獎勵和 done new_reward compute_sparse_reward(transition[next_obs], new_goal) new_done 1.0 if new_reward success_reward else 0.0 # 替換目標后壓入 replay buffer replay_buffer.push({ obs: concat(transition[obs], new_goal), next_obs: concat(transition[next_obs], new_goal), action: transition[action], reward: new_reward, done: new_done, goal: new_goal }) # 正常 off-policy 更新 if replay_buffer.size() batch_size: for step in range(updates_per_episode): batch replay_buffer.sample(batch_size) update_actor_critic(batch)這段代碼有幾個細節(jié)值得說明。一是future_states里我只抽了next_obs中的 goal 維度的部分因為很多環(huán)境里 goal 只是狀態(tài)的一個子集。二是random.sample里用min(future_k, len(...))防止越界這個邊界問題我后面還會提到。三是重標注后的 experience 也正常參與訓練和原始 experience 混在一起不需要區(qū)分優(yōu)先級。3.6 環(huán)境選擇建議從一個簡單到你能盯住每個環(huán)節(jié)的任務開始我第一次在gym里嘗試 HER 時為了快速驗證沒有直接用 FetchReach而是先用了一個手寫的bit-flip 環(huán)境狀態(tài)是一個 n 位的 0/1 向量目標是把這個向量變成另一個目標向量每一步只能翻轉一位。這個環(huán)境極度稀疏——只有完全匹配才給獎勵但目標空間有限隨機探索也能偶爾碰到成功非常適合驗證 HER 實現是否真的有效。如果你連 bit-flip 都嫌麻煩直接在gymnasium里用FetchReach-v4這類環(huán)境也行它已經是 mujoco 移植版本狀態(tài)觀測比較干凈。但我仍然建議先從簡單環(huán)境過一遍全流程確認重標注、獎勵計算、done 邏輯都正確再上機器人環(huán)境。否則一旦訓練不收斂你根本分不清是 HER 實現問題還是環(huán)境本身太難。4. 實操過程與核心環(huán)節(jié)實現一次完整的 HER 訓練復現記錄4.1 從零到一準備環(huán)境和模型用 DDPG 還是 SAC我在實際項目中綜合下來SAC HER 的組合通常比 DDPG HER 更穩(wěn)數據利用率也很高但代碼復雜度稍高。如果只是驗證思路DDPG HER 足夠如果要上復雜任務建議直接上 SAC HER。原因很簡單SAC 自帶熵正則探索更充分配合 HER 的“經驗發(fā)掘”能讓成功率天花板更高。模型結構方面我一般用一個三層的 MLP第一層concat(obs, goal)作為輸入維度是 obs_dim goal_dim隱藏層(256, 256, 256)激活函數用 ReLU輸出層actor 輸出動作連續(xù)任務用 tanhcritic 輸出 Q 值critic 更新時我的 loss 是標準的 TD lossL ( Q(s, g, a) - (r gamma * (1 - done) * Q(s, g, a) ) )^2注意這里r是重標注后的獎勵g是重標注后的目標。actor 更新時最大化Q(s, g, a)其中輸入動作由 actor 輸出輸入目標用當前 batch 里的 goal可能是原始目標也可能是重標注目標取決于我們采樣到哪條經驗。4.2 訓練參數與超參數設置貼一份我常用的配置超參數我貼一份自己跑通的配置環(huán)境是FetchReach-v4機械臂末端到達目標位置。這個環(huán)境目標維度是 3狀態(tài)維度大概 10 左右動作維度 4非常適合先跑通流程超參數數值說明replay buffer 容量1_000_000要足夠大HER 對 buffer 需求很高batch size256我用 256穩(wěn)定性和顯存占用平衡gamma0.98目標條件任務不需要太大太大容易震蕩actor / critic 學習率1e-3 / 1e-3用 Adam同步衰減tau軟更新0.05不同于默認的 0.005我調大了一些更新更快每回合更新次數40一個 episode 結束后更新 40 次梯度future_k4future 策略采樣范圍relabel_prob0.8重標注概率探索噪聲OU Noise 或 Gaussian 0.1早期大噪聲后期衰減強調一下 tau 這個參數。很多人直接抄 DDPG 默認的 0.005目標網絡更新太慢配合 HER 這種數據效率極高的方法會顯得訓練特別慢。我調到 0.05 之后訓練明顯更跟手了。當然調太大也會不穩(wěn)定建議在 0.01 到 0.1 之間做個小掃描。4.3 訓練效果對比HER 到底能把成功率拉到多高我在相同環(huán)境、相同預算下跑過一組對比純 DDPG 稀疏獎勵跑了 80 個 epoch成功率幾乎為 0只能靠運氣偶爾碰到目標然后馬上又忘掉。DDPG HERfinal 策略成功率能到 50% 左右但波動很大有時一個 epoch 能到 70%下一個 epoch 又掉回 20%。DDPG HERfuture 策略成功率穩(wěn)步上升80 個 epoch 時能達到 85% 以上波動也小很多。SAC HERfuture 策略同樣的 epoch 數成功率能到 90% 以上而且樣本效率略高。表里的“成功率”不是測試時的貪心成功率而是訓練過程中的評估成功率評估時不加噪聲。我見過很多人測試時用隨機動作去模擬訓練過程這是錯的——評估一定要用確定性動作否則噪聲會影響你的判斷。另外我強烈建議在訓練過程中定期保存 checkpoint每 5 個 epoch 存一次。HER 訓練極容易在后期出現“震蕩性遺忘”就是明明已經學會 80% 成功率突然某個 epoch 又跌回 30%。如果有 checkpoint可以回溯到之前好的權重而不是從頭再來。4.4 一個容易被忽略的實現細節(jié)狀態(tài)歸一化與目標縮放的先后順序前面提到要歸一化 obs 和 goal這里再細化一下。我的做法是先收集一些隨機探索數據算出各維度的 mean 和 std然后對 obs 和 goal 分別歸一化。但是有個先后順序的問題如果你要把 goal 從狀態(tài)空間里拆出來歸一化一定要保證 obs 里沒有被歸一化后的 goal 混著。否則同樣是“目標位置”這個信息一處歸一化一處不歸一化模型會學到混亂的特征。在gymnasium的 Fetch 類環(huán)境里observation是完整狀態(tài)achieved_goal和desired_goal是單獨字段。我的處理方法是只拼obs不包含 goal 部分和desired_goal的歸一化向量。當重標注時新的desired_goal是從achieved_goal里采樣得到的也要走同一套歸一化參數。這個細節(jié)看起來小但直接影響收斂速度。我試過不歸一化直接拼訓練曲線跟心電圖一樣歸一化之后曲線才變成正常的上坡形態(tài)。如果你的環(huán)境狀態(tài)本身就是 0 到 1 的連續(xù)值歸一化可以省掉但只要現實到機器人任務幾乎必須做。4.5 延伸一步從 HER 到 HIRhindsight 思想在上游指令數據清洗中的應用既然是“hindsight”標題我順便擴展一個方向Hindsight Instruction RelabelingHIR很多人也叫 LLM 版的 hindsight。它把 HER 的思想搬到了指令微調數據上。傳統(tǒng)指令微調需要人工寫“輸入-輸出”對但自動生成數據時經常出現模型答非所問、輸出和指令不匹配的情況。HIR 的思路是既然模型給了這個輸出那就根據輸出反推一個指令再把“指令 輸出”作為新樣本喂給模型。具體操作上拿一個 LLM比如 GPT-4 或開源模型給定原始錯誤樣本的輸入輸出讓它用幾句話分析“這段輸出實際上回答了什么問題”再生成一條符合該輸出的新指令然后組合成新的訓練對。這和 HER 的 relabeling 完全同構失敗樣本被改寫成成功樣本目標空間從“原始指令”重標到“模型實際完成的問題”。在清洗帶噪自動標注數據時這個思路很有用相當于自動把低質量樣本“救活”。不過要提醒的是HIR 會引入“模型擅長什么就說什么”的自證偏差如果全部重標注可能讓模型只學會自己偏好的輸出模式。所以我一般控制重標注比例只對一小部分樣本做改寫當作數據增強手段而不是主數據來源。這和 HER 里relabel_prob不能設成 1 是一個道理。5. 常見問題與排查技巧實錄我在 HER 項目里踩過的坑5.1 訓練不上升先別急著加網絡復雜度去查這三個地方我在多個項目里碰到過 HER 訓練曲線長時間不動的現象排到最后大多不是算法問題而是三個低級錯誤reward 計算里用的是 obs 而不是 next_obs。后來才發(fā)現“到達目標”這個判斷應該用動作執(zhí)行后的下一狀態(tài)而不是動作執(zhí)行前的狀態(tài)。寫成reward(s, a, s, g)而不是reward(s, g)這個是最典型的 ER 錯誤。done 標志和 reward 沒對齊。有的版本稀疏獎勵成功給 1但 done 仍為 0或者反過來。需要保證“成功即終止”否則 Q 值的 bootstrapping 會污染。goal 沒有在新經驗里同步替換。正如前面說的只換了 reward沒換 obs/goal等于教模型對著舊目標學新答案。排查方法也很直接在訓練前寫一個 check 腳本手動構造一條已知 transition跑一遍 relabel 邏輯打印新舊 goal、reward、done 是否正常。這個 10 分鐘就能寫完的腳本能幫你省下一整天的 debug 時間。5.2 訓練后期震蕩和遺忘HER 不是一錘子買賣要配好“保鮮”機制HER 訓練到中后期我經常遇到“成功率上去了又掉下來”的情況。一開始以為是學習率太大后來發(fā)現更核心的問題是重標注目標分布和真實目標分布偏差變大。前期 agent 啥也不會重標注目標大多離真實目標很遠訓練還算穩(wěn)后期 agent 學得不錯重標注目標開始集中于真實目標附近但真實目標本身仍有一定比例隨機探索失敗樣本兩批數據在分布上打架導致策略頻繁震蕩。我的應對方案有三個降低relabel_prob到 0.50.6讓更多原始目標樣本占主導。降低后期學習率比如用 cosine schedule讓策略不要劇烈更新。定期凍結目標網絡更新比例讓 critic 的估計穩(wěn)住了actor 再跟著變。這三個手段疊加起來“震蕩遺忘”基本可以被壓制住。但說句實在話HER 并不是為了徹底解決穩(wěn)定性而生的它更像“樣本效率加速器”。如果任務本身難到超出容量再穩(wěn)也沒用。5.3 索引越界和維度不匹配最容易被模糊錯誤掩蓋的 bugHER 實現里字符串比較多的代碼在“從未來狀態(tài)中采樣”這里極易出現索引越界。比如軌跡長度為 T你遍歷到 t T-1 時未來狀態(tài)集合只有當前狀態(tài)本身random.sample的 k 可能會超過集合長度。代碼里我習慣用min(future_k, len(future_states))但這只是第一層保險第二層保險是if len(future_states) 0: continue防止某些環(huán)境終止狀態(tài)突然截斷導致空集合。維度不匹配是個隱性 bug通常報錯發(fā)生在concat(obs, goal)時但有時候兩個維度剛好相同程序不報錯只是語義錯亂。比如 obs 可能是 10 維goal 也是 10 維obs 里已經包含了當前物體位置goal 是目標位置如果你不小心把 obs 整體當作新目標來替換網絡的輸入維度沒變但語義完全錯位。訓練曲線會表現為“有點學習跡象但永遠接近不了真實目標”。排查時我建議打印一段樣本肉眼檢查 obs 和 goal 是否對得上號。5.4 收益不明顯可能是任務本身不適合 HER不是你實現錯了最后說一點經驗之談。HER 不是萬能的它適用的任務有一個共同特點任務的目標是可擴展、可達或部分可排序的。比如“推物體到任意位置”任意位置都是潛在目標“學到把物體推到 A”確實有助于推到 B。但如果任務是“擰開瓶蓋”目標狀態(tài)只有兩種——擰開和沒擰開中間不存在“把瓶蓋擰到 30 度”這種目標連續(xù)性HER 的重標注收益就很弱。另外我也試過在多智能體協(xié)作任務里用 HER效果一般。原因是重標注會干擾其他智能體的觀察導致訓練不穩(wěn)定。所以先判斷任務是否具備目標空間的可復用性再決定要不要用 HER。怎么判斷簡單粗暴的實驗方法是用一個隨機的 state 作為目標試跑幾次看模型能不能快速學到“到達隨機狀態(tài)”的能力。如果能HER 大概率會有效如果連隨機目標都學不會HER 也很難救場。5.5 常見問題速查表癥狀可能原因解決方案訓練曲線完全不動reward 用錯狀態(tài)done 邏輯錯goal 未同步替換寫 relabel 單測逐字段打印檢查訓練后期成功率暴跌目標分布沖突學習率過大調低 relabel_prob學習率 schedule軟更新減慢目標明明很近但學不會維度未歸一化obs 和 goal 尺度差異大分別歸一化統(tǒng)一量綱采樣時報索引錯誤future 集合為空或長度不足用 min(k, len) 空集合跳過成功率有時高有時低replay buffer 太小經驗被覆蓋太快增大 buffer 容量使用 on-policy 算法配合 HER理論不兼容切換 DDPG / SAC 等 off-policy 算法5.6 調參優(yōu)先級參考我總結一下調參的先后順序新手照著做能少走彎路先確認代碼邏輯正確尤其 relabel 后的 reward、done、goal 是否一致。再調 reward 的稀疏/稠密設計不要一上來就加一堆輔助獎勵。然后調relabel_prob和future_k這兩個參數決定重標注分布。最后調學習率、tau、batch size這些是錦上添花。如果訓練還上不去檢查歸一化和網絡容量。如果前面的邏輯全對relabel_prob調到 0.8、future_k調到 4訓練曲線還不上漲那大概率不是 HER 的問題而是任務本身不夠適合這個方法。5.7 我的經驗總結與一個小技巧hindsight 這個思想除了強化學習我后來也應用在了數據分析、模型評估里——很多“失敗”的模型輸出換個評價口徑其實就是高價值樣本?;剡^頭看它教會我最重要的一件事不要輕易丟棄看起來失敗的數據換個目標重新看它們往往是寶藏。做實驗遇到瓶頸時我總會提醒自己先別質疑模型先看看是不是“目標定義”出了問題。最后分享一個小技巧如果你想快速驗證 HER 的收益不要一上來就對比最終成功率而是先對比首次正獎勵出現的時間。HER 顯著的優(yōu)勢就是讓第一次獎勵提前出現這個信號比“最終成功率”更直觀也能幫你迅速判斷實現是否正確。只要第一次正獎勵出現在合理時間內后面穩(wěn)住訓練參數成功率通常只是時間和算力的問題。