İçeriğe geç

Kitaplar / Yöntem ile Programlamaya Giriş / Bölüm 13 — Sinir ağları

Bölüm 13 — Sinir ağları

Bir sinir ağı, katmanların art arda dizilmesiyle oluşur. Her Yoğun katman girdisini bir ağırlık matrisiyle çarpar, bir sapma ekler ve sonucu bir etkinleştirme fonksiyonundan (relu, tanh, sigmoid) geçirir. Eğitim, bu ağırlıkları gradyan inişiyle ayarlamaktır.

İlk sinir ağı: XOR

Yöntem
program SinirAğı
kullan YZ
değişken
  X, Y, tahmin: tensör
  model, opt: herhangi
  geçmiş: liste
başla
  Tohum(42)
  // XOR: girdiler aynıysa 0, farklıysa 1. Tek bir doğruyla ayrılamaz.
  X := Tensör([[0, 0], [0, 1], [1, 0], [1, 1]])
  Y := Tensör([[0], [1], [1], [0]])

  model := Ardışık([Yoğun(2, 8, 'tanh'),       // 2 girdi -> 8 gizli nöron
                    Yoğun(8, 1, 'sigmoid')])  // 8 -> 1 çıktı (0..1 olasılık)
  opt := Adam(model.Parametreler, 0.05)
  yaz('Parametre sayısı: ' + model.ParametreSayısı, 1)

  geçmiş := Eğit(model, X, Y, 'ikiliÇaprazEntropi', opt, 300, 100)

  tahmin := model.Tahmin(X)
  yaz('Tahminler:', 1)
  yaz(tahmin, 1)
  yaz('Doğruluk : %' + Doğruluk(tahmin, [0, 1, 1, 0]) * 100, 1)
bitir.
Çıktı
Parametre sayısı: 33
  Epok     1/300   kayıp = 0.704415
  Epok   100/300   kayıp = 0.001678
  Epok   200/300   kayıp = 0.000737
  Epok   300/300   kayıp = 0.000424
Tahminler:
tensör([[0.0002],
        [0.9997],
        [0.9993],
        [0.0005]])
Doğruluk : %100.0
Parça Görevi
Ardışık([...]) Katmanları sırayla birbirine bağlayan model
Yoğun(g, ç, etkinleştirme) g girdi alan, ç çıktı veren tam bağlantılı katman
Adam(parametreler, oran) Ağırlıkları güncelleyen optimizasyon algoritması. Basit olanı: SGD
Eğit(model, X, Y, kayıp, opt, epok, rapor) Hazır eğitim döngüsü; kayıp geçmişini döndürür
Kayıp fonksiyonları OKH (sayı tahmini), İkiliÇaprazEntropi (evet/hayır), ÇaprazEntropi (çok sınıf)
Tahmin(X) Eğitimden sonra modeli kullanır

Kayıp modelin ne kadar yanıldığını ölçer. 0.70’ten 0.0004’e düşmesi, ağın XOR kuralını öğrendiğini gösterir. Tohum(42) başlangıç ağırlıklarını sabitler; böylece sonuçlar her çalıştırmada aynı çıkar.

Kendi eğitim döngünüz: üç sınıflı sınıflandırma

Eğit kolaydır ama ne olduğunu görmek için döngüyü bir kez elle yazmak öğreticidir. Aşağıdaki program üç nokta bulutu üretir ve hangi noktanın hangi buluta ait olduğunu öğrenir.

Yöntem
program ÜçSınıf
kullan YZ, Matematik
değişken
  noktalar: liste
  etiketler: liste
  i, s: tamsayı
  X: tensör
  model, opt: herhangi
  kayıp: tensör
  epok: tamsayı
  merkezler: liste
başla
  Tohum(1)
  merkezler := [[0, 0], [3, 0], [1.5, 3]]
  noktalar := [];  etiketler := []
  0'dan 2'ye kadar her s için
    1'den 30'a kadar her i için
    başla
      noktalar.Ekle([merkezler[s][0] + Normal(0, 0.6), merkezler[s][1] + Normal(0, 0.6)])
      etiketler.Ekle(s)
    bitir
  X := Tensör(noktalar)

  model := Ardışık([Yoğun(2, 16, 'relu'), Yoğun(16, 3)])
  opt := Adam(model.Parametreler, 0.03)
  1'den 150'ye kadar her epok için
  başla
    opt.SıfırlaGrad                                      // 1. eski gradyanları sil
    kayıp := ÇaprazEntropi(model.İleri(X), etiketler)   // 2. ileri geçiş + kayıp
    kayıp.GeriYay                                        // 3. gradyanları hesapla
    opt.Adım                                             // 4. ağırlıkları güncelle
    eğer epok mod 50 = 0 ise
      yaz(Biçimle('epok {:3}  kayıp {:.4}  doğruluk %{:.1}', epok, kayıp.Değer,
                  Doğruluk(model.Tahmin(X), etiketler) * 100), 1)
  bitir
  yaz('Yeni nokta [2.8, 0.2] sınıfı: ' + ArgMaks(model.Tahmin([[2.8, 0.2]]))[0], 1)
  yaz('Yeni nokta [1.4, 2.7] sınıfı: ' + ArgMaks(model.Tahmin([[1.4, 2.7]]))[0], 1)
bitir.
Çıktı
epok  50  kayıp 0.0225  doğruluk %100.0
epok 100  kayıp 0.0137  doğruluk %100.0
epok 150  kayıp 0.0109  doğruluk %100.0
Yeni nokta [2.8, 0.2] sınıfı: 1
Yeni nokta [1.4, 2.7] sınıfı: 2

Her sinir ağı eğitimi bu dört adımı tekrarlar: sıfırla → ileri geç ve kaybı hesapla → geri yay → güncelle. Son katmanda etkinleştirme olmaması bilinçlidir: ÇaprazEntropi ham puanları kendisi olasılığa çevirir. ArgMaks en yüksek puanlı sınıfın numarasını verir. (3, 0) civarındaki nokta 1. buluta, (1.5, 3) civarındaki 2. buluta atandı.

Kendi katmanınızı yazmak: İleri ve Parametreler metodları olan her Yöntem sınıfı Ardışık modele katman olarak eklenebilir. Örneği Yöntem klasöründeki ornekler/xor_sinir_agi.y dosyasında bulabilirsiniz.