Apa yang harus saya lakukan ketika jaringan saraf saya tidak belajar?

148

Saya melatih jaringan saraf tetapi kehilangan pelatihan tidak berkurang. Bagaimana saya bisa memperbaikinya?

Saya tidak bertanya tentang overfitting atau regularisasi. Saya bertanya tentang bagaimana menyelesaikan masalah di mana kinerja jaringan saya tidak membaik pada set pelatihan .


Pertanyaan ini sengaja diajukan secara umum sehingga pertanyaan lain tentang cara melatih jaringan saraf dapat ditutup sebagai duplikat dari yang satu ini, dengan sikap bahwa "jika Anda memberi ikan kepada seorang pria, Anda memberinya makan selama sehari, tetapi jika Anda mengajar seorang manusia untuk memancing, Anda bisa memberinya makan selama sisa hidupnya. " Lihat thread Meta ini untuk diskusi: Apa cara terbaik untuk menjawab "jaringan saraf saya tidak berfungsi, tolong perbaiki" pertanyaan?

Jika jaringan saraf Anda tidak menggeneralisasi dengan baik, lihat: Apa yang harus saya lakukan ketika jaringan saraf saya tidak menggeneralisasi dengan baik?

Sycorax
sumber
1
Inilah kasus di mana NN tidak bisa maju. youtu.be/iakFfOmanJU?t=144
Joshua
4
Blog Ivanov " Alasan mengapa Jaringan Saraf Anda tidak berfungsi ", terutama bagian II, III, dan IV, bisa membantu.
user5228

Jawaban:

187

Unit Testing Adalah Teman Anda

Ada pepatah di antara para penulis bahwa "Semua tulisan adalah penulisan ulang" - artinya, sebagian besar tulisan direvisi. Untuk pemrogram (atau setidaknya ilmuwan data) ungkapan itu dapat diucapkan ulang sebagai "Semua pengkodean adalah debugging."

Setiap kali Anda menulis kode, Anda perlu memverifikasi bahwa kode itu berfungsi sebagaimana mestinya. Metode terbaik yang pernah saya temukan untuk memverifikasi kebenaran adalah memecah kode Anda menjadi segmen kecil, dan memverifikasi bahwa setiap segmen berfungsi. Ini dapat dilakukan dengan membandingkan keluaran segmen dengan apa yang Anda ketahui sebagai jawaban yang benar. Ini disebut pengujian unit . Menulis unit test yang baik adalah kunci untuk menjadi ahli statistik / ilmuwan data / ahli pembelajaran mesin / praktisi jaringan saraf yang baik. Tidak ada pengganti.

Anda harus memeriksa bahwa kode Anda bebas dari bug sebelum dapat menyesuaikan kinerja jaringan! Jika tidak, Anda mungkin juga mengatur kursi geladak di RMS Titanic .

Ada dua fitur jaringan saraf yang membuat verifikasi bahkan lebih penting daripada jenis pembelajaran mesin atau model statistik lainnya.

  1. Jaringan saraf bukan algoritma "off-the-shelf" dalam cara yang acak hutan atau regresi logistik. Bahkan untuk jaringan yang sederhana, umpan-maju, tanggung jawab sebagian besar pada pengguna untuk membuat banyak keputusan tentang bagaimana jaringan dikonfigurasi, terhubung, diinisialisasi dan dioptimalkan. Ini berarti menulis kode, dan menulis kode berarti men-debug.

  2. Bahkan ketika kode jaringan saraf dijalankan tanpa memunculkan pengecualian, jaringan masih dapat memiliki bug! Bug-bug ini bahkan mungkin merupakan jenis yang berbahaya di mana jaringan akan berlatih, tetapi terjebak pada solusi yang kurang optimal, atau jaringan yang dihasilkan tidak memiliki arsitektur yang diinginkan. ( Ini adalah contoh perbedaan antara kesalahan sintaksis dan semantik .)

Posting Medium ini , " Bagaimana cara menguji kode pembelajaran mesin ," oleh Chase Roberts membahas pengujian unit untuk model pembelajaran mesin secara lebih rinci. Saya meminjam contoh kode kereta ini dari artikel:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

Apakah Anda melihat kesalahannya? Banyak operasi yang berbeda tidak benar - benar digunakan karena hasil sebelumnya terlalu banyak ditulis dengan variabel baru. Menggunakan blok kode ini dalam jaringan masih akan melatih dan bobot akan diperbarui dan kehilangan bahkan mungkin berkurang - tetapi kode pasti tidak melakukan apa yang dimaksudkan. (Penulis juga tidak konsisten tentang menggunakan tanda kutip tunggal atau ganda tapi itu murni gaya.)

Kesalahan pemrograman paling umum yang berkaitan dengan jaringan saraf adalah

  • Variabel dibuat tetapi tidak pernah digunakan (biasanya karena kesalahan copy-paste);
  • Ekspresi untuk pembaruan gradien salah;
  • Pembaruan berat tidak diterapkan;
  • Fungsi kerugian tidak diukur pada skala yang benar (misalnya, kehilangan lintas-entropi dapat dinyatakan dalam probabilitas atau log)
  • Kehilangan tidak sesuai untuk tugas (misalnya, menggunakan kerugian lintas-entropi kategoris untuk tugas regresi).

Merangkak Sebelum Anda Berjalan; Berjalan Sebelum Menjalankan

Jaringan saraf yang luas dan dalam, dan jaringan saraf dengan kabel eksotis, adalah Hot Thing saat ini dalam pembelajaran mesin. Tetapi jaringan-jaringan ini tidak sepenuhnya terbentuk; desainer mereka dibangun untuk mereka dari unit yang lebih kecil. Pertama, bangun jaringan kecil dengan satu lapisan tersembunyi dan verifikasi apakah itu berfungsi dengan benar. Kemudian secara bertahap tambahkan kompleksitas model tambahan, dan verifikasi bahwa masing-masing berfungsi dengan baik.

  • Terlalu sedikit neuron dalam suatu lapisan dapat membatasi representasi yang dipelajari jaringan, yang menyebabkan kurang pas. Terlalu banyak neuron dapat menyebabkan pemasangan berlebihan karena jaringan akan "menghafal" data pelatihan.

    Bahkan jika Anda dapat membuktikan bahwa secara matematis, hanya sejumlah kecil neuron yang diperlukan untuk memodelkan masalah, sering kali memiliki "beberapa" neuron membuat pengoptimal lebih mudah menemukan konfigurasi "baik". (Tapi saya tidak berpikir ada orang yang sepenuhnya mengerti mengapa hal ini terjadi.) Saya memberikan contoh tentang hal ini dalam konteks masalah XOR di sini: Tidakkah iterasi saya diperlukan untuk melatih NN untuk XOR dengan MSE <0,001 terlalu tinggi? .

  • Memilih jumlah lapisan tersembunyi memungkinkan jaringan mempelajari abstraksi dari data mentah. Pembelajaran mendalam adalah hal yang populer akhir-akhir ini, dan jaringan dengan banyak lapisan telah menunjukkan hasil yang mengesankan. Tetapi menambahkan terlalu banyak lapisan tersembunyi dapat membuat overfitting risiko atau membuatnya sangat sulit untuk mengoptimalkan jaringan.

  • Memilih kabel jaringan yang pintar dapat melakukan banyak pekerjaan untuk Anda. Apakah sumber data Anda setuju dengan arsitektur jaringan khusus? Jaringan saraf convolutional dapat mencapai hasil yang mengesankan pada sumber data, gambar atau audio yang "terstruktur". Jaringan saraf berulang dapat bekerja dengan baik pada tipe data sekuensial, seperti bahasa alami atau data deret waktu. Koneksi residual dapat meningkatkan jaringan umpan-maju yang dalam.

Pelatihan Jaringan Saraf Seperti Memetik Kunci

Untuk mencapai hasil terbaik, atau bahkan hanya hasil yang bagus, Anda harus mengatur semua bagian yang dikonfigurasikan untuk bekerja sama dengan baik . Menyiapkan konfigurasi jaringan saraf yang benar-benar dipelajari sama seperti mengambil kunci: semua bagian harus berbaris tepat. Sama seperti itu tidak cukup untuk memiliki satu gelas di tempat yang tepat, juga tidak cukup untuk hanya memiliki arsitektur, atau hanya pengoptimal, diatur dengan benar.

Pilihan konfigurasi penyetelan tidak sesederhana seperti mengatakan bahwa satu jenis pilihan konfigurasi (mis. Tingkat pembelajaran) lebih atau kurang penting daripada yang lain (misalnya jumlah unit), karena semua pilihan ini berinteraksi dengan semua pilihan lain, jadi satu pilihan dapat dilakukan dengan baik dalam kombinasi dengan pilihan lain yang dibuat di tempat lain .

Ini adalah daftar opsi konfigurasi yang tidak lengkap yang bukan juga opsi regularisasi atau opsi optimisasi numerik.

Semua topik ini adalah bidang penelitian aktif.

Optimalisasi non-cembung sulit

Fungsi objektif dari jaringan saraf hanya cembung ketika tidak ada unit tersembunyi, semua aktivasi linier, dan matriks desain adalah peringkat penuh - karena konfigurasi ini secara identik merupakan masalah regresi biasa.

Dalam semua kasus lain, masalah optimisasi adalah non-cembung, dan optimasi non-cembung sulit. Tantangan pelatihan jaringan saraf sudah diketahui (lihat: Mengapa sulit untuk melatih jaringan saraf yang dalam? ). Selain itu, jaringan saraf memiliki sejumlah besar parameter, yang membatasi kita hanya pada metode orde pertama (lihat: Mengapa metode Newton tidak banyak digunakan dalam pembelajaran mesin? ). Ini adalah bidang penelitian yang sangat aktif.

  • Menyetel tingkat pembelajaran terlalu besar akan menyebabkan pengoptimalan menyimpang, karena Anda akan melompat dari satu sisi "jurang" ke sisi lainnya. Pengaturan ini terlalu kecil akan mencegah Anda membuat kemajuan nyata, dan mungkin memungkinkan kebisingan yang melekat dalam SGD membanjiri perkiraan gradien Anda.

  • Kliping gradien mengubah skala norma gradien jika berada di atas ambang batas. Dulu saya berpikir bahwa ini adalah parameter set-and-forget, biasanya pada 1,0, tetapi saya menemukan bahwa saya bisa membuat model bahasa LSTM secara dramatis lebih baik dengan menetapkannya ke 0,25. Saya tidak tahu mengapa itu terjadi.

  • Penjadwalan tingkat pembelajaran dapat mengurangi tingkat pembelajaran selama pelatihan. Dalam pengalaman saya, mencoba menggunakan penjadwalan sangat mirip dengan regex : ini menggantikan satu masalah ("Bagaimana saya bisa belajar untuk melanjutkan setelah zaman tertentu?") Dengan dua masalah ("Bagaimana saya bisa belajar untuk melanjutkan setelah zaman tertentu ? "dan" Bagaimana saya memilih jadwal yang baik? "). Orang lain bersikeras bahwa penjadwalan sangat penting. Saya akan membiarkan Anda memutuskan.

  • Memilih ukuran minibatch yang baik dapat mempengaruhi proses pembelajaran secara tidak langsung, karena mini-batch yang lebih besar cenderung memiliki varian yang lebih kecil ( ) daripada mini-batch yang lebih kecil. Anda ingin mini-batch cukup besar untuk menjadi informatif tentang arah gradien, tetapi cukup kecil sehingga SGD dapat mengatur jaringan Anda.

  • Ada sejumlah varian pada penurunan gradien stokastik yang menggunakan momentum, tingkat pembelajaran adaptif, pembaruan Nesterov dan sebagainya untuk meningkatkan SGD vanilla. Merancang pengoptimal yang lebih baik sangat banyak bidang penelitian aktif. Beberapa contoh:

  • Ketika pertama kali keluar, pengoptimal Adam menghasilkan banyak minat. Tetapi beberapa penelitian baru-baru ini menemukan bahwa SGD dengan momentum dapat mengungguli metode gradien adaptif untuk jaringan saraf. " Nilai Marginal dari Metode Gradien Adaptif dalam Pembelajaran Mesin " oleh Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht

  • Tetapi di sisi lain, makalah ini baru-baru ini mengusulkan pengoptimal tingkat pembelajaran adaptif baru yang seharusnya menutup kesenjangan antara metode tingkat adaptif dan SGD dengan momentum. " Menutup Celah Generalisasi Metode Gradien Adaptif dalam Pelatihan Jaringan Saraf Tiruan " oleh Jinghui Chen, Quanquan Gu

    Metode gradien adaptif, yang mengadopsi informasi gradien historis untuk secara otomatis menyesuaikan tingkat pembelajaran, telah diamati untuk menggeneralisasi lebih buruk daripada stochastic gradient descent (SGD) dengan momentum dalam pelatihan jaringan saraf yang dalam. Ini meninggalkan cara untuk menutup kesenjangan generalisasi metode gradien adaptif masalah terbuka. Dalam karya ini, kami menunjukkan bahwa metode gradien adaptif seperti Adam, Amsgrad, kadang-kadang "terlalu beradaptasi". Kami merancang algoritma baru, yang disebut metode estimasi momentum adaptif sebagian (Padam), yang menyatukan Adam / Amsgrad dengan SGD untuk mencapai yang terbaik dari kedua dunia. Eksperimen pada tolok ukur standar menunjukkan bahwa Padam dapat mempertahankan laju konvergensi cepat sebagai Adam / Amsgrad sambil menggeneralisasi dan SGD dalam melatih jaringan saraf yang dalam.

Normalisasi

Skala data dapat membuat perbedaan besar dalam pelatihan.

Regularisasi

Memilih dan menyelaraskan pengaturan jaringan adalah bagian penting dari membangun model yang menggeneralisasi dengan baik (yaitu, model yang tidak sesuai dengan data pelatihan). Namun, pada saat itu jaringan Anda sedang berjuang untuk mengurangi hilangnya data pelatihan - ketika jaringan tidak belajar - regularisasi dapat mengaburkan apa masalahnya.

Ketika jaringan saya tidak belajar, saya mematikan semua regularisasi dan memverifikasi bahwa jaringan yang tidak diatur berfungsi dengan benar. Lalu saya menambahkan setiap bagian regularisasi kembali, dan memverifikasi bahwa masing-masing bekerja di sepanjang jalan.

Taktik ini dapat menunjukkan dengan tepat di mana beberapa regularisasi mungkin tidak ditetapkan dengan baik. Beberapa contohnya adalah

Simpan Buku Catatan Eksperimen

Ketika saya mengatur jaringan saraf, saya tidak membuat kode pengaturan parameter apa pun. Sebagai gantinya, saya melakukannya dalam file konfigurasi (mis., JSON) yang dibaca dan digunakan untuk mengisi detail konfigurasi jaringan saat runtime. Saya menyimpan semua file konfigurasi ini. Jika saya melakukan modifikasi parameter, saya membuat file konfigurasi baru. Akhirnya, saya menambahkan sebagai komentar semua kerugian per-zaman untuk pelatihan dan validasi.

Alasan mengapa saya begitu obsesif untuk mempertahankan hasil lama adalah karena ini membuatnya sangat mudah untuk kembali dan meninjau eksperimen sebelumnya. Ini juga lindung nilai terhadap kesalahan mengulangi percobaan buntu yang sama. Secara psikologis, juga memungkinkan Anda melihat kembali dan mengamati "Nah, proyek mungkin tidak di mana saya ingin menjadi hari ini, tapi saya membuat kemajuan dibandingkan ke tempat saya minggu yang lalu."k

Sebagai contoh, saya ingin belajar tentang model bahasa LSTM, jadi saya memutuskan untuk membuat bot Twitter yang menulis tweet baru sebagai tanggapan terhadap pengguna Twitter lainnya. Saya mengerjakan ini di waktu senggang saya, antara sekolah pascasarjana dan pekerjaan saya. Butuh waktu sekitar satu tahun, dan saya mengulangi sekitar 150 model yang berbeda sebelum sampai ke model yang melakukan apa yang saya inginkan: menghasilkan teks berbahasa Inggris baru yang (semacam) masuk akal. (Salah satu poin penting, dan sebagian alasan mengapa diperlukan begitu banyak upaya, adalah bahwa itu tidak cukup untuk hanya mendapatkan kehilangan sampel yang rendah, karena model awal yang kehilangan data awal telah berhasil menghafal data pelatihan, jadi itu hanya mereproduksi blok teks erat kata demi kata dalam konfirmasi - butuh beberapa penyesuaian untuk membuat model lebih spontan dan masih memiliki kehilangan rendah.)

Sycorax
sumber
11
Banyak saran bagus di sana. Sangat menarik berapa banyak komentar Anda mirip dengan komentar yang telah saya buat (atau pernah dilihat orang lain) sehubungan dengan debugging estimasi parameter atau prediksi untuk model kompleks dengan skema pengambilan sampel MCMC. (Misalnya, kode tersebut tampaknya berfungsi ketika tidak diimplementasikan dengan benar.)
Glen_b
11
@ Glen_b Saya tidak berpikir praktik terbaik pengkodean menerima penekanan yang cukup di sebagian besar statistik / kurikulum pembelajaran mesin yang mengapa saya sangat menekankan hal itu. Saya telah melihat sejumlah posting NN di mana OP meninggalkan komentar seperti "oh saya menemukan bug sekarang berfungsi."
Sycorax
7
Saya mengajar pemrograman untuk mata kuliah ilmu data dalam python, dan kami benar-benar melakukan fungsi dan pengujian unit pada hari pertama, sebagai konsep utama. Melawan pertarungan yang bagus.
Matthew Drury
8
+1 untuk "Semua pengkodean sedang debug". Saya kagum betapa banyak poster di SO yang berpikir bahwa coding adalah latihan sederhana yang hanya membutuhkan sedikit usaha; yang mengharapkan kode mereka berfungsi dengan benar saat pertama kali menjalankannya; dan yang tampaknya tidak dapat melanjutkan ketika tidak. Yang lucu adalah bahwa mereka setengah benar: coding itu mudah - tetapi pemrogramannya sulit.
Bob Jarvis
41

Jawaban yang diposting sangat bagus, dan saya ingin menambahkan "Cek Sanitas" yang sangat membantu saya di masa lalu.

1) Latih model Anda pada satu titik data tunggal. Jika ini berhasil, latihlah pada dua input dengan output yang berbeda.

Ini memverifikasi beberapa hal. Pertama, ini dengan cepat menunjukkan kepada Anda bahwa model Anda dapat belajar dengan memeriksa apakah model Anda dapat menyesuaikan data Anda. Dalam kasus saya, saya terus-menerus membuat kesalahan konyol melakukan Dense(1,activation='softmax')vs Dense(1,activation='sigmoid')untuk prediksi biner, dan yang pertama memberikan hasil sampah.

Jika model Anda tidak dapat menyesuaikan beberapa poin data, maka itu terlalu kecil (yang tidak mungkin pada zaman sekarang), atau ada sesuatu yang salah dalam strukturnya atau algoritma pembelajarannya.

2) Perhatikan kerugian awal Anda.

Melanjutkan contoh biner, jika data Anda adalah 30% 0 dan 70% 1, maka kerugian awal yang diperkirakan sekitar . Ini karena model Anda harus mulai mendekati menebak secara acak.L=0.3ln(0.5)0.7ln(0.5)0.7

Sering kali Anda akan melihat hilangnya sesuatu yang konyol, seperti 6.5. Secara konseptual ini berarti bahwa output Anda sangat jenuh, misalnya menuju 0. Misalnya , jadi jika Anda melihat kerugian yang lebih besar dari 1, kemungkinan Anda Modelnya sangat miring. Ini biasanya terjadi ketika berat jaringan saraf Anda tidak seimbang dengan benar, terutama lebih dekat ke softmax / sigmoid. Jadi ini akan memberi tahu Anda jika inisialisasi Anda buruk.0.3ln(0.99)0.7ln(0.01)=3.2

Anda dapat mempelajari ini lebih lanjut dengan membuat model Anda memprediksi beberapa ribu contoh, dan kemudian membuat histogram output. Ini sangat berguna untuk memeriksa apakah data Anda dinormalisasi dengan benar. Sebagai contoh, jika Anda mengharapkan output Anda cenderung condong ke 0, mungkin ide yang baik untuk mengubah output yang Anda harapkan (data pelatihan Anda) dengan mengambil akar kuadrat dari output yang diharapkan. Ini akan menghindari masalah gradien untuk sigmoids jenuh, pada output.

3) Generalisasi output model Anda ke debug

Sebagai contoh, bayangkan Anda menggunakan LSTM untuk membuat prediksi dari data deret waktu. Mungkin dalam contoh Anda, Anda hanya peduli dengan prediksi terbaru, jadi LSTM Anda menghasilkan nilai tunggal dan bukan berurutan. Ganti LSTM untuk mengembalikan prediksi di setiap langkah (dalam keras, ini return_sequences=True). Kemudian Anda dapat melihat output kondisi tersembunyi Anda setelah setiap langkah dan memastikan mereka benar-benar berbeda. Aplikasi ini adalah untuk memastikan bahwa ketika Anda menyembunyikan urutan Anda (yaitu menambahkannya dengan data untuk membuat mereka sama panjang), LSTM dengan benar mengabaikan data Anda yang disembunyikan. Tanpa menggeneralisasi model Anda, Anda tidak akan pernah menemukan masalah ini .

4) Lihatlah lapisan individual

Tensorboard menyediakan cara yang berguna untuk memvisualisasikan output layer Anda . Ini dapat membantu memastikan bahwa input / output dinormalisasi dengan benar di setiap lapisan. Itu juga dapat menangkap aktivasi kereta. Anda juga dapat meminta hasil lapisan dalam keras pada serangkaian prediksi, dan kemudian mencari lapisan yang memiliki aktivasi miring yang mencurigakan (baik semua 0, atau semua bukan nol).

5) Bangun model yang lebih sederhana dulu

Anda telah memutuskan bahwa pendekatan terbaik untuk menyelesaikan masalah Anda adalah dengan menggunakan CNN yang dikombinasikan dengan detektor kotak pembatas, yang selanjutnya memproses pemangkasan gambar dan kemudian menggunakan LSTM untuk menggabungkan semuanya. Butuh 10 menit hanya untuk GPU Anda untuk menginisialisasi model Anda.

Alih-alih, buat kumpulan data palsu (bentuk yang sama), dan pisahkan model Anda menjadi beberapa komponen. Kemudian buat model boneka di tempat masing-masing komponen ("CNN" Anda bisa menjadi konvolusi 2x2 20 langkah, LSTM dengan hanya 2 unit tersembunyi). Ini akan membantu Anda memastikan bahwa struktur model Anda sudah benar dan tidak ada masalah yang asing. Saya berjuang untuk sementara dengan model seperti itu, dan ketika saya mencoba versi yang lebih sederhana, saya menemukan bahwa salah satu layer tidak terselubung dengan benar karena bug yang keras. Anda dapat dengan mudah (dan dengan cepat ) meminta lapisan model internal dan melihat apakah Anda telah mengatur grafik Anda dengan benar.

6) Standarisasi Versi Preprocessing dan Paket Anda

Jaringan saraf khususnya sangat sensitif terhadap perubahan kecil dalam data Anda. Sebagai contoh, dua paket pemuatan gambar yang populer adalah cv2dan PIL. Hanya dengan membuka JPEG, kedua paket ini akan menghasilkan gambar yang sedikit berbeda . Perbedaannya biasanya sangat kecil, tetapi kadang-kadang Anda akan melihat penurunan kinerja model karena hal-hal semacam ini. Itu juga membuat debugging mimpi buruk: Anda mendapat skor validasi selama pelatihan, dan kemudian Anda menggunakan loader yang berbeda dan mendapatkan akurasi yang berbeda pada dataset darn yang sama.

Jadi, jika Anda mengunduh model seseorang dari github, perhatikan baik-baik preprosesnya. Loader gambar apa yang mereka gunakan? Apa rutinitas preprocessing gambar yang mereka gunakan? Saat mengubah ukuran gambar, interpolasi apa yang mereka gunakan? Apakah mereka pertama kali mengubah ukuran dan kemudian menormalkan gambar? Atau sebaliknya? Apa urutan saluran untuk gambar RGB?

Cara teraman dari standarisasi paket adalah dengan menggunakan requirements.txtfile yang menguraikan semua paket Anda seperti pada pengaturan sistem pelatihan Anda, hingga ke keras==2.1.5nomor versi. Secara teori, menggunakan Docker bersama dengan GPU yang sama seperti pada sistem pelatihan Anda kemudian akan menghasilkan hasil yang sama.

Alex R.
sumber
7
(+1) Memeriksa kerugian awal adalah saran yang bagus. Saya menyesal telah meninggalkan jawaban saya.
Sycorax
7
Memastikan bahwa model Anda dapat dikenakan adalah ide yang bagus. Saya begitu terbiasa berpikir tentang overfitting sebagai kelemahan yang saya tidak pernah berpikir secara eksplisit (sampai Anda menyebutkannya) bahwa kemampuan untuk berpakaian sebenarnya adalah kekuatan.
John Coleman
15

Jangan latih jaringan saraf untuk memulainya!

Semua jawaban bagus, tetapi ada satu hal yang harus disebutkan: apakah ada yang bisa dipelajari dari data Anda? (yang dapat dianggap sebagai semacam pengujian).

Jika label yang Anda coba prediksi independen dari fitur Anda, maka kemungkinan kerugian pelatihan akan berkurang.

Alih-alih, mulailah mengkalibrasi regresi linier, hutan acak (atau metode apa pun yang Anda suka yang memiliki hiperparameter rendah, dan yang perilakunya dapat Anda pahami).

Kemudian, jika Anda mencapai kinerja yang layak pada model ini (lebih baik daripada menebak secara acak), Anda dapat mulai menyetel jaringan saraf (dan jawaban @Sycorax akan menyelesaikan sebagian besar masalah).

RUser4512
sumber
5
Saya setuju dengan jawaban ini. Jaringan saraf dan bentuk ML lainnya "sangat panas sekarang". Seringkali bentuk-bentuk regresi yang sederhana diabaikan. Juga, ketika datang untuk menjelaskan model Anda, seseorang akan datang dan bertanya "apa efek pada hasilnya?" dan yang bisa Anda lakukan hanyalah mengangkat bahu. Hanya lihat solusi Machine Learning ketika teknik yang lebih sederhana telah gagal Anda. xk
Ingolifs
11

Pada intinya, alur kerja dasar untuk melatih model NN / DNN kurang lebih selalu sama:

  1. mendefinisikan arsitektur NN (berapa banyak lapisan, jenis lapisan apa, koneksi antar lapisan, fungsi aktivasi, dll.)

  2. baca data dari beberapa sumber (Internet, database, satu set file lokal, dll.), lihat beberapa sampel (untuk memastikan impor telah berjalan dengan baik) dan lakukan pembersihan data jika diperlukan. Langkah ini tidak sepele seperti yang biasanya diasumsikan orang. Alasannya adalah bahwa untuk DNN, kami biasanya berurusan dengan set data raksasa, beberapa urutan besarnya lebih besar dari yang biasa kami lakukan, ketika kami memasukkan model statistik parametrik nonlinier yang lebih standar (secara teori NN termasuk dalam keluarga ini).

  3. menormalkan atau menstandarkan data dalam beberapa cara. Karena NN adalah model nonlinier, normalisasi data dapat memengaruhi tidak hanya stabilitas numerik, tetapi juga waktu pelatihan, dan keluaran NN (fungsi linier seperti normalisasi tidak berubah dengan fungsi hierarki nonlinier).

  4. pisahkan data dalam pelatihan / validasi / set tes, atau dalam beberapa lipatan jika menggunakan validasi silang.

  5. melatih jaringan saraf, sementara pada saat yang sama mengendalikan kerugian pada set validasi. Di sini Anda dapat menikmati kesenangan yang memilukan dari optimasi non-cembung, di mana Anda tidak tahu apakah ada solusi, jika ada beberapa solusi, yang merupakan solusi terbaik dalam hal kesalahan generalisasi dan seberapa dekat Anda dengan saya t. Perbandingan antara kehilangan pelatihan dan kurva kehilangan validasi memandu Anda, tentu saja, tetapi jangan meremehkan sikap keras dari NN (dan terutama DNN): mereka sering menunjukkan (mungkin lambat) penurunan pelatihan / kehilangan validasi bahkan ketika Anda memiliki bug yang melumpuhkan dalam kode Anda.

  6. Periksa akurasi pada set tes, dan buat beberapa plot / tabel diagnostik.

  7. Kembali ke poin 1 karena hasilnya tidak bagus. Ulangi mual iklan .

Tentu saja detail akan berubah berdasarkan kasus penggunaan khusus, tetapi dengan pemikiran kasar ini, kita dapat memikirkan apa yang lebih mungkin salah.

Pemeriksaan Arsitektur Dasar

Ini bisa menjadi sumber masalah. Biasanya saya melakukan pemeriksaan pendahuluan:

  • mencari arsitektur sederhana yang berfungsi dengan baik pada masalah Anda (misalnya, MobileNetV2 dalam hal klasifikasi gambar) dan menerapkan inisialisasi yang sesuai (pada tingkat ini, acak biasanya akan dilakukan). Jika ini melatih dengan benar pada data Anda, setidaknya Anda tahu bahwa tidak ada masalah mencolok dalam kumpulan data. Jika Anda tidak dapat menemukan arsitektur yang sederhana dan teruji yang berfungsi dalam kasus Anda, pikirkan baseline sederhana . Misalnya classifier Naif Bayes untuk klasifikasi (atau bahkan hanya mengklasifikasi kelas yang paling umum), atau model ARIMA untuk perkiraan deret waktu

  • Buat tes unit. Mengabaikan hal ini (dan penggunaan Notebook Jupyter yang berdarah) biasanya merupakan akar permasalahan dalam kode NN yang saya minta untuk ditinjau, terutama ketika model tersebut seharusnya digunakan dalam produksi. Karena jawaban yang paling banyak dipilih sudah mencakup tes unit, saya hanya akan menambahkan bahwa ada perpustakaan yang mendukung pengembangan tes unit untuk NN (sayangnya, hanya di Tensorflow).

Perlengkapan latihan

Periksa ulang data input Anda. Lihat apakah Anda membalik set pelatihan dan menguji label set, misalnya (terjadi pada saya sekali -___-), atau jika Anda mengimpor file yang salah. Lihatlah beberapa sampel input, dan label terkait, dan pastikan semuanya masuk akal. Periksa apakah data yang dinormalkan benar-benar dinormalisasi (lihat kisarannya). Juga, dataset dunia nyata kotor: untuk klasifikasi, mungkin ada tingkat kebisingan label yang tinggi (sampel memiliki label kelas yang salah) atau untuk perkiraan deret waktu multivarian, beberapa komponen deret waktu mungkin memiliki banyak data yang hilang ( Saya telah melihat angka setinggi 94% untuk beberapa input).

Urutan di mana set pelatihan diumpankan ke jaring selama pelatihan mungkin memiliki efek. Coba acak acak set pelatihan ( tanpa memutus hubungan antara input dan output ) dan lihat apakah kehilangan pelatihan turun.

Akhirnya, cara terbaik untuk memeriksa apakah Anda memiliki masalah set pelatihan adalah dengan menggunakan set pelatihan lain. Jika Anda melakukan klasifikasi gambar, alih-alih gambar yang Anda kumpulkan, gunakan dataset standar seperti CIFAR10 atau CIFAR100 (atau ImageNet, jika Anda mampu melatihnya). Kumpulan data ini telah diuji dengan baik: jika kehilangan pelatihan Anda turun di sini tetapi tidak pada kumpulan data asli Anda, Anda mungkin memiliki masalah dalam kumpulan data.

Lakukan Tes Emas

Ada dua tes yang saya sebut Tes Emas, yang sangat berguna untuk menemukan masalah di NN yang tidak melatih:

  • kurangi set pelatihan menjadi 1 atau 2 sampel, dan latih untuk ini. NN harus segera mengganti set pelatihan, mencapai akurasi 100% pada set pelatihan dengan sangat cepat, sedangkan akurasi pada set validasi / tes akan menjadi 0%. Jika ini tidak terjadi, ada bug dalam kode Anda.

  • tes sebaliknya: Anda mempertahankan set pelatihan penuh, tetapi Anda mengocok label. Satu-satunya cara NN dapat belajar sekarang adalah dengan menghafal set pelatihan, yang berarti bahwa kehilangan pelatihan akan menurun sangat lambat, sedangkan kehilangan tes akan meningkat dengan sangat cepat. Secara khusus, Anda harus mencapai kehilangan kesempatan acak pada set tes . Ini berarti bahwa jika Anda memiliki 1000 kelas, Anda harus mencapai akurasi 0,1%. Jika Anda tidak melihat perbedaan antara kehilangan pelatihan sebelum dan setelah pengocokan label, ini berarti bahwa kode Anda bermasalah (ingat bahwa kami telah memeriksa label pelatihan yang diatur pada langkah sebelumnya).

Pastikan metrik pelatihan Anda masuk akal

Akurasi (kerugian 0-1) adalah metrik jelek jika Anda memiliki ketidakseimbangan kelas yang kuat. Cobalah sesuatu yang lebih bermakna seperti kehilangan lintas-entropi: Anda tidak hanya ingin mengklasifikasikan dengan benar, tetapi Anda ingin mengklasifikasikan dengan akurasi tinggi.

Bawa senjata besar

Jika tidak ada yang membantu, sekarang saatnya untuk mulai mengutak-atik hyperparameter. Ini adalah bagian yang paling buruk dari pelatihan NN, tetapi ini adalah model raksasa dan tidak dapat diidentifikasi yang parameternya cocok dengan menyelesaikan optimasi yang tidak cembung, sehingga iterasi ini seringkali tidak dapat dihindari.

  • coba pengoptimal yang berbeda: kereta SGD lebih lambat, tetapi mengarah ke kesalahan generalisasi yang lebih rendah, sementara Adam melatih lebih cepat, tetapi kehilangan pengujian terhenti pada nilai yang lebih tinggi
  • coba kurangi ukuran bets
  • tingkatkan tingkat pembelajaran pada awalnya, dan kemudian busuk, atau gunakan tingkat pembelajaran siklik
  • tambahkan layer
  • tambahkan unit tersembunyi
  • menghapus regularisasi secara bertahap (mungkin beralih norma batch untuk beberapa layer). Kehilangan pelatihan sekarang harus berkurang, tetapi kehilangan pengujian dapat meningkat.
  • memvisualisasikan distribusi bobot dan bias untuk setiap lapisan. Saya tidak pernah sampai di sini, tetapi jika Anda menggunakan BatchNorm, Anda akan mengharapkan kira-kira distribusi normal standar. Lihat apakah norma bobot meningkat secara abnormal dengan zaman.
  • jika Anda mendapatkan beberapa kesalahan pada waktu pelatihan, google kesalahan itu . Saya terbuang suatu pagi ketika mencoba untuk memperbaiki arsitektur yang berfungsi dengan baik, hanya untuk mengetahui bahwa versi Keras yang telah saya instal memiliki dukungan multi-buggy dan saya harus memperbaruinya. Terkadang saya harus melakukan yang sebaliknya (menurunkan versi paket).
  • perbarui CV Anda dan mulailah mencari pekerjaan yang berbeda :-)
DeltaIV
sumber
+1, tapi "Notebook Jupyter berdarah"? Mau mengomentari itu? :)
amoeba
2
Inilah mengapa saya membenci Notebook Jupyter . TL; DR: keadaan tersembunyi, diffing adalah masalah, masalah keamanan dan mendorong praktik pemrograman yang buruk, seperti tidak menggunakan tes unit / regresi / integrasi. Pelatihan NN sudah cukup sulit, tanpa orang lupa tentang dasar-dasar pemrograman.
DeltaIV
2
Saya mungkin terlalu negatif, tetapi terus terang saya sudah cukup dengan orang-orang yang mengkloning Jupyter Notebooks dari GitHub, berpikir itu akan menjadi hitungan menit untuk mengadaptasi kode ke case use mereka dan kemudian datang kepada saya mengeluh bahwa tidak ada yang berhasil. Demi cripes, dapatkan IDE nyata seperti PyCharm atau VisualStudio Code dan buat kode terstruktur dengan baik, daripada memasak Notebook! Terutama jika Anda berencana untuk mengirimkan model ke produksi, itu akan membuat banyak hal lebih mudah.
DeltaIV
2
Lol. 'Notebook Jupyter' dan 'unit testing' anti-berkorelasi.
Sycorax
2
(+1) Ini adalah artikel yang bagus. Saran untuk tes pengacakan adalah cara yang sangat bagus untuk mendapatkan jaringan yang disadap.
Sycorax
6

Jika model tidak belajar, ada kemungkinan yang layak bahwa backpropagation Anda tidak berfungsi. Tetapi ada begitu banyak hal yang bisa salah dengan model kotak hitam seperti Neural Network, ada banyak hal yang perlu Anda periksa. Saya pikir Sycorax dan Alex keduanya memberikan jawaban komprehensif yang sangat baik. Hanya ingin menambahkan satu teknik yang belum dibahas.

ϵ

Anthony Lei
sumber