Wie verwende ich den GPML-Matlab-Code korrekt für ein tatsächliches Problem (ohne Demo)?

9

Ich habe den neuesten GPML-Matlab-Code heruntergeladen. Ich habe die Dokumentation gelesen und die Regressionsdemo ohne Probleme ausgeführt. Ich habe jedoch Schwierigkeiten zu verstehen, wie ich es auf ein Regressionsproblem anwenden kann, mit dem ich konfrontiert bin.

Das Regressionsproblem ist wie folgt definiert:


Sei ein Eingabevektor und y iR 25 sein entsprechendes Ziel. Die Menge von M Eingängen ist in einer Matrix X = [ x 1 , , x M ] ⊤ angeordnet und ihre entsprechenden Ziele sind in einer Matrix Y = [ y 1 - ˉ y , , y M - ˉ y ] ⊤ gespeichert . mit ˉ yxiR20yiR25MX=[x1,,xM]Y=[y1y¯,,yMy¯]y¯Dies ist der mittlere Zielwert in .Y

Ich möchte ein GPR-Modell mit der quadratischen Exponentialfunktion trainieren:G={X,Y,θ}

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

Dabei ist gleich wenn und andernfalls . Die Hyperparameter sind wobei der angenommene Geräuschpegel in den Trainingsdaten und die Längenskala ist. 1 i = j 0 θ = ( α , β , γ ) γ βδij1i=j0θ=(α,β,γ)γβ

Um das Modell zu trainieren, muss ich die negative logarithmische Grenzwahrscheinlichkeit in Bezug auf die Hyperparameter minimieren:

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

Dabei ist c eine Konstante und die Matrix eine Funktion der Hyperparameter (siehe Gleichung k (xi, xj) = ...).K


Basierend auf der Demo auf der GPML-Website ist mein Versuch, dies mithilfe des GPML-Matlab-Codes zu implementieren, unten aufgeführt.

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 enthält die Trainingseingaben

X2 enthält die Testeingänge

Y1 enthält die Trainingsziele

Y2r sind die Schätzungen aus der Anwendung des Modells

n ist der Index, mit dem jedes Element im Ausgabevektor zurückgeführt wird

Ist dies angesichts des Problems der richtige Weg, um das GPR-Modell zu trainieren und anzuwenden? Wenn nicht, was muss ich ändern?

Josh
quelle

Antworten:

7

Der Hausarzt leistet gute Arbeit für die Trainingsdaten Ihres Problems. Für die Testdaten ist es jedoch nicht so toll. Sie haben wahrscheinlich schon so etwas wie das Folgende selbst ausgeführt:

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

Durch manuelles Einstellen der Hyperparameter und ohne Verwendung der Minimierungsfunktion ist es möglich, den Zug- und Testfehler etwas auszugleichen, aber das Einstellen der Methode anhand des Testfehlers ist nicht das, was Sie tun sollen. Ich denke, was passiert, ist eine starke Überanpassung an Ihre drei Probanden, die die Trainingsdaten generiert haben. Keine Methode wird hier einen guten Job machen, und wie könnte es sein? Sie geben die Trainingsdaten an, sodass die Methode versucht, die Trainingsdaten so gut wie möglich zu verarbeiten, ohne sie zu überanpassen. Und tatsächlich passt es nicht im klassischen Sinne. Es passt nicht zu den Daten, aber zu den drei Trainingsthemen. Eine Kreuzvalidierung mit dem Trainingssatz würde uns beispielsweise sagen, dass es keine Überanpassung gibt. Trotzdem wird Ihr Testsatz schlecht erklärt.

Was Sie tun können, ist:

  1. Holen Sie sich Daten von mehr Themen für das Training. Auf diese Weise sieht Ihre vierte Person weniger wahrscheinlich wie ein "Ausreißer" aus als derzeit. Außerdem haben Sie nur eine Sequenz von jeder Person, richtig? Vielleicht würde es helfen, die Sequenz mehrmals aufzuzeichnen.

  2. Integrieren Sie irgendwie Vorkenntnisse über Ihre Aufgabe, die verhindern, dass eine Methode an bestimmte Themen angepasst wird. In einem GP könnte dies über die Kovarianzfunktion erfolgen, aber es ist wahrscheinlich nicht so einfach ...

  3. Wenn ich mich nicht irre, sind die Sequenzen tatsächlich Zeitreihen. Vielleicht wäre es sinnvoll, die zeitlichen Beziehungen auszunutzen, beispielsweise mit wiederkehrenden neuronalen Netzen.

Es gibt definitiv mehr, aber das sind die Dinge, an die ich gerade denken kann.

Ahans
quelle
Ich gehe von einem Gaußschen Prozess mit einem Mittelwert von Null aus. Da die Ziele keinen Mittelwert von Null haben, zentriere ich sie durch Subtrahieren ihres Mittelwerts. Sie haben Recht mit der Redundanz; Ich habe diese beiden Zeilen entfernt. Ich glaube nicht, dass die Kovarianzfunktion angesichts des Problems korrekt ist, und ich bin nicht sicher, ob die Hyperparameter initialisiert werden. Meine Zweifel ergeben sich aus den Ergebnissen. Die Residuen sind praktisch die gleichen wie für die Gratregression, und meine Daten sind bekanntermaßen sehr nichtlinear.
Josh
Sie haben Recht mit der Subtraktion; es sollte auf keinen Fall weh tun. Normalerweise würde ich das zur Kovarianzfunktion hinzufügen, da covfunc = { 'covSum', { 'covSEiso' } }ich nicht ganz sehe, wie dies jetzt für verrauschte Daten sorgt. Es scheint, dass sich die Toolbox seit meiner letzten Verwendung stark verändert hat. Ich werde sie mir später genauer ansehen .
Ahans
Was wissen Sie über Ihr Problem, das Sie denken lässt, dass covSEiso keine vernünftige Wahl ist? Und die Ridge-Regression, die Sie verwenden, ist das eine kernlisierte oder eine lineare? Wenn Sie Kernel verwenden, ist es nicht verwunderlich, dass Sie ähnliche Ergebnisse erzielen.
Ahans
Können Sie Beispieldaten zu Ihrem Problem bereitstellen? Das würde die Dinge ein bisschen einfacher machen, vielleicht mit nur einer Zieldimension.
Ahans
1
n>30
3

Ich denke, das Problem könnte eine falsche Modellspezifikation sein. Wenn Ihre Ziele Winkel von + -180 Grad haben, ist der "Rauschprozess" für Ihre Daten möglicherweise nicht guassisch genug, sodass die baysischen Beweise keine gute Möglichkeit sind, die Hyperparameter zu optimieren. Überlegen Sie beispielsweise, was passiert, wenn "Rauschen" das Signal umgibt. In diesem Fall ist es zu klug sein , kann entweder die Modellauswahl durchführt , indem die Kreuzvalidierungsfehler minimiert wird (es ist eine Public Domain Implementierung des Verfahrens simplex Nelder-Mead hierwenn Sie nicht über die Optimierungs-Toolbox verfügen). Die Kreuzvalidierungsschätzung der Leistung ist nicht so empfindlich gegenüber Modellfehlspezifikationen, sondern eine direkte Schätzung der Testleistung, während die marginale Wahrscheinlichkeit des Modells der Beweis für das Modell ist, da die Modellannahmen korrekt sind. Siehe die Diskussion ab Seite 123 des Buches von Rasmussen und Williams.

Ein anderer Ansatz wäre, die Ausgänge neu zu codieren, damit ein Gaußsches Rauschmodell besser geeignet ist. Eine Sache, die Sie tun könnten, ist eine Form der unbeaufsichtigten Reduzierung der Dimensionalität, da es nichtlineare Beziehungen zwischen Ihren Zielen gibt (da es nur eine begrenzte Art und Weise gibt, wie sich ein Körper bewegen kann), so dass es eine niedrigerdimensionale Mannigfaltigkeit gibt, die Ihre Ziele leben weiter, und es wäre besser, die Koordinaten dieser Mannigfaltigkeit als die Winkel selbst zu regressieren (auf diese Weise gibt es möglicherweise auch weniger Ziele).

Auch eine Art Procrustes-Analyse könnte eine gute Idee sein, um die Unterschiede zwischen den Probanden vor dem Training des Modells zu normalisieren.

Möglicherweise finden Sie einige der Arbeiten von Neil Lawrence zur Wiederherstellung des menschlichen Interesses. Ich erinnere mich, dass ich vor einigen Jahren auf einer Konferenz eine Demo davon gesehen habe und war sehr beeindruckt.

Dikran Beuteltier
quelle
Bei meiner Analyse habe ich festgestellt, dass die Diskontinuitäten im Ausgaberaum eine Reihe von Problemen verursachen. Ich habe überlegt, Gelenkpositionen anstelle von Gelenkwinkeln zu verwenden, um dieses Problem zu lösen. Hatten Sie durch die Reduzierung der Dimensionalität eine bestimmte Methode im Sinn? Im Gegensatz zu bildbasierten Ansätzen sehe ich nicht, wie sich die Unterschiede in den Probanden (außer ihren Bewegungsmustern) auf das Training des Modells auswirken würden, da ich Orientierungen von IMU-Sensoren verwende, die konsistent platziert und nachbearbeitet werden zwischen Themen ausgerichtet.
Josh
Ich bin schon einmal auf Lawrences Zeitung gestoßen. Da in der Arbeit nur eine Sequenz erwähnt wurde, scheint es, dass irgendeine Form von k-fachem CV durchgeführt wurde. In diesem Fall wird das Problem fast trivial. Gleichartige Zuordnungen einer Aktivität, insbesondere einer zyklischen, sind normalerweise einfach, um anständige Posenschätzungen zu erhalten. Ich habe Zuordnungen zum gleichen Thema und zum gleichen Thema verglichen, und der Unterschied ist sehr signifikant. Leider ist die Forschung in diesem Bereich grundsätzlich unvergleichlich, da jeder sein eigenes Regressionsframework, Mocap-Daten, Fehlermetriken und Eingabe- / Ausgabestrukturen verwendet.
Josh