manipulationdiffusion-policymanipulationDDPMLeRobot

Diffusion Policy thực hành: Từ lý thuyết đến code

DDPM recap, Diffusion Policy architecture (CNN vs Transformer), code với LeRobot, và benchmark results -- hướng dẫn thực hành đầy đủ.

Nguyen Anh Tuan14 tháng 2, 20268 phút đọc
Diffusion Policy thực hành: Từ lý thuyết đến code

Từ Image Generation đến Robot Control

Diffusion models đã cách mạng image generation (Stable Diffusion, DALL-E 3). Ý tưởng cốt lõi: bắt đầu từ noise, dần dần denoise để tạo ra output có cấu trúc. Nhưng tại sao lại dùng nó cho robot?

Trong Part 2, mình đã nói về vấn đề multimodal actions -- khi cùng một observation có nhiều cách làm đúng. BC với MSE loss sẽ average các modes, cho ra action "trung bình" vô nghĩa. ACT dùng CVAE để xử lý, nhưng Diffusion Policy (Chi et al., 2023) có cách tiếp cận mạnh hơn: model toàn bộ action distribution bằng diffusion process.

Kết quả? Outperform tất cả baselines trên 12 tasks từ 4 benchmarks, với average improvement 46.9%. Đây là state-of-the-art cho manipulation policy learning.

Nếu bạn chưa đọc bài tổng quan Diffusion Policy, xem Diffusion Policy deep dive trong AI for Robotics series.

Diffusion process -- từ noise đến structured action sequences

DDPM Recap: Denoising Diffusion Probabilistic Models

Forward Process (Thêm noise)

Bắt đầu từ data x_0, thêm Gaussian noise dần dần qua T bước:

q(x_t | x_{t-1}) = N(x_t; sqrt(1-beta_t) * x_{t-1}, beta_t * I)

Sau T bước, x_T ~ N(0, I) -- pure noise. Beta_t là noise schedule, tăng dần từ ~0.0001 đến ~0.02.

Reverse Process (Denoise)

Học một neural network epsilon_theta để predict noise tại mỗi bước:

p_theta(x_{t-1} | x_t) = N(x_{t-1}; mu_theta(x_t, t), sigma_t^2 * I)

Training objective: predict noise đã thêm vào:

# DDPM training step (simplified)
def train_step(model, x_0):
    # 1. Sample random timestep
    t = torch.randint(0, T, (batch_size,))

    # 2. Sample noise
    epsilon = torch.randn_like(x_0)

    # 3. Add noise theo schedule
    x_t = sqrt_alpha_cumprod[t] * x_0 + sqrt_one_minus_alpha_cumprod[t] * epsilon

    # 4. Predict noise
    epsilon_pred = model(x_t, t)

    # 5. MSE loss
    loss = F.mse_loss(epsilon_pred, epsilon)
    return loss

Từ Images sang Actions

Trong image generation, x_0 là pixel values. Trong Diffusion Policy, x_0 là action sequence [a_t, a_{t+1}, ..., a_{t+H}] với H là prediction horizon. Conditioning là observation (images + joint positions) thay vì text prompt.

Diffusion Policy Architecture

CNN-based (Diffusion Policy - C)

Architecture gốc dùng 1D temporal CNN (giống WaveNet) để process action sequences:

Input: noisy action chunk x_t (B, H, action_dim) + timestep t
Condition: observation features (B, obs_dim) from ResNet18

Architecture:
  1. FiLM conditioning: inject obs features vào mỗi conv layer
  2. 1D Conv blocks: [Conv1D -> GroupNorm -> Mish -> Conv1D] x N
  3. Residual connections
  4. Output: predicted noise epsilon (B, H, action_dim)

Ưu điểm: nhanh (inference ~10ms), nhẹ (~5M parameters), dễ train.

Transformer-based (Diffusion Policy - T)

Thay CNN bằng Transformer decoder:

Input tokens:
  - Noisy action tokens: x_t -> Linear -> (H, d_model)
  - Observation tokens: obs -> ResNet18 -> (N_obs, d_model)
  - Timestep token: t -> sinusoidal embedding -> (1, d_model)

Transformer Decoder:
  - Self-attention trên action tokens
  - Cross-attention từ action tokens đến observation tokens
  - L layers, d_model=256, 4 heads

Output: predicted noise epsilon (H, action_dim)

Ưu điểm: capture long-range dependencies tốt hơn, scale tốt với data.

CNN vs Transformer: Khi nào dùng gì?

Tiêu chí Diffusion Policy - C Diffusion Policy - T
Tốc độ inference ~10ms ~50ms
Parameters ~5M ~20M
Data efficiency Tốt hơn với ít data (<100 demos) Cần nhiều data hơn (>200 demos)
Long-horizon Kém hơn Tốt hơn
Training time Nhanh (2-4h trên 1 GPU) Chậm hơn (6-12h)
Recommendation Default choice Khi task phức tạp, đủ data

Lời khuyên: bắt đầu với CNN variant. Chỉ chuyển sang Transformer khi CNN plateau và bạn có đủ data.

Diffusion Policy trong LeRobot: Hands-on

Setup

# Cài LeRobot
pip install lerobot

# Kiểm tra GPU
python -c "import torch; print(torch.cuda.is_available())"

Train Diffusion Policy trên PushT (2D benchmark)

PushT là benchmark kinh điển: robot đẩy chữ T vào target pose. Đơn giản nhưng demonstrate được sức mạnh của Diffusion Policy với multimodal actions.

# Download PushT dataset
python -m lerobot.scripts.download_dataset \
    --repo-id lerobot/pusht

# Train Diffusion Policy (CNN variant)
python -m lerobot.scripts.train \
    --policy.type=diffusion \
    --env.type=pusht \
    --dataset.repo_id=lerobot/pusht \
    --training.num_epochs=5000 \
    --training.batch_size=64 \
    --policy.n_action_steps=8 \
    --policy.n_obs_steps=2 \
    --policy.num_inference_steps=100

Các hyperparameters quan trọng

# Config giải thích
policy:
  n_obs_steps: 2          # Số observation frames làm input (2 = current + previous)
  n_action_steps: 8       # Số actions execute trước khi re-plan (action chunking)
  horizon: 16             # Prediction horizon (predict 16 actions, execute 8)
  num_inference_steps: 100 # Số DDPM denoising steps (nhiều = chính xác hơn, chậm hơn)

  # Noise schedule
  noise_scheduler:
    type: "ddpm"           # Hoặc "ddim" (nhanh hơn, ít steps hơn)
    beta_start: 0.0001
    beta_end: 0.02
    beta_schedule: "squaredcos_cap_v2"  # Cosine schedule (tốt hơn linear)

DDIM: Tăng tốc inference

DDPM cần 100 denoising steps -> chậm cho real-time robot control. DDIM (Denoising Diffusion Implicit Models) giảm xuống còn 10-20 steps mà giữ gần như nguyên chất lượng:

# Đổi từ DDPM sang DDIM trong LeRobot config
policy:
  noise_scheduler:
    type: "ddim"
  num_inference_steps: 10  # Giảm từ 100 xuống 10

Trên thực tế, DDIM với 10 steps cho inference ~15ms -- đủ nhanh cho 50Hz control loop.

Training loop của Diffusion Policy -- observation conditioning + action denoising

Benchmark Results

PushT (2D)

Method Success Rate
BC (MLP) 58.7%
BC (Transformer) 63.2%
IBC (Implicit BC) 62.4%
BET (BeT) 65.8%
Diffusion Policy - C 88.7%
Diffusion Policy - T 85.3%

RobomiMic (Simulated Manipulation)

Task BC-RNN IBC Diffusion-C Diffusion-T
Lift 100% 96% 100% 100%
Can 92% 84% 96% 95%
Square 82% 68% 92% 92%
Transport 46% 32% 78% 74%
Tool Hang 18% 12% 56% 52%

Diffusion Policy vượt trội hoàn toàn, đặc biệt trên tasks khó (Transport, Tool Hang) -- chính là nơi multimodal actions quan trọng.

Tại sao Diffusion Policy mạnh?

1. Xử lý multimodal actions tự nhiên

Khi có nhiều cách làm đúng (đẩy T từ trái hoặc từ phải), BC average hai cách -> action vô nghĩa. Diffusion model học toàn bộ distribution, khi sample sẽ chọn một mode cụ thể và thực hiện nhất quán.

2. Expressiveness cao

Diffusion process có thể model bất kỳ distribution nào, không bị giới hạn bởi parametric assumptions (như Gaussian trong VAE). Điều này quan trọng cho complex manipulation trajectories.

3. Training stability

Không có mode collapse như GAN, không có posterior collapse như VAE. Training objective (predict noise) đơn giản và ổn định.

4. Action chunking built-in

Predict cả chunk actions một lúc, giảm compounding error tương tự ACT nhưng với phương pháp generate mạnh hơn.

Tips thực tế

Training

  • Cosine noise schedule tốt hơn linear cho action sequences
  • EMA (Exponential Moving Average) của model weights: bắt buộc, dùng decay=0.995
  • Gradient clipping: max_norm=1.0, tránh explosion khi train
  • Learning rate: 1e-4 với AdamW, cosine decay

Inference trên robot thật

  • Dùng DDIM với 10 steps để đạt real-time
  • Temporal ensembling (như ACT): average các overlapping chunks
  • Action clipping: giới hạn action trong safe range trước khi gửi xuống robot
  • Latency compensation: tính toán trước 1-2 steps để bù latency

Debug

  • Visualize denoising process: plot action trajectory tại mỗi denoising step -- nếu không converge, tăng num_inference_steps
  • Check action distribution: histogram actions từ dataset vs predicted -- nên match
  • Overfit trên 1 episode trước: nếu không overfit được, có bug trong code

Diffusion Policy vs ACT: Chọn gì?

Tiêu chí ACT Diffusion Policy
Multimodal CVAE (limited modes) Full distribution
Speed Nhanh (~5ms) Chậm hơn (~15ms DDIM)
Data efficiency Rất tốt (50 demos) Tốt (50-100 demos)
Long-horizon Tốt Tốt hơn
Implementation Phức tạp (CVAE) Trung bình
Best for Bimanual, ít data Complex tasks, nhiều data

Chọn ACT khi: ít data (<50 demos), cần inference nhanh, bimanual tasks. Chọn Diffusion Policy khi: task phức tạp, multimodal, đủ data, và 50Hz là đủ.

Tiếp theo trong series


Bài viết liên quan

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Bài viết liên quan

NEWTutorial
Hướng dẫn GigaBrain-0: VLA + World Model + RL
vlaworld-modelreinforcement-learninggigabrainroboticsmanipulation

Hướng dẫn GigaBrain-0: VLA + World Model + RL

Hướng dẫn chi tiết huấn luyện VLA bằng World Model và Reinforcement Learning với framework RAMP từ GigaBrain — open-source, 3.5B params.

12/4/202611 phút đọc
NEWNghiên cứu
UnifoLM-VLA-0: Mô hình VLA cho Manipulation trên Unitree G1
vlaunitreeg1manipulationhumanoid

UnifoLM-VLA-0: Mô hình VLA cho Manipulation trên Unitree G1

Phân tích và hướng dẫn triển khai UnifoLM-VLA-0 — mô hình VLA open-source đầu tiên chạy trực tiếp trên G1 humanoid

8/4/202623 phút đọc
NEWDeep Dive
Multi-Step Manipulation: Curriculum Learning cho Long-Horizon
rlcurriculum-learninglong-horizonmanipulationPhần 8

Multi-Step Manipulation: Curriculum Learning cho Long-Horizon

Giải quyết manipulation dài hơi bằng RL — curriculum learning, hierarchical RL, skill chaining, và benchmark IKEA furniture assembly.

7/4/202610 phút đọc