Saya mengoptimalkan fungsi 10-20 variabel. Berita buruknya adalah bahwa setiap evaluasi fungsi mahal, kira-kira 30 menit dari perhitungan serial. Kabar baiknya adalah bahwa saya memiliki cluster dengan beberapa lusin node komputasi yang saya miliki.
Jadi pertanyaannya: apakah ada algoritma optimasi yang memungkinkan saya untuk menggunakan semua daya komputasi secara efisien?
Di satu sisi spektrum akan menjadi pencarian lengkap: membagi seluruh ruang pencarian menjadi kisi-kisi halus dan menghitung fungsi di setiap titik kisi secara independen. Ini tentu saja perhitungan yang sangat paralel, tetapi algoritma ini sangat tidak efisien.
Di sisi lain spektrum adalah algoritma kuasi-Newton: secara cerdas memperbarui estimasi parameter berdasarkan riwayat sebelumnya. Ini adalah algoritma yang efisien, tetapi saya tidak tahu bagaimana membuatnya paralel: konsep "estimasi parameter berdasarkan sejarah sebelumnya" terdengar seperti perhitungan serial.
Algoritma kuadrat tampaknya berada di suatu tempat di tengah: seseorang dapat membangun "model pengganti" awal dengan menghitung banyak nilai secara paralel, tetapi saya tidak tahu apakah iterasi yang tersisa dapat diparalelkan.
Adakah saran tentang metode optimasi bebas gradien seperti apa yang akan bekerja dengan baik pada sebuah cluster? Juga, apakah ada implementasi paralel dari algoritma optimasi yang saat ini tersedia?
sumber
Jawaban:
Seperti yang dikatakan Paul, tanpa informasi lebih lanjut, sulit untuk memberikan saran tanpa asumsi.
Dengan 10-20 variabel dan evaluasi fungsi yang mahal, kecenderungannya adalah untuk merekomendasikan algoritme pengoptimalan bebas derivatif. Saya akan sangat tidak setuju dengan saran Paul: Anda biasanya memerlukan gradien presisi mesin kecuali jika Anda menggunakan semacam metode khusus (misalnya, penurunan gradien stokastik dalam pembelajaran mesin akan mengeksploitasi bentuk tujuan untuk menghasilkan yang masuk akal. estimasi gradien).
Setiap langkah kuasi-Newton akan berbentuk:
Mendekati Hessian dan gradien keduanya melalui perbedaan hingga adalah ide yang buruk karena sejumlah alasan:
Jadi untuk mendapatkan satu iterasi buruk dari quasi-Newton, Anda melakukan sesuatu seperti hingga 420 evaluasi fungsi pada 30 menit per evaluasi, yang berarti Anda akan menunggu beberapa saat untuk setiap iterasi, atau Anda akan perlu cluster besar hanya untuk evaluasi fungsi. Pemecahan linear aktual akan terdiri dari 20 dengan 20 matriks (paling banyak!), Jadi tidak ada alasan untuk memparalelkannya. Jika Anda bisa mendapatkan informasi gradien dengan, misalnya, menyelesaikan masalah adjoint, maka mungkin lebih bermanfaat, dalam hal ini, mungkin layak untuk melihat buku seperti Nocedal & Wright.
Jika Anda akan melakukan banyak evaluasi fungsi secara paralel, Anda harus melihat pendekatan pemodelan pengganti atau menghasilkan metode pencarian set sebelum mempertimbangkan pendekatan quasi-Newton. Artikel ulasan klasik adalah artikel oleh Rios dan Sahinidis tentang metode bebas turunan , yang diterbitkan pada tahun 2012 dan memberikan perbandingan luas yang sangat bagus; artikel pembandingan oleh More and Wild dari 2009; buku teks 2009 "Pengantar Optimalisasi Derivatif-Gratis" oleh Conn, Scheinberg, dan Vicente; dan artikel ulasan tentang menghasilkan metode pencarian kumpulan oleh Kolda, Lewis, dan Torczon dari tahun 2003.
Seperti yang ditautkan di atas, paket perangkat lunak DAKOTA akan mengimplementasikan beberapa metode tersebut, dan demikian juga NLOPT , yang mengimplementasikan DIRECT, dan beberapa metode pemodelan pengganti Powell. Anda mungkin juga melihat MCS ; itu ditulis dalam MATLAB, tapi mungkin Anda bisa port implementasi MATLAB ke bahasa pilihan Anda. Pada dasarnya DAKOTA merupakan kumpulan skrip yang dapat Anda gunakan untuk menjalankan simulasi mahal Anda dan mengumpulkan data untuk algoritme pengoptimalan, dan NLOPT memiliki antarmuka dalam sejumlah besar bahasa, jadi pilihan bahasa pemrograman seharusnya tidak menjadi masalah besar dalam menggunakan paket perangkat lunak mana pun; DAKOTA memang butuh waktu untuk belajar, dan memiliki sejumlah besar dokumentasi untuk disaring.
sumber
Mungkin algoritma optimasi berbasis pengganti adalah apa yang Anda cari. Algoritme ini menggunakan model pengganti untuk menggantikan model yang sebenarnya mahal secara komputasi selama proses optimisasi dan mencoba untuk mendapatkan solusi yang sesuai menggunakan sesedikit mungkin evaluasi dari model yang mahal secara komputasi.
Saya pikir metode Mode Mengejar Sampling dapat digunakan untuk menyelesaikan masalah Anda. Algoritma ini menggunakan model pengganti RBF untuk memperkirakan fungsi objektif yang mahal dan dapat menangani kendala nonlinear. Lebih penting lagi, ini memilih beberapa kandidat untuk melakukan evaluasi fungsi yang mahal sehingga Anda dapat mendistribusikan kandidat ini untuk komputasi paralel untuk lebih mempercepat proses pencarian. Kode ini open-source dan ditulis dalam MATLAB.
Referensi
Wang, L., Shan, S., & Wang, GG (2004). Metode pengambilan sampel yang mengejar mode untuk optimisasi global pada fungsi kotak hitam yang mahal. Rekayasa Optimasi, 36 (4), 419-438.
sumber
Saya tidak yakin algoritma paralel benar-benar apa yang Anda cari. Ini evaluasi fungsi Anda yang sangat mahal. Yang ingin Anda lakukan adalah memparalelkan fungsi itu sendiri, belum tentu dengan algoritma optimasi.
Jika Anda tidak bisa melakukan itu, maka ada jalan tengah antara pencarian lengkap dan algoritma Newton, itu adalah metode Monte Carlo. Anda dapat, pada sekelompok inti / node yang berbeda, memulai algoritma yang sama yang cenderung jatuh ke optima lokal (katakanlah algoritma kuasi-Newton), tetapi semua dengan kondisi awal acak. Tebakan terbaik Anda maka untuk optima sejati adalah minimum dari minimum. Ini sepele untuk diparalelkan dan dapat digunakan untuk memperluas metode apa pun. Meskipun tidak sepenuhnya efisien, jika Anda memiliki daya komputasi yang cukup, Anda pasti dapat memenangkan pertempuran produktivitas pemrograman vs kinerja algoritma (jika Anda memiliki banyak daya komputasi, ini bisa selesai sebelum Anda pernah selesai membuat algoritma yang lebih menarik).
sumber
Pilihan algoritma pengoptimalan (dan dengan demikian paralelisasi) sangat tergantung pada sifat-sifat fungsi objektif dan kendala. Tanpa mengetahui lebih banyak tentang masalahnya, sulit untuk memberikan saran yang berarti.
Tetapi dari pertimbangan Anda tentang metode newton, saya menyimpulkan bahwa fungsi objektif Anda dapat dibedakan. Jika memungkinkan, masalah Anda akan sangat diuntungkan dengan memparalelkan evaluasi fungsi. Jika tidak memungkinkan, maka Anda juga dapat mempertimbangkan metode newton yang tidak tepat yang menggantikan gradien / goni yang tepat dengan perkiraan perbedaan hingga. Kemudian, Anda dapat menggunakan semua prosesor yang Anda inginkan untuk menghitung setiap elemen non-nol dari jacobian, seperti yang disarankan @stali.
Untuk informasi lebih lanjut, baca Nocedal & Wright's Numerical Optimization, Bab 7 . Ada banyak paket perangkat lunak pengoptimalan yang mengimplementasikannya secara paralel. Di antara freeware yang paling banyak digunakan adalah paket perangkat lunak DAKOTA (Sandia National Labs) .
sumber
Inilah solusi untuk masalah Anda.
Deskripsi metode matematika disediakan dalam makalah ini .
sumber