Apakah Gradient Descent dimungkinkan untuk kernel SVM (jika ya, mengapa orang menggunakan Quadratic Programming)?

21

Mengapa orang menggunakan teknik Pemrograman Quadratic (seperti SMO) ketika berhadapan dengan SVM kernel? Apa yang salah dengan Keturunan Gradien? Apakah tidak mungkin digunakan dengan kernel atau itu terlalu lambat (dan mengapa?).

Berikut adalah konteks yang lebih sedikit: mencoba memahami SVM sedikit lebih baik, saya menggunakan Gradient Descent untuk melatih classifier SVM linier menggunakan fungsi biaya berikut:

J(w,b)=Ci=1mmax(0,1y(i)(wtx(i)+b))+12wtw

Saya menggunakan notasi berikut:

  • w adalah bobot fitur model dan adalah parameter biasnya.b
  • x(i) adalah vektor fitur contoh pelatihan .ith
  • y(i) adalah kelas target (-1 atau 1) untuk instance .ith
  • m adalah jumlah instance pelatihan.
  • C adalah hiperparameter regularisasi.

Saya mendapatkan vektor gradien (sub) (berkaitan dengan dan ) dari persamaan ini, dan Gradient Descent bekerja dengan baik.wb

Sekarang saya ingin mengatasi masalah non-linear. Dapatkah saya mengganti semua produk dot dengan dalam fungsi biaya, di mana adalah fungsi kernel (misalnya Gaussian RBF, ), lalu gunakan kalkulus untuk menurunkan a (sub) gradien vektor dan teruskan dengan Gradient Descent? K( u , v )KK( u , v )= e - γ u - v 2utvK(u,v)KK(u,v)=eγuv2

Jika terlalu lambat, mengapa begitu? Apakah fungsi biaya tidak cembung? Atau apakah itu karena perubahan gradien terlalu cepat (itu bukan Lipschitz kontinu) sehingga algoritme terus melompat melintasi lembah selama penurunan, sehingga konvergen sangat lambat? Tetapi meskipun begitu, bagaimana bisa lebih buruk daripada kompleksitas waktu Pemrograman Quadratic, yaitu O(nsamples2×nfeatures) ? Jika itu masalah minimum lokal, tidak bisakah Stochastic GD dengan simulasi anil mengatasi mereka?

MiniQuark
sumber

Jawaban:

6

Set sehingga dan , dengan , di mana adalah pemetaan dari matriks input asli , . Ini memungkinkan seseorang untuk menyelesaikan SVM melalui formulasi primal. Menggunakan notasi Anda untuk kerugian:w t ϕ ( x ) = u tK w t ww=ϕ(x)kamuwtϕ(x)=kamutKK = φ ( x ) t φ ( x ) φ ( x ) xwtw=kamutKkamuK=ϕ(x)tϕ(x)ϕ(x)x

J(w,b)=Ci=1mmax(0,1y(i)(utK(i)+b))+12utKu

m × m u m × 1K adalah matriks , dan adalah matriks . Tidak ada yang tak terbatas.m×mum×1

Memang, dual biasanya lebih cepat untuk diselesaikan, tetapi primal memiliki kelebihannya juga, seperti solusi perkiraan (yang tidak dijamin dalam formulasi ganda).


Sekarang, mengapa dual jauh lebih menonjol adalah tidak jelas sama sekali: [1]

Alasan historis yang sebagian besar penelitian dalam dekade terakhir telah tentang optimasi ganda tidak jelas . Kami percaya bahwa itu karena SVM pertama kali diperkenalkan dalam formulasi hard margin mereka [Boser et al., 1992], di mana optimasi ganda (karena kendala) tampaknya lebih alami. Secara umum, bagaimanapun, SVM margin lunak harus lebih disukai, bahkan jika data pelatihan dapat dipisahkan: batas keputusan lebih kuat karena lebih banyak poin pelatihan diperhitungkan [Chapelle et al., 2000]


Chapelle (2007) berpendapat kompleksitas waktu dari optimasi primal dan dual adalah , yang terburuk adalah , tetapi mereka menganalisis kerugian engsel kuadratik dan perkiraan, jadi bukan kerugian engsel yang tepat, karena tidak dapat dibedakan untuk digunakan dengan metode Newton. O ( n 3 )O(nnsv+nsv3)O(n3)


[1] Chapelle, O. (2007). Pelatihan mesin vektor dukungan di awal. Komputasi saraf, 19 (5), 1155-1178.

Pembakar
sumber
1
+1 Bisakah Anda memperluas kompleksitas waktu juga
seanv507
@ seanv507 terima kasih, memang saya seharusnya mengatasinya, saya akan segera memperbarui jawaban ini.
Firebug
4

Jika kami menerapkan transformasi ke semua vektor bobot input ( ), kami mendapatkan fungsi biaya berikut:x ( i )ϕx(i)

J(w,b)=Ci=1mmax(0,1y(i)(wtϕ(x(i))+b))+12wtw

Trik kernel menggantikan oleh . Karena vektor bobot adalah tidak berubah, trik kernel tidak dapat diterapkan dengan biaya fungsi di atas .K ( u , v ) wϕ(u)tϕ(v)K(u,v)w

Fungsi biaya di atas sesuai dengan bentuk dasar dari tujuan SVM:

minw,b,ζCi=1mζ(i)+12wtw

tunduk pada dan untukζ ( i )0 i = 1 , , my(i)(wtϕ(x(i))+b)1ζ(i))ζ(i)0i=1,,m

The Bentuk ganda adalah:

minα12αtQα1tα

tunduk pada dan untukytα=00αiCi=1,2,,m

di mana adalah vektor penuh 1s dan adalah matriks dengan elemen .1Qm×mQij=y(i)y(j)ϕ(x(i))tϕ(x(j))

Sekarang kita dapat menggunakan trik kernel dengan menghitung seperti:Qij

Qij=y(i)y(j)K(x(i),x(j))

Jadi trik kernel hanya dapat digunakan pada bentuk ganda dari masalah SVM (ditambah beberapa algoritma lain seperti regresi logistik).

Sekarang Anda dapat menggunakan pustaka Pemrograman Kuadratik yang tidak tersedia untuk menyelesaikan masalah ini, atau menggunakan pengganda Lagrangian untuk mendapatkan fungsi yang tidak dibatasi (fungsi biaya ganda), kemudian mencari minimum menggunakan Gradient Descent atau teknik pengoptimalan lainnya. Salah satu pendekatan yang paling efisien tampaknya adalah algoritma SMO yang diterapkan oleh libsvmperpustakaan (untuk kernel SVM).

MiniQuark
sumber
1
Saya tidak yakin mengapa Anda menandai jawaban Anda Wiki Komunitas. Ini sepertinya jawaban yang benar-benar valid untuk pertanyaan Anda.
Sycorax berkata Reinstate Monica
Terima kasih @GeneralAbrial. Saya menandai jawaban saya sebagai Komunitas Wiki untuk menghindari kecurigaan bahwa saya tahu jawabannya sebelum mengajukan pertanyaan.
MiniQuark
1
Anda harus selalu melakukan apa yang Anda anggap benar, tetapi bertanya dan menjawab pertanyaan Anda sendiri sangatlah halal.
Sycorax berkata Reinstate Monica
Tunggu, tidak bisakah Anda mengubah vektor bobot ke sehingga dan , dengan , lalu mengoptimalkan bobot sampel ? w=ϕ(x)uwtϕ(x)=uKwtw=utKuK=ϕtϕu
Firebug
2

Saya mungkin salah, tapi saya tidak melihat bagaimana kita bisa mengganti produk dot dengan kernel tanpa mengubahnya menjadi masalah ganda.

Kernel memetakan input secara implisit ke beberapa ruang fitur di mana menjadi , fungsi loss kemudian menjadi Jika kernel Gaussian diterapkan, akan memiliki ifinite dimensi, begitu juga .xϕ(x)
J(w,b)=Ci=1mmax(0,1y(i)(wtϕ(x(i))+b))+12wtw
ϕ(x(i))w

Tampaknya sulit untuk mengoptimalkan vektor dimensi tak terbatas menggunakan gradient descent secara langsung.

Perbarui
jawaban Firebug memberi cara untuk mengganti produk dot dengan kernel dalam formulasi primal.

dontloo
sumber