File size: 9,725 Bytes
37c61d4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | # 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 | κ²μ΄νΈ μ μ μΆμ (μ€ν¨ν μ²λ°©, μ½λλ§ μμ‘΄) |
|