Otomatik farklılaşma ile ilgili olarak, kaynak kodu dönüşümü (STC) operatör aşırı yüklenmesinden (OO) daha mı verimli?


12

Bir uzay-zaman süreci için Bayesian bir model üzerinde çalışıyoruz ve log olasılığı için bir model gerektiren ve model parametrelerine göre gradyanı olan bir U-Dönüşü olmayan örnekleyici (NUTS) kullanıyoruz. Daha özünde, istatistiksel dağılımları, kronecker ürünlerini, üstelleri, oranları, if-else ifadelerini vb. İçeren oldukça karmaşık günlük olasılık fonksiyonuna sahibiz ve bunu sağlamamız gerekiyor ve NUTS için bir gradyan. Birkaç paket ( Stan ve Julia'nın MCMC ), degradeyi otomatik olarak elde etmek için operatör aşırı yüklemesini (bilgim dahilinde) kullanır.f:RnR

Kendi degrade fonksiyonumuzu yaratabilseydik, belki de bir kaynak kodu dönüşümü otomatik fark aracı kullanarak, daha iyi performans elde eder miydik, yoksa OO da iyi mi yoksa daha iyi mi?

Yanıtlar:


9

Kaynaktan kaynağa dönüşüm, performans açısından altın standart olarak kabul edilmektedir. OO yaklaşımları neredeyse iyi görünüyor, çünkü orada daha fazla OO paketi var ve performans önemli bir dezavantaj olarak belirtilmiyor. Çalıştığınız dil için sevdiğiniz bir OO kütüphanesi bulursanız, önce onu kullanırım ve daha sonra kesinlikle kaynaktan kaynağa dönüştürmeye ihtiyacınız olup olmadığını ve ihtiyaçlarınızı karşılayan böyle bir araç varsa anlarım. Otomatik farklılaşma ile üretilen bir türevin tipik maliyeti, bir şeyleri bağlama koymak için bir işlev değerlendirmesinin kabaca üç ila beş katıdır.

Dışarıda daha fazla OO paketi var, çünkü operatör aşırı yüklemesi kullanarak otomatik farklılaştırma araçlarını uygulamak kaynaktan kaynağa çeviri kullanmaktan daha kolaydır. Kaynaktan kaynağa çevirmen uygulamak, bir derleyici yazmakla eşdeğerdir: kaynak kodu ayrıştırılmalı ve tokenleştirilmeli, daha sonra elde edilen ifade ağacına dönüştürme kuralları uygulanmalıdır. Andreas Griewank'ın Türevleri Değerlendirme: Algoritmik Farklılaşma Prensipleri ve Teknikleri, İkinci Baskı, ödünleşmeler konusunda daha ayrıntılı olarak ele alınmaktadır.


Teşekkürler Geoff, bu çok yardımcı olur, özellikle tipik maliyetler tahmininiz.
Matthew Emmett

1

Degrade hesaplaması için AD'nin ters modunu kullanırsınız. Bu, her iki durumda da bir işlenen yığını oluşturmayı gerektirir, OO sürümü de kodun tersine çevrilmesi sırasında yorumlanması gereken bir işlem yığını oluşturmalıdır. Kaynak dönüştürülmüş kod, ters sıralı işlemleri derlenen ek kaynak kodu olarak yazar. Kodda işlem yorumlayıcısının eklenmesi önemli olabilir. Tapenade tarafından üretilen Tapenade kod ve Adol-C karşılaştırmaları vardır.

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.