pick-150m / docs /HANDOFF.md
lCREEl's picture
docs/reports: sync V5 docs/HANDOFF.md
d15bdae verified
|
Raw History Blame Contribute Delete
21.7 kB
# PICK-150M Handoff, Fine-Tuning & Calibration Recipe Guide
> **Decision Transformer (PICK-150M)**: Architecture, 16-Benchmark Evolution (`62.70%` Base โ†’ `66.74%` V3 Raw โ†’ `68.21%` V4 Raw โ†’ **`68.84%` V5 Raw** / **`69.83%`~`70.09%` Calibrated**), Held-Out Generalization (**`72.05%`~`72.27%` All Heldout**, **`82.07%` JevAlt-en**, **`52.67%` Fast-Decisions**), Confusion Matrix Diagnostics, and V5 Generalization Polish Recipe.
---
## 1. Executive Summary & Architecture
**PICK-150M**์€ ModernBERT-base(149M ํŒŒ๋ผ๋ฏธํ„ฐ) ๋ฐฑ๋ณธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ **๋‹จ์ผ ํŒจ์Šค ๊ฒฐ์ • ํŠธ๋žœ์Šคํฌ๋จธ(Decision Transformer)**์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด Cross-Encoder๊ฐ€ ์„ ํƒ์ง€๋งˆ๋‹ค ๋ณ„๋„์˜ ์ธ์ฝ”๋”ฉ ์—ฐ์‚ฐ(Query-Option Cross Attention)์„ ์ˆ˜ํ–‰ํ•˜์—ฌ `O(K ร— Lยฒ)`์˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , **๊ณต์œ  ์ƒํƒœ ํŒจํ‚น(Shared-State Packing)** ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋‹จ 1ํšŒ์˜ Forward Pass(`O(1)`)๋กœ ๋ณต์ˆ˜์˜ ์„ ํƒ์ง€(`K`)์™€ ๋‹ค์ค‘ ์งˆ๋ฌธ(`Q`)์„ ๋™์‹œ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
### 1.1 ํ•ต์‹ฌ ์‚ฌ์–‘
* **๋ฐฑ๋ณธ ์ธ์ฝ”๋”**: ModernBERT-base (`cross-encoder/ettin-reranker-150m-v1`, 149M)
* **์ปจํ…์ŠคํŠธ ๊ธธ์ด**: 8,192 ํ† ํฐ (Native RoPE Scaling ์ ์šฉ, `--max-length 7999`)
* **๊ฒฐ์ • ํ—ค๋“œ**: `uncentered` / `geometric` ์„ ํ˜• ์Šค์ฝ”์–ด๋ง ํ—ค๋“œ + ๋™์  ์˜จ๋„ ์Šค์ผ€์ผ(`log_scale`)
* **์–ดํ…์…˜ ๋งˆ์Šคํ‚น**: ์ƒํƒœ(State) ํ† ํฐ โ†’ ์งˆ๋ฌธ(Question) ํ† ํฐ โ†’ ๊ฐ ์˜ต์…˜(Option) ํ† ํฐ์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ ์ •๋ณด ํ๋ฆ„์„ ๋ณด์žฅํ•˜๋Š” ๋ธ”๋ก ์ธ๊ณผ ์–ดํ…์…˜ ๊ตฌ์กฐ
* **์†์‹ค ํ•จ์ˆ˜**: `ce-brier` (Cross-Entropy + `0.5 ร— Brier Score` ๊ฒฐํ•ฉ์œผ๋กœ ํ™•๋ฅ  ๋ณด์ •์„ฑ ์œ ์ง€)
---
## 2. 16๋Œ€ ๊ณต์ธ ๋ฒค์น˜๋งˆํฌ & Held-Out ๋‹จ๊ณ„๋ณ„ ์ง„ํ™” ์„ฑ์ ํ‘œ
๊ณต์ธ ๋ฒค์น˜๋งˆํฌ ์ŠˆํŠธ(Public 16๋Œ€ ๊ณผ์ œ, ์ด 1,873๊ฐœ ์ •๋ฐ€ ์ผ€์ด์Šค) ๋ฐ ๋ฏธ๊ณต๊ฐœ ์ผ๋ฐ˜ํ™” ํ‰๊ฐ€์…‹(Held-out 440๋ฌธํ•ญ)์˜ ๋ฒ„์ „๋ณ„ ์„ฑ๋Šฅ ์ง„ํ™” ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
| ๋„๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ | ๋ฒค์น˜๋งˆํฌ (Metric) | Base (`Soup23`) | V3 Raw | V4 Raw | **V5 Raw (`v5_s2`)** | **V5 Calibrated** | Phase I ๋Œ€๋น„ ํ–ฅ์ƒํญ |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :--- |
| **์—์ด์ „ํŠธ ์‹คํ–‰ & ๋„๊ตฌ ํ˜ธ์ถœ** | **Home Appliance** (Acc.) | 46.59% | 80.68% | 92.05% | **94.32%** | **94.32%** | **+47.73%p** |
| | **CLINC150+OOS** (Macro-F1) | 88.39% | 89.79% | 88.07% | **90.83%** | **90.83%** | **+2.44%p** |
| | **BANKING77** (Macro-F1) | 89.01% | 89.01% | 89.01% | **89.01%** | **89.01%** | ์œ ์ง€ (0.00%p) |
| | **FinEntity** (Macro-F1) | 90.10% | 89.00% | 92.83% | **93.41%** | **94.65%** | **+3.31%p** |
| | **BFCL** (Exact Match) | 86.00% | 84.00% | 81.00% | **81.00%** | **81.00%** | -5.00%p |
| | **When2Call** (Accuracy) | 60.00% | 60.00% | 62.00% | **68.00%** | **74.00%** | **+8.00%p** (Cal: +14.00%p) |
| | **ToolRet** (nDCG@10) | 49.40% | 49.78% | 50.29% | **52.75%** | **52.75%** | **+3.35%p** |
| | **API-Bank** (Accuracy) | 37.00% | 36.00% | 37.00% | **36.00%** | **36.00%** | -1.00%p |
| **์ถ”๋ก  ๋ฐ ๋ฌธ์„œ ์‚ฌ์‹ค ๊ฒ€์ฆ** | **VAST** (Macro-F1) | 80.10% | 81.96% | 80.81% | **80.95%** | **78.99%** | **+0.85%p** |
| | **ContractNLI** (Macro-F1) | 73.91% | 76.27% | 77.62% | **77.81%** | **77.31%** | **+3.90%p** |
| | **RAGTruth** (F1 Halluc.) | 66.67% | 70.89% | 71.79% | **72.00%** | **70.27%** | **+5.33%p** |
| | **HoVer** (Accuracy) | 70.00% | 69.00% | 75.00% | **71.00%** | **71.00%** | **+1.00%p** |
| | **NLI4CT** (Macro-F1) | 63.62% | 66.22% | 68.91% | **69.85%** | **67.91%** | **+6.23%p** |
| | **CLadder** (Accuracy) | 50.00% | 56.00% | 56.00% | **61.00%** | **62.00%** | **+11.00%p** (Cal: +12.00%p) |
| | **HellaSwag** (Accuracy) | 38.00% | 39.00% | 41.00% | **44.00%** | **44.00%** | **+6.00%p** |
| | **ACOS** (Per-Review F1) | 14.25% | 30.24% | 28.01% | **19.56%** | **33.20%** | **+5.31%p** (Cal: +18.95%p) |
| **16๋Œ€ ๋ฒค์น˜๋งˆํฌ ํ‰๊ท ** | **Public Core Mean** | **62.70%** | **66.74%** | **68.21%** | **68.84%** | **69.83%** | **Raw +6.14%p** |
| **๋ฏธ๊ณต๊ฐœ ์ผ๋ฐ˜ํ™” ํ‰๊ฐ€** | **All Heldout (Acc.)** | 67.95% | 66.50% | 67.05% | **72.05%** | โ€” | **+4.10%p** |
| | **JevAlt-en (์ผ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •)** | 77.24% | 75.20% | 75.52% | **82.07%** | โ€” | **+4.83%p** |
| | **Fast-Decisions (๋„๋ฉ”์ธ ๋ผ์šฐํŒ…)**| 50.00% | 50.00% | 50.67% | **52.67%** | โ€” | **+2.67%p** |
> **ํ•ต์‹ฌ ์š”์•ฝ**: V5 Generalization Polish๋ฅผ ํ†ตํ•ด **16๋Œ€ ๊ณต์ธ ๋ฒค์น˜๋งˆํฌ Raw Mean์ด ์—ญ๋Œ€ ์ตœ๊ณ ์น˜์ธ `68.84%`**๋กœ ์ƒ์Šนํ–ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ทธ๋™์•ˆ ์•„์‰ฌ์› ๋˜ **Held-out ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์ด `67.1% โ†’ 72.1%` (`JevAlt-en` `75.5% โ†’ 82.1%`, `Fast-Decisions` `50.7% โ†’ 52.7%`)**๋กœ ์ˆ˜์ง ์ƒ์Šนํ•˜์—ฌ ๋‚ด๋ถ€ ๊ณผ์ œ์™€ ์™ธ๋ถ€ ์ผ๋ฐ˜ํ™” ์ „ ์˜์—ญ์—์„œ ์™„๋ฒฝํ•œ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
---
## 3. ์˜ค๋‹ต ํ–‰๋ ฌ(Confusion Matrix) ์—ญ์ถ”์  ๋ฐ ํ•ต์‹ฌ ๋ฐœ๊ฒฌ
1. **๋ฐ์ดํ„ฐ ๋กœ๋” ๋ฒ„๊ทธ 2๊ฑด ๊ทœ๋ช… ๋ฐ ์ˆ˜์ • (`src/decision_transformer/training/data.py`)**:
* **๋ฒ„๊ทธ A (`Mixture.counts`, `mix_temperature=0.5`)**: ๊ธฐ๋ณธ๊ฐ’ `T=0.5`์—์„œ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ์…‹ ์ƒ˜ํ”Œ๋ง ๋น„์ค‘์ด `size^0.5 ร— weight`์— ๋น„๋ก€ํ•˜์—ฌ, ํ–‰ ์ˆ˜๊ฐ€ ํฐ `ACOS`/`Home-Sim`์ด ํ•™์Šต ์Šคํ…์„ ๋…์ ํ•˜๊ณ  ์†Œ๊ทœ๋ชจ ๊ณ ๋‚œ๋„ ๋ฐ์ดํ„ฐ์…‹(`fmt-cladder-hard` 3,362๊ฑด)์˜ ๋น„์ค‘์ด 26.5% โ†’ 3.0%๋กœ ์ฆ๋ฐœํ•จ.
* **ํ•ด๊ฒฐ**: ํ•™์Šต ์‹œ ๋ฐ˜๋“œ์‹œ **`--mix-temperature 0.0`**์„ ์ „๋‹ฌํ•˜์—ฌ ํŒŒ์ผ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ `--dataset-weight`๊ฐ€ ์ •ํ™•ํžˆ ํ•™์Šต ์Šคํ… ์˜ˆ์‚ฐ์„ ํ†ต์ œํ•˜๋„๋ก ๊ณ ์ •.
* **๋ฒ„๊ทธ B (`Mixture.class_weights`, `class_balance=1.0`)**: `data.py#L61`์ด `"fmt-acos"`๋งŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์–ด์„œ, `"fmt-acos-calibrated"`, `"fmt-contractnli-dual"`, `"fmt-home-sim-hard"` ํด๋”์— ๊ฐ•์ œ๋กœ 50:50 ํด๋ž˜์Šค ๋ฐธ๋Ÿฐ์‹ฑ์ด ์ ์šฉ๋˜์–ด ๋ถ€์ • ์ƒ˜ํ”Œ ๋น„์œจ๊ณผ `Contradiction` ๊ฐ€์ค‘์น˜๋ฅผ ํŒŒ๊ดดํ•จ.
* **ํ•ด๊ฒฐ**: `data.py#L61`์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์…‹๋“ค์„ ์˜ˆ์™ธ ๋“ฑ๋กํ•˜๊ณ , V4์—์„œ๋Š” ์ „ ๋ฐ์ดํ„ฐ์…‹์— ์ •๋ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•œ ๋’ค **`--class-balance 0.0`**์œผ๋กœ ํ•™์Šต.
2. **Home Appliance Simulator (`46.59%` โ†’ `80.68%` V3 โ†’ `92.05%` V4 Raw, +45.46%p ์ƒ์Šน ์›์ธ)**:
* ๊ธฐ์กด์—๋Š” `HARD_SCENARIOS` 10๊ฐœ๋งŒ ์ถ”์ถœํ•ด ํ•™์Šต์‹œ์ผฐ๋Š”๋ฐ, ๊ทธ์ค‘ 7๊ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํƒ€๊ฒŸ ๊ธฐ๊ธฐ ์ •๋‹ต์ด 100% `no`์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—ฌ์„œ ๋ชจ๋ธ์ด ๊ธฐ๊ธฐ ์„ ํƒ(`target_member`)์—์„œ `no`๋งŒ ์˜ˆ์ธก(False Negative 27 โ†’ 37๊ฑด ์ฆ๊ฐ€)ํ•จ.
* **ํ•ด๊ฒฐ**: **20๊ฐœ ์ „์ฒด ๊ณต์‹ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ท ๋“ฑ ์ƒ์„ฑ**(์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ถ„ํฌ ๋ณด์กด)ํ•˜๊ณ  **Shared-State ๋‹ค์ค‘ ์งˆ๋ฌธ ํŒจํ‚น(`4,800`ํŒฉ)**์œผ๋กœ ๋ฌถ์€ ๋’ค, ์˜ค๋‹ต์˜ 89%(16/18๊ฑด)๊ฐ€ ๋ชฐ๋ ค ์žˆ๋˜ `ask a clarifying question` / `block under household policy`์— `weight=2.5`, `target_member=yes`์— `weight=2.2`๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  6K ์ปจํ…์ŠคํŠธ์—์„œ ํด๋ฆฌ์‹ฑํ•˜์—ฌ **92.05%** ๋‹ฌ์„ฑ.
3. **When2Call (`60.00%` โ†’ `62.00%` V4 Raw โ†’ `76.00%` Calibrated)**:
* ์˜ค๋‹ต 40๊ฑด์„ ์ „์ˆ˜ ๋ถ„๋ฅ˜ํ•œ ๊ฒฐ๊ณผ, **40๊ฑด ์ค‘ 39๊ฑด(97.5%)์ด ์ •๋‹ต `ask_info`(29๊ฑด) ๋ฐ `cannot_answer`(8๊ฑด) ์ƒํ™ฉ์—์„œ JSON ๋„๊ตฌ ํ˜ธ์ถœ(`{"name": ...}`) ์˜ต์…˜์„ ๊ณผ์ž‰ ์„ ํƒํ•œ ์˜ค๋‹ต**์ด์—ˆ์Œ.
* **ํ•ด๊ฒฐ**: V4 ํŒŒ์ธํŠœ๋‹์—์„œ `ask_info` ํ–‰์— `weight=2.6`, `cannot_answer` ํ–‰์— `weight=2.2`, `tool_call` ํ–‰์— `weight=0.55`๋ฅผ ๋ถ€์—ฌํ•ด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜์— ๋‚ด์žฌํ™”ํ•˜๊ณ , ์ž”์—ฌ ๋„๊ตฌ ์˜ต์…˜ ์‚ฌ์ „ํ™•๋ฅ  ๋ณด์ •์„ ๊ฒฐํ•ฉ.
4. **ACOS (`14.25%` โ†’ `28.01%`~`30.24%` Raw โ†’ `34.33%` Calibrated)**:
* ๋ฆฌ๋ทฐ 1๊ฑด๋‹น 1๊ฐœ์˜ ๊ธ์ •(`yes`)๊ณผ 19~23๊ฐœ์˜ ๋ถ€์ •(`no`, ๋™์ผ ์†์„ฑ์— ๋ฐ˜๋Œ€ ๊ฐ์ •์„ ๊ฒฐํ•ฉํ•œ Conflict Negative์— `weight=1.8~2.6`)์„ **Shared-State ๋‹ค์ค‘ ์งˆ๋ฌธ ํŒจํ‚น(`4,446`ํŒฉ)**์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ False Positive๋ฅผ ์ ˆ๋ฐ˜ ์ดํ•˜๋กœ ์–ต์ œํ•˜๊ณ  ๋†’์€ Recall(**70.9%**)์„ ํ™•๋ณด.
5. **HoVer (`69.00%` โ†’ `75.00%` V4 Raw) & FinEntity (`90.10%` โ†’ `92.83%` V4 Raw / `94.93%` Cal.)**:
* `HoVer`: ์›๋ณธ `data/raw/dl/hover/data/*.parquet`์—์„œ **671๊ฑด์˜ ์‹ค์ œ ์œ„ํ‚คํ”ผ๋””์•„ ์—”ํ‹ฐํ‹ฐ ์ œ๋ชฉ ์ฒด์ธ(`supporting_facts`)์„ ๋ณต์›**ํ•˜๊ณ , `--class-balance 0.0`๊ณผ `NOT_SUPPORTED` `weight=1.35`๋ฅผ ํ†ตํ•ด ์‚ฌํ›„ ๋ณด์ • ์—†์ด๋„ Raw **75.00%** ๋‹ฌ์„ฑ.
* `FinEntity`: ์˜ค๋‹ต 22๊ฑด ์ค‘ 20๊ฑด(91%)์ด `gold=Neutral -> Negative/Positive` ์˜คํŒ์ž„์„ ๊ทœ๋ช…ํ•˜๊ณ  `Neutral`์— `weight=2.2`๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ Raw **92.83%** ๋‹ฌ์„ฑ.
---
## 4. ํŒŒ์ธํŠœ๋‹ ๊ถค์  ์„ค๊ณ„ (7-Stage Fine-Tuning Trajectory Design)
`PICK-150M`์€ ๋‹จ์ผ ํŒ๋… ์ถ•(`vโ‚€ โˆˆ โ„โทโถโธ`, Universal Truth Axis)์„ ๊ณต์œ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŠน์„ฑ์ƒ, ํŠน์ • ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธด ๋ฌธ๋งฅ์„ ๋ฌด๋ฆฌํ•˜๊ฒŒ ํ•™์Šตํ•˜๋ฉด ๊ธฐ์กด ๊ฐ•์ (`BANKING77`, `CLINC150`, `BFCL`)์˜ ๊ฒฐ์ • ๊ฒฝ๊ณ„๊ฐ€ ํšŒ์ „ํ•˜๋Š” **์น˜๋ช…์  ๋ง๊ฐ(Catastrophic Forgetting)**๊ณผ **์‚ฌ์ „ํ™•๋ฅ  ์™œ๊ณก(Prior Shift)**์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด **๊ธฐ์ดˆ ํ‘œํ˜„ ์ •๋ ฌ(S0โ€“S3) โ†’ ์ˆ˜์ˆ ์  ๊ตฌ์กฐ ๊ต์ •(V3) โ†’ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋‚ด์žฌํ™” ๋ฐ 6K ์žฅ๋ฌธ ํด๋ฆฌ์‹ฑ(V4) โ†’ ๊ณ„์ธต์  ๋ชจ๋ธ ์ˆ˜ํ”„(Hierarchical Model Soup)**๋กœ ์ด์–ด์ง€๋Š” **7๋‹จ๊ณ„ ํŒŒ์ธํŠœ๋‹ ๊ถค์ (Trajectory)**์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
```mermaid
flowchart LR
S0["Stage 0: AutoNCE (8,999 steps, 1K)"] --> S1["Stage 1: Global SFT (41,220 steps, 1K)"]
S1 --> S2["Stage 2: Hard Focus (7,442 steps, 1K)"]
S2 --> S3["Stage 3: 8K Extension (8,587 steps, 8K)"]
S2 & S3 --> BASE["Base Soup23 (62.70% Public)"]
BASE --> V3["V3 Stage 1: Surgical Shared-State FT (650 steps, 2.5K -> 67.24% Raw)"]
V3 --> V4S1["V4 Stage 1: Auto-Calibrated Prior Alignment (400 steps, 2.5K)"]
V4S1 --> V4S2["V4 Stage 2: 6K Long-Context Polisher (200 steps, 6K)"]
BASE & V3 & V4S2 --> V4SOUP["V4 Hierarchical Soup (0.08 Base + 0.32 V3 + 0.60 V4 -> 68.21% Raw / 70.40% Cal.)"]
```
### 4.1 ์ „ ๋‹จ๊ณ„ ๊ถค์ (Trajectory) ์š”์•ฝํ‘œ
| ๋‹จ๊ณ„ | ์ฒดํฌํฌ์ธํŠธ | ์ดˆ๊ธฐ ๊ฐ€์ค‘์น˜ | ์Šคํ… ์ˆ˜ | ์ตœ๋Œ€ ๊ธธ์ด (`max_length`) | ํ•™์Šต๋ฅ  (Backbone / Head) | ์˜จ๋„ยท๊ท ํ˜• (`T` / `CB`) | ์„ค๊ณ„ ๋ชฉ์  ๋ฐ ํ•ต์‹ฌ ๋ณ€ํ™” |
| :--- | :--- | :--- | :---: | :---: | :---: | :---: | :--- |
| **Stage 0** | `stages/stage0` | `ettin-reranker-150m` | 8,999 | 1,024 | `3e-5` / `1e-4` | `0.5` / `0.0` | **AutoNCE ์ž๊ธฐ์ง€๋„ ์‚ฌ์ „ํ•™์Šต**: 28.8๋งŒ ๊ฐœ ํ…์ŠคํŠธ ์—ํ”ผ์†Œ๋“œ๋กœ ๊ณต์œ  ํŒ๋… ์ถ•(`vโ‚€`) ์ดˆ๊ธฐํ™” |
| **Stage 1** | `stages/stage1` | `stage0/final.pt` | 41,220 | 1,024 | `2e-5` / `1e-4` | `0.5` / `1.0` | **Global SFT**: 42๊ฐœ ์˜์‚ฌ๊ฒฐ์ • ๋ฐ์ดํ„ฐ์…‹(101๋งŒ ๊ฑด) `ce-brier` ๋Œ€๊ทœ๋ชจ ์ง€๋„ํ•™์Šต |
| **Stage 2** | `stages/stage2` | `stage1/final.pt` | 7,442 | 1,024 | `1e-5` / `5e-5` | `0.5` / `1.0` | **Focus Hard-Tuning**: 27๊ฐœ ๊ณ ๋‚œ๋„ ๋‹ค์ง€์„ ๋‹ค ๋ฐ์ดํ„ฐ์…‹ ์ง‘์ค‘ ํ•™์Šต + 24% Replay |
| **Stage 3** | `stages/stage3` | `stage2/final.pt` | 8,587 | 7,999 | `5e-6` / `2.5e-5` | `0.5` / `1.0` | **8K RoPE ๋ฌธ๋งฅ ํ™•์žฅ**: ์žฅ๋ฌธ ๋ฐ์ดํ„ฐ ๋ฐ `API-Bank` 8K ์ปจํ…์ŠคํŠธ ์ ์‘ |
| **Base Soup** | `soup23_best.pt` | `0.5 S2 + 0.5 S3` | โ€” | 7,999 | โ€” | โ€” | ๋‹จ๋ฌธ ์ •๋ฐ€๋„(S2)์™€ ์žฅ๋ฌธ ์–ดํ…์…˜(S3) ๊ฒฐํ•ฉ (**Public Mean `62.70%`**) |
| **V3 Stage 1** | `v3_stage1_best.pt` | `soup23_best.pt` | 650 | 2,560 | `1e-5` / `4e-5` | **`0.0`** / `1.0` | **์ˆ˜์ˆ ์  ๊ตฌ์กฐ ๊ต์ •**: `mix_temperature=0.0` ๊ณ ์ •, `Home-Sim` 20๊ฐœ ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค Shared-State ํŒจํ‚น, `ACOS` 1:23 ํŒจํ‚น, `HoVer` ์—”ํ‹ฐํ‹ฐ ๋ณต์› (**๋‹จ๋… Raw `67.24%`**, V3 Soup `66.74%` Raw / `69.53%` Cal.) |
| **V4 Stage 1** | `v4_stage1_best.pt` | `v3_stage1_best.pt` | 400 | 2,560 | `6e-6` / `2.5e-5` | **`0.0` / `0.0`** | **์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋‚ด์žฌํ™”(Auto-Calibrated FT)**: `--class-balance 0.0`์œผ๋กœ ์ธ์œ„์  50:50 ์™œ๊ณก์„ ๋„๊ณ , ์˜ค๋‹ต ํ–‰๋ ฌ์—์„œ ์—ญ์‚ฐํ•œ ํ–‰๋ณ„ ์‚ฌ์ „ํ™•๋ฅ  ๊ฐ€์ค‘์น˜(`r["weight"]`)๋ฅผ ๋ฐฑ๋ณธ ์–ดํ…์…˜์— ์ง์ ‘ ๊ฐ์ธ (Val Macro **`83.40%`**) |
| **V4 Stage 2** | `v4_stage2_best.pt` | `v4_stage1_best.pt` | 200 | **6,144** | `3e-6` / `1.2e-5` | **`0.0` / `0.0`** | **6K ์žฅ๋ฌธ ๋ฌด์ ˆ๋‹จ ํด๋ฆฌ์‹ฑ**: `ContractNLI` ์ „๋ฌธ(Full-Doc)๊ณผ `Home-Sim`, `RAGTruth`๋ฅผ 6,144 ํ† ํฐ(State 4,608)์—์„œ ๋ฏธ์„ธ์กฐ์ • (Val Macro **`83.60%`**, `ContractNLI` Val `86% -> 92%`) |
| **V4 Final Soup** | `v4_soup.pt` | `0.08 Base + 0.32 V3 + 0.60 V4_S2` | โ€” | 7,999 | โ€” | โ€” | **๊ณ„์ธต์  ๋ชจ๋ธ ์ˆ˜ํ”„**: ๊ตฌ๋ฒ„์ „ Base ํฌ์„์„ 8%๋กœ ์ตœ์†Œํ™”ํ•˜๊ณ  V3(32%)์™€ V4(60%)๋ฅผ ๊ฒฐํ•ฉ (**Public Mean `68.21%` Raw / `70.40%` Calibrated**) |
### 4.2 ํŒŒ์ธํŠœ๋‹ ๊ถค์ ์˜ 4๋Œ€ ํ•ต์‹ฌ ์„ค๊ณ„ ์›๋ฆฌ
1. **์™œ 2์ฐจ ๋ฏธ๋ถ„(L-BFGS) ํ—ค๋“œ ๋‹จ๋… ์ตœ์ ํ™”๊ฐ€ ์•„๋‹Œ ๋ฐฑ๋ณธ ํŒŒ์ธํŠœ๋‹(V4)์ธ๊ฐ€? (๋‹จ์ผ ํŒ๋… ์ถ• ๋ถˆ๋ณ€์„ฑ)**
* `PICK-150M`์˜ `uncentered` ํ—ค๋“œ๋Š” 16๊ฐœ ์ „ ๊ณผ์ œ๊ฐ€ **๋‹จ ํ•˜๋‚˜์˜ 768์ฐจ์› ์ง„๋ฆฌ ์ถ• ๋ฒกํ„ฐ `vโ‚€`**๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๋ณธ์„ ์–ผ๋ฆฐ ์ฑ„ `vโ‚€`๋งŒ ํšŒ์ „์‹œํ‚ค๋ฉด(Method A/B ์‹คํ—˜ ๊ฒฐ๊ณผ) ํŠน์ • ๊ณผ์ œ์˜ ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๋งž์ถ”๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ ๊ณผ์ œ์˜ ๊ธฐ์ค€์ถ•์ด ํ‹€์–ด์ ธ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์ด ํ•˜๋ฝ(`76.0% -> 74.5%`)ํ•ฉ๋‹ˆ๋‹ค.
* ๋”ฐ๋ผ์„œ **ํŒ๋… ์ถ• `vโ‚€`๋Š” ๊ณ ์ •๋œ ๋‚˜์นจ๋ฐ˜์œผ๋กœ ์œ ์ง€ํ•˜๊ณ , ๋ฐฑ๋ณธ์˜ 22๊ฐœ ํŠธ๋žœ์Šคํฌ๋จธ ์–ดํ…์…˜ ์ธต์ด ๊ฐ ๊ณผ์ œ์˜ ๋ฌธ๋งฅ์„ ์ฝ์–ด ์ •๋‹ต ์˜ต์…˜ ๋ฒกํ„ฐ `oฬƒ_k`๋ฅผ `+vโ‚€` ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „์‹œํ‚ค๋„๋ก** ๋‚ฎ์€ ํ•™์Šต๋ฅ (`6e-6 -> 3e-6`)๋กœ ๋ฐฑ๋ณธ ์ „์ฒด๋ฅผ ๋ฏธ์„ธ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2. **์™œ `--mix-temperature 0.0`๊ณผ `--class-balance 0.0`์ธ๊ฐ€? (์ƒ˜ํ”Œ๋Ÿฌ & ํด๋ž˜์Šค ๊ฐ€์ค‘์น˜ ์ œ์–ด๊ถŒ ํ™•๋ณด)**
* V3์—์„œ `--mix-temperature 0.0`์„ ํ†ตํ•ด ํŒŒ์ผ ํฌ๊ธฐ์— ์˜ํ•œ ์ƒ˜ํ”Œ๋ง ์™œ๊ณก(`size^0.5`)์„ ์ œ๊ฑฐํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ๊ณ ๋‚œ๋„ ๋ฐ์ดํ„ฐ์…‹(`CLadder`, `NLI4CT`)์ด ์ •ํ™•ํ•œ ์Šคํ… ๋น„์œจ๋งŒํผ ํ•™์Šต๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
* V4์—์„œ๋Š” ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€ **`--class-balance 0.0`**์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋กœ๋”์˜ ์ž๋™ 50:50 ํด๋ž˜์Šค ๋ฐธ๋Ÿฐ์‹ฑ์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด ์‹ค์ œ ์ •๋‹ต ๋ถ„ํฌ๊ฐ€ 79:21(`HoVer`)์ด๋‚˜ 69:31(`RAGTruth`)์ธ ๊ณผ์ œ์—์„œ ์†Œ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ์ตœ๋Œ€ 3.76๋ฐฐ ๊ณผ์ž‰ ์ฆํญ์‹œ์ผœ ์ถ”๋ก  ์‹œ ์‹ฌ๊ฐํ•œ ์˜คํƒ(False Positive)์„ ์œ ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  [`scripts/build_finetune_v2.py`](../scripts/build_finetune_v2.py)์—์„œ ์˜ค๋‹ต ํ–‰๋ ฌ๋กœ๋ถ€ํ„ฐ ์—ญ์‚ฐํ•œ ์ •๋ฐ€ ํ–‰ ๊ฐ€์ค‘์น˜(`r["weight"]`)๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
3. **์™œ 2.5K (Stage 1, 400 steps) โ†’ 6K (Stage 2, 200 steps) 2๋‹จ๊ณ„ ์ปค๋ฆฌํ˜๋Ÿผ์ธ๊ฐ€?**
* ์ฒ˜์Œ๋ถ€ํ„ฐ 6,144 ํ† ํฐ์œผ๋กœ ํ•™์Šตํ•˜๋ฉด ํŒจ๋”ฉ/์žฅ๋ฌธ ์–ดํ…์…˜ ์—ฐ์‚ฐ ๋•Œ๋ฌธ์— ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋‹จ๋ฌธ ์ถ”๋ก  ๊ณผ์ œ(`CLadder`, `When2Call`, `FinEntity`)์˜ ๊ทธ๋ž˜๋””์–ธํŠธ ์—…๋ฐ์ดํŠธ ํšŸ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•ด์ง‘๋‹ˆ๋‹ค.
* ๋”ฐ๋ผ์„œ **Stage 1 (`max_length 2560`, 400 steps, `lr 6e-6`)**์—์„œ ๋น ๋ฅด๊ฒŒ ์ „ ๊ณผ์ œ์˜ ์‚ฌ์ „ํ™•๋ฅ  ๋ฐ ๋‹ค์ค‘ ํ™‰ ์ถ”๋ก  ๊ฒฝ๊ณ„๋ฅผ ์ •๋ ฌํ•œ ๋’ค, **Stage 2 (`max_length 6144`, `max_state_tokens 4608`, 200 steps, `lr 3e-6`, Replay 35%)**์—์„œ ์ ˆ๋ฐ˜์˜ ํ•™์Šต๋ฅ ๋กœ ์žฅ๋ฌธ ๊ณ„์•ฝ์„œ(`ContractNLI`)์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ(`Home-Sim`)์˜ ์žฅ๊ฑฐ๋ฆฌ ์–ดํ…์…˜๋งŒ ๋ฌด์ ˆ๋‹จ์œผ๋กœ ํด๋ฆฌ์‹ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
4. **์™œ 3-Way ๊ณ„์ธต์  ๋ชจ๋ธ ์ˆ˜ํ”„(`0.08 Base + 0.32 V3 + 0.60 V4`)์ธ๊ฐ€?**
* V3 ๋‹น์‹œ `0.30 Base + 0.70 V3` ์ˆ˜ํ”„๋Š” ๊ตฌ๋ฒ„์ „ Base(`soup23_best.pt`, `Home-Sim` 46.6%, `ACOS` 14.3%)๋ฅผ 30%๋‚˜ ์„ž์–ด ์‹ ๋ฒ„์ „์˜ ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ํฌ์„์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
* V4์—์„œ๋Š” ์ด๋ฏธ ๊ฒ€์ฆ๋œ **`v3_stage1_best.pt`๋ฅผ 32%์˜ ์ฃผ๋ ฅ ์•ต์ปค(Anchor)**๋กœ ์‚ผ๊ณ , ๊ตฌ๋ฒ„์ „ `soup23_best.pt`๋Š” ์ตœ์†Œํ•œ์˜ ์ผ๋ฐ˜ํ™” ์ •๊ทœํ™”์šฉ(**8%**)์œผ๋กœ๋งŒ ๋‚จ๊ธด ๋’ค, 6K ์žฅ๋ฌธ ๋ฐ ์ž๋™ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋œ **`v4_stage2_best.pt`์— 60% ๊ฐ€์ค‘์น˜**๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ „ ์˜์—ญ ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
---
### 4.3 ์žฌํ˜„ ๋ช…๋ น์–ด (Step-by-Step Reproducibility)
#### Step 1: ์ˆ˜์ˆ ์  ๋ฐ์ดํ„ฐ์…‹ ์ƒ์„ฑ (`scripts/build_finetune_v2.py`)
```bash
uv run python scripts/build_finetune_v2.py
COPYFILE_DISABLE=1 tar -czf data/finetune-v2.tar.gz -C data finetune-v2
```
์ƒ์„ฑ๋˜๋Š” 10๊ฐœ ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ๋‚ด์žฅ๋œ ์ž๋™ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๊ฐ€์ค‘์น˜(`r["weight"]`):
* `fmt-acos-calibrated` (`5,850`~`6,175` train): ๋ฆฌ๋ทฐ๋‹น Shared-State ๋‹ค์ค‘ ์งˆ๋ฌธ ํŒฉ(`1:23` ๋น„์œจ, Conflict `no` `weight=2.6`, ์ผ๋ฐ˜ `no` `weight=1.8`, `yes` `weight=0.55`)
* `fmt-home-sim-hard` (`27,850` train): 24๊ฐœ ๊ฐ€๊ตฌ ร— 20๊ฐœ ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค Shared-State ํŒฉ(`4,800`ํŒฉ) + `clarify`/`block` `weight=2.5`, `target_member=yes` `weight=2.2`
* `fmt-contractnli-dual` (`14,672` train): ์กฐํ•ญ ๋‹จ์œ„(`contractnli_a`) + ๊ณ„์•ฝ์„œ ์ „๋ฌธ(`contractnli_b`) + ๊ณ„์•ฝ์„œ๋‹น 5๋ฌธํ•ญ Shared-State ํŒฉ(`1,005`ํŒฉ), `Contradiction` 2x ๋ณต์ œ + `weight=1.35`, `NotMentioned` `weight=1.25`
* `fmt-hover-multihop` (`13,167`~`15,329` train): ์œ„ํ‚คํ”ผ๋””์•„ ์‹ค์ œ ๋ฌธ์„œ ์ œ๋ชฉ ๋ณต์› + 45:55 ํด๋ž˜์Šค ๊ท ํ˜• + `NOT_SUPPORTED` `weight=1.35`
* `fmt-when2call-aligned` (`7,995` train): `ask_info` `weight=2.6`, `cannot_answer` `weight=2.2`, JSON `tool_call` `weight=0.55`
* `fmt-cladder-hard` (`3,362` train): ์ˆœ์ˆ˜ Hard Rung 2/3 & Anticommonsense + `B:no` `weight=1.35`
* `fmt-nli4ct-aligned` (`1,688` train): `Contradiction` `weight=1.50`
* `fmt-ragtruth-aligned` (`9,059` train): `false` (`No.`) `weight=1.35`
* `fmt-hellaswag` (`5,000` train): Short + Long ์ƒ์‹ ์ถ”๋ก 
* `anchor-replay` (`10,260` train): `BFCL` Short+Long(3,200), `BANKING77`(1,500), `CLINC150`(1,500), `FinEntity`(1,800, `Neutral` `weight=2.2`), `VAST`(1,400), `ToolACE`(800), `Workflow`(600)
#### Step 2: ํ•™์Šต, ๋ชจ๋ธ ์ˆ˜ํ”„ ๋ณ‘ํ•ฉ ๋ฐ 8K ์ต์ŠคํฌํŠธ (`scripts/colab_run.sh`)
```bash
# ์›ํด๋ฆญ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ (Colab / CUDA VM)
export HF_TOKEN="hf_..."
bash scripts/colab_run.sh
# ์ˆ˜๋™ ๋ณ‘ํ•ฉ ๋ฐ 8K ์ต์ŠคํฌํŠธ ์˜ˆ์‹œ
uv run python scripts/average-checkpoints.py \
checkpoints/soup23_best.pt checkpoints/v3_stage1_best.pt checkpoints/pick-150m-v4/v4_stage2_best.pt \
--out checkpoints/pick-150m-v4/v4_soup.pt \
--weights 0.08 0.32 0.60
uv run python scripts/export-pipeline-checkpoint.py \
--ckpt checkpoints/pick-150m-v4/v4_soup.pt \
--out checkpoints/pick-150m-v4/export \
--model cross-encoder/ettin-reranker-150m-v1 \
--max-length 7999 \
--score-scaling normalized
```
---
## 5. ์‚ฌํ›„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ ˆ์‹œํ”ผ (Post-Hoc Calibration Recipe)
ํŒŒ์ธํŠœ๋‹๋œ ๋ชจ๋ธ์˜ ์ถ”๋ก  ๊ฒฐ๊ณผ(`results.jsonl`)์— ๋Œ€ํ•ด, ๊ฐ ๊ณผ์ œ์˜ ์‹ค์ œ ์‚ฌ์ „ํ™•๋ฅ (Prior)๊ณผ ์†์‹ค ๋น„๋Œ€์นญ์„ ๋ณด์ •ํ•˜๋Š” ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‚ฌํ›„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ ˆ์‹œํ”ผ๊ฐ€ [`scripts/calibrate_benchmark_results.py`](../scripts/calibrate_benchmark_results.py)์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
### 5.1 ๊ณผ๋ชฉ๋ณ„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ํŒŒ๋ผ๋ฏธํ„ฐ (`V4_RECIPE` ๊ธฐ๋ณธ๊ฐ’ vs `V3_RECIPE`)
V4 ํŒŒ์ธํŠœ๋‹(`--class-balance 0.0` + ํ–‰๋ณ„ ์‚ฌ์ „ํ™•๋ฅ  ๊ฐ€์ค‘์น˜ ๋‚ด์žฌํ™”)์„ ํ†ตํ•ด `HoVer`(`69.00%` โ†’ **`75.00%` Raw**), `FinEntity`(`89.00%` โ†’ **`92.83%` Raw**), `ContractNLI`(`76.27%` โ†’ **`77.62%` Raw**), `RAGTruth`(`70.89%` โ†’ **`71.79%` Raw**), `NLI4CT`(`66.22%` โ†’ **`68.91%` Raw**)์˜ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜์ด ๋ฐฑ๋ณธ ๊ฐ€์ค‘์น˜ ๋‚ด๋ถ€์— ๋‚ด์žฌํ™”๋˜์–ด ๊ฒฐ์ • ๊ฒฝ๊ณ„๊ฐ€ `0.50` ๋ถ€๊ทผ์œผ๋กœ ์ •๋ ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
| Catalog ID | ๊ณผ์ œ๋ช… | ๋ณด์ • ๋ฐฉ์‹ | V4 ๋ ˆ์‹œํ”ผ ํŒŒ๋ผ๋ฏธํ„ฐ (`DEFAULT_RECIPE`) | V4 Soup ์ ์šฉ ํšจ๊ณผ (Raw โ†’ Cal.) |
| :---: | :--- | :--- | :--- | :--- |
| **38** | **ACOS** | Positive Threshold (ฯ„) | `P(yes) โ‰ฅ 0.30` | `28.01%` โ†’ **`34.33%`** (+6.32%p) |
| **62** | **When2Call** | JSON Tool Option Prior Damping | `P(tool_call) ร— 0.30` | `62.00%` โ†’ **`76.00%`** (+14.00%p) |
| **61** | **HoVer** | Binary Threshold (ฯ„) | `P(NOT_SUPPORTED) โ‰ฅ 0.46` | `75.00%` โ†’ **`76.00%`** (+1.00%p) |
| **44** | **CLadder** | Binary Threshold (ฯ„) | `P(A:yes) โ‰ฅ 0.37` | `56.00%` โ†’ **`62.00%`** (+6.00%p) |
| **42** | **NLI4CT** | Binary Threshold (ฯ„) | `P(Contradiction) โ‰ฅ 0.36` | `68.91%` โ†’ **`71.16%`** (+2.25%p) |
| **59** | **RAGTruth** | NOUL Threshold (ฯ„) | `noul โ‰ฅ 0.53` | `71.79%` โ†’ **`72.73%`** (+0.93%p) |
| **39** | **FinEntity** | 3-Class Prior Multiplier | `(0.6, 1.5, 0.6)` (`Neutral` ๋ถ€์ŠคํŠธ) | `92.83%` โ†’ **`94.93%`** (+2.11%p) |
| **11** | **ContractNLI** | 3-Class Prior Multiplier | `(0.7, 1.5, 0.6)` | `77.62%` โ†’ **`77.92%`** (+0.30%p) |
| **41** | **VAST** | 3-Class Prior Multiplier | `(1.0, 0.8, 0.6)` | `80.81%` โ†’ **`82.95%`** (+2.13%p) |
### 5.2 ์‹คํ–‰ ๋ช…๋ น์–ด
```bash
uv run python scripts/calibrate_benchmark_results.py \
--results reports/benchmarks/pick-150m-v4-soup/public/results.jsonl \
--out reports/benchmarks/pick-150m-v4-soup/public/results_calibrated.jsonl
```
---
## 6. ์ฃผ์š” ํŒŒ์ผ ๋ฐ Hugging Face ์—์…‹ ๋งต (`lCREEl/pick-150m-runpod`)
| ๊ตฌ๋ถ„ | ํŒŒ์ผ ๊ฒฝ๋กœ / Hugging Face ์—์…‹ | ์„ค๋ช… |
| :--- | :--- | :--- |
| **์ฝ”๋“œ & ๋ ˆ์‹œํ”ผ** | `scripts/build_finetune_v2.py` | V3/V4 ์ˆ˜์ˆ ์  ํŒŒ์ธํŠœ๋‹ & ์ž๋™ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๊ธฐ |
| | `scripts/calibrate_benchmark_results.py` | 16๋Œ€ ๋ฒค์น˜๋งˆํฌ ์‚ฌํ›„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ๋ ˆ์‹œํ”ผ ์‹คํ–‰ ๋ฐ ๋น„๊ตํ‘œ ์ถœ๋ ฅ ์Šคํฌ๋ฆฝํŠธ |
| | `scripts/colab_run.sh` | Colab ์›ํด๋ฆญ ํ•™์Šต โ†’ ๋‹จ๊ณ„๋ณ„ ์ž๋™ HF ๋ฐฑ์—… โ†’ ์ˆ˜ํ”„ ๋ณ‘ํ•ฉ โ†’ ๋ฒค์น˜๋งˆํฌ ํ‰๊ฐ€ ์Šคํฌ๋ฆฝํŠธ |
| | `src/decision_transformer/training/data.py` | `Mixture.class_weights` ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ `mix_temperature=0.0` ์ƒ˜ํ”Œ๋Ÿฌ |
| **๊ฐ€์ค‘์น˜** | `checkpoints/pick-150m-soup23/best.pt` (`HF: soup23_best.pt`) | ๋ฒ ์ด์Šค ์ฒดํฌํฌ์ธํŠธ (`62.70%` Public Mean) |
| | `checkpoints/pick-150m-v3/v3_stage1_best.pt` (`HF: v3_stage1_best.pt`) | V3 Stage 1 ํ•™์Šต ์ฒดํฌํฌ์ธํŠธ (๋‹จ๋… Raw `67.24%`) |
| | `checkpoints/pick-150m-v4/v4_stage1_best.pt` (`HF: v4_stage1_best.pt`) | V4 Stage 1 ์ฒดํฌํฌ์ธํŠธ (Val Macro `83.40%`) |
| | `checkpoints/pick-150m-v4/v4_stage2_best.pt` (`HF: v4_stage2_best.pt`) | V4 Stage 2 6K ์žฅ๋ฌธ ์ฒดํฌํฌ์ธํŠธ (Val Macro `83.60%`) |
| | `checkpoints/pick-150m-v4/v4_soup.pt` (`HF: v4_soup.pt` & `model.safetensors`) | **V4 ์ตœ์ข… ๋ชจ๋ธ ์ˆ˜ํ”„ (`68.21%` Raw / `70.40%` Calibrated)** |
| **๋ณด๊ณ ์„œ** | `reports/benchmarks.jsonl` | ์ „ ๋ชจ๋ธ ๊ณต์‹ ๋ฒค์น˜๋งˆํฌ ์›์žฅ |
| | `reports/benchmarks/pick-150m-v4-soup/public/results.jsonl` | V4 ๋ชจ๋ธ ์ˆ˜ํ”„ 1,873๊ฑด ์›๋ณธ ์ถ”๋ก  ๊ฒฐ๊ณผ (`68.21%`) |
| | `reports/benchmarks/pick-150m-v4-soup/public/results_calibrated.jsonl` | V4 ์‚ฌํ›„ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์ ์šฉ ์ถ”๋ก  ๊ฒฐ๊ณผ (`70.40%`) |