Modeli eğitmek işin başlangıcı. Asıl iş onu yayında tutmak.
Deftere yazılan doğruluk oranı ile üretimde ölçülen doğruluk oranı neredeyse hiç tutmuyor. Aradaki fark modelde değil — eğitim ile çalışma zamanı arasındaki her katmanda saklı.
This post is in Turkish.
Bir model geliştirme ortamında yüzde doksan başarıyla çalışıyor. Üretime alıyorsun, aynı model yüzde yetmiş yapıyor.
Model değişmedi. Değişen şey, ona neyin nasıl verildiği.
Bu fark, makine öğrenmesi projelerinin çoğunun takıldığı yer — ve nedeni genelde algoritmik değil, mühendislik.
Eğitimdeki veri, çalışma zamanındaki veri değil
En yaygın sebep, aynı özelliğin iki yerde farklı hesaplanması.
Eğitimde toplu veri üzerinde çalışıyorsun: bütün geçmiş elinde, ortalama alıyorsun, normalize ediyorsun. Çalışma zamanında ise tek bir istek geliyor ve aynı özelliği anlık olarak hesaplaman gerekiyor — farklı kod, farklı kütüphane, bazen farklı dil.
İki uygulama arasındaki en küçük fark bile modele farklı girdi veriyor. Ve model bunu bildirmiyor; sessizce daha kötü tahmin ediyor.
Tek gerçek çözüm, özellik hesaplamasının tek bir yerde tanımlanması ve iki tarafın da onu çağırması. İki kez yazılan her özellik, er ya da geç ayrışıyor.
Geleceği sızdırmak
İkinci klasik hata, eğitim verisine tahmin anında var olmayacak bir bilgi karıştırmak.
Bir işlemin sahte olup olmadığını tahmin ediyorsun ve özelliklerin arasında "itiraz edildi mi" var. Deftere göre model muhteşem. Üretimde işe yaramıyor, çünkü tahmin anında o bilgi henüz yok.
Bu hata her zaman bu kadar bariz olmuyor. Bir alanın ne zaman doldurulduğunu bilmiyorsan, geçmişe bakarak eğitmek gelecekten bilgi almak olabiliyor. Kural şu: her özellik için "bu değer tahmin anında elimde miydi" sorusunun cevabı yazılı olmalı.
Deftere göre çok iyi çalışan bir model, genelde iyi bir model değil — sızdıran bir kurulumdur.
Model bir kod, veri bir bağımlılık
Üçüncüsü sürümleme. Bir tahmini yeniden üretebilmek için üç şeyin sürümü lazım: kod, model ağırlıkları ve özellik tanımları.
Bunlardan biri kayıtsızsa, üç ay sonra "bu kullanıcı neden engellendi" sorusunu cevaplayamıyorsun. Ajanlarda deterministik kayıt için yazdığım şeyin buradaki karşılığı bu — her tahmin, hangi model sürümüyle ve hangi girdiyle üretildiğini taşımalı.
Yayına almak bir anahtar çevirmek değil
Yeni bir model doğrudan bütün trafiğe verilmiyor.
Önce gölge modda çalışıyor: tahmin üretiyor, kaydediliyor, ama hiçbir karara etki etmiyor. Eski modelle karşılaştırılıyor. Sonra küçük bir kesime açılıyor, sonra genişliyor.
Ve geri dönüş yolu her zaman açık olmalı — eski model silinmiyor, bir bayrakla anında geri alınabiliyor. Mobil dağıtım yazısında anlattığım kademeli açılışın aynısı, sadece paket yerine model.
Bozulmayı ölçmek
Son parça, tahmin ile gerçekleşen arasındaki farkı sürekli izlemek.
Bunun için her tahminin sonucunu kaydetmek gerekiyor — ki bu da her zaman mümkün olmuyor, sahtekârlık yazısında anlattığım kapanmayan döngü gibi. Sonuç gelmeyen yerlerde ikinci en iyi şey girdi dağılımını izlemek: modele gelen veri, eğitildiği veriye hâlâ benziyor mu.
Benzemiyorsa, doğruluk düşmeden önce uyarı almış oluyorsun. Bu, üretimdeki bir modelin kendi bozulduğunu söyleyebilmesinin tek yolu.