Pengecekan Gradien Angka: Seberapa dekat cukup dekat?

8

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?

Frobot
sumber

Jawaban:

9

Yang paling dekat yang saya lihat untuk mengatasi ini adalah di tutorial Stanford UFLDL dalam bagian regresi softmax . Menyalin pernyataan kunci:

Norma perbedaan antara gradien numerik dan gradien analitik Anda harus kecil, pada urutan .109

Dengan python kode akan terlihat seperti ini:

norm(gradients - numericalGradients)/norm(gradients + numericalGradients)

di mana gradientsAnda hasil dari turunan dan numericalGradientsmerupakan gradien yang diperkirakan.

cdeterman
sumber
Terima kasih, bagaimana jika gradien saya disimpan dalam matriks array 2D? Setelah saya kurangi 2 matriks dari satu sama lain, bagaimana saya harus mengevaluasi norma dari matriks "perbedaan" yang dihasilkan?
Kari
1
@Kari Saya akan meratakannya ke vektor dan menggunakan kode yang sama seperti ditunjukkan di atas. Misalnya, jika Anda memiliki array numpy, Anda bisa menggunakan flattenmetode ini.
cdeterman
7

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,

f(x+h)=f(x)+hf(x)+h22f(ξ) untuk beberapaξ[x,x+h]

Ini membantu, karena Anda mungkin memperkirakan turunan pertama Anda oleh

f(x)f(x+h)f(xh)2h

dengan beberapa kecil (saya biasanya menggunakan , tapi saya yakin suatu hari saya akan menemukan kasus di mana itu tidak sesuai).h104

Setelah aljabar kecil, kita dapat menggunakan sisa Cauchy untuk melihat bahwa pendekatan numerik kita secara teoritis harus dalam dari .hf(ξ),ξ[xh,x+h]f(x)

Bahkan, Anda dapat mengikatnya dengan , di mana dan ... yang setara dengan , .h(f(ξ1)f(ξ2))ξ1[xh,x]ξ2[x,x+h]h2f(ξ)ξ[xh,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 angkah0f(x+h)f(xh)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 denganhhhf(ξ)0.01h=104 , seharusnya sekitar dengan dengan asumsi ketidakstabilan numerik belum muncul .0.0001h=105

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=104h=105h0

Cliff AB
sumber
5

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(wh)2hh105

  • Pantau fraksi , di mana berada gradien analitik dan adalah gradien yang didekati secara numerik. Biasanya, rentang fraksi yang disukai ini harus .|fa(w)fn(w)|max(|fa(w)|,|fn(w)|)fa(w)fn(w)<102

  • 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=0xhx+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.

Fengchong Wang
sumber