2010-07-04 9 views
8

Bir Python istatistik paketi için automatic differentiation uygulamasını denemeye çalışıyorum (sorun formülasyonu, en iyi duruma getirme sorun formülleriyle benzerdir).2. türev için otomatik farklılaşma uygulanması: hesaplamalı grafiğin geçişi için algoritma?

Hesaplama grafiği, operatörün aşırı yüklenmesi ve sum(), exp() vb. Gibi işlemler için fabrika işlevleri kullanılarak oluşturulur. Ters birikimi kullanarak degrade için otomatik farklılaşma uyguladık. Ancak, ikinci türev (Hessian) için otomatik farklılaştırmanın uygulanmasını çok daha zor buldum. Bireysel kısmi gradyan hesaplamaları nasıl yapacağımı biliyorum, ancak grafiğin üstesinden gelmek ve birikimi yapmak için akıllıca bir yol bulmakta zorlandım. Herhangi biri, öğrenmeyi deneyebileceğim aynı şeyi uygulayan ikinci türev veya açık kaynak kütüphaneleri için otomatik farklılaştırma algoritmaları veren iyi makaleler biliyor mu?

+1

"Off-topic" ayağım (bu şekilde oy veren yalnız SOER'e yorum yapıyor) - bu programlama ile ilgili başka bir şey olabilir. grafik "hakkında ?! (Neden John'un ilk türevi işlevselliğini iki kez uygulayarak 2. türevi yapamadığını anlamamasına rağmen, bunun sebebi "Hessian" ın ne olduğunu bilmemem olabilir [[Alman doğumlu bir asker hariç] 1776 yılında Brits için mücadele! -)]]). –

+0

Sorunuzu yanıtlamak için, değişkenler arasındaki etkileşimler nedeniyle iki kez ayırt etmek önemsizdir. Fonksiyonunuz bir skalar (n girişleri ile) ise, 1. türevin bir vektör uzunluğu n, ikinci türevi bir n^2 matrisidir 3. türev türevi n^3'tür. İlk türev için, yukarı çıkmanız gerekir 1 Dönem başına bağımsız bağımlı değişkenden gelen yol, ikinci türev için iki farklı yoldan ilerlemeniz gerekir. Bu konuyla ilgili biraz endişeliydim, ama bu soru için daha iyi bir forumun ne olduğunu bilmiyorum; kesinlikle bir matematik taşma meselesi değil. –

+0

Otomatik farklılaşma kesinlikle gerekli midir?Her düşündüğümde, algoritmayı elle daha kolay anlaşılır kıldığını buldum, ama yine Hessyalılarım oldukça basit (diyagonal veya analitik formül tarafından hesaplanabilir). –

cevap

1

İlk karar vermelidir (eğer Hessian matris tersini hesaplamak gerekir) Sayısal hatalar özellikle dikkat ve duyarlılık analizi yapmak Bir seyrek Hessian ya da tamamen yoğun bir Hessen'e daha yakın bir şey hesaplayın.

İstediğiniz şey seyrek ise, bunu yapmanın iki rekabetçi yolu vardır. zeki bir yolla hesaplama grafik kullanarak Yalnızca, hesaplamalı grafiğinin bir ters süpürme Eğer edge_pushing algoritması kullanarak Hessen matrisi hesaplayabilirsiniz:

http://www.tandfonline.com/doi/full/10.1080/10556788.2011.580098

Yoksa içine Hessian matrisi sıkıştırmak için grafik renklendirme teknikleri deneyebilirsiniz ne istediğini (pratikte olağandışı) yoğun Hessen ise daha az bir sütun matrisi, ardından her bir sütunu

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.66.2603

hesaplamak için ters birikimini kullanmak sizin de Hessian bir sütun hesaplama muhtemelen daha iyi geri biriktirme (BRUCE CHRISTIANSON ve ters biriktirme için arama) ile bir zaman

+0

Bu oldukça ilginç. İlk makalenin pdf versiyonunuz var mı? –

-1

3 boyutlu Hessian yaklaşan alışılmış yöntemi L-BFGS yöntem benzerdir BFGS

olup. Python'da bulunmamasına rağmen, L-BFGS'nin (Oss'leri çözmek için bir ara sonuç olarak Hessian'ı hesaplar) birkaç dilde (C#, C++, VBA vb.) Kaynak kodunu bulabilirsiniz. Bence tercüme etmek kolay değil. Başka bir dilden alg çevirmek yapacaksanız

, sen eğer