Burada bir hikaye ile ön plana çıkan birkaç dikkat kelimesi ile tartmama izin verin. Uzun zaman önce, yeni başladığımda bir arkadaşımla çalıştım. Çözmek için oldukça dağınık bir hedefi olan bir optimizasyon problemi vardı. Onun çözümü, bir optimizasyon için analitik türevler üretmekti.
Gördüğüm sorun bu türevlerin kötü olmasıydı. Macsyma kullanılarak üretildi, fortran koduna dönüştürüldü, her biri düzinelerce devam ifadesi uzunluğundaydı. Aslında, Fortran derleyici, maksimum devam ifadelerinin sayısını aştığından üzüldü. Bu sorunu çözmemize izin veren bir bayrak bulsak da, başka sorunlar da vardı.
Uzun ifadelerde, CA sistemleri tarafından yaygın olarak üretildiği gibi, büyük eksiltme iptali riski vardır. Çok sayıda büyük sayıyı hesaplayın, ancak hepsinin küçük bir sayı elde etmek için birbirlerini iptal ettiklerini bulmak için.
Genellikle analitik olarak üretilen türevlerin değerlendirilmesi sonlu farklar kullanılarak sayısal olarak üretilen türevlerden daha pahalıdır. N değişkenler için bir gradyan, objektif işlevinizi değerlendirme maliyetinin n katından fazla sürebilir. (Zamandan tasarruf edebilirsiniz, çünkü terimlerin çoğu çeşitli türevler arasında yeniden kullanılabilir, ancak bu aynı zamanda bilgisayar tarafından üretilen ifadeler kullanmak yerine dikkatli el kodlaması yapmaya da zorlar. ifadelerinde hata olasılığı önemsiz değildir. Bu türevleri doğruluk için doğruladığınızdan emin olun.)
Hikayemin anlamı, bu CA tarafından üretilen ifadelerin kendi sorunları var. Komik olan şey, meslektaşımın problemin karmaşıklığından gurur duymasıydı, cebir çok kötü olduğu için gerçekten zor bir problemi açıkça çözüyordu. Düşündüğünü sanmıyorum, bu cebir aslında doğru olanı hesaplıyorsa, bunu doğru bir şekilde yapıyor muydu ve verimli bir şekilde yapıyor muydu.
O zamanlar bu projede kıdemli kişi olsaydım, ona ayaklanma hareketini okurdum. Gururu, sonlu bir fark temelli eğimin yeterli olup olmadığını kontrol etmeden, muhtemelen gereksiz yere karmaşık olan bir çözüm kullanmasına neden oldu. Bahse girerim, bu optimizasyonu çalıştırmak için belki bir haftalık bir hafta geçirdik. En azından, üretilen gradyanı dikkatlice test etmesi için ona danışmanlık yapardım. Doğru muydu? Sonlu fark türevlerine kıyasla ne kadar doğruydu? Aslında bugün, türev tahminlerindeki hatanın bir tahminini de döndürecek araçlar var. Bu kesinlikle MATLAB'de yazdığım uyarlamalı farklılaşma kodu (derivest) için geçerlidir .
Kodu test edin. Türevleri doğrulayın.
Ancak, HERHANGİ BİRİNİ yapmadan önce, daha iyi optimizasyon şemalarının bir seçenek olup olmadığını düşünün. Örneğin, üstel uydurma yapıyorsanız, bölümlenmiş doğrusal olmayan en küçük kareler (bazen ayrılabilir en küçük kareler olarak adlandırılır) kullanabilmeniz için çok iyi bir şans var. parametre kümesini öz doğrusal ve öz doğrusal olmayan kümelere ayırmaktır. Yalnızca doğrusal olmayan parametrelerde çalışan bir optimizasyon kullanın. Bu parametrelerin "bilindiği" göz önüne alındığında, kendinden doğrusal parametreler basit doğrusal en küçük kareler kullanılarak tahmin edilebilir. Bu şema optimizasyondaki parametre alanını azaltacaktır. Doğrusal parametreler için başlangıç değerleri bulmanız gerekmediğinden sorunu daha sağlam hale getirir. Arama alanınızın boyutsallığını azaltır, böylece sorunun daha hızlı çalışmasını sağlar. Yine sağladımsadece MATLAB'de bu amaç için bir araç .
Analitik türevleri kullanıyorsanız, terimleri yeniden kullanmak için bunları kodlayın. Bu ciddi bir zaman tasarrufu olabilir ve gerçekte hataları azaltarak zamandan tasarruf etmenizi sağlayabilir. Ama sonra bu sayıları kontrol edin!
codegen
, ifadelerin her biri veya tamamı için otomatik olarak kompakt ve verimli C veya Fortran kodu oluşturabileceğinden pakete bakmak isteyebilirsiniz .