Biarkan saya menimbang di sini dengan beberapa kata hati-hati, diawali dengan sebuah cerita. Dulu, saya bekerja dengan seorang rekan ketika saya baru memulai. Dia memiliki masalah optimisasi untuk dipecahkan, dengan tujuan yang agak berantakan. Solusinya adalah menghasilkan turunan analitik untuk optimasi.
Masalah yang saya lihat adalah turunan ini buruk. Dihasilkan menggunakan Macsyma, dikonversi ke kode fortran, mereka masing-masing lusinan pernyataan lanjutan. Bahkan, kompiler Fortran menjadi marah pada saat itu, karena melebihi jumlah maksimum pernyataan lanjutan. Sementara kami menemukan bendera yang memungkinkan kami untuk mengatasi masalah itu, ada masalah lain.
Dalam ekspresi panjang, seperti yang umumnya dihasilkan oleh sistem CA, ada risiko pembatalan subtraktif masif. Hitung banyak angka besar, hanya untuk menemukan mereka semua membatalkan satu sama lain untuk menghasilkan angka kecil.
Seringkali derivatif yang dihasilkan secara analitik sebenarnya lebih mahal untuk dievaluasi daripada derivatif yang dihasilkan secara numerik menggunakan perbedaan hingga. Gradien untuk n variabel dapat memakan waktu lebih dari n kali biaya mengevaluasi fungsi objektif Anda. (Anda mungkin dapat menghemat waktu karena banyak istilah dapat digunakan kembali di berbagai turunan, tetapi itu juga akan memaksa Anda untuk melakukan pengkodean tangan secara hati-hati, alih-alih menggunakan ekspresi yang dihasilkan komputer. Dan setiap kali Anda membuat kode matematika tidak menyenangkan ekspresi, probabilitas kesalahan tidak sepele. Pastikan Anda memverifikasi turunan ini untuk akurasi.)
Inti cerita saya adalah ekspresi yang dihasilkan CA ini memiliki masalah sendiri. Yang lucu adalah kolega saya sebenarnya bangga dengan kerumitan masalahnya, bahwa ia jelas memecahkan masalah yang sangat sulit karena aljabarnya begitu jahat. Apa yang saya pikir tidak dia pikirkan adalah apakah aljabar itu benar-benar menghitung hal yang benar, apakah itu melakukannya dengan akurat, dan apakah itu melakukannya dengan efisien.
Seandainya saya menjadi orang senior saat itu dalam proyek ini, saya akan membacakan kepadanya aksi kerusuhan. Kebanggaannya menyebabkan dia menggunakan solusi yang mungkin tidak perlu rumit, bahkan tanpa memeriksa bahwa gradien berbasis perbedaan yang terbatas sudah memadai. Saya berani bertaruh kami telah menghabiskan mungkin satu minggu minggu waktu untuk menjalankan optimasi ini. Paling tidak, saya akan menasihatinya untuk hati-hati menguji gradien yang dihasilkan. Apakah itu akurat? Seberapa akurat itu, dibandingkan dengan turunan beda hingga? Bahkan, ada alat di sekitar hari ini yang juga akan mengembalikan perkiraan kesalahan dalam prediksi turunannya. Ini tentu benar untuk kode diferensiasi adaptif, (turunan) yang saya tulis dalam MATLAB.
Uji kodenya. Verifikasi turunannya.
Tetapi sebelum Anda melakukan APAPUN ini, pertimbangkan apakah skema optimasi lain yang lebih baik adalah sebuah pilihan. Misalnya, jika Anda melakukan pemasangan eksponensial, maka ada peluang yang sangat baik Anda dapat menggunakan kuadrat terkecil non-linier yang dipartisi (kadang-kadang disebut kuadrat terkecil yang dapat dipisah. Saya pikir itulah istilah yang digunakan oleh Seber dan Wild dalam buku mereka.) Idenya adalah untuk memecah set parameter menjadi set intrinsik linier dan intrinsik nonlinier. Gunakan pengoptimalan yang hanya berfungsi pada parameter nonlinear. Mengingat parameter tersebut "diketahui", maka parameter linear intrinsik dapat diperkirakan dengan menggunakan kuadrat terkecil linier sederhana. Skema ini akan mengurangi ruang parameter dalam optimasi. Itu membuat masalah lebih kuat, karena Anda tidak perlu menemukan nilai awal untuk parameter linier. Ini mengurangi dimensi ruang pencarian Anda, sehingga membuat masalah berjalan lebih cepat. Sekali lagi saya berikanalat untuk tujuan ini , tetapi hanya di MATLAB.
Jika Anda menggunakan turunan analitik, beri kode untuk menggunakan kembali istilah. Ini bisa menjadi penghematan waktu yang serius, dan sebenarnya dapat mengurangi bug, menghemat waktu Anda sendiri. Tapi periksa angka-angka itu!
codegen
paket di dalamnya karena dapat menghasilkan kode C atau Fortran yang kompak dan efisien untuk masing-masing atau semua ekspresi secara otomatis.