Saya bertanya-tanya apa perbedaan kasus penggunaan untuk dua algoritma, Koordinat Keturunan dan Gradient Keturunan .
Saya tahu bahwa penurunan koordinat memiliki masalah dengan fungsi yang tidak mulus tetapi digunakan dalam algoritma populer seperti SVM dan LASSO.
Namun penurunan Gradient menurut saya digunakan secara lebih luas, terutama dengan kebangkitan JST, dan untuk banyak tugas pembelajaran mesin lainnya.
Pertanyaan saya adalah: Jenis masalah apa yang cocok satu tetapi tidak yang lain, dan dalam hal apa yang membuat penurunan koordinat cocok untuk SVM dan LASSO, tetapi gradient descent fitting untuk JST?
Bagaimana seharusnya seseorang memilih antara keduanya ketika memilih algoritma optimasi?
Koordinasi penurunan memperbarui satu parameter pada satu waktu, sedangkan penurunan gradien mencoba memperbarui semua parameter sekaligus.
Sulit untuk menentukan dengan tepat kapan satu algoritma akan bekerja lebih baik daripada yang lain. Sebagai contoh, saya sangat terkejut mengetahui bahwa penurunan koordinat adalah hal yang paling baik untuk LASSO. Dan saya bukan satu-satunya; lihat slide 17 .
Dengan itu, ada beberapa fitur yang dapat membuat masalah lebih mudah untuk mengkoordinasikan keturunan:
(1) Pembaruan bersyarat cepat. Jika, karena alasan tertentu, masalah memungkinkan seseorang untuk mengoptimalkan parameter secara individual dengan sangat cepat, koordinat keturunan dapat memanfaatkan ini. Sebagai contoh, seseorang mungkin dapat memperbarui parameter tertentu hanya dengan menggunakan sebagian dari data, sangat mengurangi biaya komputasi dari pembaruan ini. Kasus lain adalah jika ada solusi bentuk tertutup untuk parameter individu, tergantung pada nilai-nilai semua parameter lainnya.
(2) Mode relatif independen untuk parameter. Jika nilai optimal dari satu parameter benar-benar independen dari nilai parameter lainnya, maka satu putaran penurunan koordinat akan mengarah ke solusi (dengan asumsi bahwa setiap pembaruan koordinat menemukan mode saat ini). Di sisi lain, jika mode untuk parameter yang diberikan sangat tergantung pada nilai parameter lainnya, penurunan koordinat sangat mungkin terjadi, dengan pembaruan yang sangat kecil di setiap putaran.
Sayangnya, untuk sebagian besar masalah, (2) tidak berlaku, jadi sangat jarang bahwa penurunan koordinat dapat dibandingkan dengan algoritma alternatif. Saya percaya alasan itu berkinerja baik untuk LASSO adalah bahwa ada banyak trik yang dapat digunakan untuk memberlakukan kondisi (1).
sumber
Saya menyadari bahwa ini adalah pertanyaan lama dan memiliki beberapa jawaban yang sangat bagus. Saya ingin berbagi pengalaman pribadi yang praktis.
Ini sebenarnya banyak bertanya. Dengan gradient descent, seseorang biasanya berurusan dengan kendala melalui fungsi penalti. Ini tidak akan berfungsi. Segera setelah nilai melanggar salah satu kendala ini, kode Anda biasanya akan memunculkan semacam kesalahan numerik. Jadi kita harus berurusan dengan kendala dengan tidak pernah benar-benar mengizinkan algoritma optimasi untuk melewatinya.
Ada banyak transformasi yang dapat Anda terapkan pada masalah Anda untuk memenuhi kendala untuk memungkinkan gradient descent. Namun, jika Anda mencari cara termudah dan paling malas untuk mengimplementasikan ini maka mengoordinasikan penurunan adalah cara yang harus ditempuh:
Untuk orang seperti saya yang bekerja di Python, ini biasanya berarti bahwa saya harus menggunakan tambahan untuk-loop yang memengaruhi kinerja cukup negatif. Keturunan gradien memungkinkan saya untuk menggunakan Numpy yang dioptimalkan kinerja. Orang bisa mendapatkan kecepatan yang sangat baik dengan itu, namun, ini tidak dapat dicapai dengan keturunan koordinat jadi saya biasanya menggunakan beberapa teknik transformasi.
Jadi kesimpulannya adalah bahwa keturunan koordinat adalah pilihan termudah untuk menghadapi kendala yang sangat ketat seperti parameter rate dalam distribusi Poisson. Jika menjadi negatif, kode Anda mengeluh dll.
Saya harap ini menambah sedikit wawasan.
sumber