Contexte et problème
J'utilise des processus gaussiens (GP) pour la régression et l'optimisation bayésienne subséquente (BO). Pour la régression, j'utilise le paquet gpml pour MATLAB avec plusieurs modifications personnalisées, mais le problème est général.
C'est un fait bien connu que lorsque deux entrées d'apprentissage sont trop proches dans l'espace d'entrée, la matrice de covariance peut devenir définie non positive (il y a plusieurs questions à ce sujet sur ce site). Par conséquent, la décomposition de Cholesky de la matrice de covariance, nécessaire pour divers calculs GP, peut échouer en raison d'une erreur numérique. Cela m'est arrivé dans plusieurs cas lors de l'exécution de BO avec les fonctions objectives que j'utilise, et j'aimerais y remédier.
Solutions proposées
AFAIK, la solution standard pour atténuer les mauvais conditionnements consiste à ajouter une crête ou une pépite à la diagonale de la matrice de covariance. Pour la régression GP, cela revient à ajouter (ou à augmenter, s'il est déjà présent) du bruit d'observation.
Jusqu'ici tout va bien. J'ai modifié le code pour une inférence exacte de gpml afin que chaque fois que la décomposition de Cholesky échoue, j'essaie de fixer la matrice de covariance à la matrice symétrique positive définie (SPD) la plus proche dans la norme Frobenius, inspirée par ce code MATLAB de John d'Errico. La justification est de minimiser l'intervention sur la matrice d'origine.
Cette solution de contournement fait le travail, mais j'ai remarqué que les performances de BO diminuaient considérablement pour certaines fonctions - peut-être chaque fois que l'algorithme aurait besoin de zoomer dans une certaine zone (par exemple, parce qu'il se rapproche du minimum ou parce que les échelles de longueur du problème deviennent non uniformément petits). Ce comportement est logique car j'augmente effectivement le bruit chaque fois que deux points d'entrée sont trop proches, mais bien sûr ce n'est pas idéal. Alternativement, je pourrais simplement supprimer les points problématiques, mais encore une fois, j'ai parfois besoin que les points d'entrée soient proches.
Question
Je ne pense pas que les problèmes numériques avec la factorisation de Cholesky des matrices de covariance de GP soient un problème nouveau, mais à ma grande surprise, je n'ai pas trouvé de solutions jusqu'à présent, à part augmenter le bruit ou supprimer des points trop proches les uns des autres. D'un autre côté, il est vrai que certaines de mes fonctions se comportent assez mal, donc peut-être que ma situation n'est pas si typique.
Toute suggestion / référence qui pourrait être utile ici?
Réponses:
Une autre option consiste à faire la moyenne des points causant essentiellement - par exemple, si vous avez 1000 points et 50 problèmes, vous pouvez prendre l'approximation optimale de bas rang en utilisant les 950 premières valeurs / vecteurs propres. Cependant, ce n'est pas loin de supprimer les points de données proches les uns des autres, ce que vous avez dit de ne pas faire. Veuillez garder à l'esprit cependant que lorsque vous ajoutez de la gigue, vous réduisez les degrés de liberté - c'est-à-dire que chaque point influence moins votre prédiction, donc cela pourrait être pire que d'utiliser moins de points.
Une autre option (que je pense personnellement intéressante) est de combiner les deux points de manière plus intelligente. Vous pouvez par exemple prendre 2 points et les combiner en un seul, mais aussi les utiliser pour déterminer une approximation du gradient également. Pour inclure des informations sur le gradient, tout ce dont vous avez besoin depuis votre noyau est de trouver et . Les produits dérivés n'ont généralement pas de corrélation avec leur observation, vous ne rencontrez donc pas de problèmes de conditionnement et ne conservez pas les informations locales.dxk(x,x′) dxdx′k(x,x′)
Éditer:
Sur la base des commentaires, j'ai pensé que j'élaborerais ce que je voulais dire en incluant des observations dérivées. Si nous utilisons un noyau gaussien (comme exemple),
ses dérivés sont,
Supposons maintenant que nous avons un point de données et un dérivé à que j'appellerai .{xi,yi;i=1,...,n} x1 m1
Soit , puis nous utilisons un seul GP standard avec matrice de covariance comme,Y=[m1,y1,…,yn]
Le reste du GP est le même que d'habitude.
la source
Une solution que nous avons lancée au bureau consiste simplement à modifier les points problématiques. Cela peut prendre la forme d'une suppression directe ou de quelque chose de plus sophistiqué. Essentiellement, l'observation est que les points proches sont très redondants: en fait, tellement redondants qu'ils réduisent le rang de la matrice de covariance. De la même manière, un point contribue de toute façon peu d'informations au problème en question, donc supprimer l'un ou l'autre (ou faire autre chose, comme les faire la moyenne ou «rebondir» un point loin de l'autre à une distance minimale acceptable) pas vraiment beaucoup changer votre solution.
Je ne sais pas comment juger à quel moment les deux points deviennent "trop proches". Cela pourrait peut-être être une option de réglage laissée à l'utilisateur.
(Oups! Après avoir posté cela, j'ai trouvé votre question ici qui fait avancer cette réponse vers une solution beaucoup plus élaborée. J'espère qu'en y associant à partir de ma réponse, je vais aider avec le référencement ...)
la source