File size: 10,120 Bytes
dd1c60c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# MoFlow ์ตœ์‹ ๋ณธ โ€” ์ด์ „ ๋ฒ„์ „ ๋Œ€๋น„ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋‚˜

๋น„๊ต ๊ธฐ์ค€: HF `po03087/sra-trajectory-code` ์ปค๋ฐ‹ `0d52562` โ†’ `37c61d4`

๋ฐ”๋€ MoFlow ํŒŒ์ผ์€ **2๊ฐœ, ์ด 88์ค„**์ด๋‹ค. ๊ทธ ์ค‘ ์‹ค์ œ ๋กœ์ง์€ 5์ค„์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ฃผ์„์ด๋‹ค.

| ํŒŒ์ผ | ๋ณ€๊ฒฝ | ์„ฑ๊ฒฉ |
|---|---|---|
| `models/graph_interaction_nba.py` | +23 | **๋ฒ„๊ทธ ์ˆ˜์ •** (edge index) |
| `models/graph_interaction_nba_v6.py` | +65 | **์ƒˆ ์•ˆ์ •ํ™” ์˜ต์…˜** 3์ข… |

> **๋ชจ๋“  ์ƒˆ ๋™์ž‘์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ† ๊ธ€ ๋’ค์— ์žˆ๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ ์ „๋ถ€ off๋‹ค.**
> ํ† ๊ธ€์„ ์•ˆ ์ผœ๋ฉด ์ด์ „ ์ฝ”๋“œ์™€ ๋น„ํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค โ€” ๊ธฐ์กด ์ฒดํฌํฌ์ธํŠธ์™€
> ์ง„ํ–‰ ์ค‘์ธ ์‹คํ–‰์ด ๊ทธ๋Œ€๋กœ ์žฌํ˜„๋œ๋‹ค.

---

## 1. `graph_interaction_nba.py` โ€” edge index ์”ฌ ํ˜ผํ•ฉ ๋ฒ„๊ทธ

### ๋ฐ”๋€ ์ฝ”๋“œ

```diff
 def _make_batched_edge_index(self, num_scenes):
     single  = self._single_edge_index                    # [2, E0]
     offsets = torch.arange(num_scenes, ...) * self.num_agents
     batched = single.unsqueeze(0).expand(num_scenes,-1,-1) + offsets.view(-1,1,1)
-    return batched.reshape(2, -1)                        # [2, S*E0]
+    if os.environ.get('SRA_EDGE_FIX', '') not in ('', '0', 'false', 'False'):
+        # [S,2,E0] -> [2,S,E0] -> [2,S*E0]: src/dst ์ถ•์„ ๋จผ์ € ์•ž์œผ๋กœ ์˜ฎ๊ธด๋‹ค
+        return batched.permute(1, 0, 2).reshape(2, -1)
+    return batched.reshape(2, -1)                        # legacy (์”ฌ ํ˜ผํ•ฉ)
```

### ์™œ ํ‹€๋ ธ๋‚˜

`batched` ์˜ shape ๋Š” `[S, 2, E0]` ์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ์น˜๋Š”

```
s0_src  s0_dst  s1_src  s1_dst  s2_src  s2_dst  ...
```

์ด๋‹ค. ์—ฌ๊ธฐ์— `.reshape(2, -1)` ์„ ํ•˜๋ฉด ์•ž ์ ˆ๋ฐ˜์ด row 0, ๋’ค ์ ˆ๋ฐ˜์ด row 1 ์ด ๋˜๋ฏ€๋กœ
**row 0 = "์•ž์ชฝ ์”ฌ๋“ค์˜ src+dst ์ „๋ถ€", row 1 = "๋’ค์ชฝ ์”ฌ๋“ค์˜ src+dst ์ „๋ถ€"** ๊ฐ€ ๋œ๋‹ค.
src/dst ํ–‰์ด ์•„๋‹ˆ๋ผ **์”ฌ ๋ธ”๋ก**์œผ๋กœ ์ž˜๋ฆฐ ๊ฒƒ์ด๋‹ค.

### ์ธก์ •๋œ ์˜ํ–ฅ (A=11)

| ์ง€ํ‘œ | ์ˆ˜์ • ์ „ | ์ˆ˜์ • ํ›„ |
|---|---|---|
| ๊ฐ™์€ ์”ฌ ์•ˆ์— ๋จธ๋ฌด๋Š” edge ๋น„์œจ | **0 %** | **100 %** |
| ๋“ค์–ด์˜ค๋Š” edge ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๋…ธ๋“œ | **์ ˆ๋ฐ˜** | 0 |
| ๋‚˜๋จธ์ง€ ๋…ธ๋“œ์˜ degree | ์˜๋„์˜ **2๋ฐฐ** | ์ •์ƒ |
| top-N ์ด์›ƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฌถ์ด๋Š” ๋น„์œจ | 33 % | 100 % |

์ฆ‰ "์˜ˆ์ธก๋œ ๋ฏธ๋ž˜ ์œ„์—์„œ ์”ฌ ๋‚ด๋ถ€ top-N ์ด์›ƒ์„ ๊ณ ๋ฅธ๋‹ค"๋Š” SRA ์˜ ์„ค๋ช…๊ณผ ์‹ค์ œ ์ฝ”๋“œ๊ฐ€
๋‹ฌ๋ž๋‹ค. ๋…ผ๋ฌธ ์ˆ˜์น˜(MID 0.957 / LED 0.778 / MoFlow 0.695)๋Š” ์ „๋ถ€ ์ด ๋ฒ„๊ทธ ์ƒํƒœ์—์„œ
๋‚˜์˜จ ๊ฐ’์ด๋‹ค.

---

## 2. `graph_interaction_nba_v6.py` โ€” ์•ˆ์ •ํ™” ์˜ต์…˜ 3์ข…

edge ๋ฅผ ๊ณ ์น˜์ž **MoFlow ๋งŒ** ์ƒˆ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ํ•™์Šต loss ๋Š” ๋‹จ์กฐ ๊ฐ์†Œํ•˜๋Š”๋ฐ
**์ƒ˜ํ”Œ๋ง์ด ๋ฐœ์‚ฐ**ํ•œ๋‹ค. ์›์ธ์€ train/sample mismatch ๋‹ค.

- ํ•™์Šต: ๋žœ๋ค timestep ํ•˜๋‚˜์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ **ํ•œ ๋ฒˆ** ์ ์šฉ
- ์ƒ˜ํ”Œ๋ง: 10 ์Šคํ… flow ์ ๋ถ„์—์„œ **๋งค ์Šคํ…** ์ ์šฉํ•˜๊ณ  ๊ทธ ์ถœ๋ ฅ์ด ๋‹ค์Œ ์Šคํ… ์ž…๋ ฅ์œผ๋กœ ๋˜๋จน์ž„

๋ฒ„๊ทธ ์ƒํƒœ์—์„œ๋Š” ๋…ธ๋“œ ์ ˆ๋ฐ˜์ด ๊ณ ์•„๋ผ ์„ญ๋™์ด ์•ฝํ•ด์„œ ์ด ๋ˆ„์ ์ด ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์•˜๋‹ค.
edge ๋ฅผ ๊ณ ์ณ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ด์›ƒ์„ ๋ฐ›์ž ์„ญ๋™์ด ์ปค์ง€๊ณ  10 ์Šคํ…์— ๊ฑธ์ณ ๊ธฐํ•˜๊ธ‰์ˆ˜๋กœ ์Œ“์ธ๋‹ค.

MIDยทLED ๋Š” iterative denoiser ๋ผ ์ด ํ˜„์ƒ์ด ์—†๋‹ค. **์•„๋ž˜ ์˜ต์…˜์€ MoFlow ์ „์šฉ ์ฒ˜๋ฐฉ์ด๋‹ค.**

### 2.1 `SRA_SOFT_START` โ€” ์ดˆ๊ธฐ ์ถฉ๊ฒฉ ์ œ๊ฑฐ

```python
if os.environ.get('SRA_SOFT_START', ...):
    nn.init.zeros_(self.out_proj.weight); nn.init.zeros_(self.out_proj.bias)
    nn.init.constant_(gate_proj_linear.bias, SRA_GATE_BIAS)   # ๊ธฐ๋ณธ -4, sigmoid(-4)โ‰ˆ0.018
```

MID ๊ฐ€ ์›๋ž˜ ์“ฐ๋˜ ๋ฐฉ์‹(zero-init + warmup gate)์„ V6 ๋กœ ์˜ฎ๊ธด ๊ฒƒ. ๋‘˜ ๋‹ค **ํ•™์Šต ๊ฐ€๋Šฅ**
ํ•˜๊ฒŒ ๋‚จ์•„ ์žˆ์–ด์„œ ๊ณ ์ • ์ถ•์†Œ์™€ ๋‹ฌ๋ฆฌ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋‚˜์ค‘์— ์ œ ๊ฐ•๋„๊นŒ์ง€ ์ž๋ž„ ์ˆ˜ ์žˆ๋‹ค.
**๋‹จ๋…์œผ๋กœ๋Š” ๋ฐœ์‚ฐ์„ ๋ง‰์ง€ ๋ชปํ–ˆ๋‹ค.**

### 2.2 `SRA_GATE_SCALE` โ€” ์ „์—ญ ์ถ•์†Œ

```python
res = SRA_GATE_SCALE * gate * self.out_proj(nodes)     # ๊ธฐ๋ณธ 1.0 = off
```

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์ฒ˜๋ฐฉ์ด์ง€๋งŒ **๊ฐ€์žฅ ๋นจ๋ฆฌ ๋ฐœ์‚ฐํ–ˆ๋‹ค(3ํšŒ์ฐจ). ํ๊ธฐ.**

### 2.3 `SRA_RES_CAP` / `SRA_RES_CAP_REL` โ€” residual norm ์ƒํ•œ

```python
_cap = float(os.environ.get('SRA_RES_CAP', 0.0) or 0.0)          # ์ ˆ๋Œ€ ์ƒํ•œ
if _cap > 0:
    rn  = res.norm(dim=-1, keepdim=True)
    res = res * torch.where(rn > _cap, _cap / rn.clamp_min(1e-6), torch.ones_like(rn))

_rel = float(os.environ.get('SRA_RES_CAP_REL', 0.0) or 0.0)      # ์ƒ๋Œ€ ์ƒํ•œ โ˜…
if _rel > 0:
    lim = _rel * orig.norm(dim=-1, keepdim=True)   # ๋…ธ๋“œ๋งˆ๋‹ค ์ž๊ธฐ ์ž„๋ฒ ๋”ฉ ํฌ๊ธฐ์— ๋น„๋ก€
    rn  = res.norm(dim=-1, keepdim=True)
    res = res * torch.where(rn > lim, lim / rn.clamp_min(1e-6), torch.ones_like(rn))
out = orig + res
```

**์ ˆ๋Œ€ cap ์€ ๊ฐ’์„ ๋‚ฎ์ถฐ๋„ ๋ฐœ์‚ฐ ์‹œ์ ์„ ๋ฏธ๋ฃฐ ๋ฟ์ด์—ˆ๋‹ค:**

| ์ ˆ๋Œ€ cap | ๊ฒฐ๊ณผ |
|---|---|
| 6.0 | 4ํšŒ์ฐจ ๋ฐœ์‚ฐ |
| 3.0 | 5ํšŒ์ฐจ ๋ฐœ์‚ฐ |
| 1.0 | 8ํšŒ์ฐจ best 0.9662 โ†’ ์ดํ›„ ๋ฐœ์‚ฐ, ์ตœ๊ทผ 1.41 |
| 0.5 | 10ํšŒ์ฐจ best 0.8732 โ†’ 12ํšŒ์ฐจ๋ถ€ํ„ฐ ๋ฐ˜๋“ฑ, ์ตœ๊ทผ 1.41 |

์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค. (a) residual norm ์€ ํ˜ธ์ŠคํŠธ ์ž„๋ฒ ๋”ฉ ์Šค์ผ€์ผ ์œ„์— ์žˆ์–ด์„œ MoFlow ์—์„œ
ํŠœ๋‹ํ•œ ๊ฐ’์ด MID/LED ์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. (b) `x โ† x + res` ์˜ ๋ˆ„์ ์„ ์ง€๋ฐฐํ•˜๋Š” ๊ฒƒ์€
์ ˆ๋Œ€ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ **๋น„์œจ `โ€–resโ€–/โ€–xโ€–`** ์ธ๋ฐ ์ ˆ๋Œ€ cap ์€ ์ด๊ฑธ ์ง์ ‘ ํ†ต์ œํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ƒ๋Œ€ cap ์€ ๋…ธ๋“œ๋งˆ๋‹ค `โ€–resโ€– โ‰ค rยทโ€–origโ€–` ๋กœ **๋น„์œจ์„ ์ง์ ‘** ๋ฌถ๋Š”๋‹ค. ์ด๊ฒƒ๋งŒ ์‚ด์•„๋‚จ์•˜๋‹ค.

### โš ๏ธ ๊ฐ™์ด ๊ณ ์นœ ๊ฒƒ โ€” ์ด์ „ cap ๊ตฌํ˜„์˜ dead-gradient ๋ฒ„๊ทธ

์ฒ˜์Œ ์“ด cap ์€ `res * (rn.clamp(max=cap) / (rn + 1e-6))` ์ด์—ˆ๋Š”๋ฐ ๋‘ ๊ฐ€์ง€๊ฐ€ ํ‹€๋ ธ๋‹ค.

1. **`res = 0` ์—์„œ gradient ๊ฐ€ ์ •ํ™•ํžˆ 0.** ์Šค์ผ€์ผ์ด `0/1e-6 = 0` ์ด๊ณ  Jacobian ๋„ 0.
   `SRA_SOFT_START`(out_proj zero-init)์™€ ๊ฐ™์ด ์ผœ๋ฉด out_proj ๊ฐ€ 0 ์— ์˜๊ตฌํžˆ ๊ฐ‡ํ˜€
   **๊ทธ๋ž˜ํ”„๊ฐ€ ์ „ํ˜€ ํ•™์Šต๋˜์ง€ ์•Š๋Š”๋‹ค.** NaN ์ด ์•„๋‹ˆ๋ผ ์กฐ์šฉํžˆ ์ฃฝ๋Š”๋‹ค.

   | ์„ค์ • | out_proj gradient ํ•ฉ |
   |---|---|
   | SOFT_START ๋งŒ | 78,751 |
   | RES_CAP ๋งŒ | 765,506 |
   | **SOFT_START + RES_CAP** | **0.00** โ† ํ•™์Šต ๋ถˆ๊ฐ€ |

   ์‹ค์ œ๋กœ ๊ทธ ์กฐํ•ฉ์œผ๋กœ ๋Œ๋ฆฐ ์‹คํ–‰์˜ ์ฒดํฌํฌ์ธํŠธ๋Š” 58 epoch ๋’ค์—๋„
   `future_graph.out_proj` ๊ฐ€ ์ •ํ™•ํžˆ `0.000000e+00` ์ด์—ˆ๋‹ค. ์ฆ‰ ๊ทธ ์‹คํ–‰๋“ค์€ host
   ๋‹จ๋…(=baseline)์„ ์ธก์ •ํ•œ ๊ฒƒ์ด๊ณ , "cap ์ด ๋ฐœ์‚ฐ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค"๋˜ ๊ฒฐ๋ก ์€ ๋ฌดํšจ์˜€๋‹ค.
   ํ•ด๋‹น ๊ฒฐ๊ณผ 4๊ฑด์€ ํ๊ธฐํ–ˆ๋‹ค.

2. **cap ๋ฏธ๋งŒ ๊ฐ’๋„ ๋ถ€๋‹นํ•˜๊ฒŒ ์ถ•์†Œ๋œ๋‹ค.** `rn/(rn+1e-6)` ์€ `rn` ์ด ์ž‘์„์ˆ˜๋ก 1 ์—์„œ
   ๋ฉ€์–ด์ง„๋‹ค โ€” `โ€–resโ€–=1e-5` ์—์„œ **0.909 ๋ฐฐ**.

`torch.where` ๋กœ ๋ฐ”๊พธ๋ฉด ๋‘˜ ๋‹ค ํ•ด๊ฒฐ๋œ๋‹ค.

| ๊ฒ€์ฆ | old | new |
|---|---|---|
| `res=0` ์—์„œ gradient | 0.0000 | **31.30** |
| `โ€–resโ€–=1e-5` ์ผ ๋•Œ ์Šค์ผ€์ผ | 0.909 | **1.000** |
| cap ์ดˆ๊ณผ ์‹œ ์ƒํ•œ | 3.0 | 3.0 (๋™์ผ) |
| ์ •์ƒ ๊ตฌ๊ฐ„ gradient ์ฐจ์ด | โ€” | ์ƒ๋Œ€์ฐจ 6e-7 |

---

## 3. ํ† ๊ธ€ ์š”์•ฝ

| ํ† ๊ธ€ | ๊ธฐ๋ณธ | ์—ญํ•  | ํŒ์ • |
|---|---|---|---|
| `SRA_EDGE_FIX` | off | edge index ์”ฌ ํ˜ผํ•ฉ ์ˆ˜์ • | **ํ•„์ˆ˜** |
| `SRA_RES_CAP_REL` | 0 (off) | `โ€–resโ€– โ‰ค rยทโ€–origโ€–` ๋น„์œจ ์ƒํ•œ | **์œ ์ผํ•œ ์ƒ์กด ์ฒ˜๋ฐฉ** |
| `SRA_RES_CAP` | 0 (off) | ์ ˆ๋Œ€ ์ƒํ•œ | ๋‘ ๊ฐ’ ๋ชจ๋‘ ๋ฐœ์‚ฐ, ์—ด๋“ฑ |
| `SRA_SOFT_START` | off | out_proj zero-init + gate bias | ๋‹จ๋… ๋ถˆ์ถฉ๋ถ„. **RES_CAP ๊ณผ ๋ณ‘์šฉ ๊ธˆ์ง€** (ยง2.3) |
| `SRA_GATE_BIAS` | โˆ’4.0 | SOFT_START ์˜ gate bias | โ€” |
| `SRA_GATE_SCALE` | 1.0 (off) | ์ „์—ญ ์ถ•์†Œ | 3ํšŒ์ฐจ ๋ฐœ์‚ฐ, ํ๊ธฐ |

---

## 4. ์ง€๊ธˆ ์‹ค์ œ๋กœ ๋Œ๋ฆฌ๋Š” ์„ค์ •

```bash
SRA_EDGE_FIX=1 SRA_RES_CAP_REL=0.03 \
CUDA_VISIBLE_DEVICES=1 python fm_nba_graph_v6.py \
  --cfg cfg/nba/cor_fm.yml --exp v3_rel003 \
  --batch_size 192 --epochs 150 --fm_in_scaling --tied_noise \
  --top_n_neighbors 5 --uncertainty_weight 0.01 --data_dir ./data/nba
```

eval ๋ณ„ min-ADEโ‚‚โ‚€ @4.0s (24ํšŒ์ฐจ, 4170/25500 = 16 % ์ง„ํ–‰):

| ์„ค์ • | 1โ€“6 | 7โ€“12 | 13โ€“18 | 19โ€“24 |
|---|---|---|---|---|
| **relcap 0.03** | 1.190 1.010 0.979 1.019 0.971 0.941 | 0.912 0.894 0.894 0.857 0.863 0.863 | 0.840 0.828 0.832 0.818 **0.816** 0.819 | **0.803** 0.823 0.808 0.818 0.807 0.820 |
| relcap 0.10 | 1.128 1.017 0.988 0.954 0.950 0.944 | 0.958 0.936 0.880 0.889 0.857 0.862 | 0.876 0.863 0.893 0.873 0.871 0.874 | 0.869 0.915 0.873 0.867 **0.830** 0.894 |
| cap 0.5 (์ ˆ๋Œ€) | 1.155 1.032 1.018 0.990 0.978 0.907 | 0.937 0.901 0.931 **0.873** 0.875 0.922 | 0.958 โ†’ ๋ฐœ์‚ฐ | ์ข…๋ฃŒ (์ตœ๊ทผ 1.41) |
| cap 1.0 (์ ˆ๋Œ€) | 1.146 1.013 0.985 1.020 0.978 1.006 | 1.170 **0.966** 1.309 1.378 1.150 1.344 | ๋ฐœ์‚ฐ | ์ข…๋ฃŒ (์ตœ๊ทผ 1.41) |
| cap ์—†์Œ | 1.141 1.052 1.048 **1.828** 1.429 1.716 | ๋ฐœ์‚ฐ | โ€” | โ€” |

ํ˜„์žฌ best (ADE/FDE ๋Š” **๊ฐ™์€ ํ‰๊ฐ€ ์‹œ์ **์—์„œ ์ง์ง€์Œ):

| ์„ค์ • | best ADE / FDE | @eval | ํ‰๊ฐ€ ํšŸ์ˆ˜ |
|---|---|---|---|
| **relcap 0.03** | **0.8029 / 0.9635** | 19 | 24 (์•ˆ์ •) |
| relcap 0.10 | 0.8302 / 1.0857 | 23 | 24 (์ง„๋™) |

---

## 5. ์ด ๋ณ€๊ฒฝ์ด ๋…ผ๋ฌธ ์ˆ˜์น˜์— ์˜๋ฏธํ•˜๋Š” ๊ฒƒ โ€” ์ •์งํ•œ ์ƒํƒœ

**โ‘  ๋…ผ๋ฌธ์˜ MoFlow+SRA = 0.695 ๋Š” ๋ฒ„๊ทธ ์ƒํƒœ์˜ ๊ฐ’์ด๋‹ค.** ์”ฌ์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๊ทธ๋ž˜ํ”„๋กœ
์–ป์€ ๊ฐ’์ด๋ฏ€๋กœ, "์˜ˆ์ธก๋œ ๋ฏธ๋ž˜ ์œ„์˜ ์”ฌ ๋‚ด๋ถ€ sparse graph ๋•๋ถ„"์ด๋ผ๋Š” ๋…ผ๋ฌธ์˜ ์„ค๋ช…๊ณผ
๊ทธ ์ˆ˜์น˜๋ฅผ ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

**โ‘ก ์ˆ˜์ • ํ›„ ์žฌํ•™์Šต์€ ์•„์ง 0.695 ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.** ํ˜„์žฌ 0.8029 (16 % ์ง„ํ–‰).
๋‚จ์€ 84 % ์™€ cosine LR ๊ฐ์‡ ์—์„œ ๋” ๋‚ด๋ ค๊ฐ€์•ผ ํ•˜๋ฉฐ, **๋„๋‹ฌํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์€
์—ด๋ ค ์žˆ๋‹ค.**

**โ‘ข `SRA_RES_CAP_REL` ์€ ๋…ผ๋ฌธ์— ์—†๋Š” ํ•ญ์ด๊ณ  ์ถ”๋ก  ์‹œ์—๋„ ์ ์šฉ๋œ๋‹ค.**
๋”ฐ๋ผ์„œ ์ด๊ฑด ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ **๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ**์ด๋‹ค. ์“ด๋‹ค๋ฉด ๋…ผ๋ฌธ ๋ณธ๋ฌธ์—
๊ธฐ์ˆ ํ•ด์•ผ ํ•˜๊ณ , ์•ˆ ์“ฐ๋ฉด edge ์ˆ˜์ •๋ณธ MoFlow ๋Š” ์•„์˜ˆ ํ•™์Šต๋˜์ง€ ์•Š๋Š”๋‹ค
(`SRA_EDGE_FIX=1` ๋งŒ์œผ๋กœ๋Š” 4ํšŒ์ฐจ์— 1.828 ๋กœ ๋ฐœ์‚ฐ).

**โ‘ฃ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋Š” ์ด ์ฒ˜๋ฐฉ์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** MID ๋Š” `graph_gate_init`/`warmup`,
LED ๋Š” ์ฒ˜๋ฐฉ ์—†์ด ํ•™์Šต๋œ๋‹ค. ์ƒ๋Œ€ cap ์„ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ์ ์šฉํ•˜๋ ค๋ฉด ๊ทธ ํ˜ธ์ŠคํŠธ์˜
residual/embedding ๋น„์œจ์„ ๋จผ์ € ์ธก์ •ํ•ด์•ผ ํ•œ๋‹ค.

**โ‘ค ๋น„์œจ๊ฐ’ ํŠœ๋‹์ด ๋๋‚˜์ง€ ์•Š์•˜๋‹ค.** 0.03 ์ด 0.10 ๋ณด๋‹ค ๋‚ซ๋‹ค. ๋” ์กฐ์ธ ๊ฐ’(0.01)์ด
๋‚˜์„์ง€, 0.03 ์ด ์ด๋ฏธ ๊ณผํ•œ ์ œ์•ฝ์ธ์ง€๋Š” ๋ฏธ๊ฒ€์ฆ์ด๋‹ค.