Saya melatih jaringan saraf convolutional sederhana untuk regresi, di mana tugasnya adalah untuk memprediksi lokasi (x, y) kotak dalam gambar, misalnya:
Output dari jaringan memiliki dua node, satu untuk x, dan satu untuk y. Sisa dari jaringan adalah jaringan saraf convolutional standar. Hilangnya adalah standar kuadrat kesalahan antara posisi kotak yang diprediksi, dan posisi kebenaran dasar. Saya melatih 10.000 gambar ini, dan memvalidasi pada tahun 2000.
Masalah yang saya alami, adalah bahwa bahkan setelah pelatihan yang signifikan, kerugiannya tidak benar-benar berkurang. Setelah mengamati output dari jaringan, saya perhatikan bahwa jaringan cenderung nilai output mendekati nol, untuk kedua node output. Dengan demikian, prediksi lokasi kotak selalu menjadi pusat gambar. Ada beberapa penyimpangan dalam prediksi, tetapi selalu di sekitar nol. Di bawah ini menunjukkan kerugian:
Saya telah menjalankan ini selama lebih banyak zaman daripada yang ditunjukkan dalam grafik ini, dan kerugiannya tidak pernah berkurang. Menariknya di sini, kerugian sebenarnya meningkat pada satu titik.
Jadi, tampaknya jaringan hanya memprediksi rata-rata data pelatihan, daripada mempelajari kecocokan. Ada ide mengapa ini bisa terjadi? Saya menggunakan Adam sebagai pengoptimal, dengan tingkat pembelajaran awal 0,01, dan relus sebagai aktivasi
Jika Anda tertarik pada beberapa kode saya (Keras), di bawah ini:
# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))
# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)
Jawaban:
Pengoptimal tidak dapat konvergen ke solusi optimal (sub-). Mengapa? Masalah Anda terlalu mudah dan / atau model Anda terlalu kompleks.
Masalahnya terlalu mudah
Seperti @photox sudah mengatakan masalah ini dapat diselesaikan dengan hanya satu lapisan tersembunyi. Saya bahkan curiga itu bisa dilakukan tanpa lapisan tersembunyi. Itu karena masalah ini adalah linear terpisah .
Biarkan saya menggambarkan ini. Bayangkan sebuah jaringan saraf tanpa lapisan tersembunyi dan fungsi aktivasi linier (Anda mungkin juga menyebutnya regresi linier). Untuk menghitung lokasi-x dari bujur sangkar, setiap piksel terhubung ke output-x. Kolom piksel pertama terhubung dengan bobot . Kolom kedua terhubung dengan bobot . Ini berlanjut hingga kolom terakhir (mis. Kolom ) yang terhubung dengan bobot . Karena2 / lebar tinggi n n / tinggi lebar tinggi ∗ lebar1/height/width 2/heightwidth n n/heightwidth height∗width piksel tidak nol (misalnya bias sama dengan nilai warna abu-abu) aktivasi x-output sama dengan pusat persegi. Oleh karena itu, fungsi linear dapat menghitung lokasi kuadrat.
Ada beberapa solusi:
Model yang terlalu rumit
Model Anda memiliki beberapa bagian yang menambah banyak kerumitan tanpa membantu pengoptimal untuk menemukan optimal yang manis.
Misalnya, lapisan konvolusional. Lapisan pertama memiliki 32 filter konvolusional dengan ukuran . Apa yang Anda harapkan dari filter ini untuk dipelajari? Dalam klasifikasi gambar, filter ini belajar mendeteksi tepi, sudut, gradien, dan gumpalan. Tetapi dalam hal ini hanya ada beberapa filter yang masuk akal. Saya dapat memikirkan edge dari kiri ke kanan dan sebaliknya dan dari atas ke bawah dan sebaliknya. Dalam kasus Anda terdapat sekitar 28 filter yang hanya menambahkan noise acak. Menghapus ini (atau hanya seluruh lapisan) membuatnya lebih mudah bagi pengoptimal untuk menemukan yang optimal yang berfungsi.5×5
Contoh lain adalah pengoptimal Adam dengan banyak parameter tambahan. Pengoptimal Adam mungkin bekerja dengan baik dengan parameter ini tetapi mengapa Anda tidak mulai saja dengan
SGD
pengoptimal sederhana dengan nilai default.Dengan demikian Anda dapat membuat beberapa optimasi:
LinearRegression
dari scikit-learn. OK, ini bukan yang Anda inginkan, tetapi saya hanya ingin menggambarkan betapa rumitnya model ini.Dense
lapisan tersembunyiSGD
pengoptimal defaultsigmoid
aktivasi. Anda dapat menganggap masing-masing node dari lapisan tersembunyi sebagai mendeteksi jika kotak berada di lokasi tertentu.Ps
Saya pikir Anda akan menyukai posting blog ini oleh Adit Deshpande.
sumber
Sepertinya masalah overfitting yang khas. Data Anda tidak memberikan informasi yang cukup untuk mendapatkan hasil yang lebih baik. Anda memilih NN kompleks dengan kereta Anda untuk mengingat semua nuansa data kereta . Kehilangan tidak pernah bisa menjadi nol, seperti pada grafik Anda. BTW Sepertinya validasi Anda memiliki bug atau set validasi tidak baik untuk validasi karena kehilangan validasi juga semakin nol.
sumber
Saya menghadapi masalah yang sama dengan kumpulan data saya. Ternyata dalam kasus saya prediktor sangat terkonsentrasi dengan varian yang sangat kecil. Anda harus memeriksa varian variabel prediksi Anda dan melihat bagaimana itu didistribusikan.
Namun, beberapa transformasi pada variabel output dapat dilakukan untuk memodifikasi atau mengubah skalanya. Ini mungkin menghasilkan distribusi tipe yang lebih seragam. Misalnya, dalam tugas pengenalan gambar, penyetaraan histogram atau peningkatan kontras kadang-kadang bekerja untuk pengambilan keputusan yang benar.
sumber
Saya sebenarnya sedang mengerjakan masalah yang sangat mirip. Pada dasarnya, saya memiliki banyak titik di latar belakang putih dan saya melatih NN untuk mengenali titik yang ditempatkan di latar belakang terlebih dahulu. Cara yang saya temukan untuk bekerja adalah dengan hanya menggunakan satu lapisan neuron yang terhubung penuh (jadi NN 1-lapisan). Sebagai contoh, untuk gambar 100x100, saya akan memiliki 10.000 neuron input (piksel) yang terhubung langsung ke 2 neuron keluaran (koordinat). Di PyTorch, ketika saya mengonversi nilai piksel menjadi tensor, itu menormalkan data saya secara otomatis, dengan mengurangi rata-rata dan membaginya dengan deviasi standar. Dalam masalah pembelajaran mesin normal, ini baik-baik saja, tetapi tidak untuk gambar di mana mungkin ada perbedaan dalam jumlah piksel berwarna dalam gambar (yaitu milik Anda di mana hanya ada beberapa piksel putih). Begitu, Saya secara normal dinormalisasi dengan membagi semua nilai intensitas piksel dengan 255 (jadi mereka sekarang berada di kisaran 0-1 tanpa teknik normalisasi khas yang mencoba menyesuaikan semua nilai intensitas ke distribusi normal). Kemudian, saya masih memiliki masalah karena memprediksi rata-rata koordinat piksel dalam set pelatihan. Jadi, solusi saya adalah mengatur tingkat pembelajaran sangat tinggi, yang bertentangan dengan hampir semua instruktur dan tutorial ML. Alih-alih menggunakan 1e-3, 1e-4, 1e-5, seperti kebanyakan orang katakan, saya menggunakan tingkat belajar 1 atau 0,1 dengan penurunan gradien stokastik. Ini memperbaiki masalah saya dan jaringan saya akhirnya belajar untuk menghafal set pelatihan saya. Itu tidak menggeneralisasi ke set pengujian terlalu baik, tapi setidaknya itu agak berhasil, yang merupakan solusi yang lebih baik daripada kebanyakan orang menyarankan pada pertanyaan Anda. kembali sekarang dalam kisaran 0-1 tanpa teknik normalisasi tipikal yang mencoba menyesuaikan semua nilai intensitas ke distribusi normal). Kemudian, saya masih memiliki masalah karena memprediksi rata-rata koordinat piksel dalam set pelatihan. Jadi, solusi saya adalah mengatur tingkat pembelajaran sangat tinggi, yang bertentangan dengan hampir semua instruktur dan tutorial ML. Alih-alih menggunakan 1e-3, 1e-4, 1e-5, seperti kebanyakan orang katakan, saya menggunakan tingkat belajar 1 atau 0,1 dengan penurunan gradien stokastik. Ini memperbaiki masalah saya dan jaringan saya akhirnya belajar untuk menghafal set pelatihan saya. Itu tidak menggeneralisasi ke set pengujian terlalu baik, tapi setidaknya itu agak berhasil, yang merupakan solusi yang lebih baik daripada kebanyakan orang menyarankan pada pertanyaan Anda. kembali sekarang dalam kisaran 0-1 tanpa teknik normalisasi tipikal yang mencoba menyesuaikan semua nilai intensitas ke distribusi normal). Kemudian, saya masih memiliki masalah karena memprediksi rata-rata koordinat piksel dalam set pelatihan. Jadi, solusi saya adalah mengatur tingkat pembelajaran sangat tinggi, yang bertentangan dengan hampir semua instruktur dan tutorial ML. Alih-alih menggunakan 1e-3, 1e-4, 1e-5, seperti kebanyakan orang katakan, saya menggunakan tingkat belajar 1 atau 0,1 dengan penurunan gradien stokastik. Ini memperbaiki masalah saya dan jaringan saya akhirnya belajar untuk menghafal set pelatihan saya. Itu tidak menggeneralisasi ke set pengujian terlalu baik, tapi setidaknya itu agak berhasil, yang merupakan solusi yang lebih baik daripada kebanyakan orang menyarankan pada pertanyaan Anda.
sumber