Bayes optimizasyonu için GP regresyonunda koşulsuz kovaryans matrisi


12

Arka plan ve sorun

Regresyon ve sonraki Bayes optimizasyonu (BO) için Gauss İşlemleri'ni (GP) kullanıyorum. Regresyon için, MATLAB için gpml paketini birkaç özel yapım modifikasyonla kullanıyorum, ancak sorun genel.

İki eğitim girdisi girdi alanında çok yakın olduğunda, kovaryans matrisinin pozitif olmayan bir kesin hale gelebileceği iyi bilinen bir gerçektir (bu sitede bunun hakkında birkaç soru vardır). Sonuç olarak, çeşitli GP hesaplamaları için gerekli olan kovaryans matrisinin Cholesky ayrışması sayısal hata nedeniyle başarısız olabilir. Kullandığım objektif işlevlerle BO yaparken bazı durumlarda bu oldu ve düzeltmek istiyorum.

Önerilen çözümler

Kötü koşulların hafifletilmesinde standart çözüm olan AFAIK, kovaryans matrisinin köşegenine bir sırt veya külçe eklemektir. GP regresyonu için bu, gözlem gürültüsü eklemek (veya zaten varsa arttırmak) anlamına gelir.

Çok uzak çok iyi. Ben tam çıkarım için kod modifiye gpml Choleskey çözümleme başarısız olduğunda, ben esinlenerek Frobemino norm en yakın simetrik pozitif tanımlı (SPD) matrikse kovaryans matrisi düzeltmeye çalışmadan ki bu MATLAB kodu John d'Errico tarafından. Gerekçe, orijinal matrise müdahaleyi en aza indirmektir.

Bu geçici çözüm işi yapar, ancak BO'nın performansının bazı işlevler için önemli ölçüde azaldığını fark ettim - muhtemelen algoritmanın bir alanda yakınlaştırma yapması gerektiğinde (örneğin, minimum seviyeye yaklaştığı veya uzunluk ölçekleri nedeniyle) sorunun eşit olmayan bir şekilde küçük hale gelir). Bu davranış mantıklıdır çünkü iki giriş noktası çok yaklaştığında gürültüyü etkili bir şekilde artırıyorum, ancak elbette ideal değil. Alternatif olarak, sadece sorunlu noktaları kaldırmak, ancak yine de bazen ben gerek yakın olmak giriş noktaları.

Soru

GP'nin kovaryans matrislerinin Cholesky çarpanlarına ayırımı ile ilgili sayısal sorunların yeni bir problem olduğunu düşünmüyorum, ancak sürpriz bir şekilde, gürültüyü arttırmak veya birbirine çok yakın olan noktaları kaldırmak dışında pek çok çözüm bulamadım. Öte yandan, bazı işlevlerimin oldukça kötü davrandığı doğrudur, bu yüzden belki de durumum çok tipik değildir.

Burada yararlı olabilecek herhangi bir öneri / referans var mı?


Kovaryans matrisinin girişlerini oluşturmanın yanı sıra, Cholesky çarpanlarına ayırma işlemini daha yüksek bir hassasiyetle, örneğin dörtlü hassasiyetle veya daha da yüksek olarak hesaplayabilir veya güncelleyebilirsiniz. Zorluğun yanı sıra, hesaplamalar büyüklük sırası daha yavaş olabilir. MATLAB için keyfi hassas eklentiler var. Bunun ideal olduğunu söylemiyorum, ama bir seçenek olabilir. Ne kadar iyi gpml ile oynadıklarını bilmiyorum, ama gpml kaynak kodunu (m dosyaları) değiştirebilirseniz, belki de yapabilirsiniz.
Mark L. Stone

Kovaryans matrisinin köşegenine küçük bir titreşim eklemeye çalıştınız mı?
Zen

@ MarkL.Stone Öneri için teşekkürler. Ne yazık ki eğitim kodunun hızlı olması gerekiyor, bu yüzden yüksek hassasiyetli sayısal uygulamalar muhtemelen benim uygulama için iyi bir seçim olmayacak.
Lacerbi

2
Bu soru gerçekten ilginç. gibi covaraince matrisinize külçe efekti eklerken, sigma'yı istediğiniz gibi optimize edersiniz veya verilir. Nugget efektini optimize etmenin ölçüm gürültüsünü yakaladığını ve gausssian sürecine yardımcı olduğunu fark ettimσσ2benσ
Wis

1
Genellikle optimizasyon yaparım. Birkaç durumda, bunun üzerinde marjinalleştirmeye çalıştım, ancak wrt optimizasyonunun çoğunu alamadım (posteriorun çok dar olduğunu varsayıyorum).
lacerbi

Yanıtlar:


7

Başka bir seçenek esas olarak neden olan noktaları ortalamaktır - örneğin 1000 puan ve 50 neden sorununuz varsa, ilk 950 özdeğer / vektörü kullanarak en uygun düşük sıralı yaklaşımı alabilirsiniz. Ancak, bunu yapmak istemediğinizi söylediğiniz veri noktalarını birbirine yakın bir şekilde kaldırmak çok da uzak değildir. Ancak, titreşim ekledikçe, serbestlik derecelerini azalttığınızı unutmayın - yani her bir nokta tahmininizi daha az etkiler, bu yüzden bu daha az nokta kullanmaktan daha kötü olabilir.

Kişisel olarak düzgün olduğunu düşündüğüm bir başka seçenek de iki noktayı daha akıllıca birleştirmektir. Örneğin, 2 puan alıp bunları bir araya getirebilirsiniz, ancak bunları degrade için bir yaklaşım belirlemek için de kullanabilirsiniz. Degrade bilgilerini eklemek için çekirdeğinizden ihtiyacınız olan tek şey ve . Türevlerin genellikle gözlemleriyle bir ilişkisi yoktur, bu nedenle koşullandırma sorunlarıyla karşılaşmazsınız ve yerel bilgileri tutmazsınız.d x d x k ( x , x )dxk(x,x')dxdx'k(x,x')

Düzenle:

Yorumlara dayanarak, türev gözlemleri ekleyerek ne demek istediğimi ayrıntılandıracağımı düşündüm. Gauss çekirdeği kullanırsak (örnek olarak),

kx,x'=k(x,x')=σtecrübe(-(x-x')2l2)

türevleri,

kdx,x'=dk(x,x')dx=-2(x-x')l2σtecrübe(-(x-x')2l2)

kdx,dx'=d2k(x,x')dxdx'=2l2-2(x-x')l4σtecrübe(-(x-x')2l2)

Şimdi bir veri noktamız olduğunu varsayalım ve bir türev arayacağım .{xben,yben;ben=1,...,n}x1m1

Let , o zaman en kovaryans matrisi ile bir tek standart GP kullanımıY=[m1,y1,...,yn]

K=(kdx0,dx0kdx0,x0...kdx0,xnkdx0,x0kx0,x0...kx0,xnkdx0,xnkx0,xn...kxn,xn)

GP'nin geri kalanı her zamanki gibi.


Önerilen yaklaşık degrade bilgilerini kullanımınızla ilgili ayrıntıları genişletmek ister misiniz?
Mark L. Stone

@j Teşekkürler - Düşük rütbeli bir yaklaşım yapmayı düşündüm, denemeliyim (şimdiye kadar kodun büyük bölümlerini yeniden yazmak zorunda kalacağım). İki noktayı bir araya getirmeyle ilgili olarak, önceki bir soruda önerdim , ancak türevsel bilgi almayı düşünmedim. Prensipte düzgün görünüyor, ancak giriş boyutu başına bir GP ekleme yükü ile sadece birkaç türev gözlemim (birleştirilmiş noktalara karşılık gelen) olacağından nasıl kullanacağımdan emin değilim.
lacerbi

@j Ek açıklama için teşekkürler. Bu gerçekten çok düzgün görünüyor. Bu yaklaşım için referanslarınız var mı (veya yeterince benzer bir şey)?
lacerbi

2
Mike Osborne'un tez sayfası 67'ye ( robots.ox.ac.uk/~mosb/public/pdf/136/full_thesis.pdf ) göz atın - türev ve integral gözlemler sunar. Umarım yardımcı olur :)
j__

4

Ofiste attığımız bir çözüm, sadece sıkıntılı noktaları değiştirmek. Bu, doğrudan silme veya daha karmaşık bir şey şeklinde olabilir. Esasen gözlem, yakın noktaların oldukça fazlalık olduğu yönündedir: aslında, o kadar fazladır ki kovaryans matrisinin sırasını azaltırlar. Aynı şekilde, bir nokta yine de eldeki soruna çok az bilgi katmaktadır, bu yüzden birini veya diğerini kaldırmak (veya bunların ortalamasını almak veya bir noktayı diğerinden en az kabul edilebilir mesafeye "sıçramak gibi) başka bir şey yapmak olacaktır. çözümünüzü gerçekten çok fazla değiştirmez.

İki noktanın hangi noktaya "çok yakın" olduğuna nasıl karar vereceğimden emin değilim. Belki de bu, kullanıcıya kalan bir ayar seçeneği olabilir.

(Hata! Bunu gönderdikten sonra, bu cevabı çok daha ayrıntılı bir çözüme ilerleten sorunuzu burada buldum . Umarım cevabımdan bağlantı kurarak SEO ile yardımcı olacağım ...)


bu mutlu da bazı ışık tutabilir, oldukça yararlıdır bu mümkünse.
GENIVI-LEARNER
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.