Saya membuat jaringan saraf convolutional dan saya ingin memeriksa bahwa gradien saya dihitung dengan benar menggunakan pengecekan gradien numerik. Pertanyaannya, seberapa dekat cukup dekat?
Fungsi pengecekan saya hanya memuntahkan turunan yang dihitung, turunan yang diperkirakan secara numerik, perbedaan antara keduanya, dan apakah kedua nilai tersebut memiliki tanda yang sama (satu positif dan yang lainnya negatif adalah tidak boleh) untuk masing-masing bobot.
Perhatian utama yang saya miliki adalah bahwa untuk semua lapisan yang sepenuhnya terhubung dan semua lapisan konvolusional kecuali yang pertama, perbedaannya terlihat serupa - 9-13 karakter pertama dari dua angka akan cocok. Kedengarannya cukup bagus, bukan? Tetapi untuk bobot lapisan konvolusional pertama, kadang-kadang saya mendapatkan hingga 12 desimal untuk mencocokkan tetapi juga bisa serendah hanya 3. Apakah itu cukup, atau mungkin ada kesalahan yang mungkin terjadi?
Satu hal yang baik untuk dicatat adalah tanda dari dua nilai selalu cocok yang baik, sehingga jaringan akan selalu bergerak ke arah yang benar, bahkan jika besarnya gerakan sedikit mati. Tapi itu pertanyaannya ... apakah ada kemungkinan tidak aktif?
flatten
metode ini.Teori Latar Belakang yang membantu
Satu fakta kecil yang dapat Anda gunakan untuk membantu memahami apakah turunan numerik dihitung dengan benar atau tidak adalah Cauchy Remainder dari ekspansi Taylor. Itu adalah,
Ini membantu, karena Anda mungkin memperkirakan turunan pertama Anda oleh
dengan beberapa kecil (saya biasanya menggunakan , tapi saya yakin suatu hari saya akan menemukan kasus di mana itu tidak sesuai).h 10−4
Setelah aljabar kecil, kita dapat menggunakan sisa Cauchy untuk melihat bahwa pendekatan numerik kita secara teoritis harus dalam dari .hf′′(ξ),ξ∈[x−h,x+h] f′(x)
Bahkan, Anda dapat mengikatnya dengan , di mana dan ... yang setara dengan , .h(f′′(ξ1)−f′′(ξ2)) ξ1∈[x−h,x] ξ2∈[x,x+h] h2f′′′(ξ) ξ∈[x−h,x+h]
Masalah dalam Praktek
Oke, kami punya teori bagus yang membatasi kesalahan turunan numerik. Tetapi ada dua lubang dalam mencoba secara langsung untuk menggunakan hasil tersebut:
1.) Kami tidak tahu (dan mungkin tidak ingin menghabiskan waktu untuk memperkirakannya)f′′′(x)
2.) karena , menderita ketidakstabilan angkah→0 f(x+h)−f(x−h)2h
Jadi dengan menggunakan apa yang kita ketahui dari awal cara saya memeriksa turunan analitik saya (yang mungkin bukan cara terbaik) adalah saya menulis fungsi turunan numerik sebagai fungsi dari . Jika saya tidak tahu apakah perbedaan antara turunan numerik dan analitik disebabkan oleh kesalahan pengkodean atau hanya perkiraan numerik, saya dapat mengurangi dan melihat apakah turunan numerik saya mendekati turunan analitik saya sebelum menderita ketidakstabilan angka (ketika ini terjadi, perkiraan numerik Anda akan menjadi kurang konsisten karena semakin kecil). Perhatikan bahwa istilah harus menghilang secara kuadrat, jadi jika kesalahan saya sekitar denganh h h f′′′(ξ) 0.01 h=10−4 , seharusnya sekitar dengan dengan asumsi ketidakstabilan numerik belum muncul .0.0001 h=10−5
Sayangnya, tidak ada pedoman yang keras dan cepat untuk selalu menentukan hal-hal ini; itu sangat tergantung pada seberapa stabil fungsi itu (dan maksud saya baik dalam hal stabilitas numerik dan turunan yang lebih tinggi). Tetapi dalam pengalaman saya, saya belum pernah melihat kasus di mana kesalahan dari tidak secara definitif mencapai 0 (yaitu menggunakan memberikan jawaban yang hampir sama dengan ) pada saat ketidakstabilan angka dari menendang.h2f′′′(ξ) h=10−4 h=10−5 h→0
sumber
Silakan merujuk ke tutorial ini http://cs231n.github.io/neural-networks-3/#ensemble . Bagian "Pemeriksaan Gradien" sangat rinci dan bermanfaat.
Seperti yang disarankan oleh gung, saya memasukkan poin utama dari tautan ini:
Gunakan aproksimasi, di mana .f(w+h)−f(w−h)2h h∼10−5
Pantau fraksi , di mana berada gradien analitik dan adalah gradien yang didekati secara numerik. Biasanya, rentang fraksi yang disukai ini harus .|f′a(w)−f′n(w)|max(|f′a(w)|,|f′n(w)|) f′a(w) f′n(w) <10−2
Gunakan presisi ganda sebagai ganti float.
Mind of kink (s) dalam fungsi aktivasi, misalnya, ketika seseorang menggunakan ReLU. Ketika ada ketegaran, seseorang perlu memonitor nilai dan . Jika kedua nilai ini berada di dua sisi kekusutan, seseorang harus mengecualikan pemeriksaan gradien ini.x=0 x−h x+h
Gunakan beberapa titik data.
Jangan melakukan pengecekan gradien pada tahap paling awal dari proses pelatihan.
Pertama periksa model tanpa regularisasi dan kemudian dengan itu.
Matikan dropout dan dropout terbalik saat melakukan pengecekan gradien.
Hanya periksa beberapa dimensi secara acak.
sumber