CERBERUS ์คํ ๋ก๋๋งต โ ๋ฌด์์, ์, ์ด๋ค ์์๋ก
์ด ๋ฌธ์ ํ๋๋ง ์ฝ์ผ๋ฉด ๋ค๋ฅธ ์๋ฒ์ ์์ด์ ํธ๋ ์ด์ด์ ์งํํ ์ ์๋๋ก ์ด๋ค. ํํฉยท๊ทผ๊ฑฐยท๋ค์ ๋ช ๋ นยทํ๋จ ๊ธฐ์ค์ ํ๊ณณ์ ๋ชจ์๋ค.
- ์ธ์
๋ณต๊ตฌ ์ ์ฐจ:
../../CLAUDE.md(๋ณผ๋ฅจ ๋ฃจํธ) ๋๋session-recovery.md - ํ์ต ์ด๋ ฅยท์ค์ ๊ทผ๊ฑฐ:
training-log.md - ์ฌ์ฌ ์ง์ ๊ณผ ๋์:
review-2026-08-10-methodology.md
0. ์ด ์ฐ๊ตฌ๊ฐ ์ ์ฆํ๋ ค๋ ๊ฒ
HAWK๋ ์ ์ ๋ฐฐ๊ฒฝ์ ๋ณ๋ ํ์ต ๋์์ผ๋ก ๋์ง ์๋๋ค. ๋ฐฐ๊ฒฝ ์ ์ฉ ์คํธ๋ฆผ์ ์ถ๊ฐํ๊ณ ์ฅ๋ฉด ์ธ์ด๋ก ๊ฐ๋ ํ๋ฉด, ๋ฐฐ๊ฒฝ ๋งฅ๋ฝ์ด ์ค์ํ ์ด์์์ ์ดํด ์ฑ๋ฅ์ด ํฅ์๋๋ค.
์ฆ๋ช ํด์ผ ํ๋ ๊ฒ์ ์ธ ๋จ๊ณ์ด๋ฉฐ, ๋ค๋ก ๊ฐ์๋ก ์ด๋ ต๋ค.
| ๋จ๊ณ | ์ฃผ์ฅ | ๋ฐ์ฆ๋๋ ์กฐ๊ฑด |
|---|---|---|
| S1 | ๋ฐฐ๊ฒฝ ์คํธ๋ฆผ์ ์ถ๊ฐํ๋ฉด ์ฑ๋ฅ์ด ์ค๋ฅธ๋ค | flow โ zero |
| S2 | ๊ทธ ํฅ์์ด ์ฉ๋์ด ์๋๋ผ ๋ฐฐ๊ฒฝ ๋ด์ฉ ๋๋ฌธ์ด๋ค | flow โ random_mask |
| S3 | ๊ทธ ํฅ์์ด ์๋ณด ๋ถํด ๋๋ฌธ์ด๋ค (๋จ์ ์ถ๊ฐ๊ฐ ์๋๋ผ) | flow โ duplicate |
S1๋ง ์ฑ๋ฆฝํ๊ณ S2๊ฐ ๊นจ์ง๋ฉด "๋ธ๋์น๋ฅผ ๋๋ฆฌ๋ฉด ์ข๋ค"๋ ํํ ๊ฒฐ๊ณผ๋ก ์ถ์๋๋ค. S2๊น์ง ์ฑ๋ฆฝํ๊ณ S3๊ฐ ๊นจ์ง๋ฉด "๋ฐฐ๊ฒฝ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ฃผ๋ฉด ์ข๋ค"๊น์ง๋ ์ฃผ์ฅํ ์ ์์ผ๋ "ํ์๊ฐ ๋ณด์กด ์๋ณด ๋ถํ "(C1)์ ๊ณ ์ ์ฑ์ ํฌ๊ธฐํด์ผ ํ๋ค.
์ค๊ณ ์์น: ๊ฐ์ค์ด ์ฐธ์ด๋ผ๋ฉด ๋๋ฌ๋๋๋ก ์ต๋ํ ์ ๋ฆฌํ ์กฐ๊ฑด์ ๋ง๋ค๋, ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ์ ๋ฌด์์ ๋ณด๊ณ ํ ์ง๋ ๋ฏธ๋ฆฌ ์ ํด ๋๋ค. ์ด๋ ์ชฝ์ด ๋์ค๋ ์ธ ์ ์๋ ๋ ผ๋ฌธ์ด ๋๋๋ก ํ๋ค.
1. ํ์ฌ ์งํ ์ค โ โ ํต์ ๊ตฐ 4-arm
๋ชฉ์ : S1ยทS2ยทS3๋ฅผ ํ ๋ฒ์ ํ์ ํ๋ค. ์ด ์คํ์ด ๋ ผ๋ฌธ์ ์์ฌ๋ฅผ ๊ฐ๋ฅธ๋ค.
cd $CERBERUS_ROOT/hawk
bash scripts/run_ablation_arms.sh # flow โ random_mask โ duplicate โ zero
- arm๋น 40 epoch(=400k ์ํ), ์ฝ 1.6์ผ. ์ ์ฒด ์ฝ 6.4์ผ
- ๋ค arm์ ์ํคํ ์ฒยทํ๋ผ๋ฏธํฐ ์ยท์๊ฐ ํ ํฐ ์๊ฐ ๋์ผํ๊ณ ์ ์ ์คํธ๋ฆผ์ ๋ด์ฉ๋ง ๋ค๋ฅด๋ค
- ์ฌ๊ฐ ๊ฐ๋ฅ: ๋๊ธด ๋ค ๊ฐ์ ๋ช
๋ น์ ๋ค์ ์คํํ๋ฉด
train_run.sh๊ฐ arm๋ณ๋ก ์ด์ด๋ฐ๋๋ค - ์งํ ํ์ธ:
grep -c "Averaged stats" $CERBERUS_ROOT/runs/abl_<arm>/train.log
์ฃผ์ โ ์ด ์คํ์ด ๋๋ ๋์ ํ์ต ๊ฒฝ๋ก ์ฝ๋๋ฅผ ์์ ํ์ง ๋ง ๊ฒ. arm๋ง๋ค ๋ค๋ฅธ ์ฝ๋๋ก ํ์ต๋๋ฉด ํต์ ๊ฐ ๊นจ์ง๋ค(์ค์ ๋ก ํ ๋ฒ ๋ฐ์ํด ์ฌ์์ํ๋ค). ํ๊ฐยท๋ฌธ์ยท๋ถ์ ์ฝ๋๋ ๋ฌด๊ดํ๋ค.
๋๋๋ฉด ํ ์ผ
for a in flow random_mask duplicate zero; do
$CERBERUS_PY scripts/evaluate.py --ckpt $CERBERUS_ROOT/runs/abl_$a/main/checkpoint_39.pth \
--out experiments/out/eval_abl_$a.json --judge gemini-2.5-flash
done
$CERBERUS_PY scripts/evaluate.py --compare
2. ๋ค์ ์์ (โ ์๋ฃ ํ)
์ฐ์ ์์๋ "์ด๋ค ์ง๋ฌธ์ ๋ตํ์ง ๋ชปํ๋ฉด ๋ ผ๋ฌธ์ด ๋งํ๋๊ฐ" ๊ธฐ์ค์ด๋ค.
โก ์๋ 3ํ โ 3.2์ผ ยท ์ต์ฐ์
๋ฐฐ๊ฒฝ ์คํธ๋ฆผ์ ๊ธฐ๋ ์ด๋์ ์ด ๋ฒค์น๋งํฌ์์ ์์์ ๋์งธ ์๋ฆฌ ๋์ญ์ด๋ค. ๋จ์ผ ์คํ
์ ์ถ์ ์ผ๋ก๋ "๋ฐ ๊ฐ ๋
ธ์ด์ฆ์ ๊ตฌ๋ณ๋์ง ์๋๋ค"๋ ํ ๋ฌธ์ฅ์ ๋ฌด๋์ง๋ค. ์ฃผ์ 2๊ฐ arm
(flow, ๊ฐ์ฅ ๊ฐํ ํต์ ๊ตฐ)์ ์๋ 3๊ฐ๋ฅผ ๋๋ ค ํ๊ท ยฑํ์คํธ์ฐจ์ ๋ถํธ์คํธ๋ฉ CI๋ฅผ ๋ณด๊ณ ํ๋ค.
# seed ๋ config ์ run.seed ๋ฅผ --options ๋ก ๋ฎ์ด์ด๋ค
for s in 43 44; do
bash scripts/train_run.sh configs/train_configs/ablation/stage2_flow.yaml abl_flow_s$s 0,1 2
done
โป run.seed ์ค๋ฒ๋ผ์ด๋๋ฅผ train_run.sh์ OPTS์ ์ถ๊ฐํด์ผ ํ๋ค(๋ฏธ๊ตฌํ).
โข 5๋ฒ์งธ arm โ ๊ณ ์น L_dis โ 1.6์ผ
๋ตํ๋ ์ง๋ฌธ: "์ ๋๋ก ์๋ํ๋ ๋ถ๋ฆฌ ๋ชฉ์ ํจ์๊ฐ ํ๋ฅ ์ฑ๋ฅ์ ๋ฐ๊พธ๋๊ฐ."
ํ์ฌ L_dis๋ ํดํ ๊ณ ์ ์ ์ ์์ด ๊ธฐ์ธ๊ธฐ๊ฐ 0์ด๋ค(ยง4 ์ฐธ์กฐ). ๊ณ ์ณ์ ์ฌ์คํํ๋ ค๋ฉด
Stage-1๋ถํฐ ๋ค์ ํด์ผ ํ ๊ฒ ๊ฐ์ง๋ง, encoder_1์ด ๊ณ๊ฐ์ง๋ผ ๊ทธ๋ด ํ์๊ฐ ์๋ค โ
projection.py์์ decoder_2๋ encoder_0์ ์ถ๋ ฅ์ ๋ฐ์ผ๋ฏ๋ก, encoder_1๋ง
์ฌ์ด๊ธฐํํ๋ฉด LLM ๊ฒฝ๋ก๊ฐ ์์๋์ง ์๋๋ค.
1. L_dis ์ฌ์ ์: ๋ฐ์๊ด(cosโโ1) โ ํ์๊ด(|cos|โ0)
+ ๋ฐฐ์น ์ค์ฌํ, ์ํ๋ณ ์ฝ์ฌ์ธ(.view(1,-1) ์ ๊ฑฐ), ๋ถ์ฐ ํํ(VICReg์ hinge)
2. checkpoint_106 ๋ก๋ ํ encoder_1 ๋ง ์ฌ์ด๊ธฐํ
3. Stage-2 40 epoch (๋ค๋ฅธ arm๊ณผ ๋์ผ ์์ฐ)
ํ๊ณ: Stage-2๋ 400k ์ํ์ด๋ผ ๋ชฉ์ ํจ์๊ฐ ์์ฉํ ๊ธฐํ๊ฐ Stage-1(1.6M)๋ณด๋ค ์ ๋ค. "Stage-1๋ถํฐ ๊ณ ์ณ ํ์ตํ๋ค๋ฉด ์ด๋ ์์ง"๋ ๋ตํ์ง ๋ชปํ๋ฉฐ, ์ด๋ ํ๊ณ๋ก ๋ช ์ํ๋ค.
โฃ ego-motion ๋ณด์ arm โ 1.6์ผ
DoTA(์ ์ฒด์ 62%)์์ ์๊ธฐ์ด๋์ด ํ๋ฉด ์ ์ฒด๋ฅผ ๋์ ์ผ๋ก ๋ถ๋ฅํด ์ ์ ์คํธ๋ฆผ์ด ๋น๋ ๋ฌธ์
(mask_statistics.json). ์ ์ญ ํธ๋ชจ๊ทธ๋ํผ ์ถ์ ํ ์์ฐจ ํ๋ก์ฐ๋ก ๋ง์คํฌ๋ฅผ ๋ง๋ ๋ค.
์ฑ๋ฅ ๊ฐ์ ์ด์ ๋ฐฉ๋ฒ๋ก ๊ธฐ์ฌ๊ฐ ๋ ์ ์๋ค โ ๋ฐฐ๊ฒฝ์ ๋ ์ ๋ณด๊ฒ ๋ง๋๋ ๋ฐฉํฅ์ด๋ฏ๋ก
์ฐ๊ตฌ ์ฃผ์ฅ๊ณผ ๊ฐ์ ๋ฐฉํฅ์ด๋ค.
โค Stage-1 ์ฌํ์ต โ 2.8์ผ + Stage-2 6.3์ผ
โข์ ์์ ํ. L_dis๋ฅผ ๊ณ ์น ์ํ๋ก Stage-1๋ถํฐ 1.6M ์ํ์ ๋ค์ ํ์ตํ๋ค.
โข์์ ์ ์ํ ํจ๊ณผ๊ฐ ๋ณด์์ ๋๋ง ์ ๋นํ๋๋ค. 2 GPU ๊ธฐ์ค max_epoch์ 107 โ 133
์ผ๋ก ์ฌ๋ ค์ผ ์ํ ์์ฐ(1.6M)์ด ์ ์ง๋๋ค(iters_per_epoch 1500, batch 4, 2 GPU).
โฅ ์ฃผ ๋น๊ต full-budget run โ 6.3์ผ
Table 1์ ์๋ณธ ๊ณต๊ฐ ์์น์ ๋๋ํ ๋๊ธฐ ์ํด flow ๊ตฌ์ฑ์ ์๋ณธ๊ณผ ๊ฐ์ 1.6M ์ํ
(max_epoch: 160, batch 2, 2 GPU)๋ก ํ ๋ฒ ๋๋ฆฐ๋ค. โ ์ ๊ฐ์ถ ์์ฐ ๊ฒฐ๊ณผ์๋ ๋ณ๊ฐ๋ค.
3. GPU ์์ด ๋ณํํ ๊ฒ
| ์์ | ์ํ | ๋น๊ณ |
|---|---|---|
| ์ฅ๋ฉด ์ดํ ์ฌํ์จ ์งํ | โณ | ์ฐ๊ตฌ ์ฃผ์ฅ์ ์ง์ ์ฌ๋ ์ ์ผํ ์งํ โ ยง5 ์ฐธ์กฐ |
| Background-critical ์ฃผ์ 600๊ฑด | โณ | ์ฌ๋ 2์ธ ์ด์ ํ์. bg_critical_benchmark/annotation_protocol.md |
| Route B ํฉ์ฑ ํ๋ก๋ธ + ๊ท๋ฌด ์กฐ๊ฑด | โ | corrected_bsi() ๊ตฌํ๋จ, ์ค๋ฐ์ดํฐ ์ ์ฉ ๋ฏธ์ |
| ์ฐธ๊ณ ๋ฌธํ [51]โ[55] ์๋ฌธ ๋์กฐ | โณ | ๊ธฐ์ต์ผ๋ก ์์ฑ๋จ โ improved/07_references.md์ ํ์ |
| Figure 1 teaser | โณ | ์ค์ ํ๋ ์์ x / Mโx / (1โM)โx 3์ฅ์ด๋ฉด ์ถฉ๋ถ |
4. ํ์ ๋ ์ฌ์ค (๋๋๋ฆฌ์ง ๋ง ๊ฒ)
์ธก์ ยท๊ฒ์ฆ์ ๊ฑฐ์น ๊ฒ๋ค์ด๋ค. ๋ค์ ๋ ผ์ํ๊ธฐ ์ ์ ๊ทผ๊ฑฐ๋ฅผ ๋จผ์ ๋ณผ ๊ฒ.
L_dis๋ ํ์ต๋ ์ ์ด ์๋ค. checkpoint_106 ์ค์ธก:
encoder_1.bias์ฝ์ฌ์ธ+0.9988/โ0.9993(๋ชฉํ๊ฐ์ ์ ํํ ๋๋ฌ)- ๊ฐ์ ๋ชจ๋์
decoder_2.bias(์ด ์์ค์ด ์ ๋ฟ๋ ๋์กฐ๊ตฐ)+0.027/+0.023 encoder_1.weight๋ ์ด๊ธฐํ ๋๋น 0.971.01๋ฐฐ โ ์ ๋ ฅ ์ฒ๋ฆฌ๋ถ๋ ์ ์์ง์๊ณ ์ ๋ ฅ ๋ฌด๊ด bias๋ง 2040๋ฐฐ ํฝ์ฐฝcos = ยฑ1์ ์ฝ์ฌ์ธ์ ์ ๋ฅ์ โ ๊ธฐ์ธ๊ธฐ 0 โ ์ดํ 106 epoch ๋์ ๋ฌด๊ธฐ์ฌ- ๊ฒฐ๋ก :
t_4 = 0.1๊ณผt_4 = 0์ด ๋นํธ ๋จ์๋ก ๋์ผํ๋ค. ์ด๋ธ๋ ์ด์ ๋ถํ์
CDS๋ L_dis์ ์ต์ ์ ์์ 0์ด ๋๋ค. linear CKA๊ฐ ๋ถํธ ๋ถ๋ณ์ด๋ฏ๋ก
z_b = โcยทz_m์์ Redundancy = 1 โ CDS = 0. ์ฆ ๋ชฉ์ ํจ์์ ์ง๋จ ์งํ๊ฐ ์๋ก
๋ฐ๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋น์ค๋ณต์ฑ์ด ์๊ตฌํ๋ ๊ฒ์ ๋ฐ์๊ด(โ1)์ด ์๋๋ผ ํ์๊ด(0)์ด๋ค.
๋ง์คํฌ ๋น์จ์ ๋๋ฉ์ธ ๊ฐ 10๋ฐฐ ์ด์ ์ฐจ์ด ๋๋ค (์ ์ 7,852 ํด๋ฆฝ, ฯ=0.2):
DoTA 0.449 / Ped2 0.160 / Ped1 0.159 / Avenue 0.147 / ShanghaiTech 0.067 /
UCF-Crime 0.064 / UBnormal 0.039. ๊ณ ์ ์นด๋ฉ๋ผ ๋๋ฉ์ธ์์ ์ ์ ์คํธ๋ฆผ์ ํ๋ ์์
84โ96%๋ฅผ ๋ณด์กดํ๋ฏ๋ก ์ธํ ์คํธ๋ฆผ๊ณผ ์
๋ ฅ์ด ํฌ๊ฒ ๊ฒน์น๋ค โ duplicate ํต์ ๊ตฐ์ด ํนํ ์ค์.
Stage-2์๋ L_MLยทL_BL์ด ์๋ค. ์ธ ์คํธ๋ฆผ์ concatํด LLaMA๋ฅผ 1ํ ํต๊ณผ์ํค๋ฏ๋ก
loss_motion = loss_background = loss์ด๋ฉฐ(video_llama.py:806), ์คํจ ๋ชฉ์ ์
1.2ยทL_VL + 0.1ยทL_sim + 0.1ยทL_dis๋ค. ๋ฐ๋ผ์ +L_BL ์ด๋ธ๋ ์ด์
ํ์ Stage-1
์ฌ์ฌ์ ํ์ต์ ์๊ตฌํ๋ค.
Stage-1์์ L_BL์ ์ ์ ์๋ํ๋ค. ๋ก๊ทธ์ motionloss 2.6672 vs
backgroundloss 2.2075๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ด๋ผ๋ ๊ฒ์ด ์ฆ๊ฑฐ๋ค. ์ฐ๊ตฌ ์ฃผ์ฅ์ ํต์ฌ ๋ถํ์
๋ถ๊ดดํ์ง ์์๋ค.
5. ์์ง ์๋ ๊ฒ โ ์ฃผ์ฅ์ ์ง์ ์ฌ๋ ์งํ
ํ์ฌ ์งํ๋ ์ฐ๊ตฌ ์ฃผ์ฅ์ ๊ฐ์ ์ ์ผ๋ก๋ง ์ฐ๋ค.
- BLEU: ๋ฌธ์ฅ ์ ์ฒด. ๋ฐฐ๊ฒฝ ์์ ์ด ์ข์์ ธ๋ ํฌ์๋๋ค
- BSI: ๋ฐฐ๊ฒฝ์ ๋ฏผ๊ฐํ๊ฐ์ด์ง ์ ํํ๊ฐ๊ฐ ์๋๋ค
context_critical์ ํ๋: ๋ง์๋ ํ๋ ธ๋. ๋ฐฐ๊ฒฝ ์์ ํ์ง์ ์๋๋ค
์ฅ๋ฉด ์ดํ ์ฌํ์จ(Scene-word Recall) โ ์ ๋ต ์บก์
์์ ๋ฝ์ ์ฅ๋ฉด ์ดํ
(extract_background_entities_sentence๊ฐ ๋ฝ๋ ๋ฐ๋ก ๊ทธ ๋จ์ด๋ค, L_BL์ ํ์ต ๋ชฉํ)๋ฅผ
๋ชจ๋ธ ์ถ๋ ฅ์ด ์ผ๋ง๋ ๋งํ๋๊ฐ. ์ด๊ฒ์ด ์์ด์ผ "HAWK๋ ๋
ธ๋ฉด์ด ์ ์๋ค๋ ๊ฑธ ๋งํ์ง ๋ชปํ๋๋ฐ
์ฐ๋ฆฌ๋ ๋งํ๋ค" ๋ฅผ ์ซ์๋ก ์ธ ์ ์๋ค. GPU ๋ถํ์.
6. ๊ฒฐ๊ณผ๋ณ ๋์ (๋ฏธ๋ฆฌ ์ ํด ๋๋ค)
| โ ๊ฒฐ๊ณผ | ํด์ | ๋ ผ๋ฌธ ๋ฐฉํฅ |
|---|---|---|
flow > duplicate > random_mask โ zero |
S1ยทS2ยทS3 ์ ๋ถ ์ฑ๋ฆฝ | ์์๋๋ก. ์๋ณด ๋ถํด๊ฐ ํต์ฌ ๊ธฐ์ฌ |
flow โ duplicate > random_mask โ zero |
S1ยทS2 ์ฑ๋ฆฝ, S3 ์คํจ | C1์ "๋ฐฐ๊ฒฝ ์ ๋ณด์ ๋ช ์์ ๋ถ๋ฆฌ"๋ก ์ถ์. ๋ถํด์ ํํ๋ ์ฃผ์ฅํ์ง ์์ |
flow โ random_mask |
S2 ์คํจ | ์ด๋์ด ์ฉ๋ยท์ ๊ทํ ํจ๊ณผ. ๊ตฌ์กฐ ์ฃผ์ฅ ์ฒ ํ, ์์ฑ ๊ฒฐ๊ณผ๋ก ์ ์งํ๊ฒ ๋ณด๊ณ |
| ์ ๋ถ ๋์ | S1 ์คํจ | ๋ฐฐ๊ฒฝ ์คํธ๋ฆผ ์์ฒด๊ฐ ๋ฌดํจ. โฃ(ego-motion)๋ก ๋ง์คํฌ ํ์ง์ ๋จผ์ ๊ฐ์ ํด ์ฌ์๋ |
๋ง์ง๋ง ๋ ๊ฒฝ์ฐ๊ฐ ๋์๋ ๋ฒ๋ฆด ์คํ์ด ์๋๋ค โ "๋ธ๋์น ์ถ๊ฐ๋ ์ฉ๋ ํจ๊ณผ์๋ค"๋ ๊ฒ๋ ์ด ๊ณ๋ณด์์ ๋ณด๊ณ ํ ๊ฐ์น๊ฐ ์๋ ๊ฒฐ๊ณผ์ด๋ฉฐ, ํต์ ๊ตฐ์ ๊ฐ์ถ ๋๋ถ์ ๊ทธ๋ ๊ฒ ๋งํ ์ ์๋ค.
7. ๋ฐฑ์ ๊ท์ฝ
ํฐ ๋ณ๊ฒฝ ํ์๋ ์์ชฝ ๋ชจ๋ ๋ฐ์ด ๋ค๋ฅธ ์๋ฒ์์ ์ฌํ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
# ์ฝ๋ยท๋ฌธ์ยทfigure
git push https://<token>@github.com/jungseoik/hawk.git HEAD:main
# ์ฒดํฌํฌ์ธํธยท๋ก๊ทธ (HF)
$CERBERUS_PY scripts/upload_checkpoint.py --folder <name> --run-dir $CERBERUS_ROOT/runs/<run> --latest
ํ ํฐ: $CERBERUS_ROOT/.github_token, .hf_token, .gemini_token(ํ์ ์).