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
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.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.
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.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ı: 2Her 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.