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