Train VLA models for robotic manipulation by using the model's own successful trajectories as self-reference for reward—enable progress-based feedback for failed attempts without external rewards or demonstrations.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Train VLA models for robotic manipulation by using the model's own successful trajectories as self-reference for reward—enable progress-based feedback for failed attempts without external rewards or demonstrations.
Train VLA Models with Self-Referential Rewards for Robotic Manipulation
Vision-Language-Action (VLA) models for robotics face extreme reward sparsity: tasks succeed or fail, with little feedback for in-between attempts. SRPO (Self-Referential Policy Optimization) breaks this bottleneck by using the model's own successful trajectories as self-reference. Failed attempts are measured against the model's successful ones from the same training batch, enabling dense progress-based rewards without external reward models or demonstrations.
This achieves 99.2% success on LIBERO (103% relative improvement from supervised baseline) by leveraging the model's latent world representation to assess behavioral progress robustly.
Core Concept
Standard VLA training for manipulation suffers from:
Reward Sparsity: Most trajectories fail; binary success/failure provides no gradient signal for intermediate progress
Sparse Demonstrations: Expert trajectories are expensive; RL without them requires dense rewards
Domain Shift: Reward models trained on one set of tasks fail on new objects/scenes
SRPO addresses all three by enabling self-comparison: rather than comparing failed trajectories to fixed rewards or external demonstrations, the model compares its current attempt to its own successful trajectories (from the same batch). A latent world model captures progress via compressed state representations, enabling robust progress estimation without task-specific fine-tuning.
classSelfReferentialComparison:
"""
Compare failed trajectories to successful ones in the batch.
"""def__init__(self, world_model):
self.world_model = world_model
defcompute_self_referential_reward(self, failed_traj, success_trajs):
"""
Compute reward for failed trajectory based on self-comparison.
failed_traj: dict with 'observations' and 'actions'
success_trajs: list of successful trajectory dicts
"""# Encode failed trajectory
failed_latent = self.world_model.encode_trajectory(
failed_traj['observations'],
failed_traj['actions']
)
# Encode successful trajectories
success_latents = []
for traj in success_trajs:
latent = self.world_model.encode_trajectory(
traj['observations'],
traj['actions']
)
success_latents.append(latent)
# Compare to each successful trajectory
progress_scores = []
for success_latent in success_latents:
progress = self.world_model.compute_progress(failed_latent, success_latent)
progress_scores.append(progress)
# Average progress across all successful trajectories
avg_progress = torch.stack(progress_scores).mean()
return avg_progress.item()
defcompute_batch_rewards(self, trajectories):
"""
Process batch of trajectories, extracting successful and failed.
Compute self-referential rewards for each failed trajectory.
"""
successful = [t for t in trajectories if t['success']]
failed = [t for t in trajectories ifnot t['success']]
rewards = {}
for i, traj inenumerate(trajectories):
if traj['success']:
# Successful trajectories get positive baseline reward
rewards[i] = 1.0else:
# Failed trajectories get self-referential progress rewardif successful:
progress_reward = self.compute_self_referential_reward(
traj,
successful
)
rewards[i] = progress_reward # Typically in [-1, 0] rangeelse:
# No successful trajectories in batch; use zero reward
rewards[i] = 0.0return rewards