Bölüm 1 · Temeller · Ders 4
Küçük bir sinir ağı
Gizli katman ve geri yayılım: doğrunun çizemediği sınır
Veri. Robot arenada 200 konumda durdu ve her seferinde pistte mi dışında mı olduğunu kaydetti. Pist kıvrımlı: iki iç içe hilal. Tek bir doğru (perceptron) bunu ayıramaz; gizli bir katman gerekir.
import numpy as npD = np.genfromtxt('pist-konum.csv', delimiter=',', names=True)X, y = np.c_[D['x'], D['y']], D['pistte'] # 200 konum, y = 1 pistterng, lr, H = np.random.default_rng(0), 0.5, 8 # H gizli nöronW1, b1 = rng.normal(size=(2, H)), np.zeros(H)W2, b2 = rng.normal(size=H), 0.0val = np.arange(len(X)) % 5 == 4 # her 5. konum doğrulamaya ayrılırhistory = {k: [] for k in ('step', 'loss', 'val_loss', 'acc', 'val_acc', 'grad_W1', 'grad_W2')} # eğitim geçmişifor step in range(3001):h = np.tanh(X @ W1 + b1) # gizli katmanp = 1 / (1 + np.exp(-(h @ W2 + b2))) # pistte olma olasılığıce = -(y * np.log(p) + (1 - y) * np.log(1 - p)); loss = ce[~val].mean() # çapraz entropi (eğitim)g = np.where(val, 0, p - y) / (~val).sum() # kaybın çıkışa göre türevigh = np.outer(g, W2) * (1 - h ** 2) # geri yayılım: gizli katmanagW2, gW1 = h.T @ g, X.T @ gh # katman gradyanlarıif step % 75 == 0: # her 75 adımda bir kaydetok = (p > 0.5) == y; [history[k].append(float(v)) for k, v in zip(history, (step, loss, ce[val].mean(), ok[~val].mean(), ok[val].mean(), np.linalg.norm(gW1), np.linalg.norm(gW2)))]W2 -= lr * gW2; b2 -= lr * g.sum()W1 -= lr * gW1; b1 -= lr * gh.sum(0)for k in ('loss', 'val_loss', 'acc', 'val_acc'): # son ölçümler tablosuprint(f'{k:<10}{history[k][-1]:>10.4f}')print('aşırı öğrenme farkı (val_loss - loss):', round(history['val_loss'][-1] - history['loss'][-1], 4))import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yazcsv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir kayıttry:import matplotlib.pyplot as plt # varsa grafik çizfig, (a, b) = plt.subplots(1, 2, figsize=(9, 3.5))for k in ('loss', 'val_loss'): a.plot(history['step'], history[k], label=k)for k in ('acc', 'val_acc'): b.plot(history['step'], history[k], label=k)a.legend(); b.legend(); a.set_xlabel('step'); b.set_xlabel('step'); plt.show()except ImportError:print('matplotlib yok: grafik atlandı')
Eğitim paneli
Eğitim çalıştırılıyor…
Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.
Veri seti
Tüm veri setleri →- Pistte mi? İki hilalVeri setini indir
- Sürücü sensör kayıtlarıalıştırmaVeri setini indir
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Gizli katmandaki her nöron girdinin bir doğrusal birleşimini tanh ile büker. Çıkış nöronu bu bükülmüş özellikleri birleştirip bir olasılık verir.
- Kayıp (çapraz entropi), yanlış ve emin tahminleri ağır cezalandırır.
- Geri yayılım, kaybın her ağırlığa göre türevini zincir kuralıyla çıkıştan girişe doğru hesaplar. Her ağırlık türevin tersine küçük bir adım atar.
- Sınır her adımda biraz daha kıvrılır. Gizli nöron sayısını 2’ye indir: sınır yeterince bükülemez.
- Şunu dene: veriyi 1 (XOR) yap. Dört nokta var; aynı girdiler 0, farklı girdiler 1 verir ve birler karşı köşelerde durur. Tek gizli nöronla ağ en fazla 3/4 doğru yapar. 2 nöron kâğıt üstünde yeter ama bu başlangıçla yerel bir çukura takılır ve 2/4’te kalır; 3 nöron 4/4’e ulaşır. Sonra veriyi 2 (daire) yap: 1 nöron daireyi çevreleyemez, 3 nöron üçgenle, 8 nöron neredeyse yuvarlak bir çitle çevreler.
Neden önemli
Bu, derin öğrenmenin en küçük hâlidir. Görüntüden nesne tanıyan ağlar da, robot kolunu yöneten politikalar da, dil modelleri de aynı üç şeyi yapar: ileri hesap, kayıp, geri yayılım. Fark yalnız katman ve ağırlık sayısındadır.
ESOF 323, 11. hafta: robotlarda derin öğrenme →