
Hai, habrozhiteli! Buku ini meletakkan dasar untuk penguasaan lebih lanjut dari teknologi pembelajaran yang mendalam. Ini dimulai dengan deskripsi dasar-dasar jaringan saraf dan kemudian memeriksa secara rinci lapisan tambahan arsitektur.
Buku ini ditulis secara khusus dengan tujuan memberikan ambang masuk serendah mungkin. Anda tidak perlu pengetahuan tentang aljabar linier, metode numerik, optimisasi cembung, dan bahkan pembelajaran mesin. Semua yang diperlukan untuk memahami pembelajaran mendalam akan diklarifikasi saat Anda pergi.
Kami menawarkan Anda untuk berkenalan dengan bagian "Apa itu kerangka pembelajaran yang mendalam?"
Alat yang bagus mengurangi kesalahan, pengembangan kecepatan, dan meningkatkan kecepatan eksekusi.Jika Anda membaca banyak tentang pembelajaran mendalam, maka Anda mungkin menemukan kerangka kerja yang terkenal seperti PyTorch, TensorFlow, Theano (baru-baru ini dinyatakan usang), Keras, Lasagne dan DyNet. Dalam beberapa tahun terakhir, kerangka kerja telah berevolusi dengan sangat cepat, dan terlepas dari kenyataan bahwa semua kerangka kerja ini didistribusikan secara bebas dan open source, masing-masing dari mereka memiliki semangat kompetisi dan persahabatan.
Sampai sekarang, saya telah menghindari membahas kerangka kerja, karena, pertama-tama, sangat penting bagi Anda untuk memahami apa yang terjadi di balik layar, mengimplementasikan algoritma secara manual (hanya menggunakan perpustakaan NumPy). Tapi sekarang kita akan mulai menggunakan kerangka kerja seperti itu, karena jaringan yang akan kita latih, jaringan dengan memori jangka pendek (LSTM), sangat kompleks, dan kode yang mengimplementasikannya menggunakan NumPy sulit dibaca, digunakan, dan debug (gradien dalam kode ini) ditemukan di mana-mana).
Kerumitan inilah yang dirancang untuk ditangani oleh kerangka kerja pembelajaran dalam. Kerangka belajar yang dalam dapat secara signifikan mengurangi kompleksitas kode (serta mengurangi jumlah kesalahan dan meningkatkan kecepatan pengembangan) dan meningkatkan kecepatan pelaksanaannya, terutama jika Anda menggunakan prosesor grafis (GPU) untuk melatih jaringan saraf, yang dapat mempercepat proses dengan 10-100 kali. Untuk alasan ini, kerangka kerja digunakan hampir di mana-mana di komunitas penelitian, dan pemahaman tentang fitur pekerjaan mereka akan berguna bagi Anda dalam karir Anda sebagai pengguna dan peneliti pembelajaran yang mendalam.
Tetapi kami tidak akan membatasi diri pada kerangka kerja kerangka kerja tertentu, karena ini akan mencegah Anda mempelajari bagaimana semua model yang rumit ini (seperti LSTM) bekerja. Sebagai gantinya, kami akan membuat kerangka kerja ringan kami sendiri, mengikuti tren terbaru dalam pengembangan kerangka kerja. Mengikuti jalur ini, Anda akan tahu persis apa yang dilakukan kerangka kerja ketika arsitektur kompleks dibuat dengan bantuan mereka. Selain itu, upaya untuk membuat kerangka kerja kecil Anda sendiri akan membantu Anda dengan lancar beralih ke penggunaan kerangka kerja pembelajaran yang benar-benar mendalam, karena Anda sudah tahu prinsip-prinsip mengatur antarmuka program (API) dan fungsinya. Latihan ini sangat berguna bagi saya, dan pengetahuan yang saya peroleh saat membuat kerangka kerja saya sendiri ternyata sangat membantu dalam men-debug model yang bermasalah.
Bagaimana kerangka kerja menyederhanakan kode? Berbicara secara abstrak, itu menghilangkan kebutuhan untuk menulis kode yang sama lagi dan lagi. Secara khusus, fitur yang paling nyaman dari kerangka pembelajaran yang dalam adalah dukungan untuk backpropagation otomatis dan optimasi otomatis. Ini memungkinkan Anda untuk menulis hanya kode distribusi langsung, dan kerangka kerja akan secara otomatis menangani distribusi kembali dan koreksi bobot. Sebagian besar kerangka kerja modern bahkan menyederhanakan kode yang mengimplementasikan distribusi langsung dengan menawarkan antarmuka tingkat tinggi untuk mendefinisikan lapisan dan fungsi kerugian yang khas.
Pengantar Tensor
Tensor adalah bentuk abstrak vektor dan matriksHingga saat ini, kami menggunakan vektor dan matriks sebagai struktur utama. Biarkan saya mengingatkan Anda bahwa matriks adalah daftar vektor, dan vektor adalah daftar skalar (angka tunggal). Tensor adalah bentuk abstrak untuk mewakili daftar angka bersarang. Vektor adalah tensor satu dimensi. Matriks adalah tensor dua dimensi, dan struktur dengan sejumlah besar dimensi disebut tensor n-dimensional. Jadi, mari kita mulai membuat kerangka kerja pembelajaran dalam yang baru dengan mendefinisikan tipe dasar, yang akan kita sebut Tensor:
import numpy as np class Tensor (object): def __init__(self, data): self.data = np.array(data) def __add__(self, other): return Tensor(self.data + other.data) def __repr__(self): return str(self.data.__repr__()) def __str__(self): return str(self.data.__str__()) x = Tensor([1,2,3,4,5]) print(x) [1 2 3 4 5] y = x + x print(y) [2 4 6 8 10]
Ini adalah versi pertama dari struktur data dasar kami. Perhatikan bahwa ia menyimpan semua informasi numerik dalam array NumPy (self.data) dan mendukung operasi tensor tunggal (tambahan). Menambahkan operasi tambahan tidak sulit sama sekali, cukup tambahkan fungsi tambahan dengan fungsionalitas yang sesuai ke kelas Tensor.
Pengantar perhitungan gradien otomatis (autograd)
Sebelumnya, kami melakukan propagasi balik manual. Sekarang mari kita membuatnya otomatis!Dalam bab 4, kami memperkenalkan turunan. Sejak itu, kami secara manual menghitung turunan ini di setiap jaringan saraf baru. Biarkan saya mengingatkan Anda bahwa ini dicapai dengan gerakan terbalik melalui jaringan saraf: pertama, gradien pada output jaringan dihitung, maka hasil ini digunakan untuk menghitung turunan dalam komponen sebelumnya, dan seterusnya, hingga gradien yang benar ditentukan untuk semua bobot dalam arsitektur. Logika ini untuk menghitung gradien juga dapat ditambahkan ke kelas tensor. Berikut ini menunjukkan apa yang ada dalam pikiran saya.
import numpy as np class Tensor (object): def __init__(self, data, creators=None, creation_op=None): self.data = np.array(data) self.creation_op = creation_op self.creators = creators self.grad = None def backward(self, grad): self.grad = grad if(self.creation_op == "add"): self.creators[0].backward(grad) self.creators[1].backward(grad) def __add__(self, other): return Tensor(self.data + other.data, creators=[self,other], creation_op="add") def __repr__(self): return str(self.data.__repr__()) def __str__(self): return str(self.data.__str__()) x = Tensor([1,2,3,4,5]) y = Tensor([2,2,2,2,2]) z = x + y z.backward(Tensor(np.array([1,1,1,1,1])))
Metode ini memperkenalkan dua inovasi. Pertama, setiap tensor menerima dua atribut baru. creator adalah daftar tensor apa pun yang digunakan untuk membuat tensor saat ini (default ke None). Yaitu, jika tensor z diperoleh dengan menambahkan dua tensor lainnya, x dan y, atribut pencipta tensor z akan berisi tensor x dan y. creation_op adalah atribut pengiring yang menyimpan operasi yang digunakan dalam proses pembuatan tensor ini. Artinya, instruksi z = x + y akan membuat grafik komputasi dengan tiga node (x, y dan z) dan dua sisi (z -> x dan z -> y). Setiap tepi ditandatangani oleh operasi dari creation_op, yaitu, tambahkan. Grafik ini akan membantu mengatur propagasi gradien mundur rekursif.
Inovasi pertama dalam implementasi ini adalah pembuatan grafik secara otomatis selama setiap operasi matematika. Jika kita mengambil z dan melakukan operasi lain, grafik akan dilanjutkan dalam referensi variabel baru z.
Inovasi kedua dalam versi kelas Tensor ini adalah kemampuan untuk menggunakan grafik untuk menghitung gradien. Jika Anda memanggil metode z.backward (), ia akan melewati gradien untuk x dan y, dengan mempertimbangkan fungsi yang digunakan tensor z (add) dibuat. Seperti yang ditunjukkan pada contoh di atas, kita melewatkan vektor gradien (np.array ([1,1,1,1,1]]) ke z, dan yang itu berlaku untuk orang tuanya. Seperti yang mungkin Anda ingat dari Bab 4, propagasi mundur melalui penjumlahan berarti menerapkan propagasi mundur. Dalam hal ini, kami hanya memiliki satu gradien untuk ditambahkan ke x dan y, jadi kami menyalinnya dari z ke x dan y:
print(x.grad) print(y.grad) print(z.creators) print(z.creation_op) [1 1 1 1 1] [1 1 1 1 1] [array([1, 2, 3, 4, 5]), array([2, 2, 2, 2, 2])] add
Fitur yang paling luar biasa dari bentuk perhitungan gradien otomatis ini adalah bahwa ia bekerja secara rekursif - setiap vektor memanggil metode .backward () dari semua orang tuanya dari daftar self.creators:
»Informasi lebih lanjut tentang buku ini dapat ditemukan di
situs web penerbit»
Isi»
KutipanKupon diskon 25% untuk pedagang asongan -
Deep LearningSetelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.