| # 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 κ° μ¬μ λ€μμ |
|
|
| ```python |
| 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`) |
|
|
| ```python |
| 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 λ§** μλΌλΈλ€. |
|
|
| ```python |
| 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. μ¬ν |
| |
| ```bash |
| # 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 | κ²μ΄νΈ μ μ μΆμ (μ€ν¨ν μ²λ°©, μ½λλ§ μμ‘΄) | |
|
|