Doğru optimizasyon algoritması nasıl seçilir?


16

Bir fonksiyonun minimumunu bulmam gerekiyor. Http://docs.scipy.org/doc/scipy/reference/optimize.html adresindeki dokümanları okumak Aynı şeyi yapan, yani minimum olanı bulan birkaç algoritma olduğunu görüyorum. Hangisini seçmem gerektiğini nasıl bilebilirim?

listelenen algoritmanın bazıları

  • Yokuş aşağı simpleks algoritmasını kullanarak bir işlevi en aza indirin.
  • BFGS algoritmasını kullanarak bir işlevi en aza indirin.
  • Doğrusal olmayan eşlenik gradyan algoritmasıyla bir işlevi en aza indirin.
  • Newton-CG yöntemini kullanarak f işlevini en aza indirin.
  • Değiştirilmiş Powell'ın yöntemini kullanarak bir işlevi en aza indirin.

Benim fonksiyonum doğrusal. boyutsallık 232750 civarındadır (her seferinde kaç farklı degradeyi hesaplamalıyım), degradeyi ve maliyeti bir kez hesaplamak yaklaşık 2 dakika sürer, bu yüzden ucuz değil. Kısıtlarım olduğunu sanmıyorum. deterministik ve süreklidir.


Sorununuzun doğasını araştırmalısınız: Doğrusal mı, değil mi? Bunun boyutu nedir? Maliyet fonksiyonunuzu değerlendirmek ucuz mu? Türevlerinizi analitik ve / veya ucuz bir şekilde değerlendirebilir misiniz? Kısıtlamalarınız var mı? Kısıtlamalarınız varsa, sorununuzu kısıtlanmamış olarak kolayca yazabilir misiniz? Lütfen bu konulara daha fazla dikkat edin.
usεr11852 diyor Reinstate Monic

@ user11852 Doğrusaldır. boyutsallık yaklaşık 50 özelliktir, degradeyi ve maliyeti bir kez hesaplamak yaklaşık 2 dakika sürer, bu yüzden ucuz değil. Kısıtlarım olduğunu sanmıyorum.
siamii

Burada "doğrusal" derken ne demek istediğinizden emin değilim. Sorununuz doğrusal ise, eğim sabittir ve hesaplanması ucuzdur. Nesnel işleviniz doğrusalsa ve kısıtlamaları yoksa, minimum -infinity (veya belki 0) olur.
paul

@paul: Optimizasyonda doğrusallık genellikle işlevin kendisine değil kısıtlamalara işaret eder. Ben (yanlışlıkla verildi) fonksiyonun düzgünlüğü ile ilgili olarak "doğrusallık" dan bahsettim ve bence OP'nin de bahsettiği bu. Cevabımda daha sonra yine de "sürekli" dediğine dayanıyordum.
usεr11852 diyor Reinstate Monic

Yanıtlar:


14

Söylediklerinize dayanarak: 50 değişken için optimizasyon yapmanız gerektiğini varsayıyorum; Ayrıca, analitik türevleri bulmanın çok pahalı olduğu (nümerik olarak çıksın) ve optimizasyonunuzun kısıtlanmamış olduğu bir duruma sahip olduğunuzu varsayıyorum.

Vurgulayayım, 25-30 ila 100 değişken arasında biraz şanssızsınız, büyük veya küçük ölçekli optimizasyon rutinleri arasında seçim yapmak için biraz alacakaranlık bölgesi. Bununla birlikte, hiçbir şey kaybolmaz.

Birinci dereceden türevin bile bu türden kurtulmak pahalı olduğu göz önüne alındığında Newton yöntemi fikrini öldürür. Hessian'ınız başlamak gibi biraz çapraz ise, Quasi-Newton (BFGS) ile biraz şansınız olabilir. CG genellikle BFGS'den biraz daha yavaştır, bu yüzden muhtemelen bu şeyleri çok fazla iyileştirmeyecektir; bellek de bir sorunsa kullanın (veya bu durumda L-BFGS'yi tercih edin). Ayrıca, işlevinizi değerlendirmenin ne kadar yavaş olduğu göz önüne alındığında, basit bir en dik iniş / satır arama algoritması kıvrımlı bir şekilde yavaş olacaktır; Simüle Tavlama ve diğer rastgele arama varyantları için de aynı şeyler geçerlidir (HMC'ye ve tüm bu cazlara erişiminiz olmadığını varsayalım).

Yani, tek bir fonksiyon değerlendirmesi söz konusu olduğunda paranız için en iyi patlamaya ihtiyacınız olduğunda: Powell'ın yöntemine gidin ve COBYLA'yı test edin; kısıtlanmış bir optimizasyon algoritması olmasına rağmen, şeyleri hızlandırmak için dahili olarak fonksiyonunuzun gradyanını yaklaşık olarak doğrusal hale getireceğinden, fonksiyonunuzun doğrusallığından yararlanabilecektir. Ayrıca kesinlikle Python için NLopt deneyin . Çok fazla gradyan içermeyen optimize edici var; UOBYQA'yı deneyin; Powell'ın beyni de (Kuadratik Yaklaşımlarla Kısıtsız Optimizasyon).

Çok kısaca: N-CG algoritmaları Hessian'ın hesaplanmasına bağlıdır ve Hessian'ın hesaplanması çok pahalı görünüyor. NLCG ve BFGS gerektirmez, ancak ilk adımlarında bir kez hesaplamaya çalışabilirler.

Simplex algoritmasını bilerek bıraktım çünkü tamamen farklı bir canavar; degradelerle böyle bir şey yok. Deneyin ama gerçekten yorum yapamam; gerçekten probleminizin doğasına bağlıdır.

Sayısal optimizasyonla ilgili ilk iyi referans için CTKelly'nin Optimizasyon için Yinelemeli Yöntemler kitabı sizi oldukça güzel bir şekilde ele alacaktır.


İleride başvurmak üzere: Benzer sorular için Stackexchange'teki Hesaplamalı Bilim beta sürümünü kontrol etmek isteyebilirsiniz.
usεr11852 diyor Reinstate Monic

Cevap için teşekkürler. Aslında benim boyutluluğum 232.750. Bu, her seferinde hesapladığım degradelerin sayısıdır. GPU üzerinde fonksiyon değerlendirme ve gradyan hesaplaması yapıyorum. Bu NLopt ile uyumlu mudur?
siamii

GPU'larda NLopt kullanmadım, ancak uyumluluk ile ilgili bir sorun olması için açık bir neden göremiyorum. GPU'dan ve GPU'ya sık sık G / Ç işlemi olsa da düşünceyi sorgulayabilirim.
usεr11852 diyor Reinstate Monic 06

@ usεr11852, Doğrusal regresyon maliyet fonksiyonunun en aza indirgenmesi için gradyan iniş ve QR ayrıştırma yöntemlerinin karşılaştırılmasını da tartışabilir miyiz? Ayrı bir soru sormam gerekir mi?
Dr Nisha Arora

@DrNishaArora: Evet. Bu ayrı bir soru için uygun olurdu. Lütfen bir kapalı form matematik çözümü bulunduğunda neden doğrusal regresyon için degrade iniş kullanmalısınız? yinelemeyi önlemek için emin olun!
usεr11852 diyor Reinstate Monic

1

Belki kendinize sayısal optimizasyon hakkında bir tanıtım kitabı almalısınız. Algoritmaya karar vermek için işlevinizi dikkate almanız gerekir.

Bahsettiğiniz algoritmalar arasında önemli farklılıklar, Jacobian veya Hessian'ın gerekli olup olmadığı veya sadece işlevin kendisidir.

Bunun bir istatistik Soru ve Cevap sitesi olduğu ve dolayısıyla rastgele değişkenlerle ilgilendiği göz önüne alındığında : işlevinizin deterministik olduğundan emin olun, arama alanı üzerinde sürekli sonuçlar verecek şekilde değerlendirilebilir.


deterministik ve süreklidir.
siamii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.