Pelatihan jaringan saraf untuk regresi selalu memprediksi rata-rata


9

Saya melatih jaringan saraf convolutional sederhana untuk regresi, di mana tugasnya adalah untuk memprediksi lokasi (x, y) kotak dalam gambar, misalnya:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

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)

Apakah gambar di atas contoh sampel aktual Anda? Apakah itu 5 sampel terpisah? Tampaknya tidak ada informasi dalam gambar yang akan membantu generalisasi. Maksud saya, Anda tidak perlu jaring syaraf untuk menemukan lokasi x, y dari kotak putih, Anda cukup menguraikan gambar dan mencari piksel putih. Jelaskan lebih banyak tentang visi Anda untuk model ini. Apakah ada pola temporal, di mana Anda memprediksi lokasi selanjutnya?
photox

Hai, dan ya, gambar adalah 5 sampel terpisah. Saya tidak yakin bagaimana mereka dirender untuk Anda, tetapi mereka harus 5 gambar persegi individu (saya telah mengubah sedikit tata letak untuk membantu ...). Ya, saya menyadari bahwa Anda tidak memerlukan jaringan saraf untuk tugas ini, tetapi itu hanya percobaan percobaan untuk membantu saya belajar bagaimana melakukan regresi dengan jaringan saraf. Saya tidak mengerti apa yang Anda maksudkan karena tidak ada informasi untuk membantu menggeneralisasi .... Setiap pasangan pelatihan terdiri dari gambar persegi, dan vektor dua dimensi dari lokasi (x, y) persegi. Terima kasih :)
Karnivaurus

1
1) Bentuk input Anda pada lapisan konv pertama menggunakan 3 (rbg) saluran, tetapi data Anda skala abu-abu (1 saluran) 2) Anda tidak perlu banyak lapisan dan filter, bahkan saya pikir satu lapisan, dan beberapa kernel kecil akan baik-baik saja.
photox

Apakah Anda yakin gambar memang sesuai dengan target?
user31264

1
Seperti yang dikatakan @photox, Anda tidak perlu lapisan konv. Menambahkan ini membuatnya lebih sulit bagi pengoptimal untuk menemukan solusi yang baik. Jika Anda menghapus 3 lapisan konv saya kira "model" Anda akan berfungsi.
Pieter

Jawaban:


9

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/width2/heightwidthnn/heightwidthheightwidthpiksel 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:

  • Pilih masalah yang lebih sulit, misalnya klasifikasi gambar
  • Tambahkan kebisingan, misalnya garam dan lada atau white-noise
  • Buat masalah menjadi lebih sulit, misalnya dengan memprediksi lokasi kotak merah sementara ada banyak lingkaran berwarna berbeda di latar belakang

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 SGDpengoptimal sederhana dengan nilai default.

Dengan demikian Anda dapat membuat beberapa optimasi:

  • gunakan LinearRegressiondari scikit-learn. OK, ini bukan yang Anda inginkan, tetapi saya hanya ingin menggambarkan betapa rumitnya model ini.
  • Hapus lapisan konv
  • Kurangi ukuran Denselapisan tersembunyi
  • Gunakan SGDpengoptimal default
  • Jika Anda menggunakan lapisan tersembunyi, Anda harus mencoba sigmoidaktivasi. Anda dapat menganggap masing-masing node dari lapisan tersembunyi sebagai mendeteksi jika kotak berada di lokasi tertentu.
  • Jika ini semua tidak berhasil, bereksperimenlah dengan tingkat pembelajaran sedikit untuk mengetahui apakah itu terlalu tinggi atau terlalu rendah.

Ps

Saya pikir Anda akan menyukai posting blog ini oleh Adit Deshpande.


Beri tahu saya jika solusi ini memang mengubah perilaku pengoptimal.
Pieter

Terima kasih, itu sangat berguna. Saya sedang berusaha mencoba saran Anda. Namun, saya tidak mengerti poin pertama Anda. Saya bingung mengapa, jika masalahnya terlalu sederhana, maka lebih sulit untuk dioptimalkan daripada masalah yang lebih kompleks. Untuk jaringan tertentu, mengapa masalah yang lebih sederhana lebih sulit dioptimalkan daripada masalah yang lebih kompleks? Dalam masalah sederhana, saya akan berpikir bahwa akan ada gradien yang sangat kuat dan global yang kuat. Tetapi poin pertama Anda mengatakan bahwa kesederhanaan masalah membuat optimasi sulit, menunjukkan bahwa masalah yang lebih kompleks akan membantu optimasi ...
Karnivaurus

0

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.


4
Pertanyaannya mengatakan jaringan hampir selalu menghasilkan nol. Itu akan menjadi kasus underfitting parah , tidak overfitting. Juga tidak ada kesenjangan antara pelatihan dan kesalahan validasi pada kurva pembelajaran, yang menunjukkan bahwa overfitting bukan masalah (kesalahannya tidak nol, skalanya adalah logaritmik)
user20160

0

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.Distribusi variabel yang saya coba prediksi

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.


-1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.