2026-07-24
Regresyon Kapilari
Hayır diyemeyen bir skorun hiçbir değeri yoktur. Bölüm 11, tüm seriyi tek bir CI kapısına dönüştürür: 20 öğelik bir değerlendirmenin iki aday çalışması üzerinde üç kontrol yürütür, bir bootstrap-CI eşiği, bir n-gram bulaşma taraması ve bir PSI kayma karşılaştırması, ve ortalaması iyi görünen ama aralığı ile dağılımı iyi görünmeyen çalışmanın dağıtımını engeller.
Neler öğreneceksin
Bölüm 10, bir modelin belirttiği güvenin sözünü tutup tutmadığını sormuştu; bu bölüm tüm değerlendirmenizin hayır demesine izin verilip verilmediğini soruyor. Serinin şimdiye kadar kurduğu her sayı, bir skor, bir altın küme, önyargısı giderilmiş bir jüri, bir güven aralığı, tek bir soruyu tek bir anda yanıtlamak için var: bu yeni model sürümü üretime ulaşmalı mı, ulaşmamalı mı? Bir regresyon kapısı (regression gate), o sorunun bir toplantıdaki sohbet olmaktan çıkıp bir makinenin uygulayabileceği bir kurala dönüştüğü yerdir. Bir dağıtımdan önce çalışan, değerlendirme sonuçlarına bakan ve iki kelimeden birini döndüren küçük bir programdır: gönder ya da engelle.
Bu bölümün yakalamak için kurulduğu tuzak, neredeyse herkesi kandıran tuzaktır: manşet ortalaması barajı geçen bir çalışma. Aynı küçük 20 öğelik değerlendirme kümesinin iki aday sürümünü, ortalaması 0.900 olan A çalışması ve ortalaması 0.725 olan B çalışması, 0.70 kalite barajına karşı notlayacağız. B çalışmasının ortalaması çizginin rahatça üzerinde oturuyor. “Ortalama eşiği geçer, o zaman gönder” naif kuralına göre B çalışması dağıtılır. Her biri ortalamanın ötesine bakan üç kontrol kuracağız ve sonunda üçü de B çalışmasının güvenli olmadığında hemfikir olacak: güven aralığı barajın altına iniyor ve skor dağılımı, güvendiğimiz çalışmadan anlamlı biçimde kaymış. Kapı dağıtımı engelliyor, ve bunu bir sezgiyle değil, bir sayıyla yapıyor.
Ön koşullar
Temel Python (bir liste, bir döngü, bir bölme) ve serinin daha önceki bir fikri yeterli: Bölüm 6’daki, tek bir ortalamayı veriyi yerine koyarak yeniden örnekleyerek bir aralığa çeviren bootstrap güven aralığı. O ifade bulanıksa, kısa versiyonu burada da var. NumPy görünüyor (yeniden örnekleme ve bir logaritma için), ama egzotik bir şey yok. Eşlik eden dosya, regression_gates.py, API anahtarı ve ağ olmadan offline çalışır, bootstrap tekrarlanabilir olsun diye sabit bir rastgele tohumla, ve doğrulanmış bir beklenen-çıktı bloğuyla biter. Bu yazıda basılan her sayı, o dosyanın gerçek çıktısıdır ve hepsini kendiniz yeniden üretebilirsiniz.
Senaryo: iki çalışma, bir baraj
Bir kapının var olma sebebi olan durum şudur. Her biri 0.0 (yanlış), 0.5 (kısmi) ya da 1.0 (doğru) olacak biçimde bir öğe-başına kalite skoruna notlanmış 20 öğelik bir değerlendirme kümeniz var. Modelinizin iki sürümü, aynı 20 öğe üzerinde 20’şer skor üretir, dolayısıyla doğrudan karşılaştırılabilirler. A sürümü, hâlihazırda üretimde olan model ya da zaten güvendiğiniz bir aday. B sürümü, birinin göndermek istediği yeni olan. Her kalite kovasına kaç öğe düştüğünün sayımı olarak yazıldığında, iki çalışma şöyle:
RUN_A = [1.0] * 17 + [0.5] * 2 + [0.0] * 1 # mean 0.900
RUN_B = [1.0] * 12 + [0.5] * 5 + [0.0] * 3 # mean 0.725
A çalışmasında 17 doğru, 2 kısmi, 1 yanlış var: 0.900 ortalama. B çalışmasında 12 doğru, 5 kısmi, 3 yanlış var: 0.725 ortalama. Kalite barajınız THRESHOLD = 0.70. İkisi de onu geçiyor. Yalnızca ortalamayı kontrol eden tek satırlık bir kapı, ikisini de geçirirdi. Bu bölümün geri kalanı, o kapının B çalışması hakkında yanıldığına dair üç sebeptir.
Kontrol 1: CI eşik kapısı
İlk kontrol, bir ortalamaya tek başına güvenmeyi reddeder. 20 örnekten hesaplanan bir ortalama bir nokta tahminidir (point estimate): aynı değerlendirmeyi farklı bir 20 öğelik örneklem üzerinde çalıştırın ve biraz farklı bir sayı elde edersiniz. Bölüm 6, o titremeyi ölçen aracı öğretti: bootstrap. 20 skoru yerine koyarak yeniden örnekler, 20’lik yeni bir küme çeker ve yeniden ortalarsınız; bunu N_BOOT = 10000 kez yapın ve elinizde ortalamanın 10000 olası değeri olur. Onları sıralayıp 2.5’inci ve 97.5’inci yüzdelikleri okuyun, elinizde bir %95 güven aralığı olur (bu da ALPHA = 0.05, iki kuyruğa bölünmüş):
def bootstrap_ci(scores, n_boot, alpha, rng):
arr = np.asarray(scores, dtype=float)
n = len(arr)
idx = rng.integers(0, n, size=(n_boot, n)) # n_boot resamples of size n
boot_means = arr[idx].mean(axis=1)
lo = float(np.percentile(boot_means, 100 * alpha / 2))
hi = float(np.percentile(boot_means, 100 * (1 - alpha / 2)))
return float(arr.mean()), lo, hi
Kapının kuralı tek satır, ve kontrolün bütün amacı bu: yalnızca CI’nin alt sınırı barajı geçerse geç, sadece ortalama değil.
def threshold_gate(scores, threshold, rng):
mean, lo, hi = bootstrap_ci(scores, N_BOOT, ALPHA, rng)
passed = lo >= threshold
return mean, lo, hi, passed
Bunu iki aday üzerinde çalıştırın ve aralarındaki fark saklanmayı bırakır:
run A: mean=0.900 95% CI=[0.775, 1.000] low >= 0.70 -> PASS
run B: mean=0.725 95% CI=[0.550, 0.875] low < 0.70 -> FAIL
A çalışmasının ortalaması 0.900 ve tüm aralığı, [0.775, 1.000], barajın üzerinde oturuyor. Verinin olası olarak olabileceği kötümser köşede bile, A çalışması 0.70’i payı ile geçiyor, dolayısıyla geçer. B çalışmasının ortalaması 0.725, barajın üzerinde, ama aralığı [0.550, 0.875], ve alt uç, 0.550, 0.70’in epey altında. İşte kapının vetosu bu: B çalışmasının ortalaması barajı geçiyor, ama veri, gerçek kalitenin 0.550 kadar düşük olmasıyla, yani rahatça barajın altında olmasıyla tutarlı. 20 öğelik bir kümede aralık geniştir, ve B’nin ortalaması çizginin güçbela üzerinde, dolayısıyla aralığın bir kısmı yanlış tarafa düşer. Kapı, savunması gereken barajın altında olabilecek bir sayıya bir dağıtımı yaslamayı reddeder.
Bu, “ortalama geçti” ile “geçtiğinden eminiz” arasındaki farktır. Ortalamayı kontrol eden bir kapı, yazı tura ile gönderir. Alt sınırı kontrol eden bir kapı, yalnızca gürültünün sizi çizginin altına sürükleyemeyeceği durumda gönderir.
Kontrol 2: bulaşma
İkinci kontrol daha ince bir başarısızlığa karşı korur, bir skoru kötü bir sebeple iyi gösteren birine. Bir değerlendirme sorusu eğitim verisine sızmışsa, model yanıta akıl yürüterek varmak yerine onu ezberlemiş olabilir. O öğede kazandığı skor, beceri kanıtı değildir; örtüşme kanıtıdır. Bulaşmış bir değerlendirme kümesi, kendisinden hesaplanan her sayıyı şişirir, dolayısıyla bir skora güvenmeden önce sızıntı için tararız.
Kontrol, bir sözcük n-gram örtüşmesidir. Her değerlendirme sorusunu ve her eğitim belgesini n = 3 ardışık sözcükten oluşan örtüşen pencerelere (sözcük trigramları) ayırın, sonra her değerlendirme öğesi için, trigramlarının hangi oranının eğitim korpusunda bir yerde de yer aldığını sorun. 1.00 örtüşme, sorunun her trigramının eğitimde bulunduğu anlamına gelir, ki bu da ifadenin tam ezberlenmesinin göründüğü şeydir.
def word_ngrams(text, n):
tokens = text.lower().split()
return {tuple(tokens[i:i + n]) for i in range(len(tokens) - n + 1)}
def contamination_overlap(eval_text, train_ngrams, n):
ev = word_ngrams(eval_text, n)
if not ev:
return 0.0
hit = sum(1 for g in ev if g in train_ngrams)
return hit / len(ev)
Dört değerlendirme sorusunu dört belgelik bir eğitim korpusuna karşı tarıyoruz, ve o eğitim belgelerinden biri dosdoğru yapıştırılmış bir değerlendirme sorusu. 0.80 sızıntı barajında ya da üzerinde örtüşmesi olan her şeyi işaretliyoruz:
E1: overlap=1.00 -> LEAKED "what is the capital of france"
E2: overlap=0.00 -> clean "how many legs does a spider have"
E3: overlap=0.00 -> clean "who wrote the play romeo and juliet"
E4: overlap=0.20 -> clean "what is the boiling point of water"
E1, “what is the capital of france,” 1.00 örtüşmeye sahip. Dört trigramı (what is the, is the capital, the capital of, capital of france) korpusta görünüyor, çünkü tam olarak o soru eğitim kümesinde duruyor. O öğe işaretleniyor: kazandığı her skor bulaşmıştır ve atılmalı ya da öğe kaldırılmalıdır. E2 ve E3 eğitimle hiç trigram paylaşmıyor, örtüşme 0.00, gerçekten görülmemiş. E4, “what is the boiling point of water,” öğretici durum. Örtüşmesi 0.20, sıfır değil. Beş trigramı var ve tam olarak biri, what is the, E1’in sızmış satırında da görünüyor, dolayısıyla beşte bir isabet. Ama what is the genel bir soru başlangıcı, sızmış bir yanıt değil, ve 0.20, 0.80 barajının epey altında, dolayısıyla E4 doğru biçimde temiz bırakılıyor. Kontrol, ezberlenmiş bir soruyu tesadüfi bir ortak ifadeden ayırıyor, ki bu da bulaşma tespitinin bütün sanatıdır: yüksek örtüşme sızıntıyı işaretler, tesadüfi örtüşme işaretlemez.
İki tasarım tercihi adlandırmaya değer. Tek sözcükler yerine trigram kullanmak, what is the’in her soruyu barajın üzerine sürüklemesini engelleyen şeydir; daha uzun pencereler, başıboş sözcüklerin değil, tüm ifadelerin eşleşmesini talep eder. Ve barajı 1.00 yerine 0.80’e koymak, hafifçe yeniden ifade edilmiş sızmış bir öğenin yine de yakalanmasına yer bırakır. Bu, alanın gerçek korpuslar üzerinde yürüttüğü bulaşma araştırmasının kasıtlı olarak basit, offline bir vekilidir, ama ilke aynıdır: bir kıyaslama (benchmark), yalnızca model yanıtlarını daha önce görmediyse dürüsttür.
Kontrol 3: kayma
Üçüncü kontrol, özet sayısı sakin görünse bile şekli değişmiş bir çalışmayı yakalar. İki çalışma, skor dağılımları birbirinden uzaklaşmışken benzer görünen ortalamalara sahip olabilir, ve o hareket çoğu zaman bir regresyonun ilk işaretidir. Onu görmek için ortalamayı değil, tüm dağılımı karşılaştırmalısınız.
Önce her çalışmanın skorlarını kalite düzeyine göre kovalayın, 0.0, 0.5 ve 1.0, ve her birine kaç öğe düştüğünü sayın:
def bucketize(scores, edges):
counts = [0] * len(edges)
for s in scores:
counts[edges.index(s)] += 1
return counts
İki çalışmamız için kova sayımları:
buckets [0.0, 0.5, 1.0]
run A counts [1, 2, 17] (n=20)
run B counts [3, 5, 12] (n=20)
A çalışması, 20 öğesinin 17’sini en üstteki 1.0 kovasına koyuyor, yalnızca 2 kısmi ve 1 kaçırma ile. B çalışması çökmüş: yalnızca 12 öğe tamamen doğru, kısmiler 5’e yükselirken düpedüz kaçırmalar 3’e üçlenmiş. Kütle, “doğru” kovasından “kısmi” ve “yanlış”a doğru kaymış. Popülasyon Kararlılık Endeksi (Population Stability Index), ya da PSI, tam olarak o kaymaya tek bir sayı koyar. Her kova için, iki çalışmanın pA ve pB oranlarını alın ve kovalar boyunca (pA - pB) * ln(pA / pB) toplayın:
def psi(counts_a, counts_b):
na, nb = sum(counts_a), sum(counts_b)
total = 0.0
for a, b in zip(counts_a, counts_b):
pa, pb = a / na, b / nb
total += (pa - pb) * np.log(pa / pb)
return float(total)
PSI, iki dağılım aynı olduğunda sıfırdır ve ıraksadıkça büyür; simetriktir, dolayısıyla hangi çalışmayı taban çizgisi olarak adlandırdığınız fark etmez. Alışılmış okuma şudur: 0.10’un altında dağılımlar kararlıdır, 0.10 ile 0.25 arası bakmaya değer ölçülü bir kaymadır ve 0.25’in üzeri anlamlı kaymadır. İki çalışmamız şunu veriyor:
PSI = sum (pA-pB)*ln(pA/pB) = 0.334 -> SIGNIFICANT drift
0.334’lük bir PSI, 0.25 çizgisinin epey ötesinde, dolayısıyla dağılımlar anlamlı biçimde kaymış. Kontrol 1’in ortalamasının vurgulayamadığı şeyi bunun neyi yakaladığına dikkat edin: B çalışması yalnızca ortalamada biraz daha düşük skor almadı, sonuçların tüm profilini değiştirdi, gerçek yanıtlar kısmi ve yanlış olanlara dönüşerek. B’nin ortalaması bir şekilde tam A çalışmasının üstüne düşseydi bile, PSI yine de bağırıyor olurdu, çünkü şekil hareket etti. Ortalamalar bulanıklaştırır; PSI netleştirir.
Aşağıdaki figür, üç kontrolü de aday B üzerinde yan yana koyuyor, ki bu da kapının onları tam olarak görme biçimidir: üç panel, tek bir hüküm.
Kapının hükmü
Şimdi kapı asıl işini yapıyor, ki o da karar vermek. Aday B üzerindeki kontrolleri, birinin göndermek istediği çalışmayı, birleştirir ve tek bir kelime döndürür:
GATE VERDICT on candidate B (the run we were about to deploy):
CI threshold gate : FAIL
distribution drift : SIGNIFICANT drift
DECISION: BLOCK THE DEPLOY
B çalışmasının 0.725 ortalaması 0.70 barajını geçti, ve tembel bir kapı onu gönderirdi. Ama CI eşik kapısı onu başarısız saydı, çünkü [0.550, 0.875] aralığı barajın altına iniyor, ve kayma kontrolü PSI 0.334’te anlamlı kayma işaretledi, çünkü dağılımı güvenilen çalışmadan uzağa çöktü. Tek başına her iki sinyal de bir dağıtımı durdurmaya yeter; birlikte kesindirler. Karar BLOCK THE DEPLOY (DAĞITIMI ENGELLE). Regresyon hiçbir zaman üretime ulaşmaz, ve, çok önemlisi, sebep denetlenebilir: “daha kötü hissettirdi” değil, “%95 CI’nin alt sınırı 0.550, 0.70 barajının altında, ve PSI 0.334, 0.25 kayma çizgisinin üstünde.” Onu bir sayı durdurdu, bir sezgi değil.
Aşağıdaki interaktif figür, o karara yüklenmenize izin verir. Aday B’nin kova sayımlarını kaydırın, öğeleri yanlış, kısmi ve doğru sütunları arasında taşıyın, ve üç kontrolün canlı yeniden hesaplanmasını izleyin: B’nin ortalaması, baraja karşı güven aralığı ve A çalışmasına karşı PSI, gönder-ya-da-engelle nihai hükmü siz ilerledikçe güncellenerek. Üçünü de geçen bir çalışma kurmayı deneyin, ve bunun yalnızca ortalamayı geçmekten ne kadar daha zor olduğunu hissedeceksiniz.
Özet / Çıkarımlar
- Bir kapı ortalamayı değil, alt sınırı kontrol eder. Barajın üzerindeki bir nokta tahmini yeterli değildir, çünkü 20 öğe geniş bir aralık üretir. B çalışmasının
0.725ortalaması0.70barajını geçer, ama %95 bootstrap CI’si[0.550, 0.875]onun altına iner, dolayısıyla CI eşik kapısı onu başarısız sayar. A çalışması geçer çünkü tüm aralığı[0.775, 1.000]barajı geçer. - Bulaşma skorları şişirir, dolayısıyla onu tarayın. Bir sözcük-trigram örtüşme kontrolü, n-gramları hâlihazırda eğitim verisinde yaşayan her değerlendirme öğesini işaretler. E1 örtüşme
1.00aldı (tamamen sızmış,0.80barajında işaretlendi); E4, genelwhat is theifadesinden0.20aldı ve temiz kaldı. Yüksek örtüşme ezberlemedir; tesadüfi örtüşme değildir. - Ortalamaları değil, dağılımları karşılaştırın. İki çalışma, şekilleri hareket ederken birbirine yakın görünen ortalamalara sahip olabilir. A çalışmasının kova sayımları
[1, 2, 17]ve B çalışmasının[3, 5, 12],0.25çizgisinin üzerinde0.334’lük bir PSI verir, dolayısıyla her iki ortalama da barajın üzerinde olsa bile kayma anlamlıdır. - Kapının kararı denetlenebilir. Aday B üzerindeki hüküm
BLOCK THE DEPLOY, iki somut sayı ile desteklenmiş (CI alt sınırı0.550barajın altında, PSI0.334kayma çizgisinin üstünde), sezgiyle değil. Bir kapıyı savunabileceğiniz ve otomatikleştirebileceğiniz bir şey yapan budur. - Serinin karşılığını verdiği yer burası. Skor (Bölüm 1), altın küme (Bölüm 2) ve güven aralığı (Bölüm 6) tam olarak bu anın, otomatik gönder-ya-da-engelle çağrısının, kanıtla yapılabilmesi için kuruldu.
Sözlük
- Regresyon kapısı (regression gate): bir dağıtımdan önce çalışan ve değerlendirme sonuçlarına dayanarak gönder ya da engelle döndüren otomatik bir kontrol. Burada bir CI eşik kapısı ile bir kayma kontrolünü birleştirir ve aday B’yi engeller.
- Nokta tahmini (point estimate): B çalışmasının
0.725ortalaması gibi, farklı bir örneklemde ne kadar hareket edeceğine dair bir ölçü olmadan hesaplanmış tek bir değer. Yalnızca bir nokta tahminine güvenen bir kapı, gürültü üzerinde gönderir. - Bootstrap güven aralığı: bir metrik için olası değerlerin aralığı, veriyi yerine koyarak
N_BOOT = 10000kez yeniden örnekleyip yeniden hesaplanan ortalamaların 2.5’inci ve 97.5’inci yüzdeliklerini okuyarak kurulur. Bölüm 6’da tanıtıldı. - CI eşik kapısı: bir çalışmanın yalnızca güven aralığının alt sınırı barajı geçerse geçtiği kural. B çalışmasını başarısız saydı (
0.550 < 0.70) ve A çalışmasını geçirdi (0.775 >= 0.70). - Bulaşma (sızıntı): eğitim verisinde görünmüş, dolayısıyla modelin yanıtını ezberlemiş olabileceği bir değerlendirme öğesi. Skoru, beceriyle hiçbir ilgisi olmayan bir sebeple şişirir.
- Sözcük n-gram örtüşmesi: bir değerlendirme öğesinin
n-sözcüklük pencerelerinin (burada trigramlar,n = 3) eğitim korpusunda da görünen oranı.1.00örtüşme, öğenin ifadesinin eğitimde tamamen bulunduğu anlamına gelir; buradaki sızıntı barajı0.80. - Popülasyon Kararlılık Endeksi (PSI): iki dağılımın ne kadar kaydığını ölçen tek bir sayı, kovalar boyunca
sum (pA - pB) * ln(pA / pB). Sıfır aynı demektir;0.10’un altı kararlı,0.10ile0.25ölçülü,0.25’in üzeri anlamlı. A çalışması ile B çalışması0.334verir. - Kayma (drift): çalışmalar arasında bir skor dağılımının yalnızca ortalamasının değil, şeklinin değişmesi. B çalışmasının kütlesi doğru kovadan kısmi ve yanlışa kaydı, ki bunu ortalama küçümser ve PSI netleştirir.
Kapı artık kötü bir çalışmayı engelleyebilir, ama hükmü ancak arkasındaki değerlendirme kümesi kadar iyidir, ve o küme kendini büyütmez. Bölüm 12, Değerlendirme Çarkı (The Eval Flywheel), üretim günlüklerinizi onu beslemeye devam eden motora dönüştürür: gerçek izleri yeni etiketli örneklere madencilik yaparak, altın küme ve üzerine kurulan her kapı, her dağıtımla daha keskin hale gelsin diye.