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

# Damıtma

Büyük modelin etiketlediği 240 kurgu kayıtla eğitilen küçük bir modelin, yalnız altı insan etiketiyle eğitilen aynı modele göre ne kazandığının iki görevde ölçülmesi: konu görevinde 0,5000'den 0,6333'e çıkıyor ve öğretmenin isabetinin tamamını yakalıyor, ama 240 insan etiketinin verdiği 0,9000'e göre açığın yalnız üçte birini kapatıyor. Ayrı konu sayma görevinde damıtma geri götürüyor, 0,5833'ten 0,3667 ve 0,2417'ye düşüyor, çünkü öğretmen saymıyor. Damıtılmış modelin hatalarının 0,9545'i öğretmenin de yanıldığı kayıtlarda, altı etiketle eğitilende bu pay 0,3000.

Bir önceki derste büyük modelin ağırlıkları elimizdeydi ve onların bir kısmını oynattık. Çoğu
durumda elde ağırlık yoktur; elde olan tek şey, büyük modelin verdiği **yanıtlardır**. Bu yanıtlar
bir etiket kümesi gibi kullanılıp **küçük bir modelin** eğitiminde girdi yapılabilir. Yapılan iş
**damıtmadır**: büyük modelin davranışı, onun binde biri kadar sayı taşıyan bir modele aktarılmaya
çalışılır.

Damıtmanın çekiciliği açıktır. İnsan etiketi pahalıdır, model etiketi ise bir çağrıdır. Ölçülmesi
gereken şey de bu yüzden tek bir sayı değildir: küçük model **öğretmenin isabetinin ne kadarını**
yakalıyor, aynı emeği insan etiketine harcasaydık nereye varırdık, ve **hangi görevde** bu aktarım
hiç çalışmıyor.

- **YM36.** Kod bir **benzeticidir**. Büyük model, küçük model ve kayıtların tamamı **kurgudur**;
  gerçek bir uç nokta çağrılmaz. Tohum **20260218**.
- **YM37.** Kayıt bir gövde cümlesi ve en çok iki **kısa ektir**. Etiketlerden biri **konu**
  (gövdenin konusu, beş sınıf), öteki **ayrı konu adedi** (metinde geçen ayrı konu sayısı, dört
  sınıf). Kayıtların bir payında gövde konuyu ele vermez.
- **YM38. Büyük model konuyu bir anahtar tablosundan puanlar, ayrı konu adedini ise saymaz**;
  uzunluk sınıfından tahmin eder. İkinci davranış, dil modellerinin sayma görevlerindeki
  zayıflığının kurgu karşılığıdır ve M28'in ilk kursunda ölçülmüştü.
- **YM39. Küçük model** belirteç torbasından doğrudan sınıfa giden tek bir dizeydir; öğretmenin
  taşıdığı yapının hiçbirini taşımaz. Eğitimi ders içinde yazılır.
- **YM40.** Üç kaynak karşılaştırılır: **altı insan etiketi**, **iki yüz kırk öğretmen etiketi** ve
  **iki yüz kırk insan etiketi**. Sonuncusu bir **üst sınırdır**, gerçek bir seçenek değil.
- **YM41.** İki koşum **öğretmenin etiketleme tohumu** değiştirilerek alınır (20260218 ve
  20260219); kayıtlar ve sınama kümesi iki koşumda da aynıdır.

## Öğretmen ve İki Görev

Damıtmanın sınırı öğretmenin kendisidir; bu yüzden önce öğretmen ölçülür. İki görev bilerek farklı
seçildi: biri anahtar sözcük eşlemesiyle çözülebilen bir sınıflandırma, öteki metinde geçen ayrı
konuların **sayılması**.

```python
# BENZETICI -- KURGUDUR. Buyuk model, kucuk model ve kayitlarin tamami ders icinde
# yazilir; gercek bir uc nokta cagrilmaz. Tohum 20260218.
from math import exp

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().replace(",", " , ").split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"]
GOVDE = [("fatura tutari gecen aya gore yuksek geldi", "fatura"),
         ("faturami odedim ama sistemde borc gorunuyor", "fatura"),
         ("evde su akmiyor bir ariza var galiba", "ariza"),
         ("baglanti bozuk oldu ve hic calismiyor", "ariza"),
         ("sayac okumasi yanlis girilmis endeks tutmuyor", "sayac"),
         ("sayac degisimi icin randevu istiyorum", "sayac"),
         ("hangi tarife basamagindayim ogrenmek istiyorum", "tarife"),
         ("birim ucret abone tipine gore degisiyor mu", "tarife"),
         ("mahallede kesinti var ne zaman gelecek", "kesinti"),
         ("planli kesinti duyurusu nereden takip edilir", "kesinti")]
KISA = {"fatura": "fatura notu", "ariza": "ariza kaydi", "sayac": "sayac formu",
        "tarife": "tarife grubu", "kesinti": "kesinti plani"}
BELIRSIZ = ["gecen hafta bir sorun yasadim yardim gerekiyor",
            "bu durumu kime iletmem gerektigini bilmiyorum"]


def kayitlar(n, tohum):
    """Bir govde cumlesi ve en cok iki kisa ek. Konu govdeninkidir; sayi ayri konu adedidir."""
    r, k = uretec(tohum), []
    for i in range(n):
        c = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
        if r() < 0.10:                          # govde konuyu ele vermiyor
            m, gecen = BELIRSIZ[int(r() * 2)], []
        else:
            aday = [x for x in GOVDE if x[1] == c]
            m, gecen = aday[int(r() * len(aday))][0], [c]
        for esik in (0.62, 0.45):
            if r() < esik:
                b = KONU[int(r() * 5)]
                if b not in gecen:
                    m += " ayrica " + KISA[b]
                    gecen.append(b)
        k.append({"metin": m, "konu": c, "sayi": len(gecen)})
    return k


ETIKETLI = kayitlar(6, TOHUM + 1)           # insan etiketi pahalidir: alti kayit
ETIKETSIZ = kayitlar(240, TOHUM + 2)        # etiketsiz yigin
SINAMA = kayitlar(120, TOHUM + 3)

IZ = {"fatur": "fatura", "tutar": "fatura", "borc": "fatura", "odedi": "fatura",
      "ariza": "ariza", "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza",
      "sayac": "sayac", "endek": "sayac", "okuma": "sayac", "randev": "sayac",
      "tarif": "tarife", "birim": "tarife", "abone": "tarife", "basam": "tarife",
      "kesin": "kesinti", "duyur": "kesinti", "mahal": "kesinti", "planl": "kesinti"}
TUZAK = {"notu": "fatura", "kaydi": "ariza", "formu": "sayac", "grubu": "tarife",
         "plani": "kesinti"}                # kisa ekler tabloda tam agirlikla duruyor
CAGRI = [0, 0]


def buyuk_model(metin, tohum, sicaklik=0.50):
    """KURGU buyuk model. Konuyu anahtar tablosundan puanlar; sayi gorevini SAYMAZ,
    uzunluk sinifindan tahmin eder. Ikinci davranis M28'in sayma zayifligina karsilik gelir."""
    CAGRI[0] += 1
    bel = belirtecle(metin)
    CAGRI[1] += len(bel)
    p = {k: 0.12 for k in KONU}
    for t in bel:
        for tablo, w in ((IZ, 1.0), (TUZAK, 0.70)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    r = uretec(tohum ^ sum((i + 1) * ord(c) for i, c in enumerate(metin)))
    ad = sorted(p)
    e = [exp(p[a] / sicaklik) for a in ad]
    s = sum(e)
    konu = ad[ayrik(r(), [x / s for x in e])]
    uzun = 0 if len(bel) <= 7 else (1 if len(bel) <= 10 else 2)
    sayi = ayrik(r(), ([0.10, 0.56, 0.24, 0.10], [0.06, 0.32, 0.40, 0.22],
                       [0.04, 0.20, 0.36, 0.40])[uzun])
    return konu, sayi


def olc(kume, tohum):
    dk = ds = 0
    for x in kume:
        k, s = buyuk_model(x["metin"], tohum)
        dk += k == x["konu"]
        ds += s == x["sayi"]
    return dk / len(kume), ds / len(kume)


dag = {}
for x in SINAMA:
    dag[x["sayi"]] = dag.get(x["sayi"], 0) + 1
print("sinama kayit", len(SINAMA), ", ayri konu adedi dagilimi", dict(sorted(dag.items())))
print("ornek kayit:", SINAMA[1]["metin"])
print("           konu", SINAMA[1]["konu"], ", ayri konu adedi", SINAMA[1]["sayi"])
print("\nbuyuk model              konu isabeti  sayi isabeti")
for ad, th in (("kosum A (20260218)", TOHUM), ("kosum B (20260219)", TOHUM + 1)):
    a, b = olc(SINAMA, th)
    print(f"{ad:<24} {a:>12.4f}  {b:>12.4f}")
print(f"sinama olcumunun bedeli: cagri {CAGRI[0]} , giris belirteci {CAGRI[1]}")
```

```
sinama kayit 120 , ayri konu adedi dagilimi {0: 4, 1: 38, 2: 63, 3: 15}
ornek kayit: evde su akmiyor bir ariza var galiba
           konu ariza , ayri konu adedi 1

buyuk model              konu isabeti  sayi isabeti
kosum A (20260218)             0.6333        0.3583
kosum B (20260219)             0.7167        0.3000
sinama olcumunun bedeli: cagri 240 , giris belirteci 3214
```

Büyük model konu görevinde **0,6333 / 0,7167**, sayma görevinde **0,3583 / 0,3000** veriyor.
Sayma görevinde dört sınıf var ve en kalabalık sınıf sınamanın 63 kaydını tutuyor; yani her kayda
o sınıfı veren bir yordam 0,5250 alırdı. Öğretmen bunun altındadır. İki koşum arasındaki fark da
konu görevinde 0,0834, sayma görevinde 0,0583: öğretmen belirsiz bir bileşendir ve etiketleri de
belirsizdir.

## Küçük Modelin Yakaladığı Pay

Küçük model her iki görevde üç ayrı kaynakla eğitilir. Öğretmenin etiketleri, iki yüz kırk
etiketsiz kaydın her biri için bir çağrı yapılarak üretilir.

```python
SOZLUK = {}
for m in [x[0] for x in GOVDE] + BELIRSIZ + ["ayrica " + v for v in KISA.values()]:
    for t in belirtecle(m):
        SOZLUK.setdefault(t, len(SOZLUK))
V = len(SOZLUK)


def parcala(metin):
    return sorted({SOZLUK[t] for t in belirtecle(metin) if t in SOZLUK})


def hedef(konu, sayi, alan):
    return KONU.index(konu) if alan == "konu" else sayi


def egit(ornek, sinif, tohum, dongu=40, adim=0.12):
    """KUCUK model: belirtec torbasindan dogrudan sinifa tek dizey, V x sinif sayi."""
    r = uretec(tohum)
    W = [[(r() - 0.5) * 0.2 for _ in range(sinif)] for _ in range(V)]
    for e in range(dongu):
        for tok, y in ornek:
            o = [sum(W[i][j] for i in tok) for j in range(sinif)]
            mx = max(o)
            d = [exp(x - mx) for x in o]
            s = sum(d)
            d = [x / s for x in d]
            d[y] -= 1.0
            for i in tok:
                for j in range(sinif):
                    W[i][j] -= adim * d[j]
    return W


def kestir(W, tok, sinif):
    o = [sum(W[i][j] for i in tok) for j in range(sinif)]
    return max(range(sinif), key=lambda j: o[j])


def kucuk_isabet(W, sinif, alan):
    return sum(kestir(W, parcala(x["metin"]), sinif) == hedef(x["konu"], x["sayi"], alan)
               for x in SINAMA) / len(SINAMA)


CAGRI[0] = CAGRI[1] = 0
DAMITMA = {t: [(x, *buyuk_model(x["metin"], t)) for x in ETIKETSIZ]
           for t in (TOHUM, TOHUM + 1)}       # etiketsiz yigin ogretmene etiketletiliyor
ETIKETLEME = (CAGRI[0], CAGRI[1])
KAYNAK = [("insan etiketi 6", lambda a, t: [(parcala(x["metin"]),
                                             hedef(x["konu"], x["sayi"], a))
                                            for x in ETIKETLI]),
          ("ogretmen etiketi 240", lambda a, t: [(parcala(x["metin"]), hedef(k, s, a))
                                                 for x, k, s in DAMITMA[t]]),
          ("insan etiketi 240", lambda a, t: [(parcala(x["metin"]),
                                               hedef(x["konu"], x["sayi"], a))
                                              for x in ETIKETSIZ])]
OG = (olc(SINAMA, TOHUM), olc(SINAMA, TOHUM + 1))
AGIRLIK = {}
print("gorev  kucuk modelin kaynagi   isabet A  isabet B  ogretmen A  yakalanan pay")
for alan, sinif in (("konu", 5), ("sayi", 4)):
    og = OG[0][0 if alan == "konu" else 1]
    for ad, veriyi_kur in KAYNAK:
        W = egit(veriyi_kur(alan, TOHUM), sinif, TOHUM)
        a = kucuk_isabet(W, sinif, alan)
        b = kucuk_isabet(egit(veriyi_kur(alan, TOHUM + 1), sinif, TOHUM + 1), sinif, alan)
        AGIRLIK[(alan, ad)] = (W, sinif)
        print(f"{alan:<6} {ad:<22} {a:>8.4f}  {b:>8.4f}  {og:>10.4f}  {a / og:>13.4f}")
    print(f"{alan:<6} {'buyuk model (ogretmen)':<22} {og:>8.4f}"
          f"  {OG[1][0 if alan == 'konu' else 1]:>8.4f}")

print("\nkucuk modelin hatasi ogretmeninkiyle ne kadar ortusuyor (kosum A):")
for alan in ("konu", "sayi"):
    for ad in ("insan etiketi 6", "ogretmen etiketi 240"):
        W, sinif = AGIRLIK[(alan, ad)]
        ortak = hata = 0
        for x in SINAMA:
            dogru = hedef(x["konu"], x["sayi"], alan)
            k, s = buyuk_model(x["metin"], TOHUM)
            kh = kestir(W, parcala(x["metin"]), sinif) != dogru
            hata += kh
            ortak += kh and hedef(k, s, alan) != dogru
        print(f"  {alan:<6} {ad:<22} kucuk hata {hata:>3} , ortak {ortak:>3}"
              f" , pay {ortak / hata:.4f}")
print(f"\nkucuk model {V} x sinif sayi ; insan etiketi 6 ya da 240 ;"
      f" ogretmen cagrisi {ETIKETLEME[0] // 2} , giris belirteci {ETIKETLEME[1] // 2}")
```

```
gorev  kucuk modelin kaynagi   isabet A  isabet B  ogretmen A  yakalanan pay
konu   insan etiketi 6          0.5000    0.5583      0.6333         0.7895
konu   ogretmen etiketi 240     0.6333    0.6917      0.6333         1.0000
konu   insan etiketi 240        0.9000    0.9000      0.6333         1.4211
konu   buyuk model (ogretmen)   0.6333    0.7167
sayi   insan etiketi 6          0.5833    0.5833      0.3583         1.6279
sayi   ogretmen etiketi 240     0.3667    0.2417      0.3583         1.0233
sayi   insan etiketi 240        0.9417    0.9417      0.3583         2.6279
sayi   buyuk model (ogretmen)   0.3583    0.3000

kucuk modelin hatasi ogretmeninkiyle ne kadar ortusuyor (kosum A):
  konu   insan etiketi 6        kucuk hata  60 , ortak  18 , pay 0.3000
  konu   ogretmen etiketi 240   kucuk hata  44 , ortak  42 , pay 0.9545
  sayi   insan etiketi 6        kucuk hata  50 , ortak  32 , pay 0.6400
  sayi   ogretmen etiketi 240   kucuk hata  76 , ortak  58 , pay 0.7632

kucuk model 103 x sinif sayi ; insan etiketi 6 ya da 240 ; ogretmen cagrisi 240 , giris belirteci 3256
```

Konu görevinde damıtma çalışıyor. Altı insan etiketiyle eğitilen küçük model **0,5000 / 0,5583**
veriyor; iki yüz kırk öğretmen etiketiyle eğitilen aynı model **0,6333 / 0,6917**'ye çıkıyor.
Kazanç 0,1333, ve **yakalanan pay 1,0000**: küçük model öğretmenin isabetine tam olarak
yetişiyor. Buraya kadar damıtma vaadini tutuyor.

Üçüncü satır vaadin sınırını gösteriyor. Aynı iki yüz kırk kayıt **insan** etiketiyle verilseydi
küçük model **0,9000** verirdi. Damıtılmış modelin kapattığı açık, 0,5000 ile 0,9000 arasındaki
mesafenin yalnız **üçte biridir**. Küçük modelin taşıyamadığı bir şey yok; taşıyamayan öğretmendir.
Damıtma modeli değil, **öğretmenin gördüğü kadarını** kopyalar.

Sayma görevi bunu tersine çeviriyor ve dersin asıl sayısını veriyor. Altı insan etiketiyle eğitilen
küçük model **0,5833** alıyor. İki yüz kırk öğretmen etiketiyle eğitilen aynı model **0,3667 /
0,2417**'ye **düşüyor**. Kırk kat daha fazla etiket, iki yüz kırk çağrı ve 3256 giriş belirteci
harcandı ve sonuç altı etiketle eğitilen modelden kötü. Öğretmen o görevde saymıyor, uzunluktan
tahmin ediyor; damıtma bu tahmin alışkanlığını sadakatle aktarıyor. Üst sınır ise **0,9417**: görev
küçük model için zor değil, öğretmen için zor.

Hata örtüşmesi sütunu aktarımın ne kadar sadık olduğunu söylüyor. Konu görevinde damıtılmış modelin
44 hatasının **42'si**, öğretmenin de yanıldığı kayıtlarda; pay **0,9545**. Altı insan etiketiyle
eğitilen modelde aynı pay **0,3000**. İkisi de hata yapıyor, ama damıtılmış olan **aynı** hataları
yapıyor. Bir sistemin iki bileşeni aynı yerde yanılıyorsa, ikisini yan yana koymak hiçbir şey
yakalamaz.

Son olarak iki koşum sütunu damıtmanın kendine özgü bir kırılganlığını gösteriyor. Öğretmen
etiketleme tohumu değiştiğinde damıtılmış modelin sayma isabeti **0,3667'den 0,2417'ye** düşüyor;
0,1250'lik bir oynama. İnsan etiketiyle eğitilen satırlar iki koşumda da aynı sayıyı veriyor.
Öğretmenin belirsizliği eğitim kümesine yazıldı ve orada kalıcı hâle geldi.

## Özet

- Büyük model konu görevinde 0,6333 / 0,7167, ayrı konu sayma görevinde 0,3583 / 0,3000 veriyor;
  sayma görevinde en kalabalık sınıfı seçen bir yordamın 0,5250'sinin altında kalıyor.
- Konu görevinde damıtma altı insan etiketine göre 0,5000'den 0,6333'e çıkarıyor ve öğretmenin
  isabetinin tamamını yakalıyor.
- Aynı iki yüz kırk kaydın insan etiketi 0,9000 verir; damıtma açığın yalnız üçte birini kapatır,
  çünkü tavan küçük model değil öğretmendir.
- Sayma görevinde damıtma geri götürüyor: 0,5833'ten 0,3667 ve 0,2417'ye. Üst sınır 0,9417'dir,
  yani görev küçük model için değil öğretmen için zordur.
- Damıtılmış modelin 44 konu hatasının 42'si öğretmenin de yanıldığı kayıtlarda (pay 0,9545); altı
  insan etiketiyle eğitilen modelde bu pay 0,3000.
- Bedel iki yüz kırk öğretmen çağrısı ve 3256 giriş belirtecidir; karşılığında altı insan etiketi
  yerine iki yüz kırk model etiketi elde edilir ve öğretmenin koşum belirsizliği devralınır.

## Sonraki Adım

Bu derste küçük model büyük modelin çıktısından doğdu. Ortaya çıkan ağırlıklar hiçbir insanın
yazmadığı, tamamen başka bir modelin yanıtlarından türetilmiş sayılardır. Aynı şey bir önceki
dersin uyarlama farkları için de geçerlidir: elde, bir başkasının modelinden **türetilmiş** bir
nesne vardır. O nesneyi kendi sunucunda çalıştırmak, abonelere bir paket içinde vermek, bir
başkasına satmak ya da yalnız çıktısını sunmak aynı şey değildir. Sonraki ders bu ayrımı sayar:
dört **kullanım koşulu sınıfı** bir kullanım senaryosuna uygulandığında kaç dağıtım seçeneği
kapanıyor, hangi koşul tek başına en çok seçeneği kapatıyor ve geriye kaç seçenek kalıyor.
