Download docs/METHOD.md from zhicao/FACT: direct link, hf CLI and curl.
- Browser
- Download file 3.66 kB
-
https://huggingface.co/zhicao/FACT/resolve/main/docs/METHOD.md
- Command line
-
hf download hf://zhicao/FACT/docs/METHOD.md
-
curl -L -o METHOD.md https://huggingface.co/zhicao/FACT/resolve/main/docs/METHOD.md
FACT architecture
Token layout
Each autoregressive block covers 0.8 s and packs 83 tokens:
[obs 50][state 1][action 16][future-state 16], preceded by one learnable task token
(and, with use_text, up to 64 umT5-XXL text tokens as a clean prefix, padding masked).
Training runs K = 4 blocks (3.2 s) in one forward pass with a block-causal mask: block k
attends to blocks [k-window, k] (window = 4) and the prefix; online K = 1.
| token | source | noise |
|---|---|---|
| obs (50) | current 3-view frame tiled into a 2×2 grid (head | right ; left | black) at 160×320, Wan2.2 VAE → 48×10×20 latent, 2×2 patches, Linear(192→d) |
clean |
| state (1) | 62-D EEF62 state (zero-padded to 64), MLP → d | clean, τ = 0 |
| action (16) | 16 × 62 delta-base actions (T-Rex reference frame and q01/q99 normalisation), Linear(64→d) |
noisy, τ ~ Beta(1.5, 1) per block |
| future state (16) | EEF62 states at +1..+16 steps (20 Hz) after the block anchor, delta-base w.r.t. the block reference state, normalised with the action statistics | noisy, same τ as action |
Positional information: slot embedding (83 slots) + block embedding + token-type embedding (no RoPE). Each token carries its own τ → sinusoidal(256) → MLP → per-token adaLN-zero (6 modulation vectors, so different modalities can sit at different noise levels); qk-RMSNorm; final adaLN followed by two linear heads (action flow, future-state flow).
Two-stage flow
- Coarse stage (
FactCoarseTransformer): joint rectified flow on[action, future state]from τ = 1 to τ = 0.4 (6 Euler steps at inference). - Coarse memory: last-layer hidden states visible to block k (84 tokens online).
- Force stage (
ForceOnlyTransformer, 768-d, 6 layers, re-used unchanged from T-Rex): 16 action tokens + 10 current F6 force tokens + 10 tactile-VQ history tokens + memory; τ 0.4 → 0 in 4 steps, suffix-only refinement at offsets 0/4/8/12 (5 Hz tactile refresh), tactile dropout 0.1. The tactile VQ (64 codes × 256-d) is trained jointly with the standard VQ + 0.25 · commitment loss.
Loss: action_flow_mse + state_flow_mse + force_flow_mse + vq + 0.25·commitment (all weights 1).
Sampling: 6 coarse steps (τ 1 → 0.4) → forward at τ = 0.4 to obtain memory and clean future
states → 4 force steps. coarse_to_zero lets the coarse model run to τ = 0 instead (used
when the force stage is disabled or for analysis).
Configurations
| config | d / layers / heads / FFN | params | notes |
|---|---|---|---|
fact_base.json |
1024 / 12 / 16 / 4096 | 209 M | finalised model |
fact_base_text.json |
same + use_text (4096-d umT5 tokens, LayerNorm + Linear(4096→d)) |
213 M | multi-task training |
fact_small.json |
768 / 8 / 12 / 3072 | 109 M | resource-constrained variant |
All configs keep the force stage (768 / 6 / 12 / 3072), window 4, 6 coarse + 4 force steps, τ_split 0.4.
Full-data training recipe
Global batch 16 × 8 = 128 samples (4 AR blocks each), AdamW, lr 3e-4 cosine to 10 % with 2000 warm-up steps, weight decay 0.01, grad clip 1.0, bf16 autocast (force stage in fp32), force-stage lr × 0.3, optimizer step skipped when the pre-clip grad norm exceeds 20. 100 k steps ≈ 15 h on 32 accelerators at 0.55–1.1 s/it.
Every --video-steps the rank-0 process samples 4 consecutive chunks of one episode and logs
eval/openloop_cascade_mse, eval/openloop_coarse_only_mse, eval/future_state_mse and a
monitoring video (left: head camera at 20 Hz; right: predicted vs ground-truth action and
future-state curves — black GT / red cascade / blue coarse τ = 0.4 / green future state).