Apache MXNet - Python Paketleri
Bu bölümde Apache MXNet'te bulunan Python Paketlerini öğreneceğiz.
Önemli MXNet Python paketleri
MXNet, tek tek tartışacağımız aşağıdaki önemli Python paketlerine sahiptir -
Autograd (Otomatik Farklılaşma)
NDArray
KVStore
Gluon
Visualization
Önce şununla başlayalım: Autograd Apache MXNet için Python paketi.
Otomatik sınıflandırma
Autograd duruyor automatic differentiationgradyanları kayıp metriğinden her bir parametreye geri yaymak için kullanılır. Geri yayılımın yanı sıra, gradyanları verimli bir şekilde hesaplamak için dinamik bir programlama yaklaşımı kullanır. Aynı zamanda ters mod otomatik farklılaştırma olarak da adlandırılır. Bu teknik, birçok parametrenin tek bir kayıp ölçüsünü etkilediği 'fan girişi' durumlarında çok etkilidir.
Gradyan nedir?
Gradyanlar, sinir ağı eğitim sürecinin temelleridir. Temel olarak, performansını iyileştirmek için ağın parametrelerini nasıl değiştireceğimizi anlatırlar.
Sinir ağlarının (NN) toplamlar, çarpımlar, evrişimler gibi operatörlerden oluştuğunu bildiğimiz gibi. Bu operatörler hesaplamaları için evrişim çekirdeklerindeki ağırlıklar gibi parametreleri kullanırlar. Bu parametreler için en uygun değerleri bulmalıyız ve gradyanlar bize yolu gösterir ve bizi çözüme götürür.
Bir parametreyi değiştirmenin ağın performansı üzerindeki etkisiyle ilgileniyoruz ve gradyanlar bize, bağlı olduğu bir değişkeni değiştirdiğimizde belirli bir değişkenin ne kadar arttığını veya azaldığını söyler. Performans genellikle en aza indirmeye çalıştığımız bir kayıp ölçütü kullanılarak tanımlanır. Örneğin, regresyon için en aza indirmeye çalışabilirizL2 Tahminlerimiz ile kesin değer arasındaki kayıp, oysa sınıflandırma için en aza indirebiliriz cross-entropy loss.
Kaybı referans alarak her parametrenin gradyanını hesapladıktan sonra, stokastik gradyan inişi gibi bir optimizasyon aracı kullanabiliriz.
Degradeler nasıl hesaplanır?
Degradeleri hesaplamak için aşağıdaki seçeneklerimiz var -
Symbolic Differentiation- İlk seçenek, her gradyan için formülleri hesaplayan Sembolik Farklılaşma'dır. Bu yöntemin dezavantajı, ağ derinleştikçe ve operatörler daha karmaşık hale geldikçe inanılmaz derecede uzun formüllere yol açmasıdır.
Finite Differencing- Diğer bir seçenek de, her parametrede küçük farklılıklar deneyen ve kayıp ölçütünün nasıl tepki verdiğini gören sonlu farklılaştırmayı kullanmaktır. Bu yöntemin dezavantajı, hesaplama açısından pahalı olması ve sayısal kesinliği zayıf olmasıdır.
Automatic differentiation- Yukarıdaki yöntemlerin dezavantajlarının çözümü, degradeleri kayıp ölçüsünden her bir parametreye geri yaymak için otomatik farklılaştırma kullanmaktır. Yayılma, gradyanları verimli bir şekilde hesaplamak için dinamik bir programlama yaklaşımı sağlar. Bu yönteme ters mod otomatik farklılaştırma da denir.
Otomatik Farklılaştırma (autograd)
Burada autograd'ın çalışmasını ayrıntılı olarak anlayacağız. Temelde şu iki aşamada çalışır -
Stage 1 - Bu aşamaya ‘Forward Pass’eğitim. Adından da anlaşılacağı gibi, bu aşamada, ağ tarafından tahminler yapmak ve kayıp ölçüsünü hesaplamak için kullanılan operatörün kaydını oluşturur.
Stage 2 - Bu aşamaya ‘Backward Pass’eğitim. Adından da anlaşılacağı gibi, bu aşamada bu kayıt üzerinden geriye doğru çalışır. Geriye doğru, her operatörün kısmi türevlerini, ağ parametresine kadar değerlendirir.
Autograd'ın avantajları
Otomatik Farklılaştırma (autograd) kullanmanın avantajları aşağıdadır -
Flexible- Ağımızı tanımlarken bize sağladığı esneklik, autograd kullanmanın en büyük faydalarından biridir. İşlemleri her yinelemede değiştirebiliriz. Bunlar, statik grafik gerektiren çerçevelerde uygulanması çok daha karmaşık olan dinamik grafikler olarak adlandırılır. Autograd, bu gibi durumlarda bile, degradeleri doğru şekilde geri yayabilir.
Automatic- Autograd otomatiktir, yani geri yayılım prosedürünün karmaşıklığı sizin için onun tarafından halledilir. Sadece hangi gradyanları hesaplamakla ilgilendiğimizi belirtmemiz gerekiyor.
Efficient - Autogard, eğimleri çok verimli bir şekilde hesaplar.
Can use native Python control flow operators- If condition ve while döngüsü gibi yerel Python kontrol akış operatörlerini kullanabiliriz. Otomatik sınıflandırma, gradyanları verimli ve doğru bir şekilde geri yaymaya devam edebilecektir.
MXNet Gluon'da otomatik derecelendirmeyi kullanma
Burada bir örnek yardımıyla nasıl kullanabileceğimizi göreceğiz autograd MXNet Gluon'da.
Uygulama Örneği
Aşağıdaki örnekte, iki katmanlı regresyon modelini uygulayacağız. Uygulamadan sonra, ağırlık parametrelerinin her birine göre kaybın gradyanını otomatik olarak hesaplamak için autograd kullanacağız -
Öncelikle autogrard'ı ve diğer gerekli paketleri aşağıdaki gibi içe aktarın -
from mxnet import autograd
import mxnet as mx
from mxnet.gluon.nn import HybridSequential, Dense
from mxnet.gluon.loss import L2Loss
Şimdi ağı şu şekilde tanımlamamız gerekiyor -
N_net = HybridSequential()
N_net.add(Dense(units=3))
N_net.add(Dense(units=1))
N_net.initialize()
Şimdi kaybı şu şekilde tanımlamamız gerekiyor -
loss_function = L2Loss()
Ardından, kukla verileri aşağıdaki gibi oluşturmamız gerekiyor -
x = mx.nd.array([[0.5, 0.9]])
y = mx.nd.array([[1.5]])
Şimdi, ağ üzerinden ilk ileri geçişimiz için hazırız. Gradyanları hesaplayabilmemiz için autograd'ın hesaplama grafiğini kaydetmesini istiyoruz. Bunun için ağ kodunu şu kapsamda çalıştırmamız gerekiyor:autograd.record bağlam aşağıdaki gibidir -
with autograd.record():
y_hat = N_net(x)
loss = loss_function(y_hat, y)
Şimdi, faiz miktarı üzerine geriye doğru yöntemi çağırarak başladığımız geri geçişe hazırız. Örneğimizdeki ilgi miktarı kayıptır, çünkü parametrelere göre kaybın gradyanını hesaplamaya çalışıyoruz -
loss.backward()
Şimdi, iyileştirici tarafından iyileştirilmiş performans için parametre değerini güncellemek üzere kullanılacak ağın her parametresi için gradyanlarımız var. 1. katmanın gradyanlarını aşağıdaki gibi kontrol edelim -
N_net[0].weight.grad()
Output
Çıktı aşağıdaki gibidir−
[[-0.00470527 -0.00846948]
[-0.03640365 -0.06552657]
[ 0.00800354 0.01440637]]
<NDArray 3x2 @cpu(0)>
Eksiksiz uygulama örneği
Aşağıda tam uygulama örneği verilmiştir.
from mxnet import autograd
import mxnet as mx
from mxnet.gluon.nn import HybridSequential, Dense
from mxnet.gluon.loss import L2Loss
N_net = HybridSequential()
N_net.add(Dense(units=3))
N_net.add(Dense(units=1))
N_net.initialize()
loss_function = L2Loss()
x = mx.nd.array([[0.5, 0.9]])
y = mx.nd.array([[1.5]])
with autograd.record():
y_hat = N_net(x)
loss = loss_function(y_hat, y)
loss.backward()
N_net[0].weight.grad()