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í?
Respuestas:
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.rex k ( x , x′) rex dX′k ( 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),
sus derivados son,
Ahora, supongamos que tenemos algún punto de datos y una derivada en que llamaré .{xi,yi;i=1,...,n} x1 m1
Deje , luego usamos un GP estándar único con matriz de covarianza como,Y=[m1,y1,…,yn]
El resto del GP es el mismo de siempre.
fuente
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 ...)
fuente