think
16px
820px

Apostille K.14 — fine-tune SigNet pada korpus registri (jawaban "kalau di-train lagi, diminishing returns?")

Deployed: ahu-signature-verify v3 (sigverify-v3-ens-dinov2-signetft) · korpus training 8.800 lembar / 4.000 pejabat · total ~5,5 jam GPU (prep 4,5 jam + training 60 epoch ~12 menit + eval)

Jawaban langsung

Bukan diminishing returns — ini justru bagian paling curam dari kurvanya, dan malam ini sudah dipanen. Kedua model lama (SigNet GPDS, dinov2 generik) belum pernah melihat domain kita sama sekali: tanda tangan pejabat Indonesia, lembar spesimen 200 DPI, crop hasil isolasi goresan. Fine-tune metric learning pada data sendiri adalah domain adaptation klasik, dan registri menyediakan datanya gratis: 21.699 pejabat punya ≥2 lembar spesimen terdaftar (78 ribu lembar) — pasangan genuine lintas-lembar tanpa perlu labeling manual sama sekali.

Bukti kurvanya masih curam, dari eksperimen malam ini sendiri: smoke run pada 224 pejabat saja menaikkan val-AUC dari 0.686 ke 0.798 dalam 3 epoch.

Hasil di korpus evaluasi beku (102 pasangan genuine lintas-lembar + 2.000 impostor)

Scorer AUC Genuine-detect @ ~5% false-accept @ ~1% false-accept
dinov2 @ goresan terisolasi (beku) 0.784 52,9% 40,2%
SigNet original (GPDS, beku) 0.717 43,1% 33,3%
SigNet fine-tuned (malam ini) 0.789 58,8% 37,3%
Ensemble v2 — produksi sebelumnya 0.766 52,9% 38,2%
Ensemble v3 — dinov2 + SigNet-FT (deployed) 0.798 60,8% 42,2%

Fine-tune menaikkan SigNet sendirian +7,2 poin AUC di atas bobot GPDS aslinya, dan ensemble v3 menang di semua metrik operasional: pada ambang "sangat mirip" (~1% impostor lolos), deteksi genuine naik dari 38,2% → 42,2%; pada ambang 5%, dari 52,9% → 60,8%. Distribusi impostor-nya juga jauh lebih terpisah (median cosine impostor turun 0.680 → 0.443) — model benar-benar belajar membedakan penulis, bukan sekadar tekstur.

Cara kerjanya (reproducible — harness di signature-verify-service/sigtrain/)

  1. Korpus (manifest.ts + prep.py): sampel 4.000 pejabat multi-registrasi (2 lembar per pejabat, pasangan genuine) + 800 pejabat tunggal (pool impostor), disjoint per-pejabat dari korpus evaluasi beku. Pipeline streaming: fetch S3 (SigV4 port python) → deteksi YOLOS ter-batch 4 rotasi sekaligus → isolasi goresan → simpan crop kecil → buang berkas mentah (disk GPU host tinggal 19GB, jadi tidak pernah menumpuk raw; total crop ~400MB). Checkpointed via meta.jsonl — aman di-kill/resume.
  2. Training (train.py): fine-tune SigNet dengan batch-hard triplet loss (batch P=16 pejabat × K=2 lembar, margin 0.25 cosine), augmentasi yang meniru mode kegagalan produksi (jitter rotasi ±10°, skala, tebal goresan erode/dilate, garis liar sisa isolasi), split train/val per-pejabat, 60 epoch cosine-LR (~10 detik/epoch di H100 — trainingnya sendiri cuma ~12 menit; yang lama adalah membangun korpusnya).
  3. Evaluasi (eval.py): skor pasangan = max cosine lintas kandidat rotasi (semantik produksi), diadu pada korpus beku yang sama dengan yang dipakai mengkalibrasi v2 — apples-to-apples.
  4. Deploy v3: bobot 63MB tinggal di build context GPU host (models-local/signet-ft.pth, backup di valbox ~/signet-ft-20260713.pth, tidak di git); Dockerfile meng-override checkpoint GPDS bila file itu ada; knot kalibrasi dihitung ulang dari persentil impostor ensemble baru (0.568/0.689/0.818/0.965 ↔ 0/50/80/100%). Sanity pasca-deploy: self-pair 100% (cos 0.9997), pasangan lintas-domain Darsani tetap jujur rendah (6-8% — "AI belum dapat menilai").

Catatan operasional: GPU1 dipakai bersama job train_adv.py-mu (41GB) — prep sempat OOM sekali tepat saat job-mu alokasi, retry sukses; semuanya jalan berdampingan tanpa saling ganggu setelahnya.

Kurva ke depan — di mana diminishing returns SEBENARNYA mulai

Langkah Perkiraan hasil Biaya
✅ Fine-tune 4k pejabat (malam ini) +3,2 AUC ensemble; +8pp detect@p95 ~5,5 jam, sekali
Skala korpus ke 21,7k pejabat (5×) naik lagi, tapi mulai melandai (log-scale terhadap data) prep ~20 jam (bisa dicicil; harness sudah checkpointed)
Arsitektur lebih besar (ResNet/ViT metric) + korpus penuh kandidat lompatan berikutnya 1-2 hari eksperimen
Data lintas-domain (pasangan dokumen-berstempel ↔ lembar spesimen dari submission riil terverifikasi) menyerang langsung kasus tersulit (dokumen vs spesimen) yang sekarang masih 6-8% butuh akumulasi data produksi + label verifikator
Pembersihan label registri (berkas spesimen berisi ttd pejabat lain, re-upload file identik) mengangkat plafon semua langkah di atas koordinasi dgn AHU

Diminishing returns baru terasa di baris kedua ke bawah; baris pertama sudah dibayar penuh malam ini. Yang paling bernilai berikutnya bukan epoch tambahan, melainkan data lintas-domain — skor kasus dokumen-vs-spesimen (seperti Darsani-mu) hanya akan naik signifikan kalau model pernah melihat pasangan semacam itu saat training.