MoFlow β edge-index λ²κ·Έ μμ κ³Ό μνλ§ λ°μ° ν΄κ²°
ν μ€ μμ½
edge-index reshape λ²κ·Έλ‘ κ·Έλνκ° μ¬μ λ€μκ³ μμλ€(permute λ‘ μμ ). κ·Έλ°λ°
μ μ κ·Έλνλ₯Ό λ£μ MoFlow λ§ λ°μ°νλ€ β νμ΅μ΄ μλλΌ μνλ§μμ. λ
Έλλ³
residual-norm cap μΌλ‘ μ€ν
λΉ μλμ μ νν΄ ν΄κ²°νλ€.
μμ λμ: models/graph_interaction_nba.py(_make_batched_edge_index),
models/graph_interaction_nba_v6.py(SRA κ·Έλν μΆλ ₯λΆ).
λͺ¨λ λ³κ²½μ νκ²½λ³μ ν κΈμ΄κ³ κΈ°λ³Έκ° off β μΌμ§ μμΌλ©΄ μλ³Έκ³Ό λμΌνκ² λμν΄
κΈ°μ‘΄ 체ν¬ν¬μΈνΈΒ·κΈ°μ‘΄(λ²κ·Έ) κ²°κ³Όμ μ¬νμ±μ΄ 보쑴λλ€.
1. λ²κ·Έ: edge-index κ° μ¬μ λ€μμ
batched = single.unsqueeze(0).expand(S, -1, -1) + offsets.view(-1, 1, 1) # [S, 2, E0]
return batched.reshape(2, -1) # β λ²κ·Έ
[S, 2, E0] μ λ©λͺ¨λ¦¬ μμλ s0_src, s0_dst, s1_src, s1_dst, β¦ μ΄λ€.
reshape(2,-1) μ μ΄ λ²νΌλ₯Ό μ/λ€ μ λ°μΌλ‘ μλ₯΄λ―λ‘ row0 μ μ¬0 λΈλ‘,
row1 μ μ¬1 λΈλ‘μ΄ λ€μ΄κ°λ€ β src/dst κ° μλλΌ μ¬μΌλ‘ λλλ€.
μ€μΈ‘ (A=11, S=4):
| κ°μ-μ¬ edge | μ΄μ 0μΈ κ³ μ λ Έλ | λ Έλ degree | |
|---|---|---|---|
| λ²κ·Έ | 0 % | 50 % | 0 λλ 20 (μ μ 10) |
| μμ | 100 % | 0 % | μ λΆ 10 |
scores.view(B*K*A, A-1) μ top-N μ΄μ κ·Έλ£Ήνλ λ²κ·Έμμ 33 % λ§ μ€μ νκ²κ³Ό
μΌμΉνκ³ , μμ ν 100 % κ° λλ€. μ¦ μ΄μ μ ν μ체λ λ§κ°μ Έ μμλ€.
μΈλ±μ€ λ²μλ μ μ(0~43)μ΄λΌ PyG κ° μλ¬λ₯Ό λ΄μ§ μλλ€ β ν¬λμ μμ΄ μ‘°μ©ν νλ¦° κ·Έλνλ₯Ό μ°κ³ μμκ³ , κ·Έλμ μ€λ λ°κ²¬λμ§ μμλ€.
μμ (SRA_EDGE_FIX=1)
if os.environ.get('SRA_EDGE_FIX', ...):
return batched.permute(1, 0, 2).reshape(2, -1) # src/dst μΆμ λ¨Όμ β μ¬ λ΄λΆ κ·Έλν
return batched.reshape(2, -1) # κΈ°λ³Έ: μλ(λ²κ·Έ) λμ
baseline μ κ·Έλνλ₯Ό μΈμ€ν΄μ€ννμ§ μμΌλ―λ‘ μ΄ λ²κ·Έμ 무κ΄νλ€ β λΉκ΅μ νμͺ½ μΆμ μ¨μ νλ€. μν₯μ λ°μ κ²μ SRA/ablation μͺ½λΏμ΄λ€.
2. μ¦μ: νμ΅μ μ μ, μνλ§λ§ λ°μ°
edge λ₯Ό κ³ μΉμ MoFlow-NBA μ eval ADE κ° νλ°νλ€. κ²μ΄νΈΒ·μ΄κΈ°ν μ²λ°©μ΄ μ°λ¬μ μ€ν¨ν λ€, train loss μ eval μ μκ° μ λ ¬ν΄μ μμΈμ νΉμ νλ€:
train loss : 96.5 β 35.6 β 20.1 β 18.0 β 16.6 λ¨μ‘° κ°μ (μμ μ μ)
eval ADE : 1.13 β 1.07 β 1.52 β 1.85 β 3.49 λ°μ°
train loss κ° λ§€λλ½κ² λ΄λ €κ°λ λ°λ‘ κ·Έ μκ° eval μ΄ ν°μ§λ€. μ΄ κ΄μ°°μ΄ μ²λ°©μ λ°©ν₯μ λ°κΏ¨λ€ β λ¬Έμ λ νμ΅μ΄ μλλΌ μνλ§μ΄λ€.
3. μμΈ: train/sample mismatch (MoFlow κ³ μ )
- νμ΅: λλ€ timestep νλμμ κ·Έλνκ° ν λ² μ μ©λλ€ β μλμ΄ λμ λ κ²½λ‘κ° μλ€.
- μνλ§: MoFlow μ flow μ λΆμ 10 μ€ν
. κ·Έλνκ° λ§€ μ€ν
μ μ©λκ³ κ·Έ μΆλ ₯μ΄
λ€μ μ€ν
μ μ
λ ₯(
y_abs)μΌλ‘ λλ¨Ήμλλ€ β μλμ΄ κΈ°νκΈμμ μΌλ‘ λμ λλ€.
λ²κ·Ένμ΄ μ ν°μ§ μ΄μ λ μ΄κ±Έλ‘ μ€λͺ λλ€: λ Έλ μ λ°μ΄ κ³ μμ¬μ κ·Έλν μλμ΄ μ¬μ€μ μ λ°λ§ νλ κ³ , κ·Έλ§νΌ μνλ§ λμ μ΄ μ½νλ€. λ²κ·Έκ° μ°μ°ν μ κ·ν μν μ νκ³ μμλ€.
MIDΒ·LED λ iterative denoiser λΌ κ·Έλνλ₯Ό λ°λ³΅ μ μ κ³Όμ μ μΌλΆλ‘ ν‘μνλ€ β κ·Έλμ κ°μ V6 λ₯Ό μ¨λ λ°μ°νμ§ μλλ€. (μ΄μ μ κ΄μ°°ν "MoFlow λ plug-in λͺ¨λμ μ λ λ―Όκ°νκ³ faithful GameFormer/C2F λ μ λΆ λ°μ°"κ³Ό μ νν κ°μ ν¨ν΄.)
μΈ‘μ : κ·Έλν residual λ Έλ norm β 6.3 vs νΈμ€νΈ μλ² λ© λ Έλ norm β 16 β μλμ΄ μλ² λ©μ μ½ 40 %. νμ΅μ΄ μ§νλλ©΄ μ΄ λΆν¬μ 꼬리(outlier)κ° μ»€μ§κ³ , κ·Έ outlier κ° μνλ§ λμ μ μ΄λ°νλ€.
4. μ€ν¨ν μ²λ°©λ€κ³Ό κ·Έ μ΄μ
| μ²λ°© | 건λλ¦° λμ | κ²°κ³Ό |
|---|---|---|
SRA_GATE_SCALE=0.1 (κ²μ΄νΈ μ μ μΆμ) |
νμ΅ | eval 5νμ°¨λΆν° λ¨μ‘° μ ν |
SRA_SOFT_START (out_proj zero-init + gate bias β4) |
νμ΅ μ΄κΈ°κ° | eval 3νμ°¨ λ°μ° (μ€νλ € λ λΉ λ¦) |
| κ²μ΄νΈ κΈ°λ³Έκ° μ μ§ | β | eval 4νμ°¨ λ°μ° |
μ
λ€ νμ΅μ μ‘°μ νλ€. κ·Έλ°λ° νμ΅μ μλ λ©μ©‘νμΌλ―λ‘ ν¨κ³Όκ° μμλ€.
SRA_SOFT_START λ μ΄κΈ° μΆλ ₯μ μμ identity(βΞβ=0)λ‘ λ§λ€μλλ°λ, νμ΅ λͺ μ€ν
λ§μ out_proj κ° μλΌμ λκ°μ΄ ν°μ‘λ€ β μ΄κΈ° 좩격 κ°μ€μ΄ λ°μ¦λ μ
μ΄λ€.
5. ν΄λ²: λ
Έλλ³ residual-norm cap (SRA_RES_CAP)
μνλ§ μ μ€ν λΉ λ Έλ μλμ ν¬κΈ°λ₯Ό μ§μ μ ννλ€. μ μ μΆμ(gate scale)μ λ¬λ¦¬ μ μ ν¬κΈ°μ μλμ κ·Έλλ‘ λκ³ λμ μ μ λ°νλ ν° outlier λ§ μλΌλΈλ€.
res = _gs * gate * self.out_proj(nodes) # [N, D] κ·Έλν μλ
_cap = float(os.environ.get('SRA_RES_CAP', 0.0)) # 0 = λ(κΈ°λ³Έ)
if _cap > 0:
rn = res.norm(dim=-1, keepdim=True) # [N, 1] λ
Έλλ³ norm
res = res * (rn.clamp(max=_cap) / (rn + 1e-6)) # norm μν
out = orig + res
κ²μ¦: SRA_RES_CAP=3.0 μμ λ
Έλ norm μ΄ μ νν β€3.0 μΌλ‘ μλ¦¬κ³ , gradient λ
μ μ§λλ©°(νμ΅ κ³μ κ°λ₯), κ°λ³ A(SDD) λ ν΅κ³Ό.
gate scale κ³Όμ κ²°μ μ μ°¨μ΄: gate scale μ μ νΈλ₯Ό μꡬν μ€μ¬ κ·Έλν ν¨κ³ΌκΉμ§ κ°μ΄ μ£½μΈλ€. cap μ λΆν¬μ κΌ¬λ¦¬λ§ μλ₯΄λ―λ‘ κ·Έλνμ ννλ ₯μ λλΆλΆ 보쑴νλ€.
6. κ²°κ³Ό
λ°μ° μ§μ (eval 3~5) ν΅κ³Ό μ¬λΆ
| eval # | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| κ²μ΄νΈ κΈ°λ³Έ | 1.141 | 1.052 | 1.048 | 1.828 | 1.429 | 1.716 | 1.821 | β |
| soft-start | 1.134 | 1.075 | 1.516 | 1.852 | 1.697 | 1.862 | 1.765 | β |
| gate 0.1 | 1.143 | 1.104 | 1.118 | 1.107 | 1.355 | 1.468 | 1.521 | 1.622 |
| cap 3.0 | 1.145 | 1.053 | 1.007 | 0.969 | 0.942 | 0.988 | 0.927 | 0.894 |
| cap 6.0 | 1.138 | 1.018 | 0.999 | 0.976 | 0.950 | 0.947 | 0.962 | 0.895 |
| baseline(μ°Έκ³ ) | 1.163 | 1.021 | 0.961 | 0.964 | 0.952 | 0.955 | 0.953 | 0.895 |
cap λ κ° λͺ¨λ λ°μ° μ§μ μ ν΅κ³Όνκ³ baseline κΆ€μ μ κ·Έλλ‘ λ°λΌκ°λ€.
μ₯κΈ° μλ ΄ (2026-07-28 κΈ°μ€, 58ν νκ° Β· 10029/25500 = 39 %)
| μ€μ | νμ¬ best ADE/FDE | λΉκ³ |
|---|---|---|
| cap 6.0 | 0.7373 / 0.9080 | λ°μ° μμ΄ 58ν |
| cap 3.0 | 0.7399 / 0.9300 | λ°μ° μμ΄ 58ν |
| κΈ°μ‘΄(λ²κ·Έν) SRA | 0.695 | μμ£Όκ° |
| baseline | 0.703 | μμ£Όκ° |
cap 3.0 κ³Ό 6.0 μ μ°¨μ΄κ° 0.0026 μ λΆκ³Όνλ€ β μ΄ μ²λ°©μ cap κ°μ λ―Όκ°νμ§ μλ€ (νμ΄νΌνλΌλ―Έν° νλμ μμ‘΄νλ μμλ°©νΈμ΄ μλλΌλ κ·Όκ±°).
λ€λ₯Έ μ€μ μμμ μ¬ν
κ°μ μ²λ°©(EDGE_FIX + SOFT_START + RES_CAP=3.0)μΌλ‘ λλ¦° MoFlow-NBA ablation 2건λ
λ°μ° μμ΄ νκ° μ€ β cap μ ν¨κ³Όκ° full SRA ν μ€μ μλ§ κ΅νλμ§ μλλ€.
| μ€ν | νκ° μ | νμ¬ best |
|---|---|---|
| sparse selection (no Ο) | 16 | 0.8034 |
| encoding (all nbrs, no Ο) | 9 | 0.8648 |
7. νκ³μ λ―Ένμ (μ μ§νκ²)
β SOFT_START κ° κ΅λ λ³μλ€. cap μ€ν 4건 λͺ¨λ SRA_SOFT_START=1 μ ν¨κ» μΌ°λ€.
λ°λΌμ "cap λ¨λ
μΌλ‘ μΆ©λΆνκ°"λ μμ§ κ²μ¦λμ§ μμλ€. soft-start λ λ¨λ
μΌλ‘λ
μ€ν¨νμΌλ―λ‘ cap μ΄ ν΅μ¬μΈ κ²μ λΆλͺ
νμ§λ§, λμ κΈ°μ¬λ₯Ό λΆλ¦¬νλ €λ©΄
RES_CAP λ§ μΌ λμ‘° μ€νμ΄ νμνλ€.
β‘ μ΅μ’ μλ ΄κ° λ―Ένμ . 39 % μ§μ μμ 0.737 μ΄κ³ , κΈ°μ‘΄(λ²κ·Έν) 0.695 / baseline 0.703 λ³΄λ€ μμ§ μλ€. λ¨μ 61 % μ cosine LR κ°μ μμ λ λ΄λ €κ° μ¬μ§λ μμΌλ, 0.695 λ₯Ό μ¬ννμ§ λͺ»ν κ°λ₯μ±λ μ΄λ € μλ€.
β’ κ·Έ κ²½μ°μ κ²°λ‘ λ λ³΄κ³ ν κ°μΉκ° μλ€. "μ μ μ¬-λ΄λΆ κ·Έλνλ μμ μ μΌλ‘ νμ΅λλ MoFlow μ one-step flow matching μμλ μ΄λμ΄ μ νμ "μ΄λΌλ κ² μ체κ°, λ²κ·Ένμ 0.695 κ° μλν λ©μ»€λμ¦μ΄ μλλΌ μ°μ°ν μ κ·ν ν¨κ³Όμμ μ μμμ μμ¬νλ λ°κ²¬μ΄λ€.
β£ MID / LED λ λ€λ₯Έ μ²λ°©μ μ΄λ€. RES_CAP μ MoFlow μ μ©μ΄λ€. MID λ
graph_gate_init 0.01β0.001 + warmup 100β200 μΌλ‘ λΆκ΄΄λ₯Ό λ§μκ³ , LED λ λ³λ
μ²λ°© μμ΄ ν볡 μ€μ΄λ€(LED sparse no-Ο λ μ΄λ―Έ κΈ°μ‘΄κ° 0.886 β 0.800 μΌλ‘ μμ¬).
8. μ¬ν
# MoFlow-NBA full SRA (νμ¬ μ€ν μ€μ )
SRA_EDGE_FIX=1 SRA_SOFT_START=1 SRA_RES_CAP=3.0 \
CUDA_VISIBLE_DEVICES=0 python fm_nba_graph_v6.py \
--cfg cfg/nba/cor_fm.yml --exp edgefix_cap3 \
--batch_size 192 --epochs 150 --fm_in_scaling --tied_noise \
--top_n_neighbors 5 --uncertainty_weight 0.01 --data_dir ./data/nba
# no-Ο ablation μ μ μ© μ€ν¬λ¦½νΈ μ¬μ© (use_sigma_gating=False νλμ½λ©)
SRA_EDGE_FIX=1 SRA_SOFT_START=1 SRA_RES_CAP=3.0 \
python fm_nba_graph_v6_nosigma.py --cfg cfg/nba/cor_fm.yml --exp ef_sparse_nosig \
--batch_size 192 --epochs 150 --fm_in_scaling --tied_noise --top_n_neighbors 5
| ν κΈ | κΈ°λ³Έ | μν |
|---|---|---|
SRA_EDGE_FIX |
off | edge-index μ¬ νΌν© λ²κ·Έ μμ (ν΅μ¬) |
SRA_RES_CAP |
0 (off) | λ Έλλ³ residual norm μν β MoFlow μνλ§ μμ ν (ν΅μ¬) |
SRA_SOFT_START |
off | out_proj zero-init + gate bias β4 (보쑰, λ¨λ μΌλ‘λ μ€ν¨) |
SRA_GATE_SCALE |
1.0 | κ²μ΄νΈ μ μ μΆμ (μ€ν¨ν μ²λ°©, μ½λλ§ μμ‘΄) |