Latar belakang dan masalah
Saya menggunakan Proses Gaussian (GP) untuk regresi dan optimasi Bayesian berikutnya (BO). Untuk regresi saya menggunakan paket gpml untuk MATLAB dengan beberapa modifikasi custom-made, tetapi masalahnya umum.
Adalah fakta yang diketahui bahwa ketika dua input pelatihan terlalu dekat dalam ruang input, matriks kovarians dapat menjadi tidak-pasti pasti (ada beberapa pertanyaan tentang hal itu di situs ini). Akibatnya, dekomposisi Cholesky dari matriks kovarians, yang diperlukan untuk berbagai perhitungan GP, dapat gagal karena kesalahan numerik. Ini terjadi pada saya dalam beberapa kasus ketika melakukan BO dengan fungsi objektif yang saya gunakan, dan saya ingin memperbaikinya.
Solusi yang diajukan
AFAIK, solusi standar untuk mengurangi pengondisian udara adalah dengan menambahkan punggungan atau nugget ke diagonal matriks kovarians. Untuk regresi GP, jumlah ini untuk menambahkan (atau meningkatkan, jika sudah ada) kebisingan pengamatan.
Sejauh ini baik. Saya memodifikasi kode untuk inferensi yang tepat dari gpml sehingga setiap kali dekomposisi Cholesky gagal, saya mencoba untuk memperbaiki matriks kovarians ke matriks SPD (simetrik positif pasti terdekat) dalam norma Frobenius, yang terinspirasi oleh kode MATLAB oleh John d'Errico. Alasannya adalah untuk meminimalkan intervensi pada matriks asli.
Solusi ini berfungsi, tetapi saya perhatikan bahwa kinerja BO berkurang secara substansial untuk beberapa fungsi - mungkin setiap kali algoritma perlu memperbesar di beberapa area (misalnya, karena semakin dekat ke minimum, atau karena panjangnya skala dari masalah menjadi tidak seragam kecil). Perilaku ini masuk akal karena saya secara efektif meningkatkan kebisingan setiap kali dua titik input terlalu dekat, tetapi tentu saja itu tidak ideal. Atau, saya bisa saja menghilangkan titik-titik bermasalah, tetapi sekali lagi, kadang-kadang saya membutuhkan titik input untuk menjadi dekat.
Pertanyaan
Saya tidak berpikir bahwa masalah numerik dengan faktorisasi Cholesky dari matriks kovarian GP adalah masalah baru, tetapi yang mengejutkan saya sejauh ini saya tidak dapat menemukan banyak solusi, selain meningkatkan kebisingan atau menghilangkan titik yang terlalu dekat satu sama lain. Di sisi lain, memang benar bahwa beberapa fungsi saya berperilaku sangat buruk, jadi mungkin situasi saya tidak terlalu khas.
Adakah saran / referensi yang bisa berguna di sini?