Bekerja dengan jaringan saraf: daftar periksa untuk debugging

Bekerja dengan jaringan saraf: daftar periksa untuk debugging

Kode produk perangkat lunak pembelajaran mesin seringkali rumit dan cukup membingungkan. Mendeteksi dan menghilangkan bug di dalamnya adalah tugas yang membutuhkan banyak sumber daya. Bahkan yang paling sederhana sekalipun jaringan saraf umpan maju memerlukan pendekatan serius terhadap arsitektur jaringan, inisialisasi bobot, dan optimalisasi jaringan. Kesalahan kecil saja bisa menimbulkan masalah yang tidak menyenangkan.

Artikel ini membahas tentang algoritme untuk men-debug jaringan saraf Anda.

Skillbox merekomendasikan: Tentu saja praktis Pengembang Python dari awal.

Kami mengingatkan: untuk semua pembaca "Habr" - diskon 10 rubel saat mendaftar di kursus Skillbox apa pun menggunakan kode promosi "Habr".

Algoritma ini terdiri dari lima tahap:

  • awal yang mudah;
  • konfirmasi kerugian;
  • memeriksa hasil antara dan koneksi;
  • diagnostik parameter;
  • pengendalian pekerjaan.

Jika ada sesuatu yang menurut Anda lebih menarik daripada yang lain, Anda dapat langsung melompat ke bagian ini.

Awal yang mudah

Jaringan neural dengan arsitektur kompleks, regularisasi, dan penjadwal kecepatan pembelajaran lebih sulit untuk di-debug dibandingkan jaringan biasa. Kami sedikit rumit di sini, karena poin itu sendiri secara tidak langsung terkait dengan debugging, tetapi ini tetap merupakan rekomendasi penting.

Permulaan yang sederhana adalah dengan membuat model yang disederhanakan dan melatihnya pada satu kumpulan (titik) data.

Pertama kita membuat model yang disederhanakan

Untuk memulai dengan cepat, kami membuat jaringan kecil dengan satu lapisan tersembunyi dan memeriksa apakah semuanya berfungsi dengan benar. Kemudian kami secara bertahap memperumit model, memeriksa setiap aspek baru dari strukturnya (lapisan tambahan, parameter, dll.), dan melanjutkan.

Kami melatih model pada satu kumpulan (titik) data

Sebagai pemeriksaan kewarasan cepat untuk proyek Anda, Anda dapat menggunakan satu atau dua titik data untuk pelatihan guna mengonfirmasi apakah sistem berfungsi dengan benar. Jaringan saraf harus menunjukkan akurasi 100% dalam pelatihan dan pengujian. Jika tidak demikian, berarti modelnya terlalu kecil atau Anda sudah mempunyai bug.

Meskipun semuanya baik-baik saja, persiapkan model untuk satu atau beberapa periode sebelum melanjutkan.

Penilaian kerugian

Estimasi kerugian adalah cara utama untuk menyempurnakan performa model. Anda perlu memastikan bahwa kerugian tersebut sesuai dengan masalahnya dan bahwa fungsi kerugian dinilai pada skala yang benar. Jika Anda menggunakan lebih dari satu jenis kerugian, pastikan semuanya memiliki urutan yang sama dan diskalakan dengan benar.

Penting untuk mewaspadai kerugian awal. Periksa seberapa dekat hasil sebenarnya dengan hasil yang diharapkan jika model dimulai dengan tebakan acak. DI DALAM Karya Andrey Karpathy menyarankan hal berikut:: β€œPastikan Anda mendapatkan hasil yang diharapkan saat memulai dengan sejumlah kecil parameter. Sebaiknya segera periksa kehilangan data (dengan derajat regularisasi disetel ke nol). Misalnya, untuk CIFAR-10 dengan pengklasifikasi Softmax, kami memperkirakan kerugian awal adalah 2.302 karena probabilitas penyebaran yang diharapkan adalah 0,1 untuk setiap kelas (karena ada 10 kelas) dan kerugian Softmax adalah kemungkinan log negatif dari kelas yang benar sebagai βˆ’ ln (0.1) = 2.302.”

Untuk contoh biner, penghitungan serupa dilakukan secara sederhana untuk setiap kelas. Misalnya saja datanya: 20% 0 dan 80% 1. Kerugian awal yang diperkirakan akan mencapai –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Jika hasilnya lebih besar dari 1, hal ini mungkin menunjukkan bahwa bobot jaringan saraf tidak seimbang dengan baik atau data tidak dinormalisasi.

Memeriksa hasil antara dan koneksi

Untuk men-debug jaringan saraf, penting untuk memahami dinamika proses dalam jaringan dan peran masing-masing lapisan perantara saat mereka terhubung. Berikut adalah kesalahan umum yang mungkin Anda temui:

  • ekspresi yang salah untuk pembaruan gradle;
  • pembaruan bobot tidak diterapkan;
  • gradien yang meledak.

Jika nilai gradiennya nol, ini berarti kecepatan pembelajaran di pengoptimal terlalu lambat, atau Anda menemukan ekspresi yang salah untuk memperbarui gradien.

Selain itu, perlu untuk memantau nilai fungsi aktivasi, bobot dan pembaruan dari masing-masing lapisan. Misalnya, besarnya pembaruan parameter (bobot dan bias) seharusnya 1-e3.

Ada fenomena yang disebut β€œDying ReLU” atau "masalah gradien hilang", ketika neuron ReLU akan mengeluarkan keluaran nol setelah mempelajari nilai bias negatif yang besar untuk bobotnya. Neuron-neuron ini tidak pernah diaktifkan lagi pada titik mana pun dalam data.

Anda dapat menggunakan pemeriksaan gradien untuk mengidentifikasi kesalahan ini dengan memperkirakan gradien menggunakan pendekatan numerik. Jika mendekati gradien yang dihitung, maka propagasi mundur telah diterapkan dengan benar. Untuk membuat pemeriksaan gradien, lihat sumber daya hebat ini dari CS231 di sini ΠΈ di siniMaupun pelajaran Andrew Nga tentang topik ini.

Faizan Syekh menunjukkan tiga metode utama untuk memvisualisasikan jaringan saraf:

  • Pendahuluan adalah metode sederhana yang menunjukkan kepada kita struktur umum model yang dilatih. Ini termasuk keluaran bentuk atau filter dari masing-masing lapisan jaringan saraf dan parameter dalam setiap lapisan.
  • Berbasis aktivasi. Di dalamnya, kami menguraikan aktivasi neuron individu atau kelompok neuron untuk memahami fungsinya.
  • Berdasarkan gradien. Metode ini cenderung memanipulasi gradien yang terbentuk dari pelatihan model maju dan mundur (termasuk peta arti-penting dan peta aktivasi kelas).

Ada beberapa alat yang berguna untuk memvisualisasikan aktivasi dan koneksi masing-masing lapisan, misalnya. Koneksi ΠΈ Papan tarik.

Bekerja dengan jaringan saraf: daftar periksa untuk debugging

Diagnostik parameter

Jaringan saraf memiliki banyak parameter yang berinteraksi satu sama lain, sehingga mempersulit pengoptimalan. Sebenarnya, bagian ini merupakan subjek penelitian aktif oleh para spesialis, sehingga saran-saran di bawah ini sebaiknya dianggap hanya sebagai saran, titik awal untuk membangun.

Ukuran paket (ukuran batch) - Jika Anda ingin ukuran batch cukup besar untuk mendapatkan perkiraan gradien kesalahan yang akurat, namun cukup kecil untuk penurunan gradien stokastik (SGD) untuk mengatur jaringan Anda. Ukuran batch yang kecil akan menyebabkan konvergensi yang cepat karena gangguan selama proses pelatihan dan selanjutnya kesulitan optimasi. Hal ini dijelaskan secara lebih rinci di sini.

Kecepatan pembelajaran - terlalu rendah akan mengakibatkan konvergensi lambat atau risiko terjebak dalam nilai minimum lokal. Pada saat yang sama, kecepatan pemelajaran yang tinggi akan menyebabkan divergensi pengoptimalan karena Anda berisiko melewati bagian fungsi kerugian yang dalam namun sempit. Coba gunakan penjadwalan kecepatan untuk menguranginya saat melatih jaringan saraf. Terkini dengan CS231n ada bagian besar yang didedikasikan untuk masalah ini.

Kliping gradienβ€Š β€” memangkas gradien parameter selama propagasi mundur pada nilai maksimum atau norma marjinal. Berguna untuk memecahkan masalah gradien yang meledak yang mungkin Anda temui di poin tiga.

Normalisasi batch - digunakan untuk menormalkan data masukan setiap lapisan, yang memungkinkan kita memecahkan masalah pergeseran kovariat internal. Jika Anda menggunakan Dropout dan Batch Norma secara bersamaan, lihat artikel ini.

Penurunan gradien stokastik (SGD) β€” ada beberapa jenis SGD yang menggunakan momentum, kecepatan pembelajaran adaptif, dan metode Nesterov. Namun, tidak satupun dari mereka memiliki keunggulan yang jelas baik dari segi efisiensi pembelajaran dan generalisasi (detail di sini).

Regularisasi - sangat penting untuk membangun model yang dapat digeneralisasikan, karena hal ini menambah penalti untuk kompleksitas model atau nilai parameter ekstrem. Ini adalah cara untuk mengurangi varians model tanpa meningkatkan biasnya secara signifikan. Lagi informasi rinci - di sini.

Untuk mengevaluasi semuanya sendiri, Anda perlu menonaktifkan regularisasi dan memeriksa sendiri gradien kehilangan data.

Putus sekolah adalah metode lain untuk merampingkan jaringan Anda untuk mencegah kemacetan. Selama pelatihan, dropout dilakukan hanya dengan mempertahankan aktivitas neuron dengan probabilitas p (hyperparameter) tertentu atau mengaturnya ke nol dalam kasus sebaliknya. Akibatnya, jaringan harus menggunakan subset parameter yang berbeda untuk setiap batch pelatihan, sehingga mengurangi perubahan pada parameter tertentu yang menjadi dominan.

Penting: Jika Anda menggunakan normalisasi dropout dan batch, berhati-hatilah dengan urutan operasi ini atau bahkan menggunakannya secara bersamaan. Semua ini masih dibahas dan ditambah secara aktif. Berikut adalah dua diskusi penting mengenai topik ini di Stackoverflow ΠΈ ArXiv.

Kontrol kerja

Ini tentang mendokumentasikan alur kerja dan eksperimen. Jika Anda tidak mendokumentasikan apa pun, Anda mungkin lupa, misalnya, kecepatan pemelajaran atau bobot kelas yang digunakan. Berkat kontrolnya, Anda dapat dengan mudah melihat dan mereproduksi eksperimen sebelumnya. Hal ini memungkinkan Anda mengurangi jumlah eksperimen duplikat.

Namun, dokumentasi manual bisa menjadi tugas yang sulit jika jumlah pekerjaan yang besar. Di sinilah alat seperti Comet.ml berguna untuk membantu Anda secara otomatis mencatat kumpulan data, perubahan kode, riwayat eksperimen, dan model produksi, termasuk informasi penting tentang model Anda (hiperparameter, metrik kinerja model, dan informasi lingkungan).

Jaringan saraf bisa sangat sensitif terhadap perubahan kecil, dan ini akan menyebabkan penurunan performa model. Melacak dan mendokumentasikan pekerjaan Anda adalah langkah pertama yang dapat Anda ambil untuk menstandardisasi lingkungan dan pemodelan Anda.

Bekerja dengan jaringan saraf: daftar periksa untuk debugging

Saya harap postingan ini dapat menjadi titik awal bagi Anda untuk mulai men-debug jaringan saraf Anda.

Skillbox merekomendasikan:

Sumber: www.habr.com

Tambah komentar