Algoritma optimasi paralel untuk masalah dengan fungsi tujuan yang sangat mahal

15

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?

Michael
sumber
1
Anda selalu dapat menghitung gradien secara paralel (untuk metode kuasi-Newton menggunakan perbedaan hingga) dan mendapatkan speedup proporsional dengan jumlah parameter yaitu, 10x-20x.
stali
@stali: Anda memerlukan Hessian untuk metode kuasi-Newton dalam optimasi. Menghitung Hessian melalui perbedaan evaluasi fungsi yang terbatas sebenarnya bukan ide yang baik. Komputasi perkiraan perbedaan hingga dari gradien untuk optimisasi juga umumnya bukan ide yang baik.
Geoff Oxberry
Banyak metode kuasi-Newton seperti BFGS tidak memerlukan Hessian secara eksplisit. Saya pikir dengan menggunakan gradien, dalam kombinasi dengan L-BFGS OP dapat dengan cepat mencapai apa yang diinginkannya.
stali
@stali: Saya menunjukkan mengapa menggunakan perkiraan perbedaan hingga gradien akan menjadi ide yang buruk dalam jawaban saya. Ini akan menurunkan konvergensi dengan memasukkan kesalahan ke sisi kanan dari itasi kuasi-Newton. Juga, itu membuang evaluasi fungsi karena tidak ada kesempatan untuk menggunakan kembali evaluasi lama (tidak seperti metode pengganti). Menggunakan BFGS hanya mengatasi setengah masalah dengan pendekatan yang Anda usulkan.
Geoff Oxberry
Ini lebih tepat sebagai komentar, bukan jawaban. Tapi saya tidak punya pilihan, karena saya tidak punya cukup perwakilan untuk mengirim komentar. Michael, saya memiliki jenis masalah yang sangat mirip: evaluasi fungsi mahal yang melibatkan simulasi kompleks yang berjalan pada sebuah cluster. Apakah Anda pernah menemukan kode yang sesuai untuk menjalankan optimasi ketika evaluasi fungsi melibatkan simulasi pada sebuah cluster?
MoonMan

Jawaban:

16

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:

H~(xk)dk=-f(xk),

H~dkxkffxk+1=xk+αkdkαkadalah ukuran langkah yang ditentukan dalam beberapa mode (seperti pencarian baris). Anda dapat pergi dengan mendekati Goni dengan cara tertentu dan iterasi Anda akan bertemu, meskipun jika Anda menggunakan sesuatu seperti perkiraan perbedaan hingga Goni melalui gradien yang tepat, Anda mungkin menderita masalah karena pengondisian yang salah. Biasanya, Hessian diperkirakan menggunakan gradien (misalnya, metode tipe BFGS dengan pembaruan peringkat-1 ke Hessian).

Mendekati Hessian dan gradien keduanya melalui perbedaan hingga adalah ide yang buruk karena sejumlah alasan:

  • Anda akan memiliki kesalahan dalam gradien, sehingga metode kuasi-Newton yang Anda terapkan mirip dengan menemukan akar dari fungsi berisik
  • NN
  • jika Anda memiliki kesalahan dalam gradien, Anda akan memiliki lebih banyak kesalahan dalam Goni Anda, yang merupakan masalah besar dalam hal pengkondisian sistem linear
  • N2

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.

Geoff Oxberry
sumber
2
Sangat menyenangkan bagi saya untuk sepenuhnya salah dan belajar sesuatu yang baru dan berguna dalam proses :).
Paul
Terima kasih! Hanya satu klarifikasi lagi: algoritma manakah yang mampu melakukan evaluasi fungsi secara paralel? Misalnya, pada k-way grid melakukan iterasi n +1, ..., n + k hanya berdasarkan informasi yang diperoleh dari iterasi 1, ..., n?
Michael
k
3

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.

Zhan Dawei
sumber
2

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).

Chris Rackauckas
sumber
0

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) .

Paul
sumber
5
Kecuali Anda memiliki gradien presisi mesin yang tersedia (secara analitik, melalui perhitungan adjoint, melalui semacam analisis sensitivitas ke depan), pendekatan ini benar-benar bukan ide yang baik; itu akan memerlukan sejumlah besar simulasi per evaluasi Goni, dan Anda akan lebih baik mengambil evaluasi fungsi tersebut dan menggunakannya untuk membangun model pengganti (misalnya, seperti BOBYQA; ORBIT dapat membangun model pengganti diNevaluasi fungsi menggunakan fungsi basis radial).
Geoff Oxberry
-2

Inilah solusi untuk masalah Anda.

Deskripsi metode matematika disediakan dalam makalah ini .

Paul
sumber
3
Selamat datang di SciComp.SE. Bisakah Anda memberikan detail tentang pendekatan yang dijelaskan dalam makalah dan diimplementasikan dalam perangkat lunak? Apa metode yang digunakan? Mengapa ini bagus? Apa yang disediakan dalam pendekatan ini yang tidak dicakup oleh jawaban lain?
nicoguaro
2
Juga, tampaknya ini adalah pekerjaan Anda sendiri. Jika itu benar, sebutkan jawaban Anda secara eksplisit.
nicoguaro
@nicoguaro: terima kasih, tapi saya tahu cara mengklik tautan.
Michael
2
@Michael, ini bukan untukmu. Filosofi situs ini adalah menjadi kumpulan jawaban. Anda mendapatkan jawaban Anda hari ini, tetapi di masa depan orang lain dapat membutuhkan bantuan yang sama. Itulah sebabnya ada standar de facto apa jawaban yang baik.
nicoguaro