Kitaplar / Yöntem ile Programlamaya Giriş / Bölüm 12 — Tensörler ve otomatik türev
Bölüm 12 — Tensörler ve otomatik türev
Modern yapay zekânın temelinde iki fikir vardır: verileri sayı tabloları (tensörler) olarak işlemek ve bir hatayı azaltmak için ayarları hangi yöne değiştireceğimizi gösteren türevi hesaplamak. Yöntem’in YZ birimi ikisini de dilin içine yerleştirir.
Tensörlerle işlem
program Tensörler
kullan YZ
değişken
A, B, v: tensör
başla
A := Tensör([[1, 2], [3, 4]])
B := Tensör([[0, 1], [1, 0]])
v := Tensör([10, 20])
yaz('A =', 1); yaz(A, 1)
yaz('Şekil : ' + A.Şekil, 1)
yaz('A + v : ' + (A + v), 1) // yayınlama: v her satıra eklenir
yaz('A * 2 : ' + (A * 2), 1)
yaz('A @ B : ' + (A @ B), 1) // matris çarpımı
yaz('A.T : ' + A.T, 1) // devrik
yaz('Toplam : ' + A.Toplam.Değer, 1)
yaz('Satır topl. : ' + A.Toplam(1), 1)
yaz('A[1, 0] : ' + A[1, 0], 1)
yaz('Sigmoid(0) : ' + Sigmoid(Tensör(0.0)), 1)
bitir.A =
tensör([[1, 2],
[3, 4]])
Şekil : [2, 2]
A + v : tensör([[11, 22],
[13, 24]])
A * 2 : tensör([[2, 4],
[6, 8]])
A @ B : tensör([[2, 1],
[4, 3]])
A.T : tensör([[1, 3],
[2, 4]])
Toplam : 10.0
Satır topl. : tensör([3, 7])
A[1, 0] : 3.0
Sigmoid(0) : tensör(0.5)*öğe öğe çarpar;@matris çarpımı yapar.- Yayınlama: Şekilleri farklı tensörler uyumluysa küçüğü genişletilir.
A + v’de[10, 20]her satıra eklendi. Toplam,Ortalamabütün tensör için ya da bir eksen boyunca (0sütunlar,1satırlar) çalışır. Tek değerli bir tensörü sayıya çevirmek için.Değerkullanılır.
Otomatik türev ve gradyan inişi
Bir tensörü Tensör(değer, doğru) ile oluşturursanız, Yöntem onunla yapılan her işlemi kaydeder. Sonuç üzerinde GeriYay çağırınca tüm türevler zincir kuralıyla hesaplanır.
program OtomatikTürev
kullan YZ
değişken
x, y: tensör
w: tensör
i: tamsayı
f: herhangi
başla
// 1) Elle: y = x² + 3x, x = 2 noktasında dy/dx = 2x + 3 = 7
x := Tensör(2.0, doğru) // doğru: gradyanı izle
y := x * x + 3 * x
y.GeriYay // gradyanları hesapla
yaz('y = ' + y.Değer + ', dy/dx = ' + x.Grad.Değer, 1)
// 2) Türev fonksiyonuyla: herhangi bir Yöntem fonksiyonunun türevi
f := fonksiyon(t) => t ** 3 - 2 * t
yaz('f''(1.5) = ' + Türev(f, 1.5), 1) // 3t² - 2 = 4.75
// 3) Gradyan inişi: g(w) = (w - 5)² fonksiyonunun en küçük noktasını bul
w := Tensör(0.0, doğru)
1'den 50'ye kadar her i için
başla
y := (w - 5) ** 2
w.SıfırlaGrad
y.GeriYay
w := (w - 0.1 * w.Grad).Ayır // gradyanın tersi yönünde küçük bir adım
w.GradGerekli := doğru
eğer i mod 10 = 0 ise
yaz(Biçimle(' adım {:2}: w = {:.4}', i, w.Değer), 1)
bitir
bitir.y = 10.0, dy/dx = 7.0
f'(1.5) = 4.75
adım 10: w = 4.4631
adım 20: w = 4.9424
adım 30: w = 4.9938
adım 40: w = 4.9993
adım 50: w = 4.9999Üçüncü parça, makine öğreniminin kalbindeki gradyan inişidir. Türev, fonksiyonun hangi yönde arttığını gösterir; biz ters yönde küçük adımlar atarız. w her adımda en küçük noktaya, 5’e yaklaşır. Bir sinir ağını eğitmek de tam olarak budur; yalnızca binlerce w vardır.
.Ayırgüncellenen değeri eski hesaplama grafiğinden koparan yeni bir tensör üretir.SıfırlaGradönceki adımın gradyanını temizler; yoksa gradyanlar birikir.