Apache MXNet - Paket Python
Di bab ini kita akan mempelajari tentang Paket Python yang tersedia di Apache MXNet.
Paket MXNet Python penting
MXNet memiliki paket Python penting berikut yang akan kita diskusikan satu per satu -
Autograd (Diferensiasi Otomatis)
NDArray
KVStore
Gluon
Visualization
Pertama mari kita mulai dengan Autograd Paket Python untuk Apache MXNet.
Autograd
Autograd berdiri untuk automatic differentiationdigunakan untuk melakukan propagasi mundur gradien dari metrik kerugian kembali ke masing-masing parameter. Bersama dengan propagasi mundur, ia menggunakan pendekatan pemrograman dinamis untuk menghitung gradien secara efisien. Ini juga disebut diferensiasi otomatis mode terbalik. Teknik ini sangat efisien dalam situasi 'fan-in' di mana, banyak parameter mempengaruhi metrik kerugian tunggal.
Apa itu gradien?
Gradien adalah dasar dari proses pelatihan jaringan saraf. Mereka pada dasarnya memberi tahu kami cara mengubah parameter jaringan untuk meningkatkan kinerjanya.
Seperti yang kita ketahui bahwa, jaringan saraf (NN) terdiri dari operator seperti jumlah, produk, konvolusi, dll. Operator ini, untuk perhitungannya, menggunakan parameter seperti bobot dalam kernel konvolusi. Kita harus menemukan nilai optimal untuk parameter ini dan gradien menunjukkan jalan dan membawa kita ke solusi juga.
Kami tertarik pada efek mengubah parameter pada kinerja jaringan dan gradien memberi tahu kami, seberapa banyak variabel tertentu meningkat atau menurun ketika kami mengubah variabel yang bergantung padanya. Performa biasanya ditentukan dengan menggunakan metrik kerugian yang kami coba minimalkan. Misalnya, untuk regresi kita mungkin mencoba meminimalkanL2 kerugian antara prediksi kami dan nilai pasti, sedangkan untuk klasifikasi kami mungkin meminimalkan cross-entropy loss.
Setelah kita menghitung gradien setiap parameter dengan mengacu pada kerugian, kita kemudian dapat menggunakan pengoptimal, seperti penurunan gradien stokastik.
Bagaimana cara menghitung gradien?
Kami memiliki opsi berikut untuk menghitung gradien -
Symbolic Differentiation- Opsi pertama adalah Diferensiasi Simbolik, yang menghitung rumus untuk setiap gradien. Kelemahan dari metode ini adalah, metode ini akan dengan cepat menghasilkan rumus yang sangat panjang karena jaringan semakin dalam dan operator menjadi lebih kompleks.
Finite Differencing- Pilihan lainnya adalah, menggunakan perbedaan terbatas yang mencoba sedikit perbedaan pada setiap parameter dan melihat bagaimana metrik kerugian merespons. Kelemahan dari metode ini adalah, secara komputasi mahal dan mungkin memiliki presisi numerik yang buruk.
Automatic differentiation- Solusi untuk kelemahan metode di atas adalah, menggunakan diferensiasi otomatis untuk melakukan propagasi mundur gradien dari metrik kerugian kembali ke masing-masing parameter. Propagasi memungkinkan kita menggunakan pendekatan pemrograman dinamis untuk menghitung gradien secara efisien. Metode ini juga disebut diferensiasi otomatis mode terbalik.
Diferensiasi Otomatis (autograd)
Di sini, kami akan memahami secara detail cara kerja autograd. Ini pada dasarnya bekerja dalam dua tahap berikut -
Stage 1 - Tahap ini disebut ‘Forward Pass’dari latihan. Sesuai namanya, pada tahap ini membuat record operator yang digunakan oleh jaringan untuk membuat prediksi dan menghitung metrik kerugian.
Stage 2 - Tahap ini disebut ‘Backward Pass’dari latihan. Sesuai namanya, dalam tahap ini bekerja mundur melalui rekaman ini. Ke belakang, ini mengevaluasi turunan parsial dari setiap operator, sampai ke parameter jaringan.
Keuntungan dari autograd
Berikut adalah keuntungan menggunakan Diferensiasi Otomatis (autograd) -
Flexible- Fleksibilitas, yang diberikan kepada kami saat mendefinisikan jaringan kami, adalah salah satu manfaat besar menggunakan autograd. Kami dapat mengubah operasi di setiap iterasi. Ini disebut grafik dinamis, yang jauh lebih kompleks untuk diterapkan dalam kerangka kerja yang membutuhkan grafik statis. Autograd, bahkan dalam kasus seperti itu, masih dapat melakukan propagasi mundur gradien dengan benar.
Automatic- Autograd otomatis, yaitu kerumitan prosedur propagasi mundur diurus olehnya untuk Anda. Kita hanya perlu menentukan gradien apa yang ingin kita hitung.
Efficient - Autogard menghitung gradien dengan sangat efisien.
Can use native Python control flow operators- Kita dapat menggunakan operator aliran kontrol Python asli seperti if condition dan while loop. Autograd masih dapat melakukan propagasi mundur gradien secara efisien dan benar.
Menggunakan autograd di MXNet Gluon
Di sini, dengan bantuan sebuah contoh, kita akan melihat bagaimana kita dapat menggunakannya autograd di MXNet Gluon.
Contoh Implementasi
Dalam contoh berikut, kami akan menerapkan model regresi yang memiliki dua lapisan. Setelah menerapkan, kami akan menggunakan autograd untuk secara otomatis menghitung gradien kerugian dengan mengacu pada masing-masing parameter bobot -
Pertama impor autogrard dan paket lain yang diperlukan sebagai berikut -
from mxnet import autograd
import mxnet as mx
from mxnet.gluon.nn import HybridSequential, Dense
from mxnet.gluon.loss import L2Loss
Sekarang, kita perlu mendefinisikan jaringan sebagai berikut -
N_net = HybridSequential()
N_net.add(Dense(units=3))
N_net.add(Dense(units=1))
N_net.initialize()
Sekarang kita perlu mendefinisikan kerugian sebagai berikut -
loss_function = L2Loss()
Selanjutnya, kita perlu membuat data dummy sebagai berikut -
x = mx.nd.array([[0.5, 0.9]])
y = mx.nd.array([[1.5]])
Sekarang, kami siap untuk forward pass pertama kami melalui jaringan. Kami ingin autograd merekam grafik komputasi sehingga kami dapat menghitung gradien. Untuk ini, kita perlu menjalankan kode jaringan dalam lingkupautograd.record konteksnya sebagai berikut -
with autograd.record():
y_hat = N_net(x)
loss = loss_function(y_hat, y)
Sekarang, kita siap untuk backward pass, yang kita mulai dengan memanggil metode mundur pada kuantitas bunga. Quatity of interest dalam contoh kami adalah kerugian karena kami mencoba menghitung gradien kerugian dengan mengacu pada parameter -
loss.backward()
Sekarang, kami memiliki gradien untuk setiap parameter jaringan, yang akan digunakan oleh pengoptimal untuk memperbarui nilai parameter untuk meningkatkan kinerja. Mari kita periksa gradien dari lapisan pertama sebagai berikut -
N_net[0].weight.grad()
Output
Outputnya adalah sebagai berikut-
[[-0.00470527 -0.00846948]
[-0.03640365 -0.06552657]
[ 0.00800354 0.01440637]]
<NDArray 3x2 @cpu(0)>
Contoh implementasi lengkap
Diberikan di bawah ini adalah contoh implementasi lengkap.
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()