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

Bölüm 5 · Deneyerek öğrenen ve öneren sistemler · Ders 25

Öneri sistemi: hangi robot projesi sana uygun?

Matris ayrıştırma: öğrencilere ve projelere gizli sayılar

Veri. Bir robotik atölye platformunda 300 öğrenci ve 60 robot projesi var (çizgi izleyen, robot kol, drone, sumo…). Her öğrencinin gizli bir zevki, her projenin gizli bir tarzı var; her öğrenci yalnızca 12 projeyi denemiş. Algoritmanın gördüğü tek şey: kim hangi denediği projeyi beğendi. 3000 deneme eğitime gider, 600'ü saklanır; başarı bu gizli beğenilerde ölçülür.

3600 deneme: 300 öğrenci × 12 projerenk: projenin gizli tarzı (model görmez)
1 / 66
oneri.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(15)
  3. taste = rng.normal(0, 1, (300, 2)) # gizli öğrenci zevki
  4. style = rng.normal(0, 1, (60, 2)) # gizli proje tarzı
  5. sig = lambda z: 1 / (1 + np.exp(-z))
  6. tried = [(u, v) for u in range(300) # herkes 12 proje dener
  7. for v in rng.choice(60, 12, replace=False)]
  8. like = {(u, v): rng.random() < sig(5 * taste[u] @ style[v])
  9. for u, v in tried}
  10. rng.shuffle(tried)
  11. train, test = tried[:3000], tried[3000:] # 600 gizli beğeni
  12. k, lr = 2, 0.1 # gizli boyut, adım
  13. U = rng.normal(0, .1, (300, k)) # öğrenci okları
  14. V = rng.normal(0, .1, (60, k)) # proje okları
  15. def scores(pairs): # çiftlerde olasılık ve gerçek
  16. u, v = np.array(pairs).T
  17. y = np.array([like[q] for q in pairs], float)
  18. return sig((U[u] * V[v]).sum(1)), y
  19. def olc(pairs): # kayıp ve doğruluk
  20. p, y = scores(pairs)
  21. ll = -(y * np.log(p) + (1 - y) * np.log(1 - p)).mean()
  22. return ll, ((p > .5) == y).mean()
  23. history = {c: [] for c in ['epoch', 'loss', 'acc',
  24. 'val_loss', 'val_acc']} # eğitim geçmişi
  25. for epoch in range(1, 101):
  26. for u, v in train:
  27. err = sig(U[u] @ V[v]) - like[(u, v)] # olasılık − gerçek
  28. U[u], V[v] = (U[u] - lr * (err * V[v] + .01 * U[u]), # iki oku it
  29. V[v] - lr * (err * U[u] + .01 * V[v]))
  30. r = [epoch, *olc(train), *olc(test)] # eğitim ve gizli beğeniler
  31. for c, v in zip(history, r): history[c].append(float(v))
  32. if epoch in (1, 25, 100):
  33. ok = [(sig(U[u] @ V[v]) > .5) == like[(u, v)]
  34. for u, v in test]
  35. print(epoch, f"{np.mean(ok):.1%}") # gizli beğenilerde doğru
  36. for c in history: print(f'{c:<10}{history[c][-1]:>10.4f}') # son ölçümler
  37. import csv
  38. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir tur
  39. csv.writer(f).writerows([list(history), *zip(*history.values())])
  40. try:
  41. import matplotlib.pyplot as plt # varsa grafik çiz
  42. for c in ('acc', 'val_acc'): plt.plot(history['epoch'], history[c], label=c)
  43. plt.xlabel('epoch'); plt.legend(); plt.show()
  44. except ImportError:
  45. 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.

oneri.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Her öğrenciye ve her projeye k sayı verilir (k = 2 ise haritada birer ok). Başta hepsi sıfıra yakın rastgele.
  2. Denenen her çift için iki okun iç çarpımı sigmoid ile beğeni olasılığına döner.
  3. Olasılık gerçekle karşılaştırılır ve iki ok da hata kadar itilir: gradyan inişi. Bütün yöntemin adı matris ayrıştırma.
  4. Öneri: her öğrenciye denemediği projelerden en güçlü eşleşen 3 tanesi.
  5. Şunu dene: gizli boyutu 1 yap; harita çizgiye iner ve doğruluk düşer. Turları azalt: eğri mümkün en iyiye yaklaşamaz.

Neden önemli

Video, müzik ve alışveriş akışlarının çekirdeği budur; gerçek sistemler kişi ve içerik başına yüzlerce sayı ve izleme süresi gibi ek sinyaller kullanır. Robotikte aynı fikir, bir robot filosunda hangi görevin hangi robota uyduğunu ya da bir öğrenciye sıradaki dersi önermeyi öğrenebilir.

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ç