Saya tertarik secara global untuk memaksimalkan fungsi dari banyak ( ) parameter nyata (hasil dari simulasi yang kompleks). Namun, fungsi yang dimaksud relatif mahal untuk dievaluasi, membutuhkan sekitar 2 hari untuk setiap set parameter. Saya membandingkan opsi yang berbeda, dan bertanya-tanya apakah ada yang punya saran.
Saya tahu ada serangkaian metode untuk proses semacam ini yang melibatkan pengembangan fungsi perkiraan dan kemudian memaksimalkannya (mis. Jones et al. "Efisien Global Optimasi Fungsi Kotak Hitam yang Mahal" ). Namun, ini tampaknya relatif terkait dengan kode.
Saya memang memiliki kemampuan untuk menjalankan sejumlah besar simulasi secara paralel (50+). Ini sepertinya menyarankan menggunakan sesuatu seperti algoritma genetika untuk melakukan optimasi ini - karena saya dapat membuat populasi kandidat solusi secepat saya bisa membuatnya.
Berikut adalah pertanyaan saya: 1) Apakah ada yang punya pengalaman dengan implementasi yang tersedia secara bebas dari jenis global solver / rekomendasi ini? 2) Apakah ada alasan untuk memilih atau menghindari algoritma genetika di sini?
Ini adalah masalah fisik, dan percobaan awal saya telah menunjukkan angka perubahan yang cukup baik saat saya mengubah parameter.
MEMPERBARUI:
Terima kasih atas bantuannya! Beberapa detail lagi: Saya tidak memerlukan informasi di luar lokasi maksimal. Simulasi itu deterministik, bukan Monte Carlo, sehingga kerumitan itu bukan masalah besar. Tidak ada batasan atau batasan eksplisit pada parameter. Satu informasi lain yang saya miliki (dan tidak saya sebutkan sebelumnya) adalah rasa ukuran maksimum yang diperlukan. Sementara saya mencari maksimum global, saya juga akan senang dengan apa pun dari skala ini atau lebih besar - saya tidak tahu apakah ini akan memberikan bantuan apa pun. Semoga jika saya melakukan penyaringan lebih sistematis (hypercubes Latin seperti yang disarankan oleh Brian Borchers), ini akan muncul.
sumber
Jawaban:
Algoritma genetika adalah pilihan yang sangat buruk ketika fungsi objektif sangat mahal untuk dievaluasi - metode ini membutuhkan banyak evaluasi fungsi di setiap generasi (yang dapat dibantu oleh paralelisme) dan banyak generasi (yang secara inheren berurutan.) Pada dua hari per generasi, ini akan sangat lambat.
Anda belum menyebutkan dari mana masalah ini berasal. Apakah Anda secara statistik menganalisis permukaan kemungkinan (dalam hal ini Anda akan menginginkan lebih dari sekedar parameter optimal dan nilai objektif) atau hanya mengoptimalkan fungsi tujuan?
Anda belum menyebutkan apakah penghitungan fungsi tujuan tepat atau tidak akurat. Sering kali ketika fungsi objektif dihitung dengan simulasi Monte Carlo, nilainya cukup berisik. Ini dapat menyesatkan banyak algoritma pengoptimalan. Metode permukaan respons membantu mengatasi masalah ini dengan menghaluskan kebisingan.
Anda belum menyebutkan kendala pada parameter. Apakah mereka terikat? Apakah ada batasan linear atau nonlinear di antara parameter?
Kemungkinannya adalah sebagian besar dari 30 parameter Anda tidak terlalu penting untuk masalah tersebut. Saya akan menyarankan menggunakan pendekatan penyaringan desain eksperimental untuk pertama-tama menentukan mana dari 30 parameter yang benar-benar penting dalam optimasi, dan kemudian setelah menetapkan nilai yang wajar untuk parameter yang tidak penting dioptimalkan pada parameter penting. Metode seperti Latin Hypercube Sampling bisa sangat membantu dalam menyaring parameter yang relatif tidak penting. Pada tahap penyaringan ini Anda dapat dengan mudah menggunakan ratusan prosesor.
Setelah mengurangi jumlah parameter ke ukuran yang lebih masuk akal, saya akan menggunakan metode permukaan respons untuk mengoptimalkan parameter yang tersisa. Jika permukaan respons benar-benar multi-modal, dan Anda menggunakan model permukaan respons yang terlalu sederhana (biasanya orang hanya cocok dengan model kuadratik) maka Anda dapat dengan mudah menyesatkan dan kehilangan maksimum global. Hati-hati! Pada tahap ini Anda dapat kembali menggunakan banyak prosesor dengan menggunakan desain eksperimental yang memberikan cakupan ruang parameter yang sangat baik. Cari titik desain di mana model yang dipasang jauh dari nilai yang dihitung - ini merupakan indikasi bahwa permukaan respons tidak berfungsi dengan baik di wilayah itu. Anda mungkin harus membuat permukaan respons di wilayah terpisah dari ruang parameter.
Sebagai langkah terakhir, Anda bisa mulai dengan parameter dari optimasi permukaan respons Anda dan mencoba untuk meningkatkan nilai-nilai parameter yang disaring dengan menyesuaikannya satu per satu (koordinat penurunan.)
Saya akan merekomendasikan rekomendasi DAKOTA sebagai kerangka kerja untuk optimasi semacam ini. Jika Anda akan melakukan pengoptimalan ini hanya sekali saja maka mungkin akan lebih mudah untuk mengatur perhitungan dengan tangan, tetapi jika Anda akan melakukannya berulang kali, maka DAKOTA akan sangat membantu.
sumber
Saya tidak punya pengalaman dengan pemecah masalah semacam ini; beberapa rekan kerja saya telah menggunakannya. DAKOTA tampaknya merupakan paket perangkat lunak yang direkomendasikan untuk tugas-tugas semacam ini. Ini termasuk antarmuka yang memungkinkan pengguna untuk berulang kali mengirimkan pekerjaan ke antrian pengiriman dan menggunakan output untuk studi parameter, analisis sensitivitas, dll. Saya tidak cukup akrab dengannya untuk mengetahui apakah akan mengambil keuntungan dari menjalankan banyak simulasi atau tidak serentak.
Dengan asumsi bahwa parameter Anda kontinu, jika angka jasa berubah lancar saat parameter berubah, maka model pengganti harus melakukan pekerjaan yang wajar untuk menyesuaikan angka jasa, dan informasi turunan pengganti harus membantu untuk menyempurnakan konvergensi. Untuk 30 parameter, metode optimisasi bebas derivatif deterministik juga bermanfaat; di sana lagi, kelancaran akan membantu. Sebaliknya, algoritma genetika tidak akan menggunakan informasi turunan sama sekali, dan seringkali memerlukan penyetelan parameter seperti tingkat mutasi, laju rekombinasi, dan parameter pemilihan untuk mencapai kinerja yang baik. Sebagai pilihan algoritmik, saya akan menggunakan algoritma genetika sebagai fallback, karena saya berharap optimasi pengganti yang dirancang dengan baik atau metode optimisasi bebas derivatif deterministik memiliki perilaku konvergensi yang lebih baik.
sumber
Lihatlah TOMLAB, DAKOTA, dan OpenMDAO untuk optimasi kotak hitam.
Sunting # 3: Optimasi Bayesian sangat mirip dengan EGO:
https://github.com/mwhoffman/pybo
https://github.com/hyperopt/hyperopt
lisensi terbatas:
https://github.com/rmcantin/bayesopt
https://github.com/HIPS/Spearmint
Edit # 2:
Pendekatan pertama adalah membangun metamodel / pengganti (menggunakan kriging / GP) di sekitar fungsi mahal dan menggunakan informasi tambahan ini untuk menemukan titik optimal global lebih cepat dan dengan lebih sedikit evaluasi (EGO).
Pendekatan kedua seperti dalam MDAS, adalah melakukan pencarian langsung dengan beberapa adaptasi pintar pada berbagai tingkatan.
Pendekatan heuristik bersifat genetik / acak dan tanpa jaminan.
Edit # 1:
TOMLAB adalah alat berbasis MATLAB yang memiliki kecepatan / kualitas optimalisasi terbaik menurut kertas Sahinidis. Tetapi ini adalah alat komersial dengan penggunaan korporat yang signifikan. Saya tidak menggunakan ini.
DAKOTA lebih disesuaikan untuk Kuantifikasi Ketidakpastian, selain optimasi umum. Berdasarkan c ++ dan beberapa kode Fortran yang lama. Meskipun di bawah lisensi LGPL dan binari tersedia untuk diunduh, sangat sulit untuk mengkompilasi ulang setidaknya dari pengalaman saya di Win7 dengan GCC atau MSVS / ifort. Memiliki dependensi pada boost, lapack, cmake untuk build. Pada dasarnya ini adalah pembungkus untuk banyak pemecah open source dan beberapa yang komersial. Ini adalah produk SNL dan terintegrasi dengan proyek-proyek lain dari Sandia NL. Saya berhasil mengintegrasikan yang ini daripada beberapa rutinitas IMSL. Makalah Sahinidis merindukan paralelisme masif yang dimungkinkan oleh DAKOTA.
OpenMDAO adalah perangkat lunak desain berbasis optimasi yang dikembangkan di Python oleh NASA di bawah Lisensi APACHE. Saya mencoba ini saat ini.
sumber
Jika Anda tidak mampu membeli 30 berjalan, masing-masing memvariasikan satu parameter, memvariasikannya dalam kelompok:
misalnya, 8 menjalankan masing-masing memvariasikan 4 parameter bersama-sama, kemudian memperbaiki 2 run / 8 parameter terbaik ...
(Saya tidak tahu bagaimana cara menukar info gain vs total runtime; bandit multi-bersenjata ?)
sumber
Berikut ini adalah kode yang memungkinkan untuk mengoptimalkan fungsi kotak hitam yang mahal secara efisien menggunakan CPU multicore.
Deskripsi matematika di balik kode diberikan di sini .
sumber