Bagaimana cara menggunakan kode GPML Matlab dengan benar untuk masalah aktual (non-demo)?


9

Saya telah mengunduh kode GPML Matlab terbaru. Kode GPML Matlab dan saya telah membaca dokumentasi dan menjalankan demo regresi tanpa masalah. Namun, saya mengalami kesulitan memahami bagaimana menerapkannya pada masalah regresi yang saya hadapi.

Masalah regresi didefinisikan sebagai berikut:


Membiarkan xiR20 menjadi vektor input dan yiR25menjadi target yang sesuai. Sekumpulan dariM input disusun menjadi sebuah matriks X=[x1,,xM] dan target yang sesuai disimpan dalam matriks Y=[y1y¯,,yMy¯], dengan y¯ menjadi nilai target rata - rata di Y.

Saya ingin melatih model GPR G={X,Y,θ} menggunakan fungsi eksponensial kuadrat:

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

dimana δij sama dengan 1 jika i=j dan 0jika tidak. Hyperparameter adalahθ=(α,β,γ) dengan γ diasumsikan tingkat kebisingan dalam data pelatihan dan β adalah skala panjang.

Untuk melatih model, saya perlu meminimalkan kemungkinan marginal log negatif sehubungan dengan hyperparameter:

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

di mana c adalah konstanta dan matriks K adalah fungsi dari hyperparameters (lihat persamaan k (xi, xj) = ...).


Berdasarkan demo yang diberikan di situs web GPML, upaya saya untuk menerapkan ini menggunakan kode Matlab GPML ada di bawah ini.

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 berisi input pelatihan

X2 berisi input tes

Y1 berisi target pelatihan

Y2r adalah perkiraan dari penerapan model

n adalah indeks yang digunakan untuk mundur setiap elemen dalam vektor output

Mengingat masalahnya, apakah ini cara yang benar untuk melatih dan menerapkan model GPR? Jika tidak, apa yang harus saya ubah?

Jawaban:


7

GP melakukan pekerjaan dengan baik untuk data pelatihan masalah Anda. Namun, itu tidak terlalu bagus untuk data uji. Anda mungkin sudah menjalankan sesuatu seperti yang berikut ini sendiri:

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

Menyetel hyperparameter secara manual dan tidak menggunakan fungsi meminimalkan, dimungkinkan untuk menyeimbangkan kereta dan menguji kesalahan, tetapi menyetel metode dengan melihat kesalahan pengujian bukanlah apa yang seharusnya Anda lakukan. Saya pikir apa yang terjadi adalah overfitting berat untuk tiga mata pelajaran Anda yang menghasilkan data pelatihan. Tidak ada metode di luar kotak akan melakukan pekerjaan dengan baik di sini, dan bagaimana mungkin? Anda memberikan data pelatihan, sehingga metode ini berusaha mendapatkan data pelatihan yang sebaik mungkin tanpa overfitting. Dan faktanya, itu tidak berlebihan dalam arti klasik. Itu tidak sesuai dengan data, tetapi cocok untuk tiga mata pelajaran pelatihan. Misalnya, validasi silang dengan set pelatihan akan memberi tahu kami bahwa tidak ada overfitting. Namun, set tes Anda akan dijelaskan dengan buruk.

Yang dapat Anda lakukan adalah:

  1. Dapatkan data dari lebih banyak mata pelajaran untuk pelatihan. Dengan cara ini, orang keempat Anda akan cenderung terlihat seperti "pencilan" seperti saat ini. Juga, Anda hanya memiliki satu urutan setiap orang, bukan? Mungkin akan membantu untuk merekam urutan beberapa kali.

  2. Entah bagaimana menggabungkan pengetahuan sebelumnya tentang tugas Anda yang akan menjaga metode dari overfitting ke mata pelajaran tertentu. Dalam GP yang bisa dilakukan melalui fungsi kovarians, tapi mungkin itu tidak mudah dilakukan ...

  3. Jika saya tidak salah, urutannya adalah deret waktu. Mungkin masuk akal untuk mengeksploitasi hubungan temporal, misalnya menggunakan jaringan saraf berulang.

Pasti ada lebih banyak lagi, tetapi itu adalah hal-hal yang dapat saya pikirkan saat ini.


Saya mengasumsikan proses Gaussian nol-rata. Karena target tidak memiliki nol rata-rata, saya memusatkan mereka dengan mengurangi rata-rata mereka. Anda benar tentang redundansi; Saya telah menghapus dua baris itu. Saya tidak percaya fungsi kovarians benar mengingat masalahnya, dan saya tidak yakin tentang inisialisasi hiperparameter. Keraguan saya muncul dari hasil. Residualnya praktis sama dengan residu untuk regresi ridge, dan data saya dikenal sangat nonlinier.
Josh

Anda benar tentang substraksi; dalam hal apapun seharusnya tidak sakit. Saya biasanya menambahkan itu ke fungsi kovarians, seperti covfunc = { 'covSum', { 'covSEiso' } }saya tidak mengerti bagaimana ini menangani data yang berisik sekarang, sepertinya toolbox telah berubah cukup banyak sejak saya terakhir menggunakannya, akan melihat lebih dekat nanti .
ahans

Apa yang Anda ketahui tentang masalah Anda yang membuat Anda berpikir bahwa covSEiso bukan pilihan yang masuk akal? Dan regresi ridge yang Anda gunakan, apakah itu kernlized atau linear? Jika Anda menggunakan kernel, tidak mengherankan bahwa Anda mendapatkan hasil yang serupa.
ahans

Bisakah Anda memberikan sampel data masalah Anda? Itu akan membuat segalanya sedikit lebih mudah, mungkin hanya dengan satu dimensi target.
ahans

1
@Masood Anda benar, tetapi kapan n>30distribusi t Student sangat dekat dengan distribusi gaussian. Bahkan dengan n> 20, kita umumnya memiliki perkiraan yang baik.
chl

3

Saya pikir masalahnya mungkin salah satu model mis-spesifikasi. Jika target Anda adalah sudut dibungkus + -180 derajat, maka "proses noise" untuk data Anda mungkin cukup non-Guassian bahwa bukti Baysian bukan cara yang baik untuk mengoptimalkan parameter hiper. Misalnya, perhatikan apa yang terjadi ketika "noise" menyebabkan sinyal membungkus. Dalam hal ini mungkin bijaksana untuk melakukan pemilihan model dengan meminimalkan kesalahan validasi silang (ada implementasi domain publik dari metode simpleks Nelder-Mead di sinijika Anda tidak memiliki kotak alat pengoptimalan). Perkiraan cross-validasi kinerja tidak begitu sensitif terhadap model mis-spesifikasi karena merupakan perkiraan langsung dari kinerja pengujian, sedangkan kemungkinan marginal dari model adalah bukti dalam suport dari model mengingat asumsi model benar. Lihat diskusi yang dimulai pada halaman 123 dari buku Rasmussen dan Williams.

Pendekatan lain adalah mengkode ulang output sehingga model noise Gaussian lebih tepat. Satu hal yang bisa Anda lakukan adalah beberapa bentuk pengurangan dimensi tanpa pengawasan, karena ada hubungan non-linear antara target Anda (karena hanya ada cara terbatas di mana tubuh dapat bergerak), sehingga akan ada manifold dimensi-lebih rendah yang Anda miliki. target hidup terus, dan akan lebih baik untuk mundur koordinat lebih dari sudut itu sendiri (mungkin ada lebih sedikit target seperti itu juga).

Juga semacam analisis Procrustes mungkin merupakan ide yang baik untuk menormalkan perbedaan antara mata pelajaran sebelum melatih model.

Anda mungkin menemukan beberapa pekerjaan yang dilakukan oleh Neil Lawrence pada pose menarik manusia. Saya ingat melihat demo ini di sebuah konferensi beberapa tahun yang lalu dan sangat terkesan.


Dari analisis saya, saya perhatikan bahwa diskontinuitas dalam ruang output menyebabkan sejumlah masalah. Saya telah mempertimbangkan menggunakan lokasi bersama daripada sudut sendi untuk mengatasi masalah ini. Dengan pengurangan dimensi, apakah Anda memiliki metode tertentu dalam pikiran? Tidak seperti pendekatan berbasis gambar, saya tidak melihat bagaimana perbedaan dalam subjek (selain pola gerakan mereka) akan mempengaruhi pelatihan model, mengingat bahwa saya menggunakan orientasi sensor IMU yang secara konsisten ditempatkan dan pasca-diproses untuk menjadi selaras antara subjek.
Josh

Saya telah menemukan kertas Lawrence sebelumnya. Karena hanya 1 urutan yang disebutkan di koran, tampaknya beberapa bentuk k-fold CV dilakukan. Dalam hal ini, masalahnya menjadi hampir sepele. Pemetaan subjek yang sama dari suatu kegiatan, khususnya yang bersifat siklis, biasanya mudah untuk mendapatkan perkiraan pose yang layak. Saya telah membandingkan pemetaan subjek yang sama dan antar subjek, dan perbedaannya sangat signifikan. Sayangnya, penelitian di bidang ini pada dasarnya tidak dapat dibandingkan karena setiap orang menggunakan kerangka kerja regresi mereka sendiri, data mocap, metrik kesalahan, dan struktur input / output.
Josh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.