Comment utiliser correctement le code Matlab GPML pour un problème réel (non démo)?

9

J'ai téléchargé le code GPML Matlab le plus récent Code GPML Matlab et j'ai lu la documentation et exécuté la démonstration de régression sans aucun problème. Cependant, j'ai du mal à comprendre comment l'appliquer à un problème de régression auquel je suis confronté.

Le problème de régression est défini comme suit:


Soit un vecteur d'entrée et sa cible correspondante. L'ensemble des entrées est organisé en une matrice et leurs cibles correspondantes sont stockées dans une matrice , avec étant la valeur cible moyenne dans .xiR20yiR25MX=[x1,,xM]Y=[y1y¯,,yMy¯]y¯Y

Je souhaite former un modèle GPR utilisant la fonction exponentielle au carré:G={X,Y,θ}

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

où est égal à si et sinon. Les hyperparamètres sont avec étant le niveau de bruit supposé dans les données d'entraînement et est l'échelle de longueur.δij1i=j0θ=(α,β,γ)γβ

Pour former le modèle, je dois minimiser la probabilité marginale logarithmique négative par rapport aux hyperparamètres:

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

où c est une constante et la matrice est une fonction des hyperparamètres (voir équation k (xi, xj) = ...).K


Sur la base de la démo donnée sur le site Web GPML, ma tentative d'implémenter cela en utilisant le code GPML Matlab est ci-dessous.

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 contient les entrées de formation

X2 contient les entrées de test

Y1 contient les objectifs d'entraînement

Y2r sont les estimations de l'application du modèle

n est l'indice utilisé pour régresser chaque élément du vecteur de sortie

Étant donné le problème, est-ce la bonne façon de former et d'appliquer le modèle GPR? Sinon, que dois-je changer?

Josh
la source

Réponses:

7

Le GP fait un bon travail pour les données d'entraînement de votre problème. Cependant, ce n'est pas si bon pour les données de test. Vous avez probablement déjà exécuté quelque chose comme le suivant:

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

Ajuster les hyperparamètres manuellement et ne pas utiliser la fonction de minimisation, il est possible d'équilibrer quelque peu le train et l'erreur de test, mais ajuster la méthode en regardant l'erreur de test n'est pas ce que vous êtes censé faire. Je pense que ce qui se passe est trop adapté à vos trois sujets qui ont généré les données de formation. Aucune méthode prête à l'emploi ne fera un bon travail ici, et comment pourrait-elle le faire? Vous fournissez les données d'entraînement, de sorte que la méthode essaie de tirer le meilleur parti possible des données d'entraînement sans surajustement. Et ce fait, il ne s'emballe pas au sens classique. Il ne correspond pas aux données, mais il s'adapte aux trois sujets de formation. Par exemple, une validation croisée avec l'ensemble d'entraînement nous dirait qu'il n'y a pas de sur-ajustement. Pourtant, votre test sera mal expliqué.

Ce que vous pouvez faire, c'est:

  1. Obtenez des données de plus de sujets pour la formation. De cette façon, votre quatrième personne sera moins susceptible de ressembler à une "valeur aberrante" comme elle le fait actuellement. De plus, vous n'avez qu'une seule séquence de chaque personne, non? Il serait peut-être utile d'enregistrer la séquence plusieurs fois.

  2. Incorporer en quelque sorte des connaissances préalables sur votre tâche qui empêcheraient une méthode de sur-adapter à des sujets spécifiques. Dans un GP qui pourrait être fait via la fonction de covariance, mais ce n'est probablement pas si facile à faire ...

  3. Si je ne me trompe pas, les séquences sont en fait des séries chronologiques. Il serait peut-être judicieux d'exploiter les relations temporelles, par exemple en utilisant des réseaux de neurones récurrents.

Il y en a certainement plus, mais ce sont les choses auxquelles je peux penser en ce moment.

ahans
la source
Je suppose un processus gaussien à moyenne nulle. Comme les cibles n'ont pas de moyenne nulle, je les centre en soustrayant leur moyenne. Vous avez raison sur la redondance; J'ai supprimé ces deux lignes. Je ne crois pas que la fonction de covariance soit correcte étant donné le problème, et je ne suis pas sûr de l'initialisation des hyperparamètres. Mes doutes viennent des résultats. Les résidus sont pratiquement les mêmes que ceux de la régression des crêtes, et mes données sont connues pour être très non linéaires.
Josh
Vous avez raison sur la soustraction; ça ne devrait en aucun cas faire mal. J'ajouterais normalement cela à la fonction de covariance, comme covfunc = { 'covSum', { 'covSEiso' } }je ne vois pas très bien comment cela prend en charge les données bruyantes maintenant, il semble que la boîte à outils a beaucoup changé depuis ma dernière utilisation, j'y reviendrai de plus près .
ahans
Que savez-vous de votre problème qui vous fait penser que le covSEiso n'est pas un choix raisonnable? Et la régression de crête que vous utilisez, est-elle kernisée ou linéaire? Si vous utilisez des noyaux, il n'est pas surprenant que vous obteniez des résultats similaires.
ahans
Pouvez-vous fournir des exemples de données sur votre problème? Cela rendrait les choses un peu plus faciles, peut-être avec une seule dimension cible.
ahans
1
@Masood Tu as raison, mais quand n>30la distribution de Student t est très proche de la distribution gaussienne. Même avec n> 20, nous avons généralement une bonne approximation.
chl
3

Je pense que le problème peut être dû à une mauvaise spécification du modèle. Si vos cibles sont des angles enveloppés à + -180 degrés, alors le "processus de bruit" pour vos données peut être suffisamment non guassien pour que les preuves baysiennes ne soient pas un bon moyen d'optimiser les hyper-paramètres. Par exemple, réfléchissez à ce qui se passe lorsque le «bruit» fait boucler le signal. Dans ce cas, il peut être judicieux d'effectuer une sélection de modèle en minimisant l'erreur de validation croisée (il existe une implémentation du domaine public de la méthode Nelder-Mead simplex icisi vous ne disposez pas de la boîte à outils d'optimisation). L'estimation de la validation croisée des performances n'est pas aussi sensible aux erreurs de spécification du modèle qu'elle est une estimation directe des performances des tests, tandis que la probabilité marginale du modèle est la preuve à l'appui du modèle étant donné que les hypothèses du modèle sont correctes. Voir la discussion commençant à la page 123 du livre de Rasmussen et Williams.

Une autre approche serait de recoder les sorties afin qu'un modèle de bruit gaussien soit plus approprié. Une chose que vous pourriez faire est une certaine forme de réduction de la dimensionnalité non supervisée, car il existe des relations non linéaires entre vos cibles (car il n'y a qu'une manière limitée dans laquelle un corps peut se déplacer), il y aura donc une variété de dimension inférieure que votre les cibles continuent de vivre, et il serait préférable de régresser les coordonnées de cette variété plutôt que les angles eux-mêmes (il peut y avoir aussi moins de cibles de cette façon).

Une analyse de Procrustes pourrait également être une bonne idée pour normaliser les différences entre les sujets avant de former le modèle.

Vous trouverez peut-être certains des travaux effectués par Neil Lawrence sur le rétablissement de la pose humaine. Je me souviens avoir vu une démonstration de cela lors d'une conférence il y a quelques années et j'ai été très impressionné.

Dikran Marsupial
la source
D'après mon analyse, j'ai remarqué que les discontinuités dans l'espace de sortie causent un certain nombre de problèmes. J'ai envisagé d'utiliser des emplacements communs plutôt que des angles communs pour surmonter ce problème. Par réduction de dimensionnalité, aviez-vous une méthode particulière en tête? Contrairement aux approches basées sur l'image, je ne vois pas comment les différences de sujets (autres que leurs schémas de mouvement) affecteraient la formation du modèle, étant donné que j'utilise des orientations de capteurs IMU qui sont systématiquement placés et post-traités pour être aligné entre les sujets.
Josh
J'ai déjà rencontré le journal de Lawrence. Puisqu'une seule séquence a été mentionnée dans l'article, il semble qu'une certaine forme de CV k-fold ait été réalisée. Dans ce cas, le problème devient presque trivial. Les mappages d'une même personne sur une activité, en particulier celle qui est cyclique, sont généralement simples pour obtenir des estimations de pose décente. J'ai comparé des mappages de même sujet et inter-sujets, et la différence est très significative. Malheureusement, la recherche dans ce domaine est fondamentalement incomparable car tout le monde utilise son propre cadre de régression, ses données de mocap, ses mesures d'erreur et ses structures d'entrée / sortie.
Josh