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

Bölüm 4 · Gören ve yazan modeller · Ders 22

Mini dil modeli: bir sonraki kelime

Robotun görev günlüğünden yazmayı öğrenen 29×29 puan tablosu

Veri. Ayıklama hattındaki robot, yaptığı her işi günlüğüne kısa bir cümleyle yazıyor: "robot şarj istasyonuna gitti ve bekledi ." gibi. Elimizde 16 cümle, 105 kelime var (nokta da kelime sayılır); farklı kelime sayısı 29. Model bu günlükten her kelimenin ardından hangi kelimenin geldiğini öğrenecek, sonra kendi günlük cümlelerini yazacak.

robotun görev günlüğü16 cümle · 105 kelime · 29 farklı
1 / 50
mini_dil_modeli.pypython
  1. import numpy as np
  2. story = '''robot kırmızı kutuyu aldı ve rafa koydu . robot
  3. mavi kutuyu aldı ve banda koydu . kol yeşil kutuyu banda
  4. bıraktı . robot şarj istasyonuna gitti ve bekledi . kamera
  5. mavi etiketi okudu . kol mavi kutuyu rafa bıraktı . robot
  6. engeli gördü ve yavaşça durdu . kamera kırmızı etiketi okudu
  7. ve bekledi . robot depoya gitti ve kutuyu aldı . kol kutuyu
  8. banda koydu ve durdu . robot şarj istasyonuna hızla döndü .
  9. kamera yeşil kutuyu gördü . robot kapıya gitti ve bekledi .
  10. kol kırmızı kutuyu depoya taşıdı . robot şarj istasyonuna
  11. gitti ve durdu . kamera engeli gördü ve robot durdu .'''
  12. w = story.split(); V = sorted(set(w)); n = len(V) # 29 farklı kelime
  13. ix = {s: i for i, s in enumerate(V)}; P = np.zeros((n, n)) # 29×29 puan, hepsi 0
  14. sm = lambda v: np.exp(v) / np.exp(v).sum() # softmax
  15. j = ' '.join(w).split(' .')[:-1] # 16 cümle
  16. ss, tr, va = [x.split() + ['.'] for x in j], ['.'], ['.']
  17. for i, x in enumerate(ss): [tr, va][i % 4 > 2].extend(x) # her 4. cümle doğrulama
  18. nll = lambda a, b: -np.log(sm(P[ix[a]])[ix[b]])
  19. ce = lambda q: np.mean([nll(*p) for p in zip(q, q[1:])]) # ortalama çapraz entropi
  20. history = {k: [] for k in ['tour', 'loss', 'val_loss',
  21. 'perplexity', 'val_perplexity']} # eğitim geçmişi
  22. for tour in range(500):
  23. for a, b in zip(tr, tr[1:]): # çift çift oku
  24. p = sm(P[ix[a]]); p[ix[b]] -= 1; P[ix[a]] -= .5 * p # hata → küçük adım
  25. lt, lv = ce(tr), ce(va) # eğitim / doğrulama kaybı
  26. r = [tour + 1, lt, lv, np.exp(lt), np.exp(lv)] # şaşkınlık = e^kayıp
  27. for k, v in zip(history, r): history[k].append(float(v))
  28. print(sm(P[ix['şarj']]).max().round(3)) # 'şarj' sonrası en olası
  29. rng, t = np.random.default_rng(7), ['.'] # cümle başından yaz
  30. for _ in range(24):
  31. q = sm(P[ix[t[-1]]]) # son kelimeden sonraki olasılıklar
  32. t.append(V[rng.choice(n, p=q)]) # ağırlıklı zar
  33. # t.append(V[q.argmax()]) # hep en olası: döngüye girer
  34. print(' '.join(t[1:]))
  35. for k in history: print(f'{k:<15}{history[k][-1]:>10.3f}') # son ölçümler
  36. import csv
  37. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir tur
  38. csv.writer(f).writerows([list(history),
  39. *zip(*history.values())])
  40. try:
  41. import matplotlib.pyplot as plt # varsa grafik çiz
  42. for k in ('loss', 'val_loss'):
  43. plt.plot(history['tour'], history[k], label=k)
  44. plt.xlabel('tour'); plt.legend(); plt.show()
  45. except ImportError:
  46. 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.

mini_dil_modeli.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Kelimeler sayıya dönüşür: her kelime, 29 farklı kelimelik alfabetik listedeki sırasını alır. Büyük dil modelleri de aynısını kelime parçalarıyla (token) yapar.
  2. Her kelime için olası her sonraki kelimeye bir puan tutulur: 29 × 29 = 841 puan, hepsi sıfırdan başlar. Softmax puanları olasılığa çevirir; başta her kelime eşit: %3,4.
  3. Model günlüğü çift çift okur: sonraki kelimeyi tahmin eder, hata yanlış kelimelere verdiği olasılıktır; küçük bir adım bu olasılığı gerçekten gelen kelimeye kaydırır.
  4. Yazarken son kelimenin olasılıklarıyla ağırlıklı bir zar atar, kazananı metne ekler ve oradan yeniden atar.
  5. Şunu dene: yazma modunu 1 (en olası) yap. Model hep aynı cümleyi tekrarlar. Tohumu değiştir: zar başka bir günlük yazar.

Neden önemli

ChatGPT gibi büyük dil modelleri de bir sonraki parçayı tahmin edip zar atarak yazar; fark, yalnız son kelimeye değil bütün konuşmaya bakmaları ve milyarlarca ağırlıkla çalışmalarıdır. Robotikte aynı fikir, sesli komutları ve görev planlarını adım adım üreten modellerde ve olay günlüklerinde "beklenmedik sıra" yakalamakta 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ç