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

Bölüm 8 · Büyük dil modellerinin parçaları · Ders 33

Kelime vektörleri

Birlikte geçen kelimeler, haritada yan yana düşer

Veri. Bir depo robotunun bakım kayıtlarından 20 kısa cümle aldık; içlerinde 19 farklı kelime var: algılayıcılar (LiDAR, kamera, sonar), hareket (motor, tekerlek, palet) ve enerji (batarya, şarj, hücre) ile bunların yanında geçen kelimeler. Kimse modele "LiDAR ile sonar benzer" demiyor. Yalnızca hangi kelimenin hangisinin yanında geçtiğini sayarak her kelimeye 19 sayılık bir vektör veriyoruz ve bunu 2B bir haritaya indiriyoruz.

bakım kayıtlarından 20 cümle20 cümle · 19 kelime · pencere 2
1 / 62
kelime_vektorleri.pypython
  1. import numpy as np
  2. T = [g.split() for g in ["lidar camera sonar", # konu başına 3 nesne
  3. "distance obstacle scan", "motor wheel track", # ve 3 bağlam kelimesi
  4. "speed turn torque", "battery charger cell",
  5. "voltage current power"]]
  6. S = [["robot", n, C[i], C[(i + 1) % 3]] # 18 cümle
  7. for N, C in zip(T[::2], T[1::2])
  8. for j, n in enumerate(N) for i in range(3) if i != j]
  9. S += [b.split() for b in ["robot motor current speed", # 2 köprü cümle
  10. "robot camera power scan"]]
  11. V = sorted({w for s in S for w in s}); win = 2 # 19 kelime · pencere
  12. ix = {w: i for i, w in enumerate(V)}; M = np.zeros((19, 19))
  13. for s in S: # eş-bulunma sayımı
  14. for a in range(4):
  15. for b in range(a + 1, min(a + win + 1, 4)):
  16. M[ix[s[a]], ix[s[b]]] += 1 # aradaki uzaklık ≤ pencere
  17. M = M + M.T; P = M / M.sum(); r = P.sum(1) # simetrik, olasılık
  18. X = np.log(P / np.outer(r, r) + 1e-12).clip(0) # PPMI
  19. U = X / np.linalg.norm(X, axis=1, keepdims=True) # birim vektörler
  20. u, s, _ = np.linalg.svd(U - U.mean(0)) # ortalamayı çıkar, SVD
  21. Y, cos = u[:, :2] * s[:2], U @ U.T # 2B konumlar, kosinüs
  22. a, b, c = ix["lidar"], ix["sonar"], ix["battery"]
  23. print(cos[a, b].round(2), cos[a, c].round(2), Y[a].round(2))
  24. ev = s ** 2 / (s ** 2).sum() # bileşen başına açıklanan varyans
  25. history = {"component": list(range(1, 20)), # değerlendirme geçmişi
  26. "explained": list(ev), "cumulative": list(ev.cumsum())}
  27. top = {w: i // 2 for i, g in enumerate(T) for w in g} # kelimenin konusu
  28. tw = [ix[w] for w in V if w in top]
  29. same = [cos[i, j] for i in tw for j in tw if i < j and top[V[i]] == top[V[j]]]
  30. other = [cos[i, j] for i in tw for j in tw if i < j and top[V[i]] != top[V[j]]]
  31. for k, v in [("kept_2d", ev[:2].sum()), ("cos_same", np.mean(same)), # son ölçümler
  32. ("cos_other", np.mean(other))]: print(f"{k:<10}{v:>8.3f}")
  33. import csv
  34. with open("egitim_gecmisi.csv", "w", newline="") as f: # satır başına bir bileşen
  35. csv.writer(f).writerows([list(history), *zip(*history.values())])
  36. try:
  37. import matplotlib.pyplot as plt # varsa grafik çiz
  38. plt.bar(history["component"], history["explained"])
  39. plt.plot(history["component"], history["cumulative"], "o-")
  40. plt.xlabel("component"); plt.show()
  41. except ImportError:
  42. 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.

kelime_vektorleri.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Eş-bulunma: her cümlede, aralarında en fazla "pencere" kadar kelime olan her çift için matristeki iki hücre 1 artar.
  2. PPMI: "robot" her cümlede geçtiği için her şeyle sık görünür. Sayıyı, iki kelime bağımsız olsaydı beklenecek sayıya böleriz ve logaritmasını alırız; beklenenden seyrekse 0 yazarız.
  3. Her satır bir kelime vektörüdür. İki vektör arasındaki açının kosinüsü benzerliği verir: 1 aynı yön, 0 ilgisiz.
  4. 19 boyutu görebilmek için ortalamayı çıkarıp en çok değişen iki yönü güç (altuzay) yöntemiyle buluruz: bir vektörü matrisle tekrar tekrar çarpınca en büyük yöne döner.
  5. Şunu dene: pencereyi 1 yap. Kelime yalnız hemen yanındakini görür; kümeler gevşer ve LiDAR–sonar benzerliği düşer.

Neden önemli

Dil modelleri her kelimeyi (aslında her parçayı) böyle bir vektöre çevirerek başlar; bugün bu vektörler sayımla değil eğitimle öğrenilir ama fikir aynıdır: "bir kelimeyi yanındakilerden tanırsın". Robotikte sesli komutları, arıza raporlarını ve kılavuzları anlamada, benzer kayıtları bulmada aynı vektörler 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ç