【智谱清言-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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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,根本…