¿Cómo usar correctamente el código GPML Matlab para un problema real (no demo)?

9

He descargado el código GPML Matlab más reciente GPML Matlab code y he leído la documentación y ejecuté la demostración de regresión sin ningún problema. Sin embargo, estoy teniendo dificultades para entender cómo aplicarlo a un problema de regresión al que me enfrento.

El problema de regresión se define de la siguiente manera:


Sea un vector de entrada y sea ​​su objetivo correspondiente. El conjunto de entradas se organiza en una matriz y sus objetivos correspondientes se almacenan en una matriz , con \ mathbf {\ bar {y}} es el valor objetivo medio en \ mathbf {Y} .xiR20yiR25MX=[x1,,xM]Y=[y1y¯,,yMy¯]y¯Y

Deseo entrenar un modelo GPR G={X,Y,θ} usando la función exponencial al cuadrado:

k(xi,xj)=α2exp(12β2(xixj)2)+γ2δij ,

donde δij es igual a 1 si i=j y 0 contrario. Los hiperparámetros son θ=(α,β,γ) siendo γ el nivel de ruido supuesto en los datos de entrenamiento y β es la escala de longitud.

Para entrenar el modelo, necesito minimizar la probabilidad marginal logarítmica negativa con respecto a los hiperparámetros:

logp(YX,θ)=12tr(YK1Y)+12logK+c,

donde c es una constante y la matriz es una función de los hiperparámetros (ver ecuación k (xi, xj) = ...).K


Basado en la demostración dada en el sitio web GPML, mi intento de implementar esto usando el código GPML Matlab está a continuación.

covfunc = @covSEiso;
likfunc = @likGauss;
sn = 0.1;
hyp.lik = log(sn);
hyp2.cov = [0;0];
hyp2.lik = log(0.1);
hyp2 = minimize(hyp2, @gp, -100, @infExact, [], covfunc, likfunc, X1, Y1(:, n));
exp(hyp2.lik)
nlml2 = gp(hyp2, @infExact, [], covfunc, likfunc, X1, Y1(:, n));
[m s2] = gp(hyp2, @infExact, [], covfunc, likfunc, X1, Y1(:, n), X2);
Y2r(:, n) = m;

X1 contiene las entradas de entrenamiento

X2 contiene las entradas de prueba

Y1 contiene los objetivos de entrenamiento

Y2r son las estimaciones de la aplicación del modelo.

n es el índice utilizado para hacer retroceder cada elemento en el vector de salida

Dado el problema, ¿es esta la forma correcta de entrenar y aplicar el modelo GPR? Si no, ¿qué necesito cambiar?

Josh
fuente

Respuestas:

7

El médico de cabecera hace un buen trabajo para los datos de entrenamiento de su problema. Sin embargo, no es tan bueno para los datos de prueba. Probablemente ya haya ejecutado algo como lo siguiente:

load('../XYdata_01_01_ab.mat');

for N = 1 : 25
    % normalize
    m = mean(Y1(N,:));
    s = std(Y1(N,:));
    Y1(N,:) = 1/s * (Y1(N,:) - m);
    Y2(N,:) = 1/s * (Y2(N,:) - m);

    covfunc = @covSEiso;
    ell = 2;
    sf = 1;
    hyp.cov = [ log(ell); log(sf)];

    likfunc = @likGauss;
    sn = 1;
    hyp.lik = log(sn);

    hyp = minimize(hyp, @gp, -100, @infExact, [], covfunc, likfunc, X1', Y1(N,:)');
    [m s2] = gp(hyp, @infExact, [], covfunc, likfunc, X1', Y1(N,:)', X1');    
    figure;    
    subplot(2,1,1); hold on;    
    title(['N = ' num2str(N)]);    
    f = [m+2*sqrt(s2); flipdim(m-2*sqrt(s2),1)];
    x = [1:length(m)];
    fill([x'; flipdim(x',1)], f, [7 7 7]/8);
    plot(Y1(N,:)', 'b');
    plot(m, 'r');
    mse_train = mse(Y1(N,:)' - m);

    [m s2] = gp(hyp, @infExact, [], covfunc, likfunc, X1', Y1(N,:)', X2');
    subplot(2,1,2); hold on;
    f = [m+2*sqrt(s2); flipdim(m-2*sqrt(s2),1)];
    x = [1:length(m)];
    fill([x'; flipdim(x',1)], f, [7 7 7]/8);    
    plot(Y2(N,:)', 'b');
    plot(m, 'r');
    mse_test = mse(Y2(N,:)' - m);

    disp(sprintf('N = %d -- train = %5.2f   test = %5.2f', N, mse_train, mse_test));
end

Ajustar los hiperparámetros manualmente y no usar la función de minimizar es posible equilibrar un poco el tren y el error de prueba, pero ajustar el método observando el error de prueba no es lo que se supone que debe hacer. Creo que lo que está sucediendo es un sobreajuste para sus tres sujetos que generaron los datos de entrenamiento. Ningún método listo para usar hará un buen trabajo aquí, y ¿cómo podría? Usted proporciona los datos de entrenamiento, por lo que el método intenta obtener lo mejor posible en los datos de entrenamiento sin sobreajustar. Y de hecho, no se sobreajusta en el sentido clásico. No se ajusta demasiado a los datos, pero se adapta a los tres sujetos de entrenamiento. Por ejemplo, la validación cruzada con el conjunto de entrenamiento nos indicaría que no hay sobreajuste. Aún así, su conjunto de prueba se explicará mal.

Lo que puedes hacer es:

  1. Obtenga datos de más temas para capacitación. De esta manera, será menos probable que su cuarta persona parezca "atípica" como lo hace actualmente. Además, solo tienes una secuencia de cada persona, ¿verdad? Tal vez sería útil grabar la secuencia varias veces.

  2. De alguna manera, incorpore conocimiento previo sobre su tarea que evitaría que un método se ajuste demasiado a temas específicos. En un GP que podría hacerse a través de la función de covarianza, pero probablemente no sea tan fácil de hacer ...

  3. Si no me equivoco, las secuencias son de hecho series de tiempo. Quizás tendría sentido explotar las relaciones temporales, por ejemplo, utilizando redes neuronales recurrentes.

Definitivamente hay más, pero esas son las cosas que puedo pensar en este momento.

ahans
fuente
Asumo un proceso gaussiano de media cero. Como los objetivos no tienen una media cero, los centro restando su media. Tienes razón sobre la redundancia; He eliminado esas dos líneas. No creo que la función de covarianza sea correcta dado el problema, y ​​no estoy seguro acerca de la inicialización de los hiperparámetros. Mis dudas surgen de los resultados. Los residuos son prácticamente los mismos que para la regresión de crestas, y se sabe que mis datos son altamente no lineales.
Josh
Tienes razón sobre la resta; No debería doler en ningún caso. Normalmente agregaría eso a la función de covarianza, covfunc = { 'covSum', { 'covSEiso' } }ya que no veo cómo esto se ocupa de los datos ruidosos ahora, parece que la caja de herramientas ha cambiado bastante desde la última vez que la usé, la examinaré más de cerca más adelante .
ahans
¿Qué sabe sobre su problema que le hace pensar que el covSEiso no es una opción razonable? Y la regresión de cresta que utilizas, ¿es una kernelizada o lineal? Si usa núcleos, no es sorprendente que obtenga resultados similares.
ahans
¿Puede proporcionar datos de muestra de su problema? Eso facilitaría un poco las cosas, tal vez con solo una dimensión objetivo.
ahans
1
@Masood Tienes razón, pero cuando la distribución t de Student está muy cerca de la distribución gaussiana. Incluso con n> 20, generalmente tenemos una buena aproximación. n>30
chl
3

Creo que el problema puede ser uno de especificación errónea del modelo. Si sus objetivos son ángulos ajustados a + -180 grados, entonces el "proceso de ruido" para sus datos puede no ser lo suficientemente guasiano como para que la evidencia baysiana no sea una buena manera de optimizar los hiperparámetros. Por ejemplo, considere qué sucede cuando el "ruido" hace que la señal se envuelva. En ese caso, puede ser conveniente realizar la selección ya sea modelo minimizando el error de validación cruzada (hay una implementación de dominio público del método de Nelder-Mead el simplex aquísi no tiene la caja de herramientas de optimización). La estimación de rendimiento de validación cruzada no es tan sensible a la especificación errónea del modelo, ya que es una estimación directa del rendimiento de la prueba, mientras que la probabilidad marginal del modelo es la evidencia en apoyo del modelo dado que los supuestos del modelo son correctos. Vea la discusión que comienza en la página 123 del libro de Rasmussen y Williams.

Otro enfoque sería volver a codificar las salidas para que un modelo de ruido gaussiano sea más apropiado. Una cosa que podría hacer es alguna forma de reducción de dimensionalidad no supervisada, ya que hay relaciones no lineales entre sus objetivos (ya que solo hay una forma limitada en la que un cuerpo puede moverse), por lo que habrá una variedad de dimensiones más bajas que su los objetivos siguen vivos, y sería mejor hacer retroceder las coordenadas de esa variedad en lugar de los ángulos en sí (también puede haber menos objetivos de esa manera).

También algún tipo de análisis de Procrustes podría ser una buena idea para normalizar las diferencias entre los sujetos antes de entrenar el modelo.

Es posible que encuentre interesante el trabajo realizado por Neil Lawrence sobre la recuperación de posturas humanas. Recuerdo haber visto una demostración de esto en una conferencia hace unos años y quedé muy impresionado.

Dikran Marsupial
fuente
De mi análisis, he notado que las discontinuidades en el espacio de salida causan una serie de problemas. He considerado usar ubicaciones de juntas en lugar de ángulos de juntas para superar este problema. Por reducción de dimensionalidad, ¿tenía en mente un método particular? A diferencia de los enfoques basados ​​en imágenes, no veo cómo las diferencias en los sujetos (aparte de sus patrones de movimiento) afectarían el entrenamiento del modelo, dado que estoy usando orientaciones de sensores IMU que se colocan y postprocesan constantemente para ser alineados entre sujetos.
Josh
Me he encontrado con el artículo de Lawrence antes. Dado que solo se mencionó 1 secuencia en el documento, parece que se realizó alguna forma de k-fold CV. En cuyo caso, el problema se vuelve casi trivial. Las asignaciones del mismo sujeto de una actividad, en particular una que es cíclica, suelen ser sencillas para obtener estimaciones de pose decentes. He comparado las asignaciones del mismo sujeto y entre sujetos, y la diferencia es muy significativa. Desafortunadamente, la investigación en esta área es básicamente incomparable debido a que todos usan su propio marco de regresión, datos de mocap, métricas de error y estructuras de entrada / salida.
Josh