GPU'da kısıtsız doğrusal olmayan optimizasyon sorunlarının çözümü


18

GPU (CUDA) ile ilgili bazı kısıtlanmamış doğrusal olmayan optimizasyon sorunlarını çözmeye çalışıyorum.

Objektif fonksiyon, doğrusal olmayan düzgün bir fonksiyondur ve gradyanı analitik olarak hesaplamak için nispeten ucuzdur, bu yüzden sayısal yaklaşımla uğraşmak zorunda değilim.

Bu sorunu çoğunlukla fp32 matematik ops (çeşitli nedenlerle) ile çözmek istiyorum, bu yüzden hangi doğrusal olmayan optimizasyon yöntemi iyi performans varken yuvarlama hatalarına karşı daha sağlam? (örneğin eşlenik gradyan / yarı newton / güven bölgesi), GPU'da BFGS'yi iyi sonuçlarla deneyen var mı?

Hessian BTW, gerekirse benim durumumda nispeten küçüktür (tipik olarak <64x64), ancak binlerce küçük ölçekli optimizasyon problemini aynı anda çözmem gerekiyor.


4
Sorunlarınızın küçük boyutu göz önüne alındığında, algoritmanın belirli seçiminin (örneğin, BFGS) en önemli zorluğunuz olacağını düşünmüyorum. Bunun yerine, GPU <-> CPU iletişim yükünü en aza indirecektir. Muhtemelen bunu yapmanın en iyi yolu, GPU'ya paralel olarak birçok probleminizi çözmek olacaktır. Hepsini bir kerede yükleyin, hepsini bir kerede çözün, sonuçları bir kerede indirin. Algoritma hakkında özel bir tavsiyem yok, ancak GPU'ların döngülerle dallardan daha iyi olduğunu söyleyeceğim.
Michael Grant

1
@Michael C. Grant: Eh, iletişim yükü benim durumumda kolayca hesaplama ile gizlenebilir, bu yüzden orada bir darboğaz değil, burada sınırlı bellek BFGS veya standart BFGS kullanma eğilimindeyim, ancak orada olup olmadığından emin değilim daha iyi bir yaklaşım.
user0002128

Bazı insanlar CUDA ile LBFGS uyguladılar .
BenC

Yanıtlar:


8

GPU'ya LBFGS, Barzilai Borwein gradyan inişi ve doğrusal olmayan konjugat gradyanı dahil olmak üzere çok çeşitli doğrusal olmayan çözücüler uyguladım.

Bunun için Dai & Yuan'ın doğrusal olmayan eşlenik gradyanı en etkili olanıdır. Genel olarak, doğrusal olmayan konjüge gradyanının diğer versiyonu daha verimli olabilir (CG-DESCENT gibi), fakat uygulanması daha zor olabilir.

LBFGS genel olarak çok sağlam bir seçimdir ve gerçekten hafızaya bağlı değilseniz, muhtemelen başlamak için en iyi yerdir.

Hem konjugat gradyanı hem de BFGS, fp32'nin sorun haline geldiği satır aramaları gerektirir. Hat arama için standart Wolfe koşullarını kullanmak yerine, burada önerilen yaklaşık Wolfe koşulunu kullanmanızı öneririm . Makale biraz dahil, ancak önemli olan şey denklem 4.1. Esasen, fonksiyonunuzu hesaplayabileceğiniz hassasiyeti açıkça ortaya koyarlar.

GPU için dikkat edilmesi gerekenler:

Bir çok küçük probleminiz var, bu da büyük bir problemi kullanım durumumdan biraz farklı. Bir bloktaki tüm evreleri kullanmak için işlev ve degrade değerlendirmelerini paralelleştirebiliyorsanız, GPU bloğu başına 1 sorun (veya bunun yerine çözgü) çalıştırmayı düşünün. Bu şekilde, farklı sorunlar farklı sayıda yineleme gerektiriyorsa sorun olmaz.

Bu bir seçenek değilse, LBFGS çözücü ile gitmek istiyorum. İşleviniz iyi davranıyorsa, sadece 1 adım boyutunu (satır aramasından kaçınarak) kullanarak ve sadece sabit sayıda yineleme için tüm sorunları çalıştırırken kurtulabilirsiniz.


0

Birçok pratik uygulamada kullanıldığı ve çok iyi hız-doğruluk performansı gösterdiği için Levenberg Marquardt'ı (bir güven bölgesi varyantı) kullanmanızı öneririm. Ayrıca, GPU için bazı kütüphaneler vardır (örn. CuLM https://github.com/zitmen/cuLM ) vardır. Eğer bu işi yapmazlarsa, uygulamanız için tonlarca kaynak vardır. LM'yi uygulamak hiç de zor değil. Yalnızca GPU iletişimini en aza indirmeye dikkat etmelisiniz. Kısa bir fikir edinmek için:

http://on-demand.gputechconf.com/gtc/2012/presentations/S0231-Levenberg-Marquardt-Using-Block-Sparse-Matrices-on-CUDA.pdf


2
Levenberg-Marquart doğrusal olmayan en küçük kareler içindir. En küçük karelerden bahsettiğini sanmıyorum.
Kurt

0

Belki simüle edilmiş bir tavlama prosedürü, yuvarlama hatalarını daha iyi işleyebilir (ve kolayca paralelleştirilebilir).

Arama alanının ham bir ızgarası ve bir başlangıç ​​"sıcaklık" parametresi ile başlarsınız

Her adımda olası çözüm noktalarını hesaplarsınız (biri olasılıkla sıcaklığa ters olarak bir miktar çözüm olmayan noktaları da kabul edebilir)

Daha sonra yalnızca bu adımdaki çözümleri saklayın ve bir sonraki tekrarlama için daha ince taneli bir ızgara sağlayan sıcaklığı artırın

Bunu sıcaklık <verilen bir limit / doğruluk eşiği olana kadar yapın

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.