Saat ini saya sedang mengerjakan implementasi Stochastic Gradient Descent,, SGD
untuk jaring saraf menggunakan back-propagation, dan sementara saya mengerti tujuannya, saya punya beberapa pertanyaan tentang bagaimana memilih nilai untuk tingkat pembelajaran.
- Apakah tingkat pembelajaran terkait dengan bentuk gradien kesalahan, karena menentukan tingkat keturunan?
- Jika demikian, bagaimana Anda menggunakan informasi ini untuk menginformasikan keputusan Anda tentang suatu nilai?
- Jika bukan nilai seperti apa yang harus saya pilih, dan bagaimana saya harus memilihnya?
- Sepertinya Anda ingin nilai-nilai kecil untuk menghindari overshooting, tetapi bagaimana Anda memilih satu sehingga Anda tidak terjebak dalam minimum lokal atau butuh waktu lama untuk turun?
- Apakah masuk akal untuk memiliki tingkat pembelajaran yang konstan, atau haruskah saya menggunakan beberapa metrik untuk mengubah nilainya ketika saya mendekati minimum dalam gradien?
Singkatnya: Bagaimana saya memilih tingkat pembelajaran untuk SGD?
Di bawah ini adalah catatan yang sangat bagus (halaman 12) tentang tingkat pembelajaran dalam Jaring Saraf Tiruan (Back Propagation) oleh Andrew Ng. Anda akan menemukan detail yang berkaitan dengan tingkat pembelajaran.
http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf
Untuk poin ke-4 Anda, Anda benar bahwa biasanya seseorang harus memilih tingkat pembelajaran "seimbang", yang seharusnya tidak melampaui atau bertemu terlalu lambat. Seseorang dapat merencanakan tingkat pembelajaran melalui penurunan fungsi biaya untuk mendiagnosis / menyempurnakan. Dalam praktiknya, Andrew biasanya menggunakan algoritma L-BFGS (disebutkan di halaman 12) untuk mendapatkan tingkat pembelajaran "cukup baik".
sumber
Memilih tingkat pembelajaran adalah contoh dari "masalah-meta" yang dikenal sebagai optimasi hyperparameter . Tingkat pembelajaran terbaik tergantung pada masalah yang dihadapi, serta pada arsitektur model yang dioptimalkan, dan bahkan pada keadaan model dalam proses optimasi saat ini! Bahkan ada paket perangkat lunak yang dikhususkan untuk optimasi hyperparameter seperti spearmint dan hyperopt (hanya beberapa contoh, ada banyak lainnya!).
Terlepas dari optimasi hyperparameter skala penuh, saya ingin menyebutkan satu teknik yang cukup umum untuk memilih tingkat pembelajaran yang belum disebutkan sejauh ini. Simulated annealing adalah teknik untuk mengoptimalkan model di mana seseorang mulai dengan tingkat pembelajaran yang besar dan secara bertahap mengurangi tingkat pembelajaran seiring optimasi berlangsung. Umumnya Anda mengoptimalkan model Anda dengan tingkat pembelajaran yang besar (0,1 atau lebih), dan kemudian secara bertahap mengurangi tingkat ini, sering kali dengan urutan besarnya (jadi 0,01, lalu 0,001, 0,0001, dll.).
Ini dapat dikombinasikan dengan penghentian awal untuk mengoptimalkan model dengan satu tingkat pembelajaran selama kemajuan sedang dibuat, kemudian beralih ke tingkat pembelajaran yang lebih kecil begitu kemajuan tampaknya lambat. Angka belajar yang lebih besar muncul untuk membantu model menemukan wilayah umum, optima skala besar, sementara angka yang lebih kecil membantu model fokus pada satu optimum lokal tertentu.
sumber
Copy-paste dari tesis master saya :
sumber
Tingkat pembelajaran, diubah sebagai "ukuran langkah" selama proses iterasi kami, telah menjadi isu panas selama bertahun-tahun, dan itu akan terus berlanjut.
Ada tiga opsi untuk ukuran langkah dalam perhatian saya:
sementara t menunjukkan angka iterasi saat ini, alpha adalah parameter hiper
sedangkan alpha dan beta adalah parameter hiper, g menunjukkan gradien
atau
Semoga ini bisa membantu Anda, semoga sukses -)
sumber
Jaringan saraf sering dilatih oleh gradient descent pada bobot. Ini berarti pada setiap iterasi kami menggunakan backpropagation untuk menghitung turunan dari fungsi kerugian dengan memperhatikan setiap bobot dan mengurangkannya dari bobot tersebut. Namun, jika Anda benar-benar mencoba itu, bobot akan berubah terlalu banyak setiap iterasi, yang akan membuat mereka "overcorrect" dan kerugian sebenarnya akan meningkat / menyimpang. Jadi dalam praktiknya, orang biasanya melipatgandakan setiap turunan dengan nilai kecil yang disebut "tingkat pembelajaran" sebelum mereka mengurangkannya dari bobot yang sesuai.
Anda juga dapat menganggap fungsi kehilangan jaringan saraf sebagai permukaan, di mana setiap arah yang dapat Anda tempati mewakili nilai bobot. Keturunan gradien seperti mengambil lompatan ke arah saat ini dari lereng, dan tingkat belajar seperti panjang lompatan yang Anda ambil.
sumber
Menambah jawaban David, di fastai adalah tempat saya menemukan konsep menemukan tingkat pembelajaran terbaik untuk data itu, menggunakan arsitektur tertentu.
Tapi benda itu hanya ada di fastai / pytorch. Baru-baru ini seseorang membuat implementasi yang keras .
yang pada gilirannya didasarkan pada makalah ini:
Semoga ini membantu.
sumber
Biarkan saya memberikan pengantar singkat untuk pendekatan lain dalam memilih tingkat pembelajaran, berdasarkan kursus Pembelajaran Mendalam Jeremy Howard 1. Jika Anda ingin menggali lebih dalam, lihat blogpost ini .
Tingkat pembelajaran yang diusulkan dalam kursus Jeremy Howard didasarkan pada cara sistematis untuk mencoba tingkat pembelajaran yang berbeda dan memilih satu yang membuat fungsi kerugian paling turun. Ini dilakukan dengan mengumpankan banyak batch ke metode gradient descent mini-batch, dan meningkatkan laju pembelajaran setiap batch baru yang Anda beri makan ke dalam metode ini. Ketika tingkat belajar sangat kecil, fungsi kerugian akan menurun sangat lambat. Ketika tingkat belajar sangat besar, fungsi kerugian akan meningkat. Di antara kedua rezim ini, ada tingkat belajar yang optimal yang fungsi kerugiannya menurun paling cepat. Ini bisa dilihat pada gambar berikut:
sumber