预训练如何革新空间强化学习:从表征学习到技能迁移的工程实践
1. 从“从零训练”到“预训练”为什么空间强化学习需要新范式如果你在机器人、自动驾驶或者游戏AI领域摸爬滚打过一定对强化学习Reinforcement Learning, RL又爱又恨。爱的是它能让智能体Agent通过与环境的交互从零开始学会完成复杂任务比如让机械臂抓取任意物体或者让游戏角色通关。恨的是这个过程太“烧”了——烧时间、烧算力、烧耐心。一个典型的深度强化学习任务动辄需要数百万甚至上千万步的环境交互在物理仿真中可能意味着数天到数周的GPU时间而在真实机器人上这几乎是不可能完成的任务。问题的核心在于“样本效率”Sample Efficiency。传统强化学习就像一个刚出生的婴儿对世界一无所知必须通过大量试错Exploration来建立对环境的认知模型状态转移、奖励函数。在复杂、高维的连续状态-动作空间比如机械臂的关节角度和速度、摄像头图像中这种盲目的探索效率极低。智能体大部分时间都在“乱动”偶尔才能撞上一次成功获得一点微弱的奖励信号。这就引出了“预训练”Pre-training的思想。这个在计算机视觉CV和自然语言处理NLP领域已经被证明是“降维打击”的神器能否拯救强化学习呢答案是肯定的但路径更为复杂。在CV/NLP中预训练通常是在大规模无标注数据如ImageNet、海量文本上学习通用的特征表示。而在强化学习中我们预训练的目标是什么是让智能体在上岗解决目标任务之前先拥有一些“常识”或“基础技能”。预训练空间强化学习正是这一思想在具身智能Embodied AI或空间决策问题上的具体实践。这里的“空间”强调智能体所处的环境是物理的或仿真的三维空间其状态如位置、姿态、传感器读数和动作如移动、旋转、抓取都具有明确的空间几何意义。预训练的目标就是让智能体在投入昂贵的任务特定训练之前已经对“空间”本身有了深刻的理解——比如物体的几何特性、物理交互的规律、自身运动的基本模式。我个人的体会是这就像培养一个飞行员。你不会让他直接上战斗机而是先让他在模拟器里学习空气动力学、仪表识别、基础操控预训练然后再针对空战、对地攻击等特定任务进行训练微调。预训练空间强化学习就是在构建那个通用的“飞行模拟器”。2. 预训练的核心目标为智能体注入“空间先验”那么具体要预训练什么这取决于我们希望智能体拥有什么样的“先验知识”。根据当前的研究和工程实践主要可以分为三大方向它们并非互斥而是常常结合使用。2.1 表征学习让智能体“看得懂”世界这是最直接借鉴CV领域的方法。在空间任务中状态State往往是高维的比如来自多个摄像头的RGB-D图像、激光雷达点云。原始像素或点云数据对于强化学习算法来说信息过于冗余且难以直接处理。预训练的目标学习一个编码器Encoder能够将高维的原始观测如图像 $o_t$映射到一个低维、稠密且富含语义的潜在向量Latent Vector $z_t$中。这个潜在空间应该能解耦地表示场景中的关键要素物体类别、形状、位置、姿态等。如何实现自监督学习Self-Supervised Learning这是主流方法。利用大量无标签的观测数据可以是随机采集的环境截图也可以是离线收集的机器人探索数据设计代理任务Pretext Task来训练编码器。对比学习Contrastive Learning如SimCLR、MoCo。核心思想是让同一观测的不同数据增强视图如裁剪、颜色抖动在潜在空间中靠近而与其他随机观测远离。这迫使编码器学习到对视角、光照变化鲁棒的不变特征这些特征往往是物体或场景的语义本质。重构学习Reconstruction如变分自编码器VAE。让编码器将观测压缩为潜在向量再用解码器重构出原观测。成功的重构意味着潜在向量捕获了观测的关键信息。在空间任务中可以重构深度图、分割图等以强调几何信息。时序一致性学习Temporal Consistency利用视频序列中相邻帧高度相关的特性训练编码器使得相邻帧的潜在表示也彼此接近。这有助于学习物体运动、相机运动等动态特征。利用预训练视觉模型直接使用在ImageNet等大型数据集上预训练好的ResNet、ViT等模型的中间层特征作为观测的编码。这是一种高效的“拿来主义”。虽然ImageNet特征偏向物体分类但其底层的边缘、纹理、形状特征对于许多空间任务依然是强大的基础。实践中我们常常冻结Freeze这些预训练模型的前几层只微调最后几层以适应特定任务。实操心得在机器人项目中我们混合使用了这两种策略。首先我们收集了机器人随机在场景中移动的数千张RGB-D图像。然后用MoCo v2框架训练了一个ResNet-18编码器。同时我们也加载了一个在ImageNet上预训练的ResNet-50将其特征与我们自监督训练的特征进行拼接Concatenate。实测下来这种“双流”特征输入比单一特征源的效果稳定提升约15%。关键点在于自监督学习的数据必须与你的任务域相关比如都是室内场景而ImageNet特征提供了通用的视觉先验。2.2 动态模型学习让智能体“预测未来”智能体要做出好的决策不仅要理解当前状态还要能预测行动带来的后果。这就是模型Model的作用。学习一个准确的环境动态模型Dynamics Model或世界模型World Model是提高样本效率的另一个关键。预训练的目标学习一个函数 $f$使得 $(\hat{s}_{t1}, \hat{r}_t) f(s_t, a_t)$即给定当前状态和动作预测下一个状态和即时奖励。一个学好的模型可以让智能体在“脑海”模型中进行大量试错大幅减少与真实环境的交互。如何实现离线数据收集在让智能体执行任何目标任务之前先让它或另一个脚本策略在环境中进行随机或带有简单启发式的探索收集大量的状态-动作-下一状态转移数据对 $(s_t, a_t, s_{t1}, r_t)$。这部分数据不要求完成任务只要求覆盖尽可能多的状态和动作空间。模型架构选择对于连续状态空间常使用多层感知机MLP或循环神经网络RNN/LSTM。对于图像输入则结合上述的视觉编码器形成“编码器-动态模型”的级联结构。训练目标最小化预测状态与真实状态之间的误差如均方误差MSE。对于图像状态可能需要预测在潜在空间中的误差或者使用更复杂的生成模型如VAE的Decoder来重构图像。工程挑战模型误差会累积在长时程的“想象”推演中预测会迅速偏离真实导致“梦幻破灭”Dreaming Collapse。因此在实践中我们常使用模型预测控制MPC的框架每次只利用模型进行短视距如5-10步的轨迹推演选择最优动作序列的第一个动作执行然后基于真实环境的新观测重新规划。2.3 技能/策略学习让智能体“掌握基本功”这是更高层次的预训练。我们不只预训练感知或预测模型而是直接预训练一个能完成某些基础子任务的策略Policy。这些基础技能Skills或选项Options可以像乐高积木一样被后续的高级任务调度和组合。预训练的目标学习一个策略库 ${\pi_i(a|s)}$每个策略 $\pi_i$ 都能稳健地完成一个原子技能如“移动到某个位置”、“抓握面前物体”、“推开障碍物”。如何实现技能发现Skill Discovery在无监督的情况下从探索数据中自动发现有意义的行为模式。常用方法包括变分自编码器VAE的隐空间离散化、互信息最大化等。智能体学习到的技能可能是“原地旋转”、“直线前进”等低层运动基元。分层强化学习HRL人工或半自动地定义一系列子任务并为每个子任务训练一个底层策略。例如在移动机器人导航任务中可以预训练“避障”、“沿墙走”、“门廊通过”等底层策略。模仿学习Imitation Learning如果有专家演示数据即使是不同任务的可以直接通过行为克隆BC或逆强化学习IRL来预训练一个策略使其模仿专家的基础行为模式。踩坑记录我们曾尝试用无监督技能发现方法为机械臂预训练技能。理想很丰满希望它自动学会“拾取”、“放置”、“推”等。但实际中由于奖励函数设计鼓励状态多样性的模糊性学出的技能常常是“快速抖动关节”或“以固定模式画圈”这类无意义但能最大化探索的行为。后来我们改为目标条件策略Goal-Conditioned Policy的预训练我们定义“末端执行器到达空间某点”为一系列目标并用稀疏奖励到达即1训练一个通用策略 $\pi(a|s, g)$。这个策略虽然简单但让机械臂学会了如何可靠地移动到任意指定位置这个“指向哪走到哪”的基础技能成为了后续复杂操作任务如装配的极其宝贵的先验。3. 主流技术路线对比从SimCLR到Decision Transformer预训练空间强化学习没有银弹不同技术路线适用于不同场景。下面我结合实践对比几种主流思路的优劣和适用场景。技术路线核心思想预训练输出优点缺点典型应用场景视觉表征预训练(如 SimCLR, MoCo)通过对比学习使编码器对数据增强不变学习语义特征。一个通用的视觉编码器Encoder。1. 通用性强特征可迁移到多种下游视觉任务。2. 无需任务标签数据获取容易。3. 能显著提升下游RL训练初期的稳定性。1. 学习的是静态特征对动态、交互关注不足。2. 与最终RL目标的关联是间接的可能包含冗余信息。任何以视觉为输入的RL任务初始层与动态模型、策略网络结合使用。世界模型预训练(如 Dreamer, PlaNet)学习环境的隐空间动态模型实现“在想象中训练”。一个世界模型包含编码器、动态模型、奖励预测器、解码器。1. 样本效率极高大部分训练在模型内进行。2. 能进行长时程规划适合需要前瞻性的任务。1. 模型训练复杂容易出错和不稳定。2. 模型偏差可能导致学出次优策略。3. 对计算资源要求高。游戏、仿真中的复杂顺序决策任务真实世界中可与MPC结合用于规划。离线RL预训练(如 CQL, IQL)利用大量离线数据不一定是专家数据直接预训练一个策略或价值函数。一个初步的策略Policy或价值函数Value Function。1. 直接面向决策迁移效率可能很高。2. 可以充分利用历史日志数据安全。1. 严重受限于离线数据分布数据质量要求高。2. 存在分布偏移Distribution Shift问题在微调时可能表现不佳。拥有大量历史交互数据的业务场景如推荐系统、游戏AI安全要求高的机器人任务初始化。序列模型预训练(如 Decision Transformer, Trajectory Transformer)将强化学习视为序列建模问题用Transformer等模型预测最优动作序列。一个基于历史轨迹预测动作的序列模型。1. 建模方式灵活可自然处理多模态、长程依赖。2. 在离线数据上表现优异引导性强。1. 自回归推理速度较慢不适合高频控制。2. 对大规模高质量序列数据依赖性强。需要复杂推理和长程规划的任务人机协作的轨迹预测与生成。基础策略/技能预训练(如 Goal-Conditioned RL, HRL)预训练一个能完成多种基础目标技能的策略。一个目标条件策略 $\pi(as, g)$ 或一套技能库。1. 提供的先验最直接可大幅加速下游任务。2. 技能可组合、可重用架构清晰。1. 技能的定义和获取自动或人工成本高。2. 技能之间的切换和组合策略仍需学习。如何选择我的经验是一个“分阶段、组合式”的实用主义路径第一阶段必选视觉表征预训练。无论后续用什么RL算法一个好的视觉编码器都是“基础设施”。用你的领域数据哪怕只是随机截图做一次自监督对比学习收益成本比极高。第二阶段按需选择如果你的任务规划性强、环境模型相对稳定如基于物理仿真的机器人任务优先考虑世界模型路线。如果你有大量历史交互数据哪怕是次优的离线RL是一个高起点。如果你的任务动作空间复杂、由明显子任务构成如“开门-取物-放置”那么投入资源做基础技能预训练是值得的。序列模型目前更多在学术前沿和特定领域如自动驾驶轨迹预测展示潜力工程落地需谨慎评估其推理延迟。4. 工程实践全链路从数据准备到模型部署理论很美但工程落地是另一回事。这里我以一个具体的项目为例——“让机械臂学会从杂乱箱子中抓取特定零件”——拆解预训练空间强化学习的完整工程实践链路。4.1 阶段零仿真环境搭建与数据管道构建在碰任何算法之前先把基础设施打牢。仿真环境选择我们选择了NVIDIA Isaac Sim。理由对ROS 2支持好物理仿真PhysX精度和速度平衡内置多种传感器模型且与NVIDIA的机器人学习栈如Isaac Gym深度集成。替代方案有PyBullet轻量、易用、MuJoCo精度高、贵、Gazebo生态老牌但性能一般。场景与模型在Isaac Sim中搭建一个工作台场景导入机械臂如UR5和夹爪模型并创建多种随机形状的零件模型。关键是要引入足够的领域随机化Domain Randomization零件颜色、纹理、尺寸、工作台光照、相机位置噪声等。这是保证从仿真迁移到真机Sim2Real成功的关键。数据管道Data Pipeline自动数据收集编写脚本让机械臂执行随机动作或简单的启发式策略如朝着点云中心抓取同时记录RGB-D图像、关节状态、动作、奖励如果是启发式策略可以定义简单的奖励如夹爪到目标的距离。我们收集了约50万条转移样本。数据存储使用LMDB或TFRecord格式存储而非单个文件。这能极大提高后续数据读取的I/O效率尤其是在使用多进程数据加载时。数据增强对于视觉表征预训练在线On-the-fly增强至关重要。我们使用了torchvision.transforms组合包括随机裁剪并对应调整深度值、颜色抖动、高斯模糊等。注意对于深度图像增强操作需保持几何一致性。4.2 阶段一视觉编码器预训练我们采用MoCo v2框架在收集的50万张无标签RGB图像上进行自监督预训练。# 简化版的MoCo训练核心步骤 import torch import torch.nn as nn import torchvision.models as models # 初始化编码器如ResNet-18和动量编码器 encoder_q models.resnet18(pretrainedFalse) # 查询编码器 encoder_k models.resnet18(pretrainedFalse) # 动量编码器 # 替换最后的全连接层为投影头projection head encoder_q.fc nn.Sequential(nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 128)) encoder_k.fc nn.Sequential(nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 128)) # 动量编码器参数不通过梯度更新而是通过动量平均 for param_q, param_k in zip(encoder_q.parameters(), encoder_k.parameters()): param_k.data.copy_(param_q.data) param_k.requires_grad False # 队列queue存储负样本 queue torch.randn(128, 65536) # 特征维度x队列长度 queue nn.functional.normalize(queue, dim0) # 对比损失InfoNCE criterion nn.CrossEntropyLoss() # 训练循环简化 for images, _ in dataloader: # 无标签数据 x_q, x_k augment(images) # 两种不同的增强 q encoder_q(x_q) # 查询特征 q nn.functional.normalize(q, dim1) with torch.no_grad(): # 更新动量编码器 for param_q, param_k in zip(encoder_q.parameters(), encoder_k.parameters()): param_k.data param_k.data * 0.999 param_q.data * 0.001 k encoder_k(x_k) k nn.functional.normalize(k, dim1) # 计算相似度正样本对(q, k)负样本来自队列 l_pos torch.einsum(nc,nc-n, [q, k]).unsqueeze(-1) l_neg torch.einsum(nc,ck-nk, [q, queue.clone().detach()]) logits torch.cat([l_pos, l_neg], dim1) labels torch.zeros(logits.shape[0], dtypetorch.long) # 正样本索引为0 loss criterion(logits, labels) # 更新队列将当前k入队最老的出队 queue torch.cat([k.T, queue[:, :-batch_size]], dim1) optimizer.zero_grad() loss.backward() optimizer.step()训练完成后我们丢弃投影头保留encoder_q的前置层backbone作为后续RL任务的视觉特征提取器并将其冻结freeze。实测发现冻结预训练编码器在训练初期能提供稳定的特征防止RL训练初期的不稳定梯度破坏已学好的特征。在RL训练中后期可以尝试解冻部分层进行微调。4.3 阶段二基础技能策略预训练目标条件RL我们的核心技能是“抓取”。但直接训练抓取特定物体太难我们将其泛化为“将夹爪移动到指定三维坐标点”即一个目标条件策略GCP。任务定义状态 $s_t$ 包括预训练视觉编码器提取的图像特征、夹爪的当前位姿。目标 $g$ 是一个三维坐标点夹爪期望到达的位置。动作 $a_t$ 是夹爪末端在三维空间中的位移量delta x, y, z。奖励函数 $r(s_t, g)$ 设计为稀疏奖励当夹爪末端与目标点距离小于阈值 $\epsilon$ 时奖励1否则为0。算法选择我们使用Hindsight Experience Replay (HER)算法。这是解决稀疏奖励目标条件任务的利器。其核心思想是即使一条轨迹没有达成原始目标 $g$它也可能达成了其他某个目标 $g$例如轨迹结束时夹爪实际到达的位置。在回放经验时我们可以用这个“事后诸葛亮”Hindsight的目标 $g$ 来替换原始目标从而从失败的经验中也学习到有用的策略。训练过程在仿真中随机采样目标点 $g$在机械臂工作空间内。策略网络 $\pi(a_t | s_t, g)$ 输出动作与环境交互。存储转移 $(s_t, a_t, r_t, s_{t1}, g)$ 到回放缓冲区。采样一批经验进行HER重标记对于每条轨迹不仅用原始目标 $g$ 计算损失还随机选取轨迹中的某个后续状态对应的位置作为新目标 $g$重新计算奖励并构造新的训练样本。我们使用DDPG或TD3作为基础的RL算法来训练这个策略网络。经过约100万步的训练我们得到了一个稳健的“指哪打哪”的GCP策略。这个策略对视觉特征中的物体位置信息非常敏感为后续的“抓取”任务奠定了坚实基础。4.4 阶段三下游任务微调与整合现在我们有了预训练的视觉编码器V和基础GCP策略$\pi_{base}$。真正的任务是“抓取红色方块”。任务重塑我们将抓取任务重新定义为目标生成问题。训练一个新的小网络 $\phi$我们称之为“目标预测器”它输入当前视觉特征 $v_t$输出一个三维抓取目标点 $g_t$。然后将这个 $g_t$ 交给已经预训练好的、且被冻结的 $\pi_{base}$ 来执行。训练目标预测器这是一个相对简单的监督学习或强化学习问题。监督学习如果我们有专家演示数据示教抓取点可以直接用MSE损失训练 $\phi$。强化学习我们采用后者。奖励信号定义为抓取成功与否稀疏奖励。动作空间就是 $\phi$ 输出的三维坐标。由于 $\pi_{base}$ 是冻结且稳健的整个系统的训练变得非常稳定和高效。我们只需要学习“往哪里抓”而“怎么过去”这个困难的控制问题已经被 $\pi_{base}$ 解决了。端到端微调可选在 $\phi$ 训练稳定后我们可以将 $\pi_{base}$ 解冻让视觉编码器 $V$、目标预测器 $\phi$ 和基础策略 $\pi_{base}$ 一起进行端到端的微调。这时由于所有组件都有了良好的初始化微调收敛速度很快且能进一步提升抓取精度和对新物体的泛化能力。4.5 部署与Sim2Real考虑模型轻量化将训练好的模型V, $\phi$, $\pi_{base}$转换为ONNX或TensorRT格式以在边缘计算设备如Jetson AGX上获得实时推理性能。域适应Domain Adaptation仿真到真实的鸿沟依然存在。除了在仿真中做足随机化我们在真机上还采用了外观域随机化在仿真中对物体纹理、光照进行更极端的随机化使编码器学会关注几何形状而非颜色纹理。动力学域随机化随机化仿真中的摩擦系数、质量等物理参数使策略对动力学变化更鲁棒。少量真机数据微调在真机上收集少量成功/失败数据仅对目标预测器 $\phi$ 进行微调保持V和$\pi_{base}$冻结这是成本最低且最有效的适应手段。通过这套组合拳我们将一个需要上千万步仿真交互的复杂抓取任务缩减到了仅需百万步左右主要消耗在基础技能预训练该技能可复用下游抓取任务微调只需数十万步即可达到高性能并且成功迁移到了真机机械臂上。这其中的关键正是系统性地应用了预训练思想将复杂问题分解并逐层构建可迁移的“先验知识”。