Matriz de covarianza mal condicionada en regresión GP para optimización bayesiana

12

Antecedentes y problema

Estoy usando procesos gaussianos (GP) para la regresión y la posterior optimización bayesiana (BO). Para la regresión, uso el paquete gpml para MATLAB con varias modificaciones personalizadas, pero el problema es general.

Es un hecho bien conocido que cuando dos entradas de entrenamiento están demasiado cerca en el espacio de entrada, la matriz de covarianza puede volverse no positiva definida (hay varias preguntas al respecto en este sitio). Como resultado, la descomposición de Cholesky de la matriz de covarianza, necesaria para varios cálculos GP, puede fallar debido a un error numérico. Esto me sucedió en varios casos al realizar BO con las funciones objetivas que estoy usando, y me gustaría solucionarlo.

Soluciones propuestas

AFAIK, la solución estándar para aliviar el mal acondicionamiento es agregar una cresta o pepita a la diagonal de la matriz de covarianza. Para la regresión GP, ​​esto equivale a agregar (o aumentar, si ya está presente) ruido de observación.

Hasta aquí todo bien. Modifiqué el código para la inferencia exacta de gpml, de modo que cada vez que falla la descomposición de Cholesky, trato de arreglar la matriz de covarianza a la matriz simétrica positiva definida (SPD) más cercana en la norma Frobenius, inspirada en este código MATLAB de John d'Errico. La razón es minimizar la intervención en la matriz original.

Esta solución hace el trabajo, pero noté que el rendimiento de BO se redujo sustancialmente para algunas funciones, posiblemente cada vez que el algoritmo necesitaría acercarse en alguna área (por ejemplo, porque se está acercando al mínimo o porque la longitud se escala del problema se vuelven no uniformemente pequeños). Este comportamiento tiene sentido ya que estoy aumentando efectivamente el ruido cada vez que dos puntos de entrada se acercan demasiado, pero por supuesto no es lo ideal. Alternativamente, podría eliminar puntos problemáticos, pero nuevamente, a veces necesito que los puntos de entrada estén cerca.

Pregunta

No creo que los problemas numéricos con la factorización de Cholesky de las matrices de covarianza de GP sean un problema nuevo, pero para mi sorpresa no pude encontrar muchas soluciones hasta ahora, aparte de aumentar el ruido o eliminar puntos que están demasiado cerca el uno del otro. Por otro lado, es cierto que algunas de mis funciones se comportan bastante mal, por lo que tal vez mi situación no sea tan típica.

¿Alguna sugerencia / referencia que pueda ser útil aquí?

lacerbi
fuente
Puede considerar formar las entradas de la matriz de covarianza, así como calcular o actualizar su factorización de Cholesky, con mayor precisión, por ejemplo, precisión cuádruple o incluso mayor. Aparte de la molestia, los cálculos pueden ser órdenes de magnitud más lentos. Hay complementos de precisión arbitrarios para MATLAB. No digo que esto sea ideal, pero puede ser una opción. No sé qué tan bien juegan con gpml, pero si puedes cambiar el código fuente de gpml (archivos m), tal vez puedas hacerlo.
Mark L. Stone el
¿Intentaste agregar un pequeño jitter a la diagonal de la matriz de covarianza?
Zen
@ MarkL.Stone Gracias por la sugerencia. Desafortunadamente, necesito que el código de entrenamiento sea rápido, por lo que los números de alta precisión probablemente no serán una buena opción para mi aplicación.
lacerbi
2
Esta pregunta es realmente interesante. Al agregar el efecto de pepita a su matriz de covaraince como optimizo sigma según su probabilidad, o se le da . Me he dado cuenta que la optimización de la captura de efecto pepita de ruido de medición y ayuda que el proceso gausssianσ2Iσ
Sab
1
Por lo general, optimizo. En algunos casos traté de marginarlo, pero no obtuve una gran mejora en la optimización del wrt (supongo que el posterior era muy estrecho).
lacerbi

Respuestas:

7

Otra opción es esencialmente promediar los puntos que causan, por ejemplo, si tiene 1000 puntos y 50 problemas de causa, podría tomar la aproximación óptima de rango bajo utilizando los primeros 950 valores propios / vectores. Sin embargo, esto no está lejos de eliminar los puntos de datos juntos, lo que dijiste que preferirías no hacer. Sin embargo, tenga en cuenta que a medida que agrega jitter, reduce los grados de libertad, es decir, cada punto influye menos en su predicción, por lo que esto podría ser peor que usar menos puntos.

Otra opción (que personalmente creo que es buena) es combinar los dos puntos de una manera más inteligente. Por ejemplo, podría tomar 2 puntos y combinarlos en uno, pero también usarlos para determinar una aproximación para el gradiente también. Para incluir información de gradiente, todo lo que necesita de su núcleo es encontrar y . Los derivados generalmente no tienen correlación con su observación, por lo que no se topa con problemas de condicionamiento y conserva la información local.dxk(x,x)dxdxk(x,x)

Editar:

Con base en los comentarios, pensé en elaborar lo que quería decir al incluir observaciones derivadas. Si usamos un núcleo gaussiano (como ejemplo),

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

sus derivados son,

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

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

Ahora, supongamos que tenemos algún punto de datos y una derivada en que llamaré .{xi,yi;i=1,...,n}x1m1

Deje , luego usamos un GP estándar único con matriz de covarianza como,Y=[m1,y1,,yn]

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

El resto del GP es el mismo de siempre.

j__
fuente
¿Le gustaría ampliar los detalles sobre su uso propuesto de información de gradiente aproximada?
Mark L. Stone el
@j Gracias. Pensé en hacer una aproximación de bajo rango, podría intentarlo (lo evité hasta ahora, ya que podría tener que reescribir grandes partes del código). Con respecto a la combinación de dos puntos en uno, lo propuse en una pregunta anterior , pero no pensé en obtener información derivada. En principio suena bien, pero no estoy seguro de cómo lo usaría, ya que solo tendría unas pocas observaciones derivadas (correspondientes a los puntos combinados), con la carga de agregar un GP por dimensión de entrada.
lacerbi
@j Gracias por la explicación adicional. Esto se ve muy bien hecho. ¿Tiene referencias para este enfoque (o algo similar)?
lacerbi
2
Consulte la página 67 de la tesis de Mike Osborne ( robots.ox.ac.uk/~mosb/public/pdf/136/full_thesis.pdf ): presenta observaciones derivadas e integrales. Espero que ayude :)
j__
4

Una solución que hemos utilizado en la oficina es simplemente alterar los puntos problemáticos. Esto puede tomar la forma de eliminación directa o algo más sofisticado. Esencialmente, la observación es que los puntos cercanos son altamente redundantes: de hecho, tan redundantes que reducen el rango de la matriz de covarianza. De la misma manera, un punto está contribuyendo con poca información al problema en cuestión de todos modos, por lo que eliminar uno u otro (o hacer otra cosa, como promediarlos o "rebotar" un punto lejos del otro a una distancia mínima aceptable) Realmente no cambiar tanto su solución.

No estoy seguro de cómo juzgar en qué punto los dos puntos se vuelven "demasiado cercanos". Quizás esta podría ser una opción de ajuste que le queda al usuario.

(¡Vaya! Después de publicar esto, encontré su pregunta aquí que avanza esta respuesta a una solución mucho más elaborada. Espero que al vincularla desde mi respuesta, ayude con SEO ...)

Sycorax dice reinstalar a Mónica
fuente
esto es bastante útil, ¿pueden arrojar algo de luz sobre esto si es posible?
GENIVI-LEARNER