【智譜清言-GLM-4.5】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt

我是機器人RL方向的博士生正在學習ManiSkill,在學習時我嘗試使用相同命令訓練同一個任務,但是我發現最終的 success_once 指標并不是相同的,我感到十分焦慮,
我使用的命令如下:

python sac.py --env_id="StackCube-v1" \--num_envs=32 --utd=0.5 --buffer_size=500_000 \--total_timesteps=500_000 --eval_freq=50_000 \--control-mode="pd_ee_delta_pos"

I conducted two independent training runs with the same setup. Here is a comparison of the success_once metric at different stages:

Run 1:

success_once: 0.00, return: 2.59: 0%
...
success_once: 0.88, return: 39.84: 90%
success_once: 0.88, return: 39.84: : 500032lt [1:04:37, 132.17lt/s]

Run 2:

success_once: 0.00, return: 2.59: 0%
...
success_once: 0.31, return: 36.46: 90%
success_once: 0.31, return: 36.46: : 500032lt [43:38, 199.09lt/s]

The final success rate differs drastically (0.88 vs. 0.31).
請您瀏覽 this codebase,尤其是 sac.py,請幫我看看是什么原因導致了結果不一致呢?

2. GLM-4.5

作為機器人RL方向的博士生,您遇到的訓練結果不一致問題在強化學習中非常常見,尤其是在涉及隨機性較高的任務中。讓我分析一下ManiSkill的SAC實現中可能導致這種差異的關鍵因素,并提供解決方案。

主要原因分析

1. 隨機種子未固定(最可能原因)
# 在sac.py中檢查是否有隨機種子設置
if seed is None:seed = np.random.randint(0, 2**32 - 1)  # 每次運行生成不同種子
  • 問題:代碼中默認沒有設置固定隨機種子,導致每次運行使用不同的初始化
  • 影響:網絡初始化、環境初始化、重放緩沖區采樣都不同步
2. 環境隨機性
# 環境創建部分
env = gym.make(env_id, ...)
env.reset()  # 物體初始位置隨機
  • 問題:StackCube任務中物體初始位置、目標位置存在隨機性
  • 影響:即使相同策略,不同初始狀態會導致不同結果
3. 探索噪聲
# 動作采樣部分
action = self.actor(state)  # 輸出均值和標準差
action = action + self.log_std.exp() * torch.randn_like(action)  # 添加噪聲
  • 問題:SAC使用高斯噪聲進行探索,噪聲大小受log_std影響
  • 影響:不同運行中探索模式不同,導致策略收斂路徑不同
4. 重放緩沖區采樣順序
# 經驗采樣
batch = self.buffer.sample(batch_size)
  • 問題:緩沖區隨機采樣導致每次訓練批次不同
  • 影響:梯度更新方向不同,影響收斂軌跡
5. 并行環境異步性
# 并行環境設置
envs = gym.vector.AsyncVectorEnv([...])
  • 問題:32個并行環境執行時序不同
  • 影響:環境交互順序不同,經驗數據分布不同

解決方案

1. 固定隨機種子(最關鍵)
# 修改命令添加隨機種子
python sac.py --env_id="StackCube-v1" \--num_envs=32 --utd=0.5 --buffer_size=500_000 \--total_timesteps=500_000 --eval_freq=50_000 \--control-mode="pd_ee_delta_pos" \--seed=42  # 添加固定種子
2. 在sac.py中實現種子控制
# 在main函數開始添加
def main():parser = argparse.ArgumentParser()parser.add_argument("--seed", type=int, default=42)  # 添加參數args = parser.parse_args()# 設置所有隨機種子np.random.seed(args.seed)torch.manual_seed(args.seed)torch.cuda.manual_seed_all(args.seed)random.seed(args.seed)# 為每個環境設置不同但可復現的種子env_seeds = [args.seed + i for i in range(args.num_envs)]
3. 環境確定性設置
# 創建環境時添加確定性選項
env = gym.make(env_id, options={"deterministic_reset": True})
4. 增加評估穩定性
# 評估時增加多次測試
def evaluate_policy():success_rates = []for _ in range(10):  # 評估10次取平均success = evaluate_single_episode()success_rates.append(success)return np.mean(success_rates)
5. 監控訓練穩定性
# 添加滑動平均監控
window_size = 10
success_history = []
def log_success(success):success_history.append(success)if len(success_history) > window_size:success_history.pop(0)avg_success = np.mean(success_history)print(f"Current success: {success:.2f}, Avg (last {window_size}): {avg_success:.2f}")

為什么即使相同設置仍有差異?

即使固定了隨機種子,仍可能觀察到輕微差異,原因包括:

  1. 浮點數精度:不同硬件/PyTorch版本可能導致微小數值差異
  2. 環境時間步:并行環境執行時序差異
  3. 系統負載:訓練速度不同導致經驗收集節奏不同

實驗建議

  1. 多次運行取平均
for seed in 42 43 44 45 46; dopython sac.py --seed=$seed [其他參數]
done
  1. 分析收斂曲線
# 記錄訓練過程中的success_once
with open(f"success_history_seed{args.seed}.csv", "w") as f:f.write("step,success\n")for step, success in zip(steps, success_list):f.write(f"{step},{success}\n")
  1. 對比策略相似性
# 保存最終策略
torch.save(agent.actor.state_dict(), f"policy_seed{args.seed}.pt")
# 加載不同策略計算相似度
policy1 = load_policy("policy_seed42.pt")
policy2 = load_policy("policy_seed43.pt")
similarity = cosine_similarity(policy1.state_dict(), policy2.state_dict())

總結

您遇到的結果不一致主要源于隨機種子未固定環境內在隨機性。通過添加固定隨機種子、增加評估次數和監控訓練穩定性,可以顯著提高結果可復現性。作為博士生,建議您:

  1. 將隨機種子控制作為實驗標準流程
  2. 記錄完整的訓練日志和保存模型
  3. 使用統計方法(如多次運行平均)報告最終結果
  4. 分析收斂曲線而非單一最終指標
    這些實踐不僅能解決當前問題,也是強化學習研究中的標準方法,有助于您后續研究的嚴謹性和可復現性。

3. 審閱筆記

3.1 方案1:固定隨機種子完全沒有必要

因為sac.py#L32默認就已經對seed設置了默認初始值;

3.2 方案2:在sac.py中實現種子控制并沒有告知這個env_seeds變量如何使用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95716.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 8.0 主從復制原理分析與實戰

MySQL 8.0 主從復制原理分析與實戰半同步復制設計理念:復制狀態機——幾乎所有的分布式存儲都是這么復制數據的基于全局事務標識符(GTID)復制GTID工作原理多主模式多主模式部署示例課程目標: MySQL 復制(Replication&a…

[UT]記錄case中seq.start(sequencer)的位置變化帶來的執行行為的變化

現象: 代碼選擇打開57行,注釋掉60行執行,結果58行不會打印。 代碼選擇打開60行,注釋57行執行,結果58行正常打印。 sequence的執行需要時間!!! SV中代碼57行切換到60行的區別&#xf…

利用keytool實現https協議(生成自簽名證書)

利用keytool實現https協議(生成自簽名證書)什么是https協議?https(安全超文本傳輸協議)是 HTTP 的安全版本,通過 SSL/TLS 加密技術,在客戶端(如瀏覽器)和服務器之間建立加…

拆解 AI 大模型 “思考” 邏輯:從參數訓練到語義理解的核心鏈路

一、引言:揭開 AI 大模型 “思考” 的神秘面紗?日常生活中的 AI 大模型 “思考” 場景呈現(如 ChatGPT 對話、AI 寫作輔助、智能客服應答)?提出核心問題:看似具備 “思考” 能力的 AI 大模型,其背后的運作邏輯究竟是…

element plus 使用細節 (二)

接上一篇文章: element plus 使用細節 最近菜鳥忙于系統開發,都沒時間總結項目中使用的問題,幸好還是在空閑之余總結了一點(后續也會來補充),希望能給大家帶來幫助! 文章目錄table fixed 的 v…

【機器學習學習筆記】numpy基礎2

零基礎小白的 NumPy 入門指南如果你想用電競(打游戲)的思路理解編程:Python 是基礎操作鍵位,而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務,比如算游戲里的傷害公式、地圖坐標&#x…

從自動化到智能化:家具廠智能化產線需求與解決方案解析

伴隨著工業4.0浪潮和智能制造技術的成熟,家具行業正逐步從傳統的自動化生產邁向智能化生產。智能化產線的構建不僅可以提升生產效率,還能滿足個性化定制和柔性制造的需求。本文以某家具廠為例,詳細解析智能化產線的核心需求,并提出…

macOS下基于Qt/C++的OpenGL開發環境的搭建

系統配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt開發環境搭建 Qt Creator的下載與安裝 在Qt官網的下載頁面上下載,即Download Qt Online Installer for macOS。下載完成就得到一個文件名類似于qt-online-installer-macOS-x64-x.y.z.dmg的安裝包。 下一步 …

當液態玻璃計劃遭遇反叛者:一場 iOS 26 界面的暗戰

引子 在硅谷的地下代碼俱樂部里,流傳著一個關于 “液態玻璃” 的傳說 —— 那是 Apple 秘密研發的界面改造計劃,如同電影《變臉》中那張能改變命運的面具,一旦啟用,所有 App 都將被迫換上流光溢彩的新面孔。 而今天,我…

探究Linux系統的SSL/TLS證書機制

一、SSL/TLS證書的基本概念 1.1 SSL/TLS協議簡介 SSL/TLS是一種加密協議,旨在為網絡通信提供機密性、完整性和身份驗證。它廣泛應用于HTTPS網站、電子郵件服務、VPN以及其他需要安全通信的場景。SSL(安全套接字層)是TLS(傳輸層安全…

python和java爬蟲優劣對比

Python和Java作為爬蟲開發的兩大主流語言,核心差異源于語法特性、生態工具鏈、性能表現的不同,其優勢與劣勢需結合具體場景(如開發效率、爬取規模、反爬復雜度)判斷。以下從 優勢、劣勢、適用場景 三個維度展開對比,幫…

Unity 槍械紅點瞄準器計算

今天突然別人問我紅點瞄準器在鏡子上如何計算,之前的吃雞項目做過不記得,今天寫個小用例整理下。 主體思想記得是目標位置到眼睛穿過紅點瞄準器獲取當前點的位置就可以。應該是這樣吧,:) 武器測試結構 首先整個結構&am…

題解 洛谷P13778 「o.OI R2」=+#-

文章目錄題解代碼居然沒有題解?我來寫一下我的抽象做法。 題解 手玩一下,隨便畫個他信心的折線圖,如下: 可以發現,如果我們知道終止節點,那么我們就可以知道中間有多少個上升長度。(因為它只能…

RTSP流端口占用詳解:TCP模式與UDP模式的對比

在音視頻傳輸協議中,RTSP(Real-Time Streaming Protocol,實時流傳輸協議)被廣泛用于點播、直播、監控等場景。開發者在實際部署或調試時,常常會遇到一個問題:一路 RTSP 流到底占用多少個端口? 這…

websocket的key和accept分別是多少個字節

WebSocket的Sec-WebSocket-Key是24字節(192位)的Base64編碼字符串,解碼后為16字節(128位)的原始隨機數據;Sec-WebSocket-Accept是28字節(224位)的Base64編碼字符串,解碼后…

單片機開發----一個簡單的Boot

文章目錄一、設計思路**整體框架設計****各文件/模塊功能解析**1. main.c(主程序入口,核心控制)2. 隱含的核心模塊(框架中未展示但必備)**設計亮點**二、代碼bootloader.hbootloader.cflash.cmain.c一、設計思路 整體…

Day2p2 夏暮客的Python之路

day2p2 The Hard Way to learn Python 文章目錄day2p2 The Hard Way to learn Python前言一、提問和提示1.1 關于raw_input()1.2 關于input()二、參數、解包、變量2.1 解讀參數2.2 解讀解包2.3 解讀變量2.4 實例2.5 模塊和功能2.6 練習前言 author:SummerEnd date…

【C++設計模式】第二篇:策略模式(Strategy)--從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析

C設計模式系列文章目錄 【第一篇】C單例模式–懶漢與餓漢以及線程安全 【C設計模式】第二篇:策略模式(Strategy)--從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析一、策略模式的基本介紹1.…

四十歲編程:熱愛、沉淀與行業的真相-優雅草卓伊凡

四十歲編程:熱愛、沉淀與行業的真相-優雅草卓伊凡今日卓伊凡收到一個問題:「如何看待40歲還在擼代碼的程序員?」這讓我不禁思考:從何時起,年齡成了程序員職業中的敏感詞?在互聯網的某些角落,彌漫…

pycharm解釋器使用anaconda建立的虛擬環境里面的python,無需系統里面安裝python。

Anaconda建立的虛擬環境可以在虛擬環境里設置任何的python版本,pycharm解釋器使用anaconda建立的虛擬環境里面的python,比如anaconda建立的虛擬環境1、虛擬環境2,pycharm解釋器使用anaconda建立虛擬環境1也可以使用虛擬環境2,根本…