---
title: 'Eniyileme Algoritmaları'
source: 'https://academia.sh/tr/kurslar/derin-ogrenme/eniyileme-algoritmalari'
course: 'Derin Öğrenme'
language: tr
updated: '2026-08-17T18:10:10+00:00'
license: 'CC BY-SA 4.0'
---

# Eniyileme Algoritmaları

Aynı eğimin üç ayrı adım kuralıyla kullanılması ve düşen kaybın düşen hata anlamına gelmediğinin ölçülmesi: 40 turluk ortak bütçede momentumlu iniş eğitim kaybını 0,2777'ye, uyarlamalı adım 0,2923'e indirir, yalın iniş 0,3296'da kalır; buna karşılık sınama doğrulukları 0,7500, 0,7222 ve 0,7698'dir. Doğrulamadan okunan üç ayarda ağın sayısı 0,7857, aynı ağın ikinci koşumu 0,7698'dir ve taban çizgisi 0,7579. Yalnız ilklendirme değişerek dört koşum yapıldığında tek bir eniyileyicinin sınama açıklığı 0,0317'ye, yani sekiz aboneye çıkar; eniyileyiciler arası fark ise koşuma göre 0,0516 ile 0,0079 arasında oynar ve on iki koşumun hiçbiri doğrusal modelin 0,8016'sını geçmez.

Önceki ders eğimin doğru hesaplandığını gösterdi: geri yayılımın verdiği sayı sayısal türevle
karşılaştırıldı ve aradaki fark basıldı. Ama eğim bir **yön** verir, bir **adım** vermez. Beş
derste ağırlıkların o yönde hangi kuralla oynatılacağı hiç sorulmadı; sorulmadığı için tek bir
kural varmış gibi duruyor: ağırlıktan eğimin sabit bir katını çıkar.

Bu ders o boşluğu doldurur. Aynı ağ, aynı veri, aynı eğim ve aynı tur bütçesiyle **üç ayrı adım
kuralı** koşturulur. Ölçü ikilidir: eniyileyicinin işi eğitim kaybını düşürmektir, modelin işi
ayrılmış kümede doğru bilmektir. Bu dersin bulgusu ikisinin **ters yönde gidebildiğidir**.

- **SA46.** Küme, bölme ve tohum önceki derslerdeki gibidir; tablo **kurgudur**. Koşum süresi ders
  içinde kalsın diye eğitim kümesi **756 satırdan 300 satıra küçültülmüştür**; doğrulama ve sınama
  kümeleri değişmedi (252 ve 252) ve taban çizgisi sınamada **0,7579**.
- **SA47.** Ağ sabittir: 12 girdi, 8 gizli birim, 1 çıktı. Değişen yalnız adım kuralıdır. Gizli
  katmanda doğrultulmuş doğrusal birim, çıktıda sigmoit, kayıpta çapraz düzensizlik vardır;
  ilklendirme **kazanç ölçeklidir** ve yanmalar sıfırdan başlar.
- **SA48.** Tur bütçesi 40, toplu boyut 20'dir; üçü de aynı sayıda güncelleme harcar.
- **SA49.** Üç kural şudur: **yalın iniş** (ağırlıktan eğimin sabit katı çıkarılır),
  **momentumlu iniş** (eğimler 0,9 unutma katsayısıyla birikir) ve **uyarlamalı adım** (her ağırlık
  için karesel eğim birikimi tutulur ve adım o birikimin köküne bölünür).
- **SA50.** Toplu bölme sırası her koşumda aynıdır. Koşumdan koşuma değişen tek şey
  **ilklendirmedir**.
- **SA51.** Denenen aday **9**'dur: üç eniyileyici çarpı üç öğrenme adımı, seçim doğrulama
  kümesinden.
- **SA52.** Karşılaştırma çizgileri M27/K03'ten gelir ve yeniden eğitilmez: doğrusal model
  **0,8016**, karar ağacı **0,7857**. İkisi de aynı sınama kümesinde ölçülmüştü.
- **SA53.** Hızın ölçüsü süre değil **tur sayısıdır**: kayıp 0,40 eşiğinin altına ilk kez hangi
  turda iniyor. Eşik keyfidir ve üç eniyileyici için aynıdır.

## Eğimden Adıma

Kurulum kurgu tabloyu üretir, kümeleri ayırır ve ağı tanımlar. Her ağırlık satırının son katsayısı
**yanmadır**.

```python
# eniyileme.py — MODELDIR. Ayni KURGU abone tablosu, ayni tohum, ayni bolme;
# egitim kumesi bu konuda 300 satira kucultulmustur.
import math
import statistics

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]


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


VERI = []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() < 0.046:
        continue
    no = 10001 + i
    r, v = uretec(TOHUM + 7000 + no), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            b[2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + no)
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn + 0.24 * (hane >= 5)
         - 0.20 * (memnun >= 4) + b[3] + 0.9 * (no - 10001) / 1399
         + (r() + r() + r() - 1.5) * 1.30)
    x = {"hane": hane, "memnuniyet": memnun, "donem": len(v), "ort_tuketim": round(ort, 2),
         "oynaklik": round(oyn, 2), "sifir_okuma": int(min(v) == 0.0),
         "supheli": int(z > 1.35)}
    x["kisi_basi"] = round(x["ort_tuketim"] / x["hane"], 3)
    for q in BOLGE:
        x["b_" + q[0]] = int(b[0] == q[0])
    VERI.append(x)

r, S = uretec(TOHUM + 90000), list(range(len(VERI)))
for i in range(len(S) - 1, 0, -1):
    j = int(r() * (i + 1))
    S[i], S[j] = S[j], S[i]
K = [VERI[i] for i in S]
EGT, DOG, SIN = K[:300], K[756:1008], K[1008:]      # egitim 756'dan 300'e KUCULTULDU
ALAN = ["ort_tuketim", "oynaklik", "hane", "memnuniyet", "donem", "sifir_okuma",
        "kisi_basi", "b_kuzey", "b_guney", "b_dogu", "b_bati", "b_merkez"]
ORT = {a: statistics.fmean(x[a] for x in EGT) for a in ALAN}
SAP = {a: max(1e-9, statistics.pstdev([x[a] for x in EGT])) for a in ALAN}


def olcekli(s):                             # OGRENME egitimden, UYGULAMA her kumeye
    return ([[(x[a] - ORT[a]) / SAP[a] for a in ALAN] for x in s],
            [float(x["supheli"]) for x in s])


XE, YE = olcekli(EGT)
XD, YD = olcekli(DOG)
XS, YS = olcekli(SIN)
TABAN = sum(y == 0.0 for y in YS) / len(YS)
AGAC, DOGRUSAL = 198 / len(SIN), 202 / len(SIN)     # M27/K03'un iki sayisi


def sikistir(z):
    if z >= 0:
        return 1.0 / (1.0 + math.exp(-z)) if z < 700 else 1.0
    e = math.exp(z) if z > -700 else 0.0
    return e / (1.0 + e)


def ilklendir(tohum, bicim, kazanc=1.0):    # kazanc olcekli; her satirin son sutunu YANMA
    r, kat = uretec(tohum), []
    for g, c in bicim:
        a = math.sqrt(6.0 * kazanc / g)
        kat.append([[(r() * 2 - 1) * a for _ in range(g)] + [0.0] for _ in range(c)])
    return kat


def sifir(kat):
    return [[[0.0] * len(w) for w in W] for W in kat]


def ileri(kat, x):                          # ara katmanlarda dogrultulmus dogrusal birim,
    a, iz = x, []                           # cikista sigmoit
    for i, W in enumerate(kat):
        iz.append(a)
        z = [sum(p * q for p, q in zip(w, a)) + w[-1] for w in W]
        a = [sikistir(z[0])] if i == len(kat) - 1 else [t if t > 0 else 0.0 for t in z]
    iz.append(a)
    return iz


def egim(kat, X, Y, idx):                   # GERI YAYILIM, capraz duzensizlik kaybi
    G, kayip = sifir(kat), 0.0
    for i in idx:
        iz = ileri(kat, X[i])
        p = min(max(iz[-1][0], 1e-12), 1 - 1e-12)
        kayip -= Y[i] * math.log(p) + (1 - Y[i]) * math.log(1 - p)
        d = [p - Y[i]]
        for L in range(len(kat) - 1, -1, -1):
            W, a = kat[L], iz[L]
            for k, dk in enumerate(d):
                gk = G[L][k]
                for j, aj in enumerate(a):
                    gk[j] += dk * aj
                gk[-1] += dk
            if L:
                d = [sum(d[k] * W[k][j] for k in range(len(W))) * (a[j] > 0)
                     for j in range(len(a))]
    for W in G:
        for w in W:
            w[:] = [v / len(idx) for v in w]
    return G, kayip / len(idx)


def dogruluk(kat, X, Y):
    return sum((ileri(kat, x)[-1][0] > 0.5) == (y > 0.5) for x, y in zip(X, Y)) / len(X)


def sira(tur):                              # toplu bolme sirasi her kosumda AYNI
    r, s = uretec(TOHUM + 500 + tur), list(range(len(XE)))
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return s


KAT0 = ilklendir(TOHUM + 1, [(len(ALAN), 8), (8, 1)])
print(f"egitim {len(EGT)} (756'dan kucultuldu), dogrulama {len(DOG)}, "
      f"sinama {len(SIN)}, sutun {len(ALAN)}")
print(f"ag {len(ALAN)}-8-1, parametre {sum(len(w) for W in KAT0 for w in W)}, "
      f"tur 40, toplu 20, guncelleme {40 * len(XE) // 20}")
print(f"taban {TABAN:.4f}; karsilastirma cizgileri dogrusal model {DOGRUSAL:.4f}, "
      f"karar agaci {AGAC:.4f}; ilklendirilmis ag {dogruluk(KAT0, XS, YS):.4f}")
```

```
egitim 300 (756'dan kucultuldu), dogrulama 252, sinama 252, sutun 12
ag 12-8-1, parametre 113, tur 40, toplu 20, guncelleme 600
taban 0.7579; karsilastirma cizgileri dogrusal model 0.8016, karar agaci 0.7857; ilklendirilmis ag 0.3333
```

Son sayı çıkış noktasını veriyor: eğitilmemiş ağ sınama kümesinde 0,3333 tutturuyor, taban
çizgisinin çok altında. 113 parametrenin tamamı henüz gürültüdür ve 600 güncellemenin işi bu
sayıyı yukarı taşımaktır.

## Aynı Tur Bütçesinde Üç Eniyileyici

Üç kural tek bir işlevde durur. Yalın iniş eğimi doğrudan kullanır. Momentumlu iniş geçmiş
eğimleri biriktirir; yön tutarlıysa adım büyür, yön salınıyorsa adımlar birbirini götürür.
Uyarlamalı adım her ağırlık için ayrı bir karesel eğim birikimi tutar ve o ağırlığın adımını
birikimin köküne böler; sürekli büyük eğim gören ağırlık küçük, seyrek eğim gören ağırlık büyük
adımla ilerler.

```python
def uygula(kat, G, M, V, yontem, adim):     # tek bir guncelleme adimi
    for W, gW, mW, vW in zip(kat, G, M, V):
        for w, g, m, v in zip(W, gW, mW, vW):
            for j in range(len(w)):
                if yontem == "momentumlu":          # birikmis yon
                    m[j] = 0.9 * m[j] + g[j]
                    w[j] -= adim * m[j]
                elif yontem == "uyarlamali":        # karesel egim birikimi
                    v[j] = 0.9 * v[j] + 0.1 * g[j] * g[j]
                    w[j] -= adim * g[j] / (math.sqrt(v[j]) + 1e-8)
                else:                               # yalin inis
                    w[j] -= adim * g[j]


def egit(yontem, adim, tohum, tur=40, toplu=20):
    kat = ilklendir(tohum, [(len(ALAN), 8), (8, 1)])
    M, V, iz = sifir(kat), sifir(kat), []
    for t in range(tur):
        s, top = sira(t), 0.0
        for b in range(0, len(s), toplu):
            G, k = egim(kat, XE, YE, s[b:b + toplu])
            uygula(kat, G, M, V, yontem, adim)
            top += k * toplu
        iz.append(top / len(s))
    return kat, iz


def hedefe_tur(iz, esik=0.40):              # kayip esigin altina inen ilk tur
    for t, k in enumerate(iz):
        if k < esik:
            return str(t + 1)
    return "inmedi"


YONTEM = ("yalin", "momentumlu", "uyarlamali")
SONUC = {}
print(f"{'eniyileyici':>12} {'adim':>6} {'egitim kaybi':>13} {'hedefe tur':>11} "
      f"{'dogrulama':>10} {'sinama':>8}")
for y in YONTEM:
    for adim in (0.02, 0.05, 0.15):
        kat, iz = egit(y, adim, TOHUM + 1)
        SONUC[(y, adim)] = (iz[-1], dogruluk(kat, XD, YD), dogruluk(kat, XS, YS))
        print(f"{y:>12} {adim:>6} {iz[-1]:>13.4f} {hedefe_tur(iz):>11} "
              f"{SONUC[(y, adim)][1]:>10.4f} {SONUC[(y, adim)][2]:>8.4f}")
SECIM = {y: max((0.02, 0.05, 0.15), key=lambda a: SONUC[(y, a)][1]) for y in YONTEM}
enk = min(SONUC.values(), key=lambda t: t[0])
enb = max(SONUC.values(), key=lambda t: t[2])
print(f"\ndenenen aday {len(SONUC)}; dogrulamadan okunan adimlar "
      + ", ".join(f"{y} {SECIM[y]}" for y in YONTEM)
      + f"\nen dusuk kayip {enk[0]:.4f} (sinama {enk[2]:.4f}), "
      + f"en yuksek sinama {enb[2]:.4f} (kayip {enb[0]:.4f})")
```

```
 eniyileyici   adim  egitim kaybi  hedefe tur  dogrulama   sinama
       yalin   0.02        0.4042      inmedi     0.8135   0.7857
       yalin   0.05        0.3664          19     0.8056   0.7897
       yalin   0.15        0.3296           8     0.7817   0.7698
  momentumlu   0.02        0.3186           6     0.7976   0.7579
  momentumlu   0.05        0.2811           4     0.7817   0.7540
  momentumlu   0.15        0.2777           3     0.7817   0.7500
  uyarlamali   0.02        0.2948           4     0.7659   0.7341
  uyarlamali   0.05        0.2923           3     0.7500   0.7222
  uyarlamali   0.15        0.3038           8     0.7341   0.7460

denenen aday 9; dogrulamadan okunan adimlar yalin 0.02, momentumlu 0.02, uyarlamali 0.02
en dusuk kayip 0.2777 (sinama 0.7500), en yuksek sinama 0.7897 (kayip 0.3664)
```

Kayıp sütunu eniyileyicilerin işini yaptığını gösteriyor. Aynı 600 güncellemede momentumlu iniş
0,2777'ye, uyarlamalı adım 0,2923'e iniyor; yalın inişin en iyisi 0,3296'da kalıyor. Fark tur
cinsinden daha keskin: momentumlu iniş 0,40 eşiğini **üçüncü** turda geçiyor, yalın iniş en küçük
adımda kırk turda hiç geçemiyor.

Sınama sütunu bunun karşılığını vermiyor. En düşük kaybı üreten ayar sınamada **0,7500** veriyor;
en yüksek sınama sayısını, **0,7897**, kaybı yalnız 0,3664'e indiren yalın iniş üretiyor. İki
sütun ters yönde gidiyor, çünkü 300 satırda 113 parametre için kaybı daha aşağı çekmenin bir yolu
var: eğitim satırlarını ezberlemek. Momentumlu iniş ve uyarlamalı adım oraya daha çabuk varıyor.
**Eniyileyici kaybı düşürür, genellemeyi düşürmez.** Seçim bu yüzden doğrulama kümesinden okunuyor
ve üçünde de en küçük adım, 0,02, kazanıyor.

## Koşum Değişkenliği Yöntem Farkını Yutuyor

Yukarıdaki tablonun her satırı **tek bir koşumdur**. Aşağıdaki blok üç eniyileyiciyi doğrulamadan
okunan adımlarıyla dörder kez koşturuyor; veri, sıra, bütçe ve adım sabit, değişen yalnız
ilklendirme.

```python
print(f"{'eniyileyici':>12} {'kayip 4 kosum':>32} {'sinama 4 kosum':>32}")
OZ = {}
for y in YONTEM:
    ks = [egit(y, SECIM[y], TOHUM + t) for t in (1, 2, 3, 4)]
    OZ[y] = ([iz[-1] for _, iz in ks], [dogruluk(k, XS, YS) for k, _ in ks])
    print(f"{y:>12} " + " ".join(f"{v:>7.4f}" for v in OZ[y][0])
          + "  " + " ".join(f"{v:>7.4f}" for v in OZ[y][1]))
for y in YONTEM:
    s = OZ[y][1]
    print(f"{y:>12} sinama acikligi {max(s) - min(s):.4f} "
          f"({round((max(s) - min(s)) * len(SIN))} abone)")
en_iyi = max(YONTEM, key=lambda y: OZ[y][1][0])
print(f"\ntaban cizgisi {TABAN:.4f}, agin sayisi {OZ[en_iyi][1][0]:.4f} ({en_iyi}), "
      f"ayni agin ikinci kosumu {OZ[en_iyi][1][1]:.4f}")
print("kosum basina en iyi ile en kotu eniyileyici arasindaki fark: "
      + ", ".join(f"{max(OZ[y][1][t] for y in YONTEM) - min(OZ[y][1][t] for y in YONTEM):.4f}"
                  for t in range(4)))
print(f"karar agacini gecen kosum "
      f"{sum(v > AGAC + 1e-9 for _, s in OZ.values() for v in s)}/12, dogrusal modeli gecen "
      f"kosum {sum(v > DOGRUSAL + 1e-9 for _, s in OZ.values() for v in s)}/12")
```

```
 eniyileyici                    kayip 4 kosum                   sinama 4 kosum
       yalin  0.4042  0.3874  0.3980  0.3972   0.7857  0.7698  0.7897  0.7817
  momentumlu  0.3186  0.3373  0.3244  0.3177   0.7579  0.7659  0.7817  0.7738
  uyarlamali  0.2948  0.3064  0.2922  0.2976   0.7341  0.7619  0.7619  0.7659
       yalin sinama acikligi 0.0198 (5 abone)
  momentumlu sinama acikligi 0.0238 (6 abone)
  uyarlamali sinama acikligi 0.0317 (8 abone)

taban cizgisi 0.7579, agin sayisi 0.7857 (yalin), ayni agin ikinci kosumu 0.7698
kosum basina en iyi ile en kotu eniyileyici arasindaki fark: 0.0516, 0.0079, 0.0278, 0.0159
karar agacini gecen kosum 1/12, dogrusal modeli gecen kosum 0/12
```

Kayıp sütunları dar: her eniyileyici dört koşumda kendi bandında kalıyor ve üç bant birbirine
değmiyor. Eniyileyicinin kayıp üzerindeki etkisi bu ölçekte **kararlıdır**.

Sınama sütunları dar değil. Uyarlamalı adım 0,7341 ile 0,7659 arasında geziyor; bu 0,0317, yani
sekiz abone eder. Son satırdan bir öncesi dersin asıl bulgusudur: eniyileyiciler arasındaki fark
birinci koşumda 0,0516, ikinci koşumda **0,0079**. Aynı üç yöntem, aynı ayarlar, aynı veri —
yalnız ilklendirme değişti ve aradaki mesafe altı kattan fazla daraldı. Birinci koşuma bakıp
"yalın iniş uyarlamalı adımı 0,0516 geçiyor" demek ölçülmüş bir sonuç değildir.

Üçlü şu haldedir: taban çizgisi 0,7579, ağın sayısı 0,7857, aynı ağın ikinci koşumu 0,7698; fark
tabana göre 0,0278, yani yedi abone. Son satır kursun ikinci iddiasını veriyor: on iki koşumun
**yalnız biri** karar ağacının 0,7857'sini geçiyor, **hiçbiri** doğrusal modelin 0,8016'sını
geçmiyor. Bu tablo verisinde ağ iki basit aileyi geçmiyor ve bu gizlenmiyor.

## Özet

- Geri yayılım bir yön verir; adım kuralı ayrı bir karardır ve üç kural aynı 600 güncellemelik
  bütçede karşılaştırılır.
- Momentumlu iniş eğitim kaybını 0,2777'ye, uyarlamalı adım 0,2923'e indiriyor; yalın iniş
  0,3296'da kalıyor ve 0,40 eşiğine en küçük adımda hiç inemiyor.
- Sınama sütunu tersine dönüyor: en düşük kayıp 0,7500, en yüksek sınama sayısı 0,7897 veriyor.
  Eniyileyici kaybı düşürür, genellemeyi düşürmez.
- Yalnız ilklendirme değişen dört koşumda tek bir eniyileyicinin sınama açıklığı 0,0317, yani
  sekiz abonedir; eniyileyiciler arası fark ise koşuma göre 0,0516 ile 0,0079 arasında oynuyor.
- Üçlü: taban 0,7579, ağın sayısı 0,7857, ikinci koşum 0,7698. On iki koşumun biri karar ağacını
  geçiyor, hiçbiri doğrusal modeli geçmiyor.

## Sonraki Adım

Bu dersin ağı iki katmanlıydı ve eğim geri gelirken yalnız bir kez zincirlendi. Katman sayısı
arttığında soru temiz kalmıyor: eğim çıkıştan girişe doğru her katmanda bir çarpanla süzülür ve o
çarpanların çarpımı ya sıfıra iner ya da taşar. Sonraki ders bunu bir sayıya bağlar — ağ
derinleştikçe ilk katmanın gördüğü eğim büyüklüğü son katmanınkine göre kaç kat küçülüyor, hangi
ilklendirme kazancında tersine dönüp patlıyor, ve eğim kırpmayla öğrenme adımı çizelgesi bu iki
uçtan hangisini ne kadar düzeltiyor.
