İçeriğe geç

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

Yöntem
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.
Çıktı
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)

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.

Yöntem
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.
Çıktı
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.