Theano - Önemsiz Eğitim Örneği
Theano, optimuma ulaşmak için maliyeti ve gradyanları tekrar tekrar hesaplamamız gereken sinir ağlarının eğitiminde oldukça kullanışlıdır. Büyük veri kümelerinde bu, hesaplama açısından yoğun hale gelir. Theano, daha önce gördüğümüz hesaplama grafiğinin dahili optimizasyonları sayesinde bunu verimli bir şekilde yapıyor.
Sorun bildirimi
Şimdi bir ağı eğitmek için Theano kütüphanesini nasıl kullanacağımızı öğreneceğiz. Dört özellikli bir veri kümesiyle başladığımız basit bir durumu ele alacağız. Her özelliğe belirli bir ağırlık (önem) uyguladıktan sonra bu özelliklerin toplamını hesaplarız.
Eğitimin amacı, her özelliğe atanan ağırlıkları, toplamın 100 hedef değerine ulaşması için değiştirmektir.
sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4
Nerede f1, f2, ... özellik değerleridir ve w1, w2, ... ağırlıklardır.
Problem ifadesinin daha iyi anlaşılması için örneği nicelleştirmeme izin verin. Her özellik için başlangıç değerinin 1.0 olduğunu varsayacağız ve w1 eşittir alacağız0.1, w2 eşittir 0.25, w3 eşittir 0.15, ve w4 eşittir 0.3. Ağırlık değerlerini belirlemede kesin bir mantık yoktur, bu sadece bizim sezgimizdir. Bu nedenle, ilk toplam aşağıdaki gibidir -
sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3
Hangi toplamı 0.8. Şimdi, bu toplam 100'e yaklaşacak şekilde ağırlık atamasını değiştirmeye devam edeceğiz.0.8 istediğimiz hedef değer olan 100'den çok uzaktır. Makine Öğrenimi terimlerinde, costhedef değer eksi mevcut çıktı değeri arasındaki fark olarak, tipik olarak hatayı patlatmak için karesi alınır. Degradeleri hesaplayarak ve ağırlık vektörümüzü güncelleyerek her yinelemede bu maliyeti düşürüyoruz.
Theano'da tüm bu mantığın nasıl uygulandığını görelim.
Değişkenleri Bildirmek
İlk olarak x girdi vektörümüzü şu şekilde beyan ederiz -
x = tensor.fvector('x')
Nerede x tek boyutlu bir float değerleri dizisidir.
Bir skaler tanımlıyoruz target değişken aşağıda verildiği gibi -
target = tensor.fscalar('target')
Ardından, bir ağırlık tensörü oluşturuyoruz W yukarıda tartışıldığı gibi başlangıç değerleri ile -
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
Theano İfadesini Tanımlamak
Şimdi aşağıdaki ifadeyi kullanarak çıktıyı hesaplıyoruz -
y = (x * W).sum()
Yukarıdaki açıklamada şunu unutmayın: x ve Wvektörlerdir ve basit skaler değişkenler değildir. Şimdi hatayı (maliyet) aşağıdaki ifade ile hesaplıyoruz -
cost = tensor.sqr(target - y)
Maliyet, hedef değer ile mevcut çıktının karesi arasındaki farktır.
Bize hedeften ne kadar uzakta olduğumuzu söyleyen gradyanı hesaplamak için yerleşik grad yöntem aşağıdaki gibidir -
gradients = tensor.grad(cost, [W])
Şimdi güncelliyoruz weights öğrenme oranını alarak vektör 0.1 aşağıdaki gibi -
W_updated = W - (0.1 * gradients[0])
Ardından, yukarıdaki değerleri kullanarak ağırlık vektörümüzü güncellememiz gerekiyor. Bunu aşağıdaki açıklamada yapıyoruz -
updates = [(W, W_updated)]
Theano Fonksiyonunu Tanımlama / Çağırma
Son olarak, bir tanımlıyoruz function Theano'da toplamı hesaplamak için.
f = function([x, target], y, updates=updates)
Yukarıdaki işlevi belirli bir sayıda çağırmak için bir for aşağıdaki gibi döngü -
for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)
Daha önce de belirtildiği gibi, fonksiyonun girdisi dört özelliğin ilk değerlerini içeren bir vektördür - değerini atarız 1.0özel bir neden olmaksızın her özelliğe. Seçiminize göre farklı değerler atayabilir ve işlevin nihayetinde yakınsayıp yakınsamadığını kontrol edebilirsiniz. Her yinelemede ağırlık vektörünün değerlerini ve karşılık gelen çıktıyı yazdıracağız. Aşağıdaki kodda gösterilmiştir -
print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)
Tam Program Listesi
Tam program listesi, hızlı başvuru için burada yeniden oluşturulmuştur -
from theano import *
import numpy
x = tensor.fvector('x')
target = tensor.fscalar('target')
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Weights: ", W.get_value())
y = (x * W).sum()
cost = tensor.sqr(target - y)
gradients = tensor.grad(cost, [W])
W_updated = W - (0.1 * gradients[0])
updates = [(W, W_updated)]
f = function([x, target], y, updates=updates)
for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)
print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)
Programı çalıştırdığınızda aşağıdaki çıktıyı göreceksiniz -
Weights: [0.1 0.25 0.15 0.3 ]
iteration: 0
Modified Weights: [19.94 20.09 19.99 20.14]
Output: 0.8
iteration: 1
Modified Weights: [23.908 24.058 23.958 24.108]
Output: 80.16000000000001
iteration: 2
Modified Weights: [24.7016 24.8516 24.7516 24.9016]
Output: 96.03200000000001
iteration: 3
Modified Weights: [24.86032 25.01032 24.91032 25.06032]
Output: 99.2064
iteration: 4
Modified Weights: [24.892064 25.042064 24.942064 25.092064]
Output: 99.84128
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Output: 99.968256
iteration: 6
Modified Weights: [24.89968256 25.04968256 24.94968256 25.09968256]
Output: 99.9936512
iteration: 7
Modified Weights: [24.89993651 25.04993651 24.94993651 25.09993651]
Output: 99.99873024
iteration: 8
Modified Weights: [24.8999873 25.0499873 24.9499873 25.0999873]
Output: 99.99974604799999
iteration: 9
Modified Weights: [24.89999746 25.04999746 24.94999746 25.09999746]
Output: 99.99994920960002
Dört yinelemeden sonra çıktının 99.96 ve beş yinelemeden sonra 99.99, istediğimiz hedefe yakın olan 100.0.
İstenen doğruluğa bağlı olarak, ağın 4 ila 5 iterasyonda eğitildiği sonucuna güvenle varabilirsiniz. Eğitim tamamlandıktan sonra, 5 yinelemeden sonra aşağıdaki değerleri alan ağırlık vektörüne bakın -
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Artık bu değerleri, modeli dağıtmak için ağınızda kullanabilirsiniz.