İçeriğe geç
academia.sh

Ders 13 / 14

Model Seçimi

Üç aday benzetici düzeyinde kurulup dört ölçütte sayılıyor: küçük yetenek 0,5000 isabet / 84,5 denk belirteç / 7,29 adım / 0 istek dışarı, orta yetenek 0,5833 / 181,2 / 7,00 / 0, büyük yetenek 0,7917 / 627,5 / 14,00 / 24. Beş ağırlık setinde kazanan üç kez orta, bir kez büyük, bir kez küçük çıkıyor. Ağırlık taraması eşikleri veriyor: isabet ağırlığı 4 olduğunda seçim ortadan büyüğe, bedel ağırlığı 2 olduğunda ortadan küçüğe geçiyor, gecikme ve veri sınırı ağırlıkları on ikiye kadar seçimi değiştirmiyor. Tohum 20260219 ile aynı hesap tekrarlandığında isabet ağırlıklı setin kazananı büyükten ortaya dönüyor.

İçindekiler

Önceki ders iki erişim biçimini üç ölçütte karşılaştırdı ve kararın ağırlığa kaldığı yerde durdu. Gerçek bir seçimde seçenek iki değildir. Aynı işi yapabilecek birden çok model bulunur; bunlar yetenek, belirteç bedeli, gecikme ve verinin nereye gittiği eksenlerinde birbirinden ayrılır ve hiçbiri dört eksende birden en iyi değildir.

Bu ders üç adayı benzetici düzeyinde kurar, dört ölçütte sayar ve tek bir soruyu yanıtlar: ağırlıklar değiştiğinde kazanan değişiyor mu, ve değişiyorsa hangi eşikte. Ağırlık taramasının ve normalleştirme kuralı seçiminin sonucu nasıl çevirebildiği Python ile Veri Analizi kursundaki Ortam Seçimi dersinde ölçüldü; o yordam burada tekrarlanmaz, tek bir normalleştirme kuralı kullanılır ve sonucu okunur.

  • DL65. Üç aday tek bir benzeticinin üç ayarıdır. Ayrıldıkları yer tanıdık öbek kümesinin genişliği, birim çarpanı ve ürettikleri yanıtın uzunluğudur. Hiçbir model, sürüm ya da sağlayıcı anılmaz; adaylar küçük, orta ve büyük yetenek diye geçer ve kurgudur.
  • DL66. Bedel birimi denk belirteçtir. Bir adayın bir belirteci, en küçük adayın belirtecinin kaç katı hesap tuttuğunu veren kurgu bir çarpanla ölçeklenir: küçük 1, orta 4, büyük 12. Para birimi yazılmaz.
  • DL67. Gecikme adım sayısıyla ölçülür: istek başına ortalama çağrı çarpı üretilen çıktı belirteci. Ham süre yazılmaz, çünkü üretim sıralı yapılır ve adım sayısı koşumdan koşuma değişmez.
  • DL68. Küçük ve orta aday açık ağırlıklı erişimle kendi donanımında koşar, büyük aday yalnız bir model uç noktası üzerinden çağrılır; kurum sınırını aşan istek sayısı sırasıyla 0, 0 ve 24 olur.
  • DL69. Küçük adayın bir düzeneği vardır: biçim denetiminden geçmeyen yanıtlarda isteme iki kurgu örnek eklenip yeniden sorulur. Bu düzenek isabeti yükseltir, çağrı sayısını ve belirteci büyütür.
  • DL70. Normalleştirme kuralı tektir: her ölçütte en kötü aday 0, en iyi aday 1 alır, aradaki değer aralığa oranlanır. Ağırlıklar bu normalleştirilmiş sayılara uygulanır.

Üç Aday ve Dört Ölçüt

# ORTAK -- KURGUDUR. Uc aday ayni benzetici uzerinde kurulur; hicbir model ya da
# saglayici anilmaz. Adaylar tanidik obek genisligi, birim carpani ve cikti uzunlugu
# ile ayrilir. Bedel birimi DENK BELIRTEC: belirtec sayisi carpi adayin birim carpani.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def belirtecle(metin):
    """Kurgu belirtecleyici: harf obekleri dorder, rakam obekleri ikiser bolunur."""
    cikti, tampon = [], ""
    for ch in metin + " ":
        if ch.isalnum():
            tampon += ch
            continue
        if tampon:
            n = 2 if tampon.isdigit() else 4
            cikti += [tampon[i:i + n] for i in range(0, len(tampon), n)]
            tampon = ""
        if ch.strip():
            cikti.append(ch)
    return cikti


BAS = [("sayac okunmadi tahmini fatura cikti", "olcum"),
       ("fatura tutari gecen aya gore iki kat cikti", "odeme"),
       ("gece boyunca su basinci dustu", "tesisat"),
       ("planli kesinti bildirimi ulasmadi", "kesinti"),
       ("abonelik devri sayaca islenmedi", "sozlesme")]
EK = ["sayacin numarasi degistirilmis olabilir", "adres bilgisi eski gorunuyor",
      "onceki ay ayni sorun yasanmadi", "sayaca ulasilamiyor kapi kapali",
      "kesinti suresi beklenenden uzun surdu", "otomatik talimat sayacta yok"]
SOZLUK = {"kesinti": ["kesi", "bild"], "olcum": ["okun", "olcu", "tahm"],
          "tesisat": ["basi", "dust", "tesi", "vana"],
          "odeme": ["fatu", "odem", "tali", "tuta"],
          "sozlesme": ["abon", "adre", "devr", "sozl"]}
SINIFLAR = list(SOZLUK)
TALEP = []
for i in range(24):
    r = uretec(TOHUM + 31 * i)
    a, b = 100000 + int(r() * 380000), 100000 + int(r() * 380000)
    TALEP.append({"no": 4100 + i, "sinif": BAS[i % 5][1],
                  "metin": f"abone {4100 + i}: {BAS[i % 5][0]}, {EK[(5 * i + 2) % 6]}."
                           f" ana sayac {a} ara sayac {b}."})
# (ad, obek genisligi, birim carpani, cikti belirteci, ornek bedeli, disari cikan istek)
ADAY = [("kucuk", 2, 1, 5, 46, 0), ("orta", 3, 4, 7, 0, 0), ("buyuk", 4, 12, 14, 0, 24)]


def cagir(t, genislik, tohum):
    """Benzetici: tanidigi obeklerle etiket secer; ilk iki aday esitse belirsiz doner."""
    bel, sz = belirtecle(t["metin"]), {s: set(o[:genislik]) for s, o in SOZLUK.items()}
    p = sorted(((sum(b in sz[s] for b in bel), s) for s in SINIFLAR), key=lambda x: (-x[0], x[1]))
    if p[0][0] == 0 or p[0][0] == p[1][0]:
        return "belirsiz"
    r = uretec(tohum + 1009 * genislik + 7 * t["no"])
    return p[1][1] if r() < 0.14 else p[0][1]


def olc(aday, tohum=TOHUM):
    ad, g, carpan, cikti, ornek, disari = aday
    dogru = cagri = giris = 0
    for t in TALEP:
        n = len(belirtecle(t["metin"]))
        y, cagri, giris = cagir(t, g, tohum), cagri + 1, giris + n
        if y == "belirsiz" and ornek:           # duzenek: isteme iki ornek eklenip yeniden sorulur
            y, cagri, giris = cagir(t, g + 1, tohum), cagri + 1, giris + n + ornek
        dogru += y == t["sinif"]
    cagri, giris = cagri / 24, giris / 24
    return {"ad": ad, "isabet": dogru / 24, "denk": (giris + cagri * cikti) * carpan,
            "adim": cagri * cikti, "cagri": cagri, "disari": disari}


S = [olc(a) for a in ADAY]
print("aday    isabet  isabet B  denk belirtec  adim  cagri/istek  disari cikan")
for a, s in zip(ADAY, S):
    b = olc(a, TOHUM + 1)["isabet"]
    print(f"{s['ad']:<6}  {s['isabet']:.4f}  {b:.4f}      {s['denk']:>6.1f}    {s['adim']:>5.2f}"
          f"   {s['cagri']:.4f}      {s['disari']:>2}/24")
aday    isabet  isabet B  denk belirtec  adim  cagri/istek  disari cikan
kucuk   0.5000  0.5833        84.5     7.29   1.4583       0/24
orta    0.5833  0.6667       181.2     7.00   1.0000       0/24
buyuk   0.7917  0.7083       627.5    14.00   1.0000      24/24

Dört sütun dört ayrı kazanan gösteriyor. İsabette büyük aday önde: 0,7917. Denk belirteçte küçük aday önde: 84,5, yani büyüğün 627,5’inin yedide birinden az. Adımda orta aday önde, ama farkı incedir: 7,00 karşısında 7,29. Kurum sınırını aşan istekte küçük ve orta aday birlikte önde, çünkü ikisi de kendi donanımında koşuyor.

Küçük adayın adım sayısındaki kaybının nereden geldiği çağrı sütununda yazılı: istek başına 1,4583 çağrı. Bu, düzeneğin bedelidir. Biçim denetiminden geçmeyen yanıtlarda isteme iki örnek eklenip yeniden soruluyor; isabet bu sayede 0,5000’e çıkıyor ama her yeniden sorulan istek bir adım daha ekliyor. Düzenek isabeti alıp gecikmeyi veriyor, ve iki sayı da tabloda yan yana duruyor.

Denk belirteç biriminin ne olduğuna dikkat etmek gerekir. Üç aday aynı isteği alıyor ve neredeyse aynı sayıda belirteç okuyor; ham belirteç sayısıyla bakıldığında üçü de birbirine yakındır. Fark belirtecin sayısında değil tuttuğunda: aynı belirteci işlemek büyük adayda küçük adayın on iki katı hesap yükü demektir. Birim çarpanı bu yükü tek bir sayıya indiriyor ve karşılaştırmayı mümkün kılıyor. Para birimi yazılmamasının nedeni de budur: çarpan yapısaldır ve beş yıl sonra da aynı biçimde okunur, bir fiyat listesi ise okunmaz. Çıktı belirteci ayrıca sayılır, çünkü çıktı sıralı üretilir ve hem bedele hem adıma girer; büyük adayın 14 belirteçlik yanıtı, aynı yanıtı 5 belirteçte veren küçük adaya göre iki kat gecikme demektir.

Ağırlık Değişince Kazanan Değişiyor

OLCUT = [("isabet", "isabet", 1), ("denk belirtec", "denk", -1), ("adim", "adim", -1),
         ("disari cikan istek", "disari", -1)]


def normal(sonuc, anahtar, yon):
    """Tek normallestirme kurali: aralikta en kotu 0, en iyi 1."""
    v = [s[anahtar] for s in sonuc]
    lo, hi = min(v), max(v)
    if hi == lo:
        return [1.0] * len(v)
    return [((x - lo) if yon > 0 else (hi - x)) / (hi - lo) for x in v]


N = {a: normal(S, a, y) for _, a, y in OLCUT}
AGIRLIK = [("dengeli", (1, 1, 1, 1)), ("isabet agirlikli", (4, 1, 1, 1)),
           ("bedel agirlikli", (1, 4, 1, 1)), ("gecikme agirlikli", (1, 1, 4, 1)),
           ("veri siniri agirlikli", (1, 1, 1, 4))]
print("olcut               kucuk   orta   buyuk")
for ad, a, _ in OLCUT:
    print(f"{ad:<18}  {N[a][0]:.4f}  {N[a][1]:.4f}  {N[a][2]:.4f}")
print("agirlik seti            kucuk   orta   buyuk   kazanan")
for ad, w in AGIRLIK:
    p = [sum(w[j] * N[a][i] for j, (_, a, _) in enumerate(OLCUT)) for i in range(3)]
    print(f"{ad:<22}  {p[0]:.4f}  {p[1]:.4f}  {p[2]:.4f}  {S[p.index(max(p))]['ad']}")
olcut               kucuk   orta   buyuk
isabet              0.0000  0.2857  1.0000
denk belirtec       1.0000  0.8220  0.0000
adim                0.9583  1.0000  0.0000
disari cikan istek  1.0000  1.0000  0.0000
agirlik seti            kucuk   orta   buyuk   kazanan
dengeli                 2.9583  3.1078  1.0000  orta
isabet agirlikli        2.9583  3.9649  4.0000  buyuk
bedel agirlikli         5.9583  5.5739  1.0000  kucuk
gecikme agirlikli       5.8333  6.1078  1.0000  orta
veri siniri agirlikli   5.9583  6.1078  1.0000  orta

Beş ağırlık setinde üç ayrı kazanan çıkıyor. Eşit ağırlıkta orta aday kazanıyor ve farkı küçüktür: 3,1078 karşısında 2,9583. İsabet ağırlığı dörde çıkınca büyük aday öne geçiyor, ama yine kılpayı: 4,0000 karşısında 3,9649. Bedel ağırlığı dörde çıkınca küçük aday kazanıyor. Gecikme ve veri sınırı ağırlıkları ortayı büyütmekten başka bir şey yapmıyor.

Aynı üç aday, aynı dört sayı, üç ayrı karar. Değişen tek şey hangi ölçütün ne kadar saydığıdır. Bu yüzden “hangi model daha iyi” sorusunun ölçüsü yoktur; ölçüsü olan soru “bu dört sayı ve şu ağırlıklarla hangi aday kazanıyor” sorusudur. Bir seçim gerekçesi, ağırlığını yazmadığı sürece bir gerekçe değil bir tercihtir.

Normalleştirme kuralının kendisi de bir karardır ve tabloda görünmez. Burada kullanılan kural aralığa oranlıyor: her ölçütte en kötü aday 0, en iyi aday 1 alıyor. Bu kural, aradaki farkın ne kadar büyük olduğuna bakmaz — isabette küçük ile orta arasındaki 0,0833’lük fark, aralığın 0,2917’lik genişliğine bölünüp 0,2857’ye çıkıyor, yani küçük bir mutlak fark büyük bir normalleştirilmiş farka dönüşüyor. Başka bir kural başka sayılar verirdi. Ortam Seçimi dersi bunun seçimi çevirebildiğini ölçtüğü için burada tek kural kullanılıyor ve kullanıldığı yazılıyor; yazılmadığında tablo, olmadığı kadar nesnel görünür.

Eşik ve Seçimin Kendi Belirsizliği

def kazanan(N, w):
    p = [sum(w[j] * N[a][i] for j, (_, a, _) in enumerate(OLCUT)) for i in range(3)]
    return ADAY[p.index(max(p))][0]


print("taranan olcut       agirlik 1  ilk degisim  yeni kazanan")
for j, (ad, _, _) in enumerate(OLCUT):
    onceki, esik, yeni = kazanan(N, (1, 1, 1, 1)), "-", "-"
    for w in range(2, 13):
        k = kazanan(N, tuple(w if i == j else 1 for i in range(4)))
        if k != onceki and esik == "-":
            esik, yeni = w, k
    print(f"{ad:<18}  {onceki:<9}  {str(esik):<11}  {yeni}")
S2 = [olc(a, TOHUM + 1) for a in ADAY]
N2 = {a: normal(S2, a, y) for _, a, y in OLCUT}
print("agirlik seti            tohum 20260218  tohum 20260219")
for ad, w in AGIRLIK:
    print(f"{ad:<22}  {kazanan(N, w):<14}  {kazanan(N2, w)}")
taranan olcut       agirlik 1  ilk degisim  yeni kazanan
isabet              orta       4            buyuk
denk belirtec       orta       2            kucuk
adim                orta       -            -
disari cikan istek  orta       -            -
agirlik seti            tohum 20260218  tohum 20260219
dengeli                 orta            orta
isabet agirlikli        buyuk           orta
bedel agirlikli         kucuk           kucuk
gecikme agirlikli       orta            orta
veri siniri agirlikli   orta            orta

Eşikler asimetriktir. Bedel ağırlığı 2 olduğunda seçim ortadan küçüğe geçiyor; isabet ağırlığı ise 4’e çıkmadan büyüğü öne getirmiyor. Gecikme ve veri sınırı ağırlıkları on ikiye kadar taransa da seçimi değiştirmiyor, çünkü bu iki ölçütte kazanan zaten ortadır ve ağırlık artırmak kazananı pekiştirmekten başka bir şey yapmaz. Bir ölçütün ağırlığını büyütmek, o ölçütte önde olmayan bir adayı asla öne getirmez.

Son tablo bu dersin en rahatsız edici sayısıdır. Aynı hesap tohum 20260219 ile tekrarlandığında isabet ağırlıklı setin kazananı büyükten ortaya dönüyor. Hiçbir ölçüt değişmedi, hiçbir ağırlık değişmedi; yalnız benzeticinin örnekleme tohumu değişti ve büyük adayın isabeti 0,7917’den 0,7083’e indi. Kılpayı kazanılan bir karar, koşumdan koşuma değişen bir bileşenin üstüne kurulduğunda kendisi de koşuma bağlı olur. Dört ölçütün üçünde seçim sağlamdır; dördüncüsünde değildir ve bu, tek koşumla ölçen bir karşılaştırmanın hiç göremeyeceği bir şeydir.

Buradan pratik bir kural çıkıyor. Bir seçim tablosu yalnız kazananı değil, kazanma payını da yazmalıdır. Payı geniş olan satırlar, ağırlıklar biraz oynasa ya da ölçüm biraz kaysa da ayakta kalır; payı ince olanlar kalmaz. Eşit ağırlıktaki 3,1078 ile 2,9583 arasındaki 0,1495’lik pay ile isabet ağırlıklı setteki 4,0000 ile 3,9649 arasındaki 0,0351’lik pay aynı tabloda durur ama aynı şeyi söylemez. İnce paylı bir satırda doğru davranış, kazananı ilan etmek değil, iki adayı da ölçüyü büyüterek yeniden koşturmak ya da kararı bir ölçüte daha bağlamaktır.

Özet

  • Üç aday dört ölçütte sayılınca kazanan dörde bölünüyor: isabette büyük 0,7917, denk belirteçte küçük 84,5, adımda orta 7,00, kurum sınırını aşan istekte küçük ve orta 0/24.
  • Küçük adayın düzeneği isabeti 0,5000’e çıkarırken çağrı sayısını 1,4583’e ve adımı 7,29’a taşıyor; kazanç ile bedel aynı tabloda durur.
  • Beş ağırlık setinde kazanan üç kez orta, bir kez büyük, bir kez küçük çıkıyor; eşit ağırlıkta fark 3,1078 karşısında 2,9583 gibi incedir.
  • Eşikler asimetriktir: bedel ağırlığı 2’de seçimi ortadan küçüğe, isabet ağırlığı 4’te ortadan büyüğe çevirir; gecikme ve veri sınırı ağırlıkları on ikiye kadar seçimi değiştirmez.
  • Tohum 20260219 ile isabet ağırlıklı setin kazananı büyükten ortaya dönüyor; kılpayı verilen bir seçim koşuma bağlı hale gelir.

Sonraki Adım

Bu derste bedel bir ölçüt olarak sayıldı, ama bir sınır olarak hiç kullanılmadı. Kazanan aday her ağırlık setinde serbestçe seçildi; oysa gerçek bir sistemde belirteç bütçesi bir üst sınırdır ve seçimi değil tasarımı dayatır. Aynı görev, aynı model ve aynı isabetle bile, istemin nasıl yazıldığına göre istek başına kaç belirteç harcandığı büyük ölçüde değişir. Sonraki ders dört düzeneği belirteç ve isabet olarak karşılaştırır — uzun istem, kısa istem ile örnek, özetleyip gönderme ve önbellek — ve bütçe daraldığında hangi tasarımın zorunlu hale geldiğini gösterir. O ders aynı zamanda kursun kapanışıdır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat