Klarifikasi tentang Peraturan Perceptron vs. Keturunan Gradien vs. Penerapan Keturunan Gradien Stokastik

15

Saya bereksperimen sedikit dengan implementasi Perceptron yang berbeda dan ingin memastikan apakah saya memahami "iterasi" dengan benar.

Aturan perceptron asli Rosenblatt

Sejauh yang saya mengerti, dalam algoritma perceptron klasik Rosenblatt, bobot secara bersamaan diperbarui setelah setiap contoh pelatihan melalui

Δw(t+1)=Δw(t)+η(tSebuahrget-SebuahctkamuSebuahl)xsaya

di mana adalah aturan belajar di sini. Dan target dan aktual keduanya di-threshold (-1 atau 1). Saya menerapkannya sebagai 1 iterasi = 1 melewati sampel pelatihan, tetapi vektor bobot diperbarui setelah setiap sampel pelatihan.etSebuah

Dan saya menghitung nilai "aktual" sebagai

ssayagn(wwTxx)=ssayagn(w0+w1x1+...+wdxd)

Penurunan gradien stokastik

Δw(t+1)=Δw(t)+η(tSebuahrget-SebuahctkamuSebuahl)xsaya

Sama seperti aturan perceptron, namun, targetdan actualbukan nilai ambang melainkan nilai nyata. Juga, saya menghitung "iterasi" sebagai jalur sampel pelatihan.

Baik, SGD dan aturan perceptron klasik bertemu dalam kasus yang terpisah secara linear ini, namun, saya mengalami masalah dengan implementasi gradient descent.

Keturunan Gradien

Di sini, saya membahas sampel pelatihan dan meringkas perubahan berat untuk 1 melewati sampel pelatihan dan memperbarui bobot setelahnya, misalnya,

untuk setiap sampel pelatihan:

Δwnew+=Δw(t)+η(targetactual)xi

...

setelah melewati 1 set pelatihan:

Δw+=Δwnew

Saya bertanya-tanya, apakah asumsi ini benar atau apakah saya kehilangan sesuatu. Saya mencoba berbagai tingkat pembelajaran (hingga sangat kecil) tetapi tidak pernah bisa menunjukkan tingkat konvergensi. Jadi, saya bertanya-tanya apakah saya salah paham sth. sini.

Terima kasih, Sebastian


sumber

Jawaban:

20

Anda memiliki beberapa kesalahan dalam pembaruan Anda. Saya pikir secara umum Anda membingungkan nilai bobot saat ini dengan perbedaan antara bobot saat ini dan bobot sebelumnya. Anda memiliki simbol tersebar di mana seharusnya tidak ada, dan + = di mana Anda seharusnya =.Δ

Perceptron:

ww(t+1)=ww(t)+ηt(y(saya)-y^(saya))xx(saya) ,

di mana adalah prediksi model pada contoh pelatihan.y^(saya)=tanda(wwxx(saya))sayath

Ini dapat dilihat sebagai metode keturunan subgradien stokastik pada fungsi "perceptron loss" berikut *:

Kerugian perceptron:

L.ww(y(saya))=maks(0,-y(saya)wwxx(saya)) .

L.ww(y(saya))={0}, jika y(saya)wwxx(saya)>0{-y(saya)xx(saya)}, jika y(saya)wwxx(saya)<0[-1,0]×y(saya)xx(saya), jika wwxx(saya)=0 .

Karena perceptron sudah merupakan bentuk SGD, saya tidak yakin mengapa pembaruan SGD harus berbeda dari pembaruan perceptron. Cara Anda menulis langkah SGD, dengan nilai-nilai yang tidak dibatasi, Anda menderita kerugian jika Anda memperkirakan jawaban terlalu benar. Itu buruk.

Langkah gradien batch Anda salah karena Anda menggunakan "+ =" saat Anda seharusnya menggunakan "=". Bobot saat ini ditambahkan untuk setiap instance pelatihan . Dengan kata lain, cara Anda menulisnya,

ww(t+1)=ww(t)+saya=1n{ww(t)-ηtL.ww(t)(y(saya))} .

Apa yang seharusnya:

ww(t+1)=ww(t)-ηtsaya=1nL.ww(t)(y(saya)) .

Selain itu, agar algoritma dapat menyatu pada setiap dan setiap kumpulan data, Anda harus mengurangi tingkat pembelajaran Anda pada suatu jadwal, seperti .ηt=η0t


* Algoritma perceptron tidak persis sama dengan SSGD pada kerugian perceptron. Biasanya dalam SSGD, dalam kasus seri ( ), , jadi , jadi Anda akan diizinkan untuk tidak mengambil langkah. Dengan demikian, kerugian perceptron dapat diminimalkan pada , yang tidak berguna. Tetapi dalam algoritma perceptron , Anda diminta untuk memutuskan ikatan, dan menggunakan arah subgradien jika Anda memilih jawaban yang salah.wwxx(saya)=0L.=[-1,0]×y(saya)xx(saya)00L.ww=00-y(saya)xx(saya)L.

Jadi mereka tidak persis sama, tetapi jika Anda bekerja dari asumsi bahwa algoritma perceptron adalah SGD untuk beberapa fungsi kerugian, dan merekayasa balik fungsi kerugian, perceptron loss adalah apa yang Anda dapatkan.

Sam Thomson
sumber
Terima kasih, Sam, dan saya minta maaf atas pertanyaan saya yang berantakan. Saya tidak tahu dari mana asal delta, tetapi "+ =" adalah hal yang salah. Saya benar-benar mengabaikan bagian itu. Terima kasih atas jawabannya!