A CVAE-trained transformer that turns the NexArm's camera frames and joint state into 100 future joint targets, then runs all of them before it looks again.
- 100 · actions per chunk
- 100 · actions run before re-planning
- 30 Hz · control rate
- 902 · encoder tokens (3 cameras)
- ResNet18 · backbone
- 100k · training steps
Architecture
ACT predicts actions in chunks instead of one at a time. Predicting 100 steps at once means a single mistake in one prediction is not compounded at every step, and it lets the policy represent a smooth motion rather than a series of corrections. The cost is that the arm moves without new observations for the length of the executed part of the chunk; on the NexArm that is the full 3.33 seconds.
| Part | Setting in lerobot-nexarm |
|---|---|
| Vision backbone | ResNet18, ImageNet-1k weights, shared across cameras |
| Image tokens | 1×1 conv to 512, 2D sine position embedding, 300 per 480×640 view |
| Encoder | 4 layers, d_model 512, 8 heads, FFN 3200, ReLU, post-norm |
| Decoder | 1 layer, 100 learned queries |
| Action head | Linear 512 → 6 |
| Latent | 32-dimensional CVAE latent, KL weight 10 |
| Normalization | mean / std for state and actions, ImageNet stats for images |
| Chunk / executed | 100 / 100 actions, no temporal ensembling |
Training
The model is trained as a conditional VAE. A second, smaller transformer reads the current joint state and the true next 100 actions and compresses them into a 32-dimensional latent z. That latent becomes the first token of the main encoder, so the network can tell apart demonstrations that look the same but were performed differently. The KL term keeps z close to a unit Gaussian, which is why it can be replaced by zeros at inference.
| Setting | Value |
|---|---|
| Data | Real teleoperated demonstrations, thanhkt/nexarm_stack_bowls |
| Held-out split | last 10% of episodes per task |
| Effective batch | 16 (batch 2 × 8 gradient-accumulation steps, sized for an 8 GB GPU) |
| Optimizer | AdamW, lr 1e-5 for the transformer and the backbone, weight decay 1e-4 |
| Stability | gradient clipping at 10, constant learning rate |
| Steps | 100,000, checkpoint and held-out loss every 5,000 |
| Loss | L1 on actions, masked past the episode end, + 10 · KL |
Camera sets must match. The default dataset has front and wrist cameras only; a 3-camera recording adds the top view. A policy trained on two cameras needs --no-top-cam at rollout, and rollout.py stops if the checkpoint and the robot disagree.