Okullar için Robotik ve Mühendislik · anaokulundan liseye

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.

200 konum: pistte / dışında2 → 8 → 1 nöron
1 / 49
sinir_agi.pypython
  1. import numpy as np
  2. D = np.genfromtxt('pist-konum.csv', delimiter=',', names=True)
  3. X, y = np.c_[D['x'], D['y']], D['pistte'] # 200 konum, y = 1 pistte
  4. rng, lr, H = np.random.default_rng(0), 0.5, 8 # H gizli nöron
  5. W1, b1 = rng.normal(size=(2, H)), np.zeros(H)
  6. W2, b2 = rng.normal(size=H), 0.0
  7. val = np.arange(len(X)) % 5 == 4 # her 5. konum doğrulamaya ayrılır
  8. history = {k: [] for k in ('step', 'loss', 'val_loss', 'acc', 'val_acc', 'grad_W1', 'grad_W2')} # eğitim geçmişi
  9. for step in range(3001):
  10. h = np.tanh(X @ W1 + b1) # gizli katman
  11. p = 1 / (1 + np.exp(-(h @ W2 + b2))) # pistte olma olasılığı
  12. ce = -(y * np.log(p) + (1 - y) * np.log(1 - p)); loss = ce[~val].mean() # çapraz entropi (eğitim)
  13. g = np.where(val, 0, p - y) / (~val).sum() # kaybın çıkışa göre türevi
  14. gh = np.outer(g, W2) * (1 - h ** 2) # geri yayılım: gizli katmana
  15. gW2, gW1 = h.T @ g, X.T @ gh # katman gradyanları
  16. if step % 75 == 0: # her 75 adımda bir kaydet
  17. ok = (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)))]
  18. W2 -= lr * gW2; b2 -= lr * g.sum()
  19. W1 -= lr * gW1; b1 -= lr * gh.sum(0)
  20. for k in ('loss', 'val_loss', 'acc', 'val_acc'): # son ölçümler tablosu
  21. print(f'{k:<10}{history[k][-1]:>10.4f}')
  22. print('aşırı öğrenme farkı (val_loss - loss):', round(history['val_loss'][-1] - history['loss'][-1], 4))
  23. import csv
  24. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  25. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir kayıt
  26. try:
  27. import matplotlib.pyplot as plt # varsa grafik çiz
  28. fig, (a, b) = plt.subplots(1, 2, figsize=(9, 3.5))
  29. for k in ('loss', 'val_loss'): a.plot(history['step'], history[k], label=k)
  30. for k in ('acc', 'val_acc'): b.plot(history['step'], history[k], label=k)
  31. a.legend(); b.legend(); a.set_xlabel('step'); b.set_xlabel('step'); plt.show()
  32. except ImportError:
  33. 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.

  • Pistte mi? İki hilalpist-konum.csv · 200 satır · 3 sütun
    Veri setini indir
  • Sürücü sensör kayıtlarıalıştırmasurucu-kayitlari.csv · 400 satır · 8 sütun
    Veri 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.

sinir_agi.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. 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.
  2. Kayıp (çapraz entropi), yanlış ve emin tahminleri ağır cezalandırır.
  3. 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.
  4. 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.
  5. Ş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 →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç