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/)
- 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. - 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). - 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. - 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.