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)๊ณผ 1923๊ฐœ์˜ ๋ถ€์ •(no, ๋™์ผ ์†์„ฑ์— ๋ฐ˜๋Œ€ ๊ฐ์ •์„ ๊ฒฐํ•ฉํ•œ Conflict Negative์— `weight=1.82.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)**์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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์—์„œ ์˜ค๋‹ต ํ–‰๋ ฌ๋กœ๋ถ€ํ„ฐ ์—ญ์‚ฐํ•œ ์ •๋ฐ€ ํ–‰ ๊ฐ€์ค‘์น˜(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)

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๋น„์œจ, Conflictno 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,329train): ์œ„ํ‚คํ”ผ๋””์•„ ์‹ค์ œ ๋ฌธ์„œ ์ œ๋ชฉ ๋ณต์› + 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)

# ์›ํด๋ฆญ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ (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์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์‹คํ–‰ ๋ช…๋ น์–ด

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%)