Bagaimana cara menginisialisasi elemen-elemen dari matriks filter?

24

Saya mencoba untuk lebih memahami jaringan saraf convolutional dengan menulis kode Python yang tidak bergantung pada perpustakaan (seperti Convnet atau TensorFlow), dan saya terjebak dalam literatur tentang bagaimana memilih nilai untuk matriks kernel, ketika melakukan lilitan pada suatu gambar.

Saya mencoba memahami detail implementasi pada langkah antara fitur peta pada gambar di bawah ini yang menunjukkan lapisan CNN.

Lapisan jaringan saraf convolutional

Menurut diagram ini:

Menggabungkan gambar

Kernel matriks kernel "langkah-langkah" di atas gambar, membuat peta fitur, di mana setiap piksel adalah jumlah dari semua produk elemen-bijaksana antara setiap berat kernel (atau matriks filter) dan nilai piksel yang sesuai dari gambar input.

Pertanyaan saya adalah: bagaimana kita menginisialisasi bobot matriks (atau filter) kernel?

Dalam demonstrasi di atas, mereka hanya 1s dan 0s, tapi saya anggap ini disederhanakan dari sake diagram.

Apakah bobot ini dilatih dalam beberapa langkah preprocessing? Atau dipilih secara eksplisit oleh pengguna?

Kai Kuspa
sumber

Jawaban:

19

Seseorang biasanya menginisialisasi jaringan dari distribusi acak, biasanya berarti nol dan beberapa perhatian diambil sehubungan dengan memilih variansnya. Hari-hari ini dengan kemajuan dalam teknik optimasi (SGD + Momentum di antara metode lain) dan nonlinier aktivasi (ReLUs dan ReLU-seperti aktivasi memungkinkan untuk backproagation yang lebih baik dari sinyal gradien, bahkan dalam jaringan yang lebih dalam), seseorang dapat benar-benar melatih keadaan konvolusi seni jaringan saraf dari inisialisasi acak.

Properti utama adalah sebagai berikut:

  • Mengapa acak? Mengapa tidak menginisialisasi semuanya menjadi 0? Konsep penting di sini disebut pemecahan simetri . Jika semua neuron memiliki bobot yang sama, mereka akan menghasilkan output yang sama dan kita tidak akan mempelajari fitur yang berbeda. Kami tidak akan mempelajari fitur yang berbeda karena selama langkah backpropagation, semua pembaruan berat akan persis sama. Jadi, memulai dengan distribusi acak memungkinkan kita untuk menginisialisasi neuron menjadi berbeda (dengan probabilitas sangat tinggi) dan memungkinkan kita mempelajari hierarki fitur yang kaya dan beragam.

  • Kenapa berarti nol? Praktik umum dalam pembelajaran mesin adalah memusatkan nol atau menormalkan data input, sehingga fitur input mentah (untuk data gambar ini adalah piksel) rata-rata menjadi nol.

    Kami tidak memusatkan data kami, dan kami akan secara acak menginisialisasi bobot jaringan kami (matriks saat Anda merujuknya). Distribusi seperti apa yang harus kita pilih? Distribusi data input ke jaringan kami memiliki nol sejak kami berpusat nol. Katakanlah kita juga menginisialisasi syarat bias menjadi nol. Ketika kami menginisialisasi pelatihan jaringan kami, kami tidak memiliki alasan untuk mendukung satu neuron daripada yang lain karena semuanya acak. Salah satu praktiknya adalah menginisialisasi bobot secara acak dengan cara di mana mereka semua tidak memiliki output aktivasi yang diharapkan. Dengan cara ini tidak ada satu neuron yang disukai untuk "mengaktifkan" (memiliki nilai output positif) daripada neuron lainnya sementara secara bersamaan melanggar simetri karena inisialisasi acak. Nah cara sederhana untuk mencapai ini adalah dengan memilih distribusi nol rata-rata.

  • Bagaimana kita memilih varians? Anda tidak ingin memilih varians yang terlalu besar, bahkan jika itu berarti nol. Nilai ekstrem dalam bobot jaring yang dalam dapat menghasilkan output aktivasi yang secara eksponensial semakin besar, dan masalah ini dapat bertambah dengan kedalaman jaringan. Ini dapat mendatangkan malapetaka pada pelatihan jaringan kami. Anda juga tidak ingin memilihnya terlalu kecil karena ini dapat memperlambat pembelajaran karena kami menghitung nilai gradien yang sangat kecil. Jadi ada keseimbangan di sini, terutama ketika menyangkut jaringan yang lebih dalam karena kita tidak ingin propagasi maju atau mundur kita meningkat atau menurun secara eksponensial.

    Ada dua skema inisialisasi berat badan yang sangat populer: Glorot Uniform ( Memahami kesulitan melatih deep feedforward neural networks ) dan He initializer ( Menggali Jauh ke dalam Rectifier: Melampaui Kinerja Level Manusia pada Klasifikasi ImageNet ).

    Keduanya dibangun dengan tujuan untuk melatih jaringan yang dalam dengan prinsip inti berikut ini (kutipan berasal dari artikel Delving Deeper into Rectifiers):

    "Metode inisialisasi yang tepat harus menghindari mengurangi atau memperbesar besaran sinyal input secara eksponensial."

    Secara kasar, kedua skema inisialisasi ini menginisialisasi varians dari setiap lapisan sehingga distribusi output dari masing-masing neuron adalah sama. Bagian 2.2 dari Delving Deep ke Rectifiers memberikan analisis mendalam.

Catatan terakhir: kadang-kadang Anda juga akan melihat orang menggunakan Gaussian dengan standar deviasi sama dengan 0,005 atau 0,01, atau beberapa standar deviasi "kecil" lainnya, di semua lapisan. Lain kali Anda akan melihat orang-orang bermain-main dengan varians dengan tangan, pada dasarnya melakukan validasi silang untuk menemukan konfigurasi berkinerja terbaik.

AI indie
sumber
1
Tapi bagaimana dengan bentuk "X" (dibuat oleh 1) dari filter kuning di GIF di atas? Saya mengerti ini yang ingin saya gunakan untuk mendeteksi bentuk "X" di mana saja dalam gambar, tetapi bagaimana saya tahu bahwa "X" adalah bentuk yang saya inginkan? Saya mendapat kesan bahwa bentuk filter dipelajari secara otomatis, tetapi saya tidak tahu caranya. Mungkin ini juga pertanyaan OP?
Felipe Almeida
2

Saya tidak dapat berkomentar karena reputasi yang rendah sehingga saya menulis ini sebagai jawaban atas pertanyaan Felipe Almeida. Setelah jawaban sempurna Indie AI, tidak ada banyak yang bisa ditambahkan. Jika Anda ingin mendeteksi bentuk tertentu (seperti X), Anda dapat menentukan terlebih dahulu filter tertentu, seperti halnya deteksi tepi. Tetapi ini adalah keindahan dari pembelajaran yang mendalam, ada begitu banyak lapisan, begitu banyak filter dan banyak iterasi sehingga filter mempelajari hampir setiap bentuk objek yang diperlukan. Jadi secara teoritis, jika ada X yang terdeteksi, salah satu filter akan belajar mendeteksi X (sebagai filter kuning)

deadcode
sumber