実際の(デモではない)問題に対してGPML Matlabコードを正しく使用するにはどうすればよいですか?


9

最新のGPML MatlabコードGPML Matlabコードをダウンロードし、ドキュメントを読み、問題なく回帰デモを実行しました。しかし、私が直面している回帰問題にそれを適用する方法を理解するのに苦労しています。

回帰問題は次のように定義されます。


ましょうである入力ベクトルとであり、それに対応するターゲット。個の入力のセットは行列配置され、対応するターゲットは行列格納されます、はの平均目標値です。xiR20yiR25MX=[x1,,xM]Y=[y1y¯,,yMy¯]y¯Y

二乗指数関数を使用して、GPRモデルをトレーニングしたいと思います。G={X,Y,θ}

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

ここでに等しい場合と、さもなければ。ハイパーパラメーターは、はトレーニングデータの想定ノイズレベルで、は長さスケールです。δij1i=j0θ=(α,β,γ)γβ

モデルをトレーニングするには、ハイパーパラメーターに関して負の対数限界尤度を最小化する必要があります。

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

ここで、cは定数であり、行列はハイパーパラメーターの関数です(方程式k(xi、xj)= ...を参照)。K


GPML Webサイトで提供されているデモに基づいて、GPML Matlabコードを使用してこれを実装する私の試みを以下に示します。

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にはトレーニング入力が含まれています

X2にはテスト入力が含まれています

Y1にはトレーニングターゲットが含まれています

Y2rはモデルの適用からの推定です

nは、出力ベクトルの各要素を回帰するために使用されるインデックスです

問題を考えると、これはGPRモデルをトレーニングして適用する正しい方法ですか?そうでない場合、何を変更する必要がありますか?

回答:


7

GPは問題のトレーニングデータを適切に処理します。ただし、テストデータにはそれほど適していません。あなたはおそらく次のようなものを自分ですでに実行しているでしょう:

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

ハイパーパラメーターを手動で調整し、最小化機能を使用しない場合、トレーニングとテストエラーのバランスをいくらかとることは可能ですが、テストエラーを見てメソッドを調整することは、想定されていることではありません。トレーニングデータを生成した3人の被験者にとって、何が起こっているのでしょうか。すぐに使用できる方法はありません。どうすればよいでしょうか。トレーニングデータを提供するので、メソッドは過剰適合せずにトレーニングデータをできるだけ取得しようとします。そしてそれは事実、それは古典的な意味でオーバーフィットしない。データには適合しませんが、3つのトレーニング科目には適合します。たとえば、トレーニングセットとの相互検証により、過剰適合がないことがわかります。それでも、テストセットの説明は不十分です。

あなたができることは:

  1. トレーニングのために、より多くの被験者からデータを取得します。このようにして、4人目は現在のように「外れ値」のように見える可能性が低くなります。また、あなたは一人一人のシーケンスを持っていますね?多分それはシーケンスを複数回記録するのに役立ちます。

  2. どういうわけか、特定の主題にメソッドが過剰適合しないようにするタスクに関する事前知識を組み込みます。共分散関数を介して実行できるGPでは、おそらくそれは簡単ではありません...

  3. 私が間違っていなければ、シーケンスは実際には時系列です。たとえばリカレントニューラルネットワークを使用するなど、時間的な関係を活用することは理にかなっています。

間違いなくそれ以上のものがありますが、それらは私が今考えることができるものです。


私はゼロ平均ガウス過程を仮定しています。ターゲットには平均値がゼロではないため、平均値を差し引くことでターゲットを中央に配置します。あなたは冗長性について正しいです。この2行を削除しました。この問題を考えると、共分散関数が正しいとは思えません。ハイパーパラメータの初期化については自信がありません。私の疑問は結果から生まれました。残差はリッジ回帰の場合とほぼ同じであり、私のデータは非常に非線形であることがわかっています。
ジョシュ

あなたは減算について正しいです。それはいかなる場合でも害を及ぼすべきではありません。通常、これを共分散関数に追加しcovfunc = { 'covSum', { 'covSEiso' } }ます。これがノイズの多いデータを処理する方法がよくわからないようです。前回使用してからツールボックスが大幅に変更されたようです。後で詳しく見ていきます。 。
ahans '06 / 06/29

covSEisoが妥当な選択ではないと思われる問題について、あなたは何を知っていますか?そして、あなたが使用するリッジ回帰は、それがカーナライズされたものですか、それとも線形ですか?カーネルを使用する場合、同様の結果が得られるのはそれほど驚くことではありません。
ahans '29 / 06/29

問題のサンプルデータを提供できますか?これにより、ターゲットディメンションが1つだけになるため、状況が少し簡単になります。
アハンス

1
@マスードその通りですが、の場合、スチューデントのt分布はガウス分布に非常に近くなります。n> 20であっても、一般的には適切な近似値があります。n>30
2009

3

問題は、モデルの仕様の誤りの1つかもしれないと思います。ターゲットが+ -180度にラップされた角度である場合、データの「ノイズプロセス」はガウス的ではなく、ベイジアンの証拠がハイパーパラメーターを最適化するための適切な方法ではない可能性があります。たとえば、「ノイズ」によって信号がラップアラウンドした場合にどうなるかを考えてみます。その場合、交差検証エラーを最小化することによってモデル選択を実行するのが賢明かもしれません(ここに Nelder-Meadシンプレックスメソッドのパブリックドメイン実装があります)最適化ツールボックスがない場合)。モデルの仮定が正しい場合、モデルの限界尤度はモデルをサポートする証拠であるのに対し、パフォーマンスの交差検証の推定は、テストパフォーマンスの直接推定であるため、モデルの誤指定にそれほど敏感ではありません。ラスムッセンとウィリアムズの本の123ページから始まる議論を参照してください。

別のアプローチは、ガウスノイズモデルがより適切になるように出力を再コード化することです。ターゲット間に非線形の関係があるため(ボディが移動できる方法は限られているため)、何らかの形で教師なしの次元削減を行うことができます。そのため、より低い次元の多様体がターゲットは存続しており、角度自体よりもその多様体の座標を後退させる方が良いでしょう(そのようにしてターゲットの数が少なくなる場合もあります)。

また、ある種のプロクラステス分析は、モデルをトレーニングする前に、被験者間の差異を正規化することをお勧めします。

ニール・ローレンスが人間のポーズの興味を回復するために行った作業の一部を見つけることができます。数年前の会議でこれのデモを見たのを覚えており、非常に感銘を受けました。


私の分析から、出力スペースの不連続が多くの問題を引き起こすことに気づきました。この問題を克服するために、関節角度ではなく関節位置を使用することを検討しました。次元削減によって、特定の方法を考えましたか?画像ベースのアプローチとは異なり、一貫して配置され、後処理されるIMUセンサーの向きを使用している場合、被験者の違い(動きのパターン以外)がモデルのトレーニングにどのように影響するかはわかりません被験者間で整列。
ジョシュ

私は以前にローレンスの論文に出くわしました。この論文では1つのシーケンスしか言及されていないため、何らかの形でk倍CVが実行されたようです。その場合、問題はほとんど取るに足らないものになります。アクティビティの同じサブジェクトマッピング、特に周期的なアクティビティは、通常、まともなポーズの見積もりを取得するのが簡単です。同じ被験者と被験者間のマッピングを比較しましたが、その違いは非常に重要です。残念ながら、誰もが独自の回帰フレームワーク、モーションキャプチャデータ、エラーメトリック、および入出力構造を使用しているため、この領域の研究は基本的に比較できません。
ジョシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.