Research protocol · 2026-05-21

모델 실험 프로토콜과 결과 기록 방식

Landmark Assistant의 모델 실험을 논문 Method/Experiment 섹션처럼 재현 가능하게 기록하기 위한 기준 문서다. 모델 개발자가 후속 실험을 이어갈 때 “무엇을 고정하고, 무엇을 바꾸고, 어떤 결과를 믿어야 하는지” 알 수 있도록 실험 순서, 지켜야 할 원칙, 결과 표 양식을 함께 정리한다.

핵심 결론

논문식 실험은 “좋아 보이는 모델 하나를 돌려본다”가 아니다. 같은 데이터 split, 같은 seed, 같은 metric, 같은 평가 절차를 고정한 뒤 하나의 변경점만 바꿔서 결과를 비교하는 과정이다.

우리 프로젝트에서는 MobileCLIP2-S4를 base로 두고, classification-only, multi-task CE, LoRA, ArcFace/CosFace, hard-negative 사용 여부를 같은 실험 프로토콜 위에서 비교한다.

별도로 모델 개발 과정 논문 작성 가이드에서는 모델 개발을 단독으로 진행한 과정을 논문 본문 구조로 어떻게 풀어쓸지 정리한다.

2026-06-12 이후 논문화 실험 기록의 상위 입구는 Paper Experiment Hub로 둔다. 이 문서는 기존 프로토콜과 누적 결과를 보존하는 상세 기록으로 유지한다.

참고한 연구 출판 기준

아래 기준을 우리 프로젝트 규모에 맞게 축소 적용한다. 완전한 저널 투고 문서는 아니지만, 실험 재현성과 결과 신뢰도를 설명할 수 있는 수준을 목표로 한다.

출처 핵심 요구 우리 프로젝트 적용
Nature Reporting Standards 실험/분석 설계, 데이터·코드 가용성, 방법의 재현 가능성을 명시한다. dataset fingerprint, split manifest, code commit, config, artifact 위치를 함께 기록한다.
NeurIPS Paper Checklist ML 실험의 재현성, 데이터/코드 접근성, 학습 세부 설정, 한계와 윤리 영향을 점검한다. seed, hyperparameter, compute 환경, 실패 실험, OOS/저신뢰 한계를 표로 남긴다.
ACM Artifact Review and Badging artifact가 사용 가능하고, 결과가 재현/검증 가능한지 분리해 본다. 모델 성능과 실행 artifact를 분리해 검증한다. 예: PyTorch 성능, ONNX parity, INT8/NPU latency.
IEEE Research Reproducibility 실험 검증을 위해 data, code, research outputs 공유를 권장한다. GitHub commit, W&B run, metrics.json, prediction jsonl, low-margin csv를 남긴다.

처음 따라가는 방법

  1. 실험 질문을 먼저 쓴다.

    예: “MobileCLIP2-S4에서 image-text contrastive loss를 추가하면 한국어 자연어 검색과 hard case 구분이 개선되는가?”

  2. 데이터 snapshot을 고정한다.

    Dataset 폴더를 바꿨다면 split을 다시 만들고 dataset_fingerprint를 기록한다. 다른 fingerprint끼리는 같은 실험처럼 비교하지 않는다.

  3. 비교할 모델과 변경점 하나를 정한다.

    예: baseline CE와 multi-task CE를 비교한다. 이때 모델, split, epoch, image size는 같게 둔다.

  4. 학습 config와 commit hash를 기록한다.

    나중에 결과가 좋아도 어떤 코드와 config에서 나온 것인지 모르면 논문식 결과로 쓸 수 없다.

  5. validation으로 선택하고 test는 마지막에만 본다.

    test 결과를 보면서 threshold나 loss weight를 고치면 test set에 맞춘 것이 되어 결과가 과대평가된다.

  6. 성공 결과와 실패 결과를 모두 남긴다.

    AI Hub w8a16처럼 latency는 좋지만 embedding이 붕괴한 결과도 중요한 실험 근거다.

실험 전체 흐름

1. Research Question
   ↓
2. Dataset Snapshot + Split Manifest
   ↓
3. Baseline Run
   ↓
4. Controlled Comparison Runs
   ↓
5. Validation-based Model Selection
   ↓
6. Locked Test Evaluation
   ↓
7. Artifact Export and Runtime Check
   ↓
8. Error Analysis and Next Experiment

우리 프로젝트의 실험 순서

순서 실험 목적 비교 기준 결과 기록 위치
0 Dataset audit + split 생성 학습/검증/테스트 분리와 누락 라벨 확인. record count, class count, confirmed/holdout, fingerprint. splits/kfold_seed20260513.json
1 Sprint 1 baseline 재현 기존 MobileCLIP2-S4 image classifier 기준선을 확보. val/test Top-1, Top-3, per-class, confusion matrix. runs/*/metrics.json
2 Multi-task CE 기준 실험 caption contrastive와 hard negative가 도움이 되는지 확인. baseline 대비 hard-case accuracy, text retrieval, low-margin count. mobileclip2_s4_partial_unfreeze_ce_hardneg
3 LoRA 비교 전체/부분 unfreeze보다 가볍게 안정적으로 학습되는지 확인. 성능, 학습 안정성, trainable parameter, export 가능성. mobileclip2_s4_lora_ce_hardneg
4 ArcFace/CosFace 비교 비슷한 랜드마크 간 embedding margin이 좋아지는지 확인. hard-case accuracy, low-margin count, confusion pair. mobileclip2_s4_partial_unfreeze_arcface_hardneg
5 Artifact export 앱 탑재 가능한 ONNX/TFLite/INT8 후보 생성. PyTorch parity, file size, memory, latency. artifact regression report
6 Demo regression 앱에서 이미지/텍스트/상세보기/거절 정책이 깨지지 않는지 확인. demo-regression-v1 통과, hard case 결과, OOS/low_quality 동작. demo validation document

반드시 고정해야 하는 것

Data

Dataset Fingerprint

데이터가 바뀌면 실험이 바뀐다. 같은 모델이라도 fingerprint가 다르면 다른 실험으로 기록한다.

Split

Train / Val / Test

validation은 모델 선택용, test는 마지막 보고용이다. test를 보면서 튜닝하지 않는다.

Seed

Random Seed

split seed, training seed, augmentation seed를 기록한다. 완전 동일 재현이 어렵더라도 추적 가능해야 한다.

Config

Hyperparameters

image size, batch size, epoch, learning rate, loss weight, freeze 범위를 config로 남긴다.

Compute

Hardware / Runtime

GPU 종류, 개수, torch/CUDA 버전, precision, backend를 기록한다. 속도와 안정성 해석에 필요하다.

Artifact

Model Output

best.pt, ONNX, INT8, prototype/text index는 같은 version 묶음으로 관리한다.

평가 지표

지표 의미 주의할 점
Top-1 Accuracy 가장 높은 후보가 정답인 비율. 모델 선택의 1차 기준. class imbalance를 함께 본다.
Top-3 Accuracy 정답이 세 후보 안에 들어간 비율. class 수가 적으면 높게 나오기 쉬우므로 단독으로 판단하지 않는다.
Macro F1 class별 성능을 균형 있게 본 값. 데이터가 적은 class가 묻히지 않게 확인한다.
Hard-case Accuracy confusing_with가 있는 이미지에서 정답을 맞히는지. 광화문/근정문/궁궐 전각처럼 실제 문제가 되는 구간을 따로 본다.
Low-margin Count Top-1과 Top-2 점수가 가까운 애매 케이스 수. 정답률이 높아도 margin이 낮으면 앱에서는 ambiguous가 필요할 수 있다.
Text Retrieval Recall@1/3 자연어 query가 올바른 landmark prototype을 찾는지. 한국어/영어/별칭/묘사형 query를 나눠 본다.
Artifact Parity PyTorch와 ONNX/INT8 결과가 일치하는지. 학습 성능과 배포 가능성은 별도 검증이다.
Latency / Size 앱에 실을 수 있는지. 정확도가 우선이지만 모바일 자원 한계를 함께 기록한다.

실험 실행 전 체크리스트

실험 노트 템플릿

Experiment ID:
Date:
Research question:
Hypothesis:

Dataset:
  data_root:
  dataset_fingerprint:
  split_manifest:
  class_count:
  train/val/test counts:

Code:
  repo:
  commit:
  entrypoint:
  config:

Training:
  model:
  pretrained:
  freeze/unfreeze:
  loss:
  optimizer:
  epoch:
  batch size:
  GPU / CUDA / torch:

Results:
  val_top1:
  val_top3:
  test_top1:
  test_top3:
  macro_f1:
  hard_case_top1:
  low_margin_count:
  text_retrieval:
  artifact_size:
  latency:

Interpretation:
  what improved:
  what got worse:
  likely cause:
  next experiment:
  do not claim:

결과 표 양식

아직 실행 전인 항목은 비워둔다. 값이 없는 칸을 추측으로 채우지 않는다.

Run Dataset fp Config Val Top-1 Test Top-1 Hard-case Text R@1 Low-margin Artifact 해석
Sprint1 S4 baseline 기록 필요 configs/candidates/mobileclip2_s4.yaml 기록 필요 기록 필요 기록 필요 해당 없음 또는 별도 측정 기록 필요 best.pt / ONNX / INT8 기준선.
Multi-task CE 실행 후 기록 mobileclip2_s4_partial_unfreeze_ce_hardneg 1차 Sprint2 기준 실험.
LoRA CE 실행 후 기록 mobileclip2_s4_lora_ce_hardneg 가벼운 adapter 비교.
ArcFace 실행 후 기록 mobileclip2_s4_partial_unfreeze_arcface_hardneg margin 기반 hard-case 개선 여부 확인.

2026-06-11 후속 5-fold 실험 기록

이 항목은 Sprint 2 multi-task 학습의 후속 실험 실행 기록이다. fold0 결과에서 후보로 남은 S3 pilot과 S4 ArcFace partial을 같은 데이터셋 fingerprint와 같은 split 정책으로 fold1-4까지 확장해, 단일 fold 우연성을 줄이는 것을 목표로 한다.

Research Question

MobileCLIP2-S3 pilot run이 S4 ArcFace 기반 partial unfreeze보다 23-class landmark recognition에서 더 안정적인 Top-1, macro-F1, hard-case 성능을 보이는가?

Controlled Setting

Data root /workspace/landmark-assis/Dataset
Dataset fingerprint ec2ad988299869f98622e52f5ebcebb35f56553c
Class count 23
Records total 6469, confirmed 6423, trainval 5462, test 961, holdout_non_confirmed 46
Split splits/kfold_seed20260513.json, seed 20260513, folds 5, test ratio 0.15
Compute Server etri-gpu, Tesla P100 16GB, CUDA_VISIBLE_DEVICES=2,3,4,5, DDP 4 processes
Tracking W&B project landmark-assistant-sprint2

Completed Fold0 Baseline

아래 값은 C:\Users\hi\Downloads\종설_작업중\wandb_exports에 내려받은 W&B scalar export를 기준으로 확인했다. text query retrieval CSV는 헤더만 있고 값이 없어, 자연어 검색 성능은 이 결과표에서 검증하지 않는다.

Run Fold Val Top-1 Test Top-1 Test Top-3 Test Macro-F1 Hard-case Test Top-1 Low-margin 해석
S3 pilot 0 0.9846 0.9865 0.9948 0.9805 0.9872 2 fold0 test 기준 최상위 후보.
S4 ArcFace 0 0.9855 0.9834 0.9938 0.9747 0.9840 1 fold0 validation 기준 최상위 후보.
S4 CE 0 0.9837 0.9792 0.9958 0.9419 0.9798 2 Top-3는 높지만 macro-F1과 일부 class F1이 약해 후속 fold 확장 우선순위에서 제외.
S4 LoRA CE 0 0.9655 0.9688 0.9906 0.9408 0.9681 7 fold0 기준 다른 후보보다 약해 후속 fold 확장 우선순위에서 제외.

Completed 5-fold Comparison

2026-06-12에 추가 export된 fold1-4 결과까지 포함해 S3 pilot과 S4 ArcFace partial을 5-fold로 재집계했다. 핵심 비교는 fold0-4 전체 평균과 표준편차를 사용한다. 단일 fold에서는 S4 ArcFace가 validation Top-1에서 근소하게 앞선 경우가 있었지만, 5-fold test 기준에서는 S3 pilot이 Top-1, Top-3, macro-F1, hard-case Top-1 모두 더 높았다. 이 결과는 후보 탐색(screening)으로 보존한다. config 점검 결과 기존 S3 run은 이름과 달리 true full unfreeze가 아니었으므로, 논문식 최종 비교는 Sprint 2 논문식 실험 매트릭스에서 새로 관리한다.

Model Config Folds Val Top-1 Test Top-1 Test Top-3 Test Macro-F1 Hard-case Test Top-1 Low-margin 해석
S3 server partial pilot legacy misnamed S3 pilot config 0-4 0.9855 ± 0.0046 0.9875 ± 0.0018 0.9960 ± 0.0017 0.9770 ± 0.0066 0.9883 ± 0.0013 1.2 ± 0.8 screening 기준 상위 후보였지만, true full unfreeze가 아니므로 최종 결론으로 사용하지 않는다.
S4 ArcFace partial configs/experiments/mobileclip2_s4_partial_unfreeze_arcface_hardneg.yaml 0-4 0.9843 ± 0.0021 0.9846 ± 0.0017 0.9938 ± 0.0022 0.9678 ± 0.0073 0.9853 ± 0.0017 1.8 ± 1.3 screening 비교 기준으로 보존한다. 새 matrix에서는 같은 방식의 S3 partial ArcFace와 비교한다.

Fold-level Evidence

Model Fold Best Epoch Val Top-1 Test Top-1 Test Top-3 Test Macro-F1 Hard-case Top-1 Low-margin Lowest test F1 examples
S3 pilot0180.98460.98650.99480.98050.98722cheonggyecheon 0.909, changgyeonggung_myeongjeongmun 0.930
S3 pilot1220.99000.99060.99580.98670.99040gwanghwamun 0.947, changgyeonggung 0.952
S3 pilot2280.97810.98650.99580.97050.98721deoksugung_daehanmun 0.750, changgyeonggung_myeongjeongjeon 0.933
S3 pilot3140.98710.98750.99480.97280.98832deoksugung_daehanmun 0.750, changgyeonggung 0.900
S3 pilot4280.98800.98650.99900.97440.98831deoksugung_daehanmun 0.857, cheonggyecheon 0.903
S4 ArcFace0180.98550.98340.99380.97470.98401cheonggyecheon 0.833, changgyeonggung_myeongjeongmun 0.930
S4 ArcFace1180.98090.98340.99170.96170.98403deoksugung_daehanmun 0.667, cheonggyecheon 0.833
S4 ArcFace2220.98350.98440.99480.96060.98512deoksugung_daehanmun 0.444, cheonggyecheon 0.938
S4 ArcFace3250.98620.98440.99170.96580.98513deoksugung_daehanmun 0.750, gyeongbokgung_geunjeongjeon 0.889
S4 ArcFace4250.98520.98750.99690.97620.98830deoksugung_daehanmun 0.800, cheonggyecheon 0.938

Run Set

전체 기록 대상은 12개 run이다. 5-fold 핵심 비교는 mobileclip2_s3_server_full_fold0-4mobileclip2_s4_multitask_partial_unfreeze_arcface_hardneg_fold0-4의 10개 run이다. mobileclip2_s4_multitask_partial_unfreeze_ce_hardneg_fold0mobileclip2_s4_multitask_lora_ce_hardneg_fold0은 fold0 ablation으로 유지한다.

Execution Command

tmux new-session -d -s landmark-sprint2-followup-folds 'bash /tmp/run_followup_folds.sh'
tmux attach -t landmark-sprint2-followup-folds
nvidia-smi

Current Limitation

이번 W&B export에서는 text_query_retrieval.query_count가 모든 핵심 run에서 0이었다. 따라서 이 5-fold 결과는 이미지 recognition 성능 비교로만 해석한다. 자연어 검색 성능은 별도 text retrieval eval을 실행해 같은 방식으로 기록해야 한다.

Decision

현재 증거 기준으로 이 결과는 최종 artifact/export 후보 결정이 아니라 screening evidence다. S3 pilot에서도 deoksugung_daehanmun, cheonggyecheon, gyeongbokgung_geunjeongjeon은 fold별 lower F1에 반복적으로 등장하므로 다음 실험에서는 해당 class의 데이터 품질, split별 support, confusion matrix를 먼저 확인한다.

하면 안 되는 것

관련 문서