Matriz de covariância mal condicionada na regressão GP para otimização bayesiana


12

Antecedentes e problema

Estou usando Processos Gaussianos (GP) para regressão e subsequente otimização bayesiana (BO). Para regressão, uso o pacote gpml do MATLAB com várias modificações personalizadas, mas o problema é geral.

É um fato bem conhecido que, quando duas entradas de treinamento estão muito próximas no espaço de entrada, a matriz de covariância pode se tornar definitiva não positiva (há várias perguntas sobre isso neste site). Como resultado, a decomposição de Cholesky da matriz de covariância, necessária para vários cálculos de GP, pode falhar devido a erro numérico. Isso aconteceu comigo em vários casos ao executar o BO com as funções objetivas que estou usando e gostaria de corrigi-lo.

Soluções propostas

AFAIK, a solução padrão para aliviar o mau condicionamento é adicionar uma crista ou pepita à diagonal da matriz de covariância. Para a regressão GP, isso equivale a adicionar (ou aumentar, se já estiver presente) ruído de observação.

Por enquanto, tudo bem. Modifiquei o código para inferência exata de gpml, para que, sempre que a decomposição de Cholesky falhe, tento fixar a matriz de covariância na matriz simétrica positiva definida (SPD) mais próxima na norma Frobenius, inspirada neste código MATLAB de John d'Errico. A lógica é minimizar a intervenção na matriz original.

Essa solução alternativa faz o trabalho, mas notei que o desempenho do BO reduziu substancialmente para algumas funções - possivelmente sempre que o algoritmo precisasse aumentar o zoom em alguma área (por exemplo, porque ele está se aproximando do mínimo ou porque o comprimento é menor) do problema se tornar não uniformemente pequeno). Esse comportamento faz sentido, pois estou aumentando efetivamente o ruído sempre que dois pontos de entrada se aproximam demais, mas é claro que não é o ideal. Como alternativa, eu poderia remover pontos problemáticos, mas, novamente, às vezes preciso que os pontos de entrada estejam próximos.

Questão

Não acho que problemas numéricos com a fatoração de Cholesky das matrizes de covariância de GP sejam um problema novo, mas para minha surpresa não consegui encontrar muitas soluções até agora, além de aumentar o ruído ou remover pontos muito próximos um do outro. Por outro lado, é verdade que algumas das minhas funções são muito mal comportadas, então talvez minha situação não seja tão típica.

Alguma sugestão / referência que possa ser útil aqui?


Você pode procurar formar as entradas da matriz de covariância, além de calcular ou atualizar sua fatoração de Cholesky, com maior precisão, por exemplo, precisão quádrupla ou até mais alta. Além do aborrecimento, os cálculos podem ter ordens de magnitude mais lentas. Existem complementos de precisão arbitrários para o MATLAB. Não estou dizendo que isso seja ideal, mas pode ser uma opção. Eu não sei o quão bem eles jogam com o gpml, mas se você pode alterar o código-fonte do gpml (arquivos m), talvez seja possível.
Mark L. Stone

Você tentou adicionar um pequeno jitter à diagonal da matriz de covariância?
Zen

@ MarkL.Stone Obrigado pela sugestão. Infelizmente, preciso que o código de treinamento seja rápido, portanto, os números numéricos de alta precisão provavelmente não serão uma boa opção para o meu aplicativo.
lacerbi

2
Esta questão é realmente interessante. Ao adicionar o efeito pepita à sua covaraince matriz tais como você otimizar sigma em sua probabilidade, ou seja σ dado. Tenho notado que otimizar o efeito pepita capturas de ruído de medição e ajuda que ele processo gausssianσ2Iσ
Wis

1
Eu costumo otimizar. Em alguns casos, tentei marginalizá-lo, mas não obtive muita otimização por escrito (presumo que o posterior fosse muito estreito).
lacerbi

Respostas:


7

Outra opção é calcular a média essencial dos pontos que causam - por exemplo, se você tiver 1000 pontos e 50 problemas, poderá fazer a aproximação ideal de classificação baixa usando os primeiros 950 valores / vetores próprios. No entanto, isso não está longe de remover os pontos de dados que você disse que preferiria não fazer. Lembre-se de que, ao adicionar instabilidade, você reduz os graus de liberdade - ou seja, cada ponto influencia menos sua previsão, portanto isso pode ser pior do que usar menos pontos.

dxk(x,x)dxdxk(x,x)

Editar:

Com base nos comentários, pensei em elaborar o que eu quis dizer com a inclusão de observações derivadas. Se usarmos um kernel gaussiano (como exemplo),

kx,x=k(x,x)=σexp((xx)2l2)

seus derivados são,

kdx,x=dk(x,x)dx=2(xx)l2σexp((xx)2l2)

kdx,dx=d2k(x,x)dxdx=2l22(xx)l4σexp((xx)2l2)

{xi,yi;i=1,...,n}x1m1

Y=[m1,y1,,yn]

K=(kdx0,dx0kdx0,x0kdx0,xnkdx0,x0kx0,x0kx0,xnkdx0,xnkx0,xnkxn,xn)

O resto do GP é o mesmo de sempre.


Você gostaria de expandir os detalhes sobre o uso proposto de informações aproximadas de gradiente?
Mark L. Stone

@j Obrigado - pensei em fazer uma aproximação de baixo escalão, posso tentar (evitei até agora, pois talvez eu tenha que reescrever grandes partes do código). Em relação à combinação de dois pontos em um, eu o havia proposto em uma pergunta anterior , mas não pensei em obter informações derivadas. Em princípio, parece legal, mas não tenho certeza de como usá-lo, pois só tenho algumas observações derivadas (correspondentes aos pontos mesclados), com o ônus de adicionar um GP por dimensão de entrada.
lacerbi

@j Obrigado pela explicação adicional. Isso parece muito legal mesmo. Você tem referências para essa abordagem (ou algo semelhante o suficiente)?
lacerbi

2
Confira a tese de Mike Osborne na página 67 ( robots.ox.ac.uk/~mosb/public/pdf/136/full_thesis.pdf ) - ele apresenta observações derivadas e integrais. Espero que ajude :)
j__

4

Uma solução que discutimos no escritório é apenas alterar os pontos problemáticos. Isso pode assumir a forma de exclusão direta ou algo mais sofisticado. Essencialmente, a observação é que os pontos próximos são altamente redundantes: na verdade, são tão redundantes que reduzem a classificação da matriz de covariância. Da mesma forma, um ponto está contribuindo com pouca informação para o problema em questão, então remover um ou outro (ou fazer outra coisa, como fazer a média deles ou "afastar" um ponto do outro a uma distância mínima aceitável) realmente não mude tanto sua solução.

Não sei como julgar em que ponto os dois pontos se tornam "muito próximos". Talvez essa seja uma opção de ajuste deixada para o usuário.

(Ops! Depois de postar isso, encontrei sua pergunta aqui, que leva essa resposta a uma solução muito mais elaborada. Espero que, ao vincular a ela a partir da minha resposta, ajudarei com o SEO ...)


isso é bastante útil, você também pode esclarecer isso, se possível.
GENIVI-LEARNER
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.