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.
import numpy as nprng = np.random.default_rng(15)taste = rng.normal(0, 1, (300, 2)) # gizli öğrenci zevkistyle = rng.normal(0, 1, (60, 2)) # gizli proje tarzısig = lambda z: 1 / (1 + np.exp(-z))tried = [(u, v) for u in range(300) # herkes 12 proje denerfor v in rng.choice(60, 12, replace=False)]like = {(u, v): rng.random() < sig(5 * taste[u] @ style[v])for u, v in tried}rng.shuffle(tried)train, test = tried[:3000], tried[3000:] # 600 gizli beğenik, lr = 2, 0.1 # gizli boyut, adımU = rng.normal(0, .1, (300, k)) # öğrenci oklarıV = rng.normal(0, .1, (60, k)) # proje oklarıdef scores(pairs): # çiftlerde olasılık ve gerçeku, v = np.array(pairs).Ty = np.array([like[q] for q in pairs], float)return sig((U[u] * V[v]).sum(1)), ydef olc(pairs): # kayıp ve doğrulukp, y = scores(pairs)ll = -(y * np.log(p) + (1 - y) * np.log(1 - p)).mean()return ll, ((p > .5) == y).mean()history = {c: [] for c in ['epoch', 'loss', 'acc','val_loss', 'val_acc']} # eğitim geçmişifor epoch in range(1, 101):for u, v in train:err = sig(U[u] @ V[v]) - like[(u, v)] # olasılık − gerçekU[u], V[v] = (U[u] - lr * (err * V[v] + .01 * U[u]), # iki oku itV[v] - lr * (err * U[u] + .01 * V[v]))r = [epoch, *olc(train), *olc(test)] # eğitim ve gizli beğenilerfor c, v in zip(history, r): history[c].append(float(v))if epoch in (1, 25, 100):ok = [(sig(U[u] @ V[v]) > .5) == like[(u, v)]for u, v in test]print(epoch, f"{np.mean(ok):.1%}") # gizli beğenilerde doğrufor c in history: print(f'{c:<10}{history[c][-1]:>10.4f}') # son ölçümlerimport csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir turcsv.writer(f).writerows([list(history), *zip(*history.values())])try:import matplotlib.pyplot as plt # varsa grafik çizfor c in ('acc', 'val_acc'): plt.plot(history['epoch'], history[c], label=c)plt.xlabel('epoch'); plt.legend(); 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 →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.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Her öğrenciye ve her projeye k sayı verilir (k = 2 ise haritada birer ok). Başta hepsi sıfıra yakın rastgele.
- Denenen her çift için iki okun iç çarpımı sigmoid ile beğeni olasılığına döner.
- 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.
- Öneri: her öğrenciye denemediği projelerden en güçlü eşleşen 3 tanesi.
- Ş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 →