Bagaimana jika Charles Darwin Membangun Neural Network? – Menuju AI

Bagaimana jika Charles Darwin Membangun Neural Network?  – Menuju AI

Pengarang: Alexander Kovalenko

Awalnya diterbitkan di Menuju AI.

Cara alternatif untuk “melatih” jaringan saraf dengan evolusi

Foto oleh Misael Moreno di Unsplash

Saat ini, backpropagation hampir merupakan satu-satunya cara untuk pelatihan jaringan saraf. Ini menghitung gradien dari fungsi kerugian sehubungan dengan bobot jaringan dan akibatnya memperbarui bobot dengan menyebarkan kembali kesalahan di seluruh lapisan jaringan menggunakan aturan rantai.

Baru-baru ini, komunitas telah mencoba melampaui backpropagation, karena maestro Geoffrey Hinton sendiri, yang mempopulerkan algoritme di tahun 80-an, sekarang “sangat curiga” tentangnya. Pandangannya sekarang adalah “buang semuanya dan mulai lagi”. Ada banyak alasan di balik kecurigaannya. Yang utama adalah otak kita tidak memundurkan sesuatu, karena tidak ada data berlabel. Kami lebih suka memberi label sendiri, yang ini adalah cerita yang sama sekali berbeda. Banyak karya cemerlang telah diterbitkan di NeurIPS yang menampilkan beragam algoritme, beberapa di antaranya agak canggih. Namun, kami di sini bukan untuk beberapa algoritme keras yang terlihat seperti mantra kuno untuk memanggil iblis, tetapi untuk sesuatu yang lebih sederhana. Jauh lebih sederhana. Alih-alih melatih model kami, kami akan mengembangkannya, seperti yang dilakukan ibu alam.

Sekarang, saatnya bagi Charles Darwin untuk tampil. Darwin mendefinisikan evolusi sebagai “keturunan dengan modifikasi”. Kedengarannya hampir seperti “turunan gradien”, bukan? 😅 Seleksi alam, yang merupakan titik kunci evolusi, berarti bahwa spesies berevolusi dari waktu ke waktu, memunculkan spesies baru, dan memiliki nenek moyang yang sama. Dengan kata sederhana, fraksi populasi yang paling beradaptasi bertahan dan menghasilkan keturunan yang sedikit berubah (yaitu, bermutasi). Kemudian, proses ini berulang-ulang dalam waktu yang lama… Berapa lama? Misalnya, dalam kasus planet Bumi, dibutuhkan waktu 4,543 miliar tahun. Konsep ini diadaptasi dengan baik dalam ilmu komputer dan disebut algoritma genetika atau evolusioner.

Mengingat populasi yang besar, dimulai secara acak, evolusi dapat muncul dengan hasil yang sangat bagus. Demikian pula, “Teorema monyet tak terbatas”, menyatakan bahwa seekor monyet, dengan waktu tak terbatas, hampir pasti akan mengetik beberapa teks yang bermakna, katakanlah, Hamlet karya William Shakespeare.

“Misalkan satu juta monyet telah dilatih untuk mengetik secara acak, dan monyet-monyet pengetikan ini bekerja keras selama sepuluh jam sehari dengan satu juta mesin tik dari berbagai jenis. Setelah satu tahun, hasil pekerjaan mereka akan berisi salinan persis dari buku-buku dari semua jenis dan bahasa yang disimpan di perpustakaan terkaya di dunia”

Émile Borel, 1913, Jurnal Fisika

Foto oleh Syed Ahmad di Unsplash

Bagaimana kita mengekstrapolasi ide ini ke pelatihan jaringan saraf? Bayangkan saja kita mulai dengan sekumpulan jaring acak. Mereka dapat bervariasi dalam hal arsitektur, berat, atau parameter lainnya. Kemudian kita harus memeriksa bagaimana mereka melakukan pekerjaannya, memilih potongan kecil yang berkinerja terbaik, dan melakukan beberapa modifikasi kecil (yang disebut “mutasi”) pada parameternya. Karena kita berbicara tentang alternatif backpropagation, di sini, tujuannya adalah menemukan bobot dan bias terbaik untuk jaringan saraf tanpa cara “tradisional” untuk melatihnya.

Tidak ada backpropagation, tidak ada gradient descent – ​​tidak ada masalah!

Pertama, mari buat hidup kita lebih mudah dengan membuat jaringan saraf menggunakan pustaka PyTorch. Untuk kesederhanaan, kami akan mengambil jaringan saraf feed-forward dengan satu lapisan tersembunyi dan mengembangkannya untuk tugas sederhana – pengenalan angka tulisan tangan, yang kita semua tahu sebagai kumpulan data MNIST:

Sekarang, untuk membuat model berfungsi, kita harus menginisialisasi bobot dan bias, jadi mari buat fungsi yang menggunakan model dan parameter yang dapat dilatih dan menyatukan semuanya:

Kemudian, kita memerlukan apa yang disebut fungsi kebugaran, yang menurut Wikipedia lama yang bagus, adalah:

jenis tertentu dari fungsi tujuan yang digunakan untuk meringkas, sebagai angka tunggal, seberapa dekat solusi desain yang diberikan untuk mencapai tujuan yang ditetapkan.

Pertama-tama, mari gunakan fungsi pengujian PyTorch standar tanpa kumpulan mini, karena kita tidak membutuhkannya lagi:

Oleh karena itu, yang disebut fungsi kebugaranlah yang harus kita maksimalkan. Saat mengembalikan akurasi, memaksimalkan fungsi kebugaran terdengar seperti sebuah rencana!

Namun, untuk menguji model, kami membutuhkan beberapa input yang akan menjadi populasi parameter jaringan saraf acak. Oleh karena itu, pertama-tama, kita perlu membuat populasi dengan hanya menghasilkan banyak pseudorandom tensor yang terdistribusi normal dari bentuk tertentu, dengan sedikit penyesuaian normalisasi yang dimaksudkan untuk menghindari parameter yang sangat besar, yaitu mengalikan bobot dan bias dengan 0,1.

Mari kita lakukan sebagai daftar tupel Python:

Di sini, setiap tupel berisi yang berikut ini:

bobot dari lapisan tersembunyi bobot dari bias lapisan keluaran dari bias lapisan tersembunyi dari lapisan keluaran

Sekarang, setelah kita memiliki 100 solusi berbeda, kita dapat memasukkannya ke dalam model, mengevaluasinya, dan memilih sekelompok (katakanlah 10) solusi terbaik. Kemudian kami memutasi solusinya sedikit, yang disebutkan di atas sebagai mutasi, dan membuat generasi baru, yaitu N solusi baru yang diambil secara acak dari atas generasi sebelumnya dan sedikit dimutasi.

Namun, di sini kami menggunakan sedikit perubahan pada implementasi asli dari algoritme. Pertama, karena kita mulai dengan populasi kecil 100, mari kita biarkan populasi tumbuh setiap generasi dengan jumlah tertentu. Ini hanyalah trik untuk konvergensi yang lebih cepat dan hasil yang lebih baik dari waktu ke waktu.

Trik kedua adalah, sesekali (katakanlah 20% dari semua kasus), kami mengizinkan inisialisasi acak dari awal. Jadi, meskipun kami memilih 10 solusi teratas untuk menciptakan generasi baru, masih ada peluang lahirnya Albert Einstein! Konsekuensinya, jika mereka ada, para Einstein itu dapat diambil dan selanjutnya dimutasi untuk menciptakan generasi baru yang lebih baik. Keseluruhan siklus kode terlihat sebagai berikut:

Singkatnya, algoritme evolusioner kami yang sedikit lebih baik melakukan hal berikut:

secara acak menghasilkan 100 set parameter untuk arsitektur jaringan saraf yang diberikan memilih 10 terbaik dari mereka secara acak sedikit memutasi 10 teratas dan membuat populasi baru, sedikit lebih besar dari sebelumnya, dengan peluang 20% ​​dari inisialisasi acak sepenuhnya berulang hingga dibutuhkan seluruh dunia!

Dan… voila! DarwinNet kami sudah siap! Saat berjalan selama 200 generasi, ini memberikan akurasi lebih dari 25% untuk kumpulan data MNIST pada set pengujian. Bukan kinerja terbaik, bagaimanapun, tebakan acak akan memberikan akurasi 10%, jadi jelas melakukan sesuatu, seperti yang Anda lihat pada gambar di bawah. Kode lengkap dapat ditemukan di sini. Seperti disebutkan di atas, menambahkan 20% kemungkinan inisialisasi acak membantu meningkatkan kinerja secara drastis, yang sesuai dengan karakteristik “langkah” pada plot.

Posting ini menunjukkan bagaimana algoritma genetika dapat digunakan untuk “melatih” model pada salah satu dataset benchmark. Ingatlah bahwa kode itu ditulis antara adu pedang kantor dan kopi; tidak ada ambisi besar di sini. Namun demikian, ada lusinan cara untuk mencapai kinerja yang lebih tinggi dengan inisialisasi bobot yang berbeda, mengubah tingkat mutasi, jumlah orang tua untuk setiap generasi, jumlah generasi, dll. Selain itu, kita dapat menggunakan pemahaman sebelumnya tentang jaringan saraf dan menyuntikkan pengetahuan ahli, yaitu, pilih bobot awal model menggunakan inisialisasi Kaiming. Ini mungkin tidak akan membantu, tetapi Anda mengerti maksudnya, bukan? 😃

Tentu saja, ide untuk melatih jaringan saraf menggunakan algoritma evolusioner bukanlah hal baru. Setidaknya ada dua makalah oleh DJ Montana & L. Davis dan SJ Marshall & RF Harrison dari abad lalu yang berbagi ide ini, di mana mereka menunjukkan keunggulan algoritme genetika dibandingkan latar belakangnya. Namun, apapun yang terjadi terjadi. Saat ini, atribut terkait backpropagation disetel dengan baik untuk melakukan yang terbaik, dengan demikian, kinerjanya dominan dibandingkan algoritma genetika dan metode saingan non-backprop lainnya misalnya. Pembelajaran Hebbian atau pembelajaran perturbasi.

Masalah lain dengan implementasi saat ini: butuh waktu… Yah, mungkin jika dijalankan selama lebih dari 4 miliar tahun, hasilnya akan lebih baik. 🙃

Bagaimana jika Charles Darwin Membangun Neural Network? awalnya diterbitkan di Menuju AI di Medium, di mana orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jeffrey Hayes