Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Bölüm 3 · Klasik algoritmalar · Ders 16

Gradyan artırma

Küçük ağaçlar art arda, her biri öncekinin hatasını düzeltir

Veri. Bir kargo dronunu −10 °C ile 50 °C arasında 80 kez aynı görevle uçurduk ve batarya bitene kadar kaç dakika havada kaldığını ölçtük. Soğukta kimyasal tepkime yavaşlar, süre 30 dakikanın altına düşer; 30 °C’nin üstünde batarya koruması devreye girer, süre yine azalır. Görev planlayıcı, hava sıcaklığından uçuş süresini tahmin etmek istiyor.

80 uçuş: sıcaklık ve uçuş süresi80 uçuş · öğrenme oranı 0,10
1 / 61
gradyan_artirma.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(8)
  3. T = np.sort(rng.uniform(-10, 50, 80)) # ortam sıcaklığı, °C
  4. y = 62 - 30 * np.exp(-(T + 10) / 10) # soğukta düşüş
  5. y -= 0.04 * np.maximum(0, T - 30) ** 2 # sıcakta düşüş
  6. y += rng.normal(0, 1.5, 80) # uçuş süresi, dk
  7. val = np.arange(80) % 4 == 3 # her 4. uçuş doğrulama
  8. Tt, yt = T[~val], y[~val] # eğitim uçuşları
  9. def kutuk(r):
  10. best = (np.inf, 0, 0, 0)
  11. for t in (Tt[1:] + Tt[:-1]) / 2: # her eşik
  12. L = Tt <= t
  13. a, b = r[L].mean(), r[~L].mean() # iki yaprak: ortalama
  14. e = ((r - np.where(L, a, b)) ** 2).sum()
  15. if e < best[0]: best = (e, t, a, b)
  16. return best[1:]
  17. lr = 0.1 # öğrenme oranı
  18. F = np.full(80, yt.mean()) # başlangıç: ortalama
  19. mse = lambda m: float(((y - F)[m] ** 2).mean()) # MSE (maske)
  20. history = {'round': [0], 'loss': [mse(~val)],
  21. 'val_loss': [mse(val)]} # eğitim geçmişi
  22. for tur in range(100):
  23. r = yt - F[~val] # kalıntı (eğitim)
  24. t, a, b = kutuk(r) # kalıntıya kütük
  25. F += lr * np.where(T <= t, a, b) # küçültüp ekle
  26. row = tur + 1, mse(~val), mse(val)
  27. for k, v in zip(history, row): history[k].append(v)
  28. kayip = history['loss']
  29. print('kayıp', f'{kayip[0]:.1f} -> {kayip[-1]:.2f}')
  30. print('oran', kayip[-1] / kayip[0])
  31. vl = history['val_loss']; best = int(np.argmin(vl)) # erken durdurma
  32. res = (y - F)[val] # doğrulama artıkları
  33. r2 = 1 - (res ** 2).mean() / y[val].var() # doğrulamada R²
  34. for k, v in [('loss', kayip[-1]), ('val_loss', vl[-1]),
  35. ('val_r2', r2), ('best_round', best)]:
  36. print(f'{k:<11}{v:>9.3f}') # son ölçümler
  37. import csv
  38. with open('egitim_gecmisi.csv', 'w', newline='') as f:
  39. w = csv.writer(f); w.writerow(history) # satır başına bir tur
  40. w.writerows(zip(*history.values()))
  41. try:
  42. import matplotlib.pyplot as plt # varsa grafik
  43. for k in ('loss', 'val_loss'):
  44. plt.plot(history['round'], history[k], label=k)
  45. plt.yscale('log'); plt.legend(); plt.show()
  46. except ImportError:
  47. 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.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

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.

gradyan_artirma.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Başlangıç modeli düz bir çizgidir: bütün uçuşların ortalaması.
  2. Kalıntı = gerçek − tahmin. Kare hatanın gradyanı tam olarak budur; adı buradan gelir.
  3. Kalıntıya bir kütük uydurulur: tek eşik, iki yaprak, her yaprak kendi kalıntılarının ortalaması.
  4. Kütük öğrenme oranıyla küçültülüp modele eklenir; sonra yeni kalıntılar hesaplanır. Basamaklar üst üste binerek eğriyi çizer.
  5. Şunu dene: öğrenme oranını 1 yap. Model birkaç turda oturur ama gürültüyü de kovalar; 0,1 ile daha yavaş ve daha düzgün öğrenir.

Neden önemli

XGBoost, LightGBM ve CatBoost bu fikrin hızlı ve düzenlileştirilmiş hâlleridir; tablo verisinde Kaggle yarışmalarını yıllardır onlar kazanır. Robotik ve enerji sistemlerinde batarya ömrü, motor sıcaklığı ve arıza süresi tahmininde sık kullanılı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ç