---
title: Nicemleme
source: 'https://academia.sh/tr/kurslar/model-apileri/nicemleme'
course: "Model API'leri ile Uygulama Geliştirme"
language: tr
updated: '2026-08-17T18:06:38+00:00'
license: 'CC BY-SA 4.0'
---

# Nicemleme

Bir ağırlığın kaç basamakla tutulduğunun bellek ve isabet üzerindeki etkisinin aynı 120 kurgu talepte ölçülmesi: 16 basamakta ağırlık belleği 34,3 milyar basamak ve eşzamanlı istek 5, 8 basamakta 17,2 milyar ve 24, 4 basamakta 8,6 milyar ve 62. Beş sınıflı konu ataması 0,8667'den 8 basamakta 0,8750'de kalıyor, 4 basamakta 0,8000'e, 3 basamakta 0,6333'e, 2 basamakta 0,2083'e düşüyor; iki sınıflı aciliyet ayrımı aynı düzeylerde 0,9417, 0,9333, 0,8583 ve 0,3583. Ortalama karar farkı beş sınıfta 0,1597, iki sınıfta 0,2665 olduğu için ince ayrım önce gidiyor. 121 satırın ayırt edici farkı 4 basamakta 24 satırda, 3 basamakta 53 satırda tamamen siliniyor.

Önceki derste bellek **sayı adedi** olarak sayıldı ve bir sayının bellekte ne kadar yer tuttuğu
sabit kabul edildi. Bu kabul bir seçimdir, bir zorunluluk değil. Aynı ağırlık daha az basamakla
tutulabilir; o zaman parametre sayısı değişmeden bellek küçülür, aynı bütçeye daha çok eşzamanlı
istek sığar ve önceki dersin son tablosundaki tavan yükselir.

Karşılığı da aynı yerdedir. Önceki dersin ağırlık satırlarında ayırt edici olan şey ortak taban
değil, tabanın üstüne konu başına eklenen **küçük farktı**. Basamak sayısı düştükçe temsil
edilebilir değerler seyrekleşir ve bir noktadan sonra o küçük farklar aynı değere yuvarlanır. Bu
ders üç basamak düzeyini yan yana koyar ve iki soruyu ayrı ayrı yanıtlar: bellek ne kadar düşüyor,
**isabet hangi noktada** ve **hangi görevde önce** düşüyor.

- **YM11.** Kod bir **benzeticidir**; önceki dersin benzeticisi kısaltılarak yeniden kurulur.
  Talepler **kurgudur**, tohum **20260218**.
- **YM12. Nicemleme burada tek bir işlemdir:** sıfır ile iki arası, basamak sayısının verdiği eşit
  adıma bölünür ve her ağırlık en yakın adıma yuvarlanır. Ölçülen tek büyüklük **basamak
  sayısıdır**.
- **YM13.** Bellek **basamak** olarak sayılır: ağırlık belleği parametre sayısı çarpı basamak
  sayısıdır. Ara durum da aynı basamak sayısıyla tutulur.
- **YM14.** Bütçe 48 milyar basamaktır; bu, önceki dersin üç milyar sayılık bütçesinin 16
  basamaktaki karşılığıdır. Ölçek sabittir ve önceki dersin büyük ölçeğidir.
- **YM15.** Aynı yanıt **üç çözünürlükte** okunur: beş sınıflı konu ataması, üç sınıflı ekip
  yönlendirmesi (ücret, saha, sayaç) ve iki sınıflı aciliyet ayrımı. Eşlemeler **kurgudur**.
- **YM16. Fark**, bir kararın sağlamlığıdır: seçilen konunun puanı ile en yakın rakibin puanı
  arasındaki uzaklık. Üç görevde rakibin tanımı farklıdır, bu yüzden fark da farklıdır.
- **YM17.** Dağılım sıcaklığı sıfırdır; bütün sayılar koşumdan bağımsızdır. Belirsizliğin yerine
  **fark dağılımı** ölçülür.
- **YM18.** Eşitlik alfabetik sırayla çözülür. Bütün ağırlıklar aynı değere yuvarlandığında model
  tek bir etikete çöker.
- **YM19.** Basamak sayısı yalnız ağırlıkları etkiler; belirteçleme, sözlük ve görev tanımları
  değişmez.
- **YM20.** Eşzamanlı istek sayısı önceki dersin hesabıyla aynıdır; değişen tek girdi bir sayının
  kaç basamak tuttuğudur.

## Basamak Sayısı Bellekte Neyi Serbest Bırakır

Nicemlemenin bellek tarafı doğrusaldır ve tartışmasızdır: basamak yarıya inerse ağırlık belleği
yarıya iner. İlginç olan ikinci etkidir. Ara durum da aynı basamak sayısıyla tutulduğu için bütçe
iki yerden birden serbest kalır, ve eşzamanlı istek sayısı basamak sayısı düştükçe **basamağın
oranından daha hızlı** büyür: ağırlıklar bütçeden bir kere düşülür, kalanın tamamı isteklere gider.

```python
# YEREL BENZETICI -- KURGUDUR. Onceki dersin benzeticisi kisaltilarak kurulur.
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 ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


def belirtecle(m):                      # KURGU belirtecleyici, parca en cok bes damga
    b = []
    for s in m.lower().split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"]
KALIP = {"fatura": ["bu ayki tutar gecen aya gore cok yuksek",
                    "odedim ama sistemde borc gorunuyor",
                    "ayrintili dokumu nereden gorebilirim"],
         "ariza": ["evde su akmiyor bir sorun var",
                   "baglanti bozuk oldu ve hic calismiyor",
                   "ariza kaydi actim ama ekip gelmedi"],
         "sayac": ["okuma yanlis girilmis endeks tutmuyor",
                   "cihaz degisimi icin randevu istiyorum",
                   "endeksi ile fatura ayni degil"],
         "tarife": ["hangi basamaktayim ogrenmek istiyorum",
                    "tarife degisikligi icin ne yapmaliyim",
                    "birim ucret abone tipine gore degisir mi"],
         "kesinti": ["mahallede elektrik yok ne zaman gelecek",
                     "planli duyuru nereden takip edilir",
                     "aksamdan beri kesinti yasiyoruz"]}
EK = ["ayrica gecen hafta da aradim", "kayit numarasi verildi",
      "ekip bilgi verecekti", "degisiklik talebim de var"]
TALEP = []                              # 120 KURGU destek talebi
for i in range(120):
    r = uretec(TOHUM + i)
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    m = KALIP[k][int(r() * 3)]
    if r() < 0.34:
        m += " " + EK[int(r() * 4)]
    TALEP.append({"no": 4001 + i, "konu": k, "metin": m})

GECIS = {}
for k, liste in KALIP.items():
    for m in liste:
        for t in set(belirtecle(m)):
            GECIS.setdefault(t, {})[k] = 1
for e in EK:
    for t in set(belirtecle(e)):
        GECIS.setdefault(t, {})

TABAN, AGIRLIK = 0.50, {}
for i, t in enumerate(sorted(GECIS)):
    r = uretec(TOHUM + 7919 * (i + 1))
    satir = {k: TABAN for k in KONU}
    if GECIS[t]:
        for k in GECIS[t]:
            satir[k] = TABAN + 0.05 + 0.40 * r()
    else:
        satir[KONU[int(r() * 5)]] = TABAN + 0.02 + 0.10 * r()
    AGIRLIK[t] = satir

GRUP = {"fatura": "ucret", "tarife": "ucret", "ariza": "saha",     # ekip yonlendirmesi
        "kesinti": "saha", "sayac": "sayac"}
ACIL = {"fatura": "normal", "tarife": "normal", "sayac": "normal",  # aciliyet ayrimi
        "ariza": "acil", "kesinti": "acil"}


def nicem(x, b):
    """Sifir ile iki arasi, 2**b - 1 esit adima bolunur; en yakin adima yuvarlanir."""
    a = 2.0 / (2 ** b - 1)
    return round(x / a) * a


def puan(metin, b):
    p = {k: nicem(TABAN, b) for k in KONU}
    for t in belirtecle(metin):
        if t in AGIRLIK:
            for k in KONU:
                p[k] = max(p[k], nicem(AGIRLIK[t][k], b))
    return p


def sec(p):
    return max(sorted(p), key=lambda a: p[a])


PARAMETRE, ARA, BUTCE = 2144337920, 157286400, 48_000_000_000

print("bas    adim  agirlik(basamak)  esz.istek  bes sinif  uc sinif  iki sinif")
for b in (16, 12, 8, 6, 5, 4, 3, 2):
    a5 = a3 = a2 = 0
    for x in TALEP:
        s = sec(puan(x["metin"], b))
        a5 += s == x["konu"]
        a3 += GRUP[s] == GRUP[x["konu"]]
        a2 += ACIL[s] == ACIL[x["konu"]]
    e = max(0, (BUTCE // b - PARAMETRE) // ARA)
    print(f"{b:>3} {2.0 / (2 ** b - 1):>7.5f} {PARAMETRE * b:>17} {e:>10}"
          f" {a5 / 120:>10.4f} {a3 / 120:>9.4f} {a2 / 120:>10.4f}")
```

```
bas    adim  agirlik(basamak)  esz.istek  bes sinif  uc sinif  iki sinif
 16 0.00003       34309406720          5     0.8667    0.8667     0.9417
 12 0.00049       25732055040         11     0.8667    0.8667     0.9417
  8 0.00784       17154703360         24     0.8750    0.8750     0.9417
  6 0.03175       12866027520         37     0.8500    0.8750     0.9417
  5 0.06452       10721689600         47     0.8417    0.8667     0.9333
  4 0.13333        8577351680         62     0.8000    0.9083     0.9333
  3 0.28571        6433013760         88     0.6333    0.7583     0.8583
  2 0.66667        4288675840        138     0.2083    0.3583     0.3583
```

Tablonun üç ana satırı 16, 8 ve 4 basamaktır. Bellek **34,3 milyardan**
17,2 milyara, oradan 8,6 milyar basamağa iniyor; tam olarak dörtte bir. Eşzamanlı istek ise
5'ten 24'e, oradan **62**'ye çıkıyor: on iki katı. Bu orantısızlık YM13'ten gelir. Ağırlık bütçeden
bir kez düşülür ve 16 basamakta bütçenin neredeyse tamamını yer; basamak azaldıkça ağırlığın payı
küçülür ve kalanın **tamamı** isteklere gider.

İsabet sütunları aynı hızda gitmiyor. Beş sınıflı konu ataması 16 basamakta **0,8667**, sekiz
basamakta **0,8750** — yani ilk yarılanma isabette ölçülebilir bir iz bırakmıyor. Altı ve beş
basamakta 0,8500 ve 0,8417 ile hafifçe geriliyor. Dört basamakta **0,8000**, üç basamakta
**0,6333**, iki basamakta **0,2083**. Son satır bir isabet değil bir çöküştür: 0,2083, benzeticinin
alfabetik olarak ilk etikete düşme oranıdır.

## Farkın Adımın Altında Kalması

Bu düşüşün nedeni tahmin edilecek bir şey değil, hesaplanacak bir şeydir. Bir kararın sağlamlığı
**farktır**: seçilen konunun puanı ile en yakın rakibinin puanı arasındaki uzaklık. Yuvarlama bu
uzaklığı ancak adım kadar oynatabilir; fark adımdan büyükse karar yerinde kalır, küçükse
kaybolabilir. Aşağıdaki iki ölçü de koşumdan bağımsızdır ve isabet ölçülmeden önce bakılabilir.

```python
def farklar(b):
    f = {"bes sinif": [], "uc sinif": [], "iki sinif": []}
    for x in TALEP:
        p = puan(x["metin"], b)
        v = sorted(p.values(), reverse=True)
        s = sec(p)
        f["bes sinif"].append(v[0] - v[1])
        f["uc sinif"].append(p[s] - max(p[k] for k in KONU if GRUP[k] != GRUP[s]))
        f["iki sinif"].append(p[s] - max(p[k] for k in KONU if ACIL[k] != ACIL[s]))
    return f


print("gorev      ortalama fark   farki adimin altinda kalan pay (bas 8 / 4 / 3)")
for ad, f in farklar(16).items():
    o = [sum(1 for x in f if x < 2.0 / (2 ** b - 1)) / 120 for b in (8, 4, 3)]
    print(f"{ad:<10} {sum(f) / 120:>13.4f}   " + "   ".join(f"{x:.4f}" for x in o))
print("\nbas  tablodaki ayri deger  ayrimi silinen satir (121 satirda)")
for b in (16, 8, 4, 3, 2):
    d = {nicem(w, b) for s in AGIRLIK.values() for w in s.values()}
    z = sum(1 for s in AGIRLIK.values() if len({nicem(w, b) for w in s.values()}) == 1)
    print(f"{b:>3} {len(d):>20} {z:>27}")
print("\n'endek' satiri basamak duzeylerinde:")
for b in (16, 8, 4, 3):
    print(f"  {b:>2} " + " ".join(f"{k}={nicem(AGIRLIK['endek'][k], b):.4f}"
                                  for k in KONU))
```

```
gorev      ortalama fark   farki adimin altinda kalan pay (bas 8 / 4 / 3)
bes sinif         0.1597   0.0167   0.4167   0.7250
uc sinif          0.1995   0.0167   0.2750   0.6667
iki sinif         0.2665   0.0083   0.2000   0.4500

bas  tablodaki ayri deger  ayrimi silinen satir (121 satirda)
 16                  133                           0
  8                   55                           0
  4                    4                          24
  3                    2                          53
  2                    1                         121

'endek' satiri basamak duzeylerinde:
  16 fatura=0.5000 ariza=0.5000 sayac=0.7095 tarife=0.5000 kesinti=0.5000
   8 fatura=0.5020 ariza=0.5020 sayac=0.7059 tarife=0.5020 kesinti=0.5020
   4 fatura=0.5333 ariza=0.5333 sayac=0.6667 tarife=0.5333 kesinti=0.5333
   3 fatura=0.5714 ariza=0.5714 sayac=0.5714 tarife=0.5714 kesinti=0.5714
```

İlk tablo, isabet tablosunun sırasını **isabete bakmadan** açıklıyor. Ortalama fark beş sınıflı
görevde **0,1597**, üç sınıflıda 0,1995, iki sınıflıda **0,2665**. Görev kabalaştıkça rakip
uzaklaşır, çünkü fatura ile tarife arasındaki karışıklık ekip yönlendirmesini bozmaz ve arıza ile
kesinti arasındaki karışıklık aciliyeti bozmaz. Aynı yanıt, kaba okunduğunda daha sağlam bir
karardır.

Sağdaki üç sütun bunu düzey düzey sayıyor. Sekiz basamakta adım 0,00784 ve kayıtların yalnız
**0,0167**'sinde fark bu adımın altında; isabetin bu düzeyde oynamaması bu yüzden beklenen bir
sonuçtur. Dört basamakta adım 0,13333'e çıkıyor ve beş sınıflı görevde kayıtların **0,4167**'si
kırılgan hâle geliyor, iki sınıflı görevde ise **0,2000**'i. Üç basamakta oranlar 0,7250 ile
0,4500. Kırılganlık payının sırası isabetin düşme sırasıyla aynıdır, ve bu sıra basamak düşürmeden
önce hesaplanabilir.

İkinci tablo mekanizmayı gösteriyor. 121 satırın 605 ağırlığı 16 basamakta **133** ayrı değer
taşıyor; sekiz basamakta 55'e iniyor ama hiçbir satır ayrımını kaybetmiyor. Dört basamakta
temsil edilebilir değer sayısı **4**'e düşüyor ve **24 satırın** beş konu için tuttuğu değerler
birbirine eşitleniyor; o satırlar artık hiçbir şey ayırt etmiyor. Üç basamakta bu sayı 53, iki
basamakta 121, yani tablonun tamamı. Nicemleme ağırlıkları küçültmez, **birbirinden ayırt edilemez
hâle getirir**; silinen şey büyüklük değil ayrımdır.

Son blok tek bir satırda aynı şeyi gösteriyor. Sayaç okumasına işaret eden `endek` parçası 16
basamakta sayaç için 0,7095, öbür dört konu için 0,5000 taşıyor; ayrım 0,2095. Sekiz basamakta
0,7059 ile 0,5020, ayrım 0,2039 — neredeyse aynı. Dört basamakta değerler 0,6667 ile 0,5333'e
oturuyor ve ayrım 0,1334'e iniyor. Üç basamakta beş değer de **0,5714**; satır artık sayacı
işaret etmiyor. Ağırlıkların hiçbiri sıfırlanmadı, hiçbiri anlamlı ölçüde küçülmedi; yalnız
aralarındaki uzaklık temsil edilemez hâle geldi.

## İsabetin Düştüğü Nokta

Tablonun okunacak yeri dört ile üç basamak arasıdır. Sekizden dörde inerken beş sınıflı isabet
0,0750 geriliyor ve bellek yarıya iniyor; dörtten üçe inerken isabet **0,1667** geriliyor ve bellek
yalnız dörtte bir daha azalıyor. Bedelin eğrisi ile kazancın eğrisi burada kesişiyor: dört basamak
altında kazanılan her basamak, öncekinden daha pahalıya geliyor.

Hangi görevin önce düştüğü sorusunun yanıtı da tablodadır. Dört basamakta beş sınıflı ayrım
0,8667'den **0,8000**'e düşerken üç sınıflı ekip yönlendirmesi 0,8667 ile 0,9083 arasındaki bandın
içinde kalıyor ve iki sınıflı aciliyet ayrımı 0,9417'den yalnız **0,9333**'e iniyor. İki basamak
daha aşağıda, üç basamakta, kaba görevler de düşüyor ama beş sınıflı görevin çok gerisinden:
0,7583 ve 0,8583. Kural şudur: **ince ayrım önce gider.** Aynı nicemlenmiş model, bir talebi hangi
ekibe yollayacağını hâlâ bilirken hangi konuya ait olduğunu bilemez hâle gelmiştir.

Bunun tasarımdaki karşılığı doğrudandır. Bir kurulumda basamak sayısını düşürmenin
kabul edilebilir olup olmadığı modele değil **göreve** bağlıdır. Aynı ağırlıklar üstünde iki iş
yürüyorsa, kaba olanı dört basamakla çalıştırmak ile ince olanı dört basamakla çalıştırmak aynı
karar değildir. Ölçülmesi gereken de tek bir isabet değil, **her görev için ayrı** bir isabettir.

## Özet

- Nicemleme burada bir aralığın eşit adımlara bölünmesidir; ölçülen tek büyüklük basamak sayısıdır
  ve bellek parametre sayısı çarpı basamak olarak yazılır.
- Ağırlık belleği 16 basamakta 34,3 milyar, 8 basamakta 17,2 milyar, 4 basamakta 8,6 milyar; aynı
  bütçedeki eşzamanlı istek 5'ten 24'e ve 62'ye çıkıyor, çünkü ağırlık bütçeden bir kez düşülür.
- Beş sınıflı isabet 8 basamağa kadar 0,8667 bandında kalıyor, 4 basamakta 0,8000, 3 basamakta
  0,6333, 2 basamakta 0,2083'e düşüyor; son satır isabet değil alfabetik çöküştür.
- Ortalama karar farkı beş sınıfta 0,1597, iki sınıfta 0,2665; farkı adımın altında kalan pay 4
  basamakta 0,4167 ile 0,2000 ve bu sıra isabetin düşme sırasını basamak düşürmeden önce veriyor.
- 605 ağırlık 4 basamakta 4 ayrı değere iniyor ve 24 satır bütün ayrımını kaybediyor; nicemleme
  büyüklüğü değil ayrımı siler.
- İsabetin düştüğü nokta dört ile üç basamak arasıdır ve önce düşen görev beş sınıflı konu
  atamasıdır; kaba görevler iki basamak daha dayanıyor.

## Sonraki Adım

Bu iki derste ağırlıklar hep **verilmiş** kabul edildi. Ölçek seçildi, basamak sayısı düşürüldü,
bellek ve isabet yan yana yazıldı; ama ağırlıkların kendisine hiç dokunulmadı. Oysa yerel bir
kurulumun uzak bir uç noktada bulunmayan asıl imkânı budur: ağırlıklar elinde olduğu için
**değiştirilebilirler**. Kendi verinle bir kaç yüz örnek üstünde eğitim sürdürülürse modelin bu
göreve isabeti yükselebilir. Yükselir mi, ne kadar yükselir, ve aynı kazanç isteme birkaç cümle
eklemekle zaten alınabiliyor muydu — bunlar ölçülmedi. Sonraki ders aynı görevde **istem düzeneği**
ile **ince ayarı** yan yana koyar, bedeli örnek sayısı ve koşum sayısıyla yazar, ve ince ayarın
**kazanmadığı** bir noktayı gösterir.
