Pemberi rekomendasi BPR implisit (di Tensorflow)

Ini adalah ringkasan dan implementasi Tensorflow dari konsep yang dikemukakan dalam makalah BPR: Bayesian Personalized Ranking from Implicit Feedback oleh Steffen Rendle, Christoph Freudenthaler, Zeno Gantner, dan Lars Schmidt-Thieme.

Isi:

  • Pendahuluan
  • Peringkat Personalisasi Bayesian
  • Model Tensorflow
  • Kumpulan data
  • Oke, ayo tulis! (kode)
  • Ringkasan
  • Referensi

Perkenalan

Posting ini sangat bergantung pada konsep yang dibahas secara rinci dalam cerita saya tentang Pemfilteran Kolaboratif Implisit ALS. Jadi agar tidak terlalu berulang, saya asumsikan Anda sudah familiar dengan faktorisasi matriks, perbedaan antara umpan balik implisit dan eksplisit, konsep fitur laten, penggunaan vektor ruang laten untuk membuat rekomendasi, dll.

Saya akan fokus secara khusus pada cara kerja pendekatan Bayesian Personalized Ranking (BPR) dan cara mengimplementasikannya menggunakan Tensorflow.

Peringkat Personalisasi Bayesian

Makalah ini mengemukakan sesuatu yang mereka sebut “BRP-Opt”, sebuah kriteria pengoptimalan umum untuk peringkat terpersonalisasi yang optimal. Pada dasarnya maksudnya adalah pendekatan yang dapat diterapkan pada berbagai jenis model rekomendasi seperti Faktorisasi Matriks atau k-Nearest-Neighbour (itu adalah bagian "generik") dan itu menyelesaikan peringkat untuk sekumpulan item untuk pengguna tertentu. Dengan cara ini, mirip dengan ALS yang juga menggunakan faktorisasi matriks dan mencoba menentukan peringkat dengan menggunakan nilai preferensi dan kepercayaan pada data.

Masalah implisit

Sebagai penyegaran singkat, masalah inti dari setiap pemberi masukan implisit adalah bagaimana memperlakukan nilai yang tidak diketahui dalam data kami. Seorang pengguna mungkin tidak memutar sebuah lagu karena mereka membencinya atau karena mereka belum menemukannya (dan tugas kami adalah memastikan mereka menemukannya), jadi kami tidak bisa menganggap semua nilai yang tidak diketahui sebagai hal yang negatif. Sebaliknya, kita perlu menemukan cara untuk belajar dari item yang belum digunakan pengguna serta item yang mereka miliki.

Namun meskipun kami tidak dapat memperlakukan semua item yang tidak diketahui sebagai sesuatu yang tidak disukai pengguna, masuk akal untuk berasumsi bahwa secara umum, kami dapat lebih yakin bahwa pengguna memiliki preferensi yang lebih tinggi terhadap item yang telah mereka konsumsi dibandingkan item yang belum mereka konsumsi. . Jika saya pernah memainkan lagu-lagu Bob Dylan tetapi belum pernah memainkan lagu Megadeth, kita dapat berasumsi bahwa, secara umum, saya lebih menyukai lagu pertama daripada lagu kedua.

Strategi inilah yang digunakan BPR untuk menentukan peringkatnya. Sementara sebagian besar pengoptimal lainnya hanya melihat apakah pengguna berinteraksi dengan suatu item, BPR melihat pada pengguna, satu item yang berinteraksi dengan pengguna dan satu item yang tidak berinteraksi dengan pengguna (item yang tidak diketahui). Ini memberi kita triplet (u, i, j) dari pengguna (u), satu item yang dikenal ( i) dan satu item yang tidak diketahui (j).

Kita dapat mengungkapkan hubungan antara item yang diketahui dan tidak diketahui seperti ini:

Di sini x̂ui menunjukkan skor untuk pengguna u dan item yang diketahui idan x̂ujskor untuk pengguna u dan item yang tidak diketahui j. Kondisi di atas terpenuhi jika skor pada item yang diketahui lebih besar dibandingkan dengan item yang tidak diketahui.

CATATAN: Satu kondisi penting yang kami asumsikan benar adalah bahwa semua pengguna bertindak secara independen terhadap setiap pengguna lainnya dan bahwa pengurutan pasangan item mana pun untuk pengguna tertentu tidak bergantung pada urutan pasangan item lainnya.

Formulasi Bayesian

BPR menggunakan formulasi Bayesian untuk menemukan peringkat yang dipersonalisasi bagi pengguna untuk semua item idi kumpulan item I (iI )dengan memaksimalkanprobabilitas posteriornya.

Kata kuncinya di sini adalah “Bayesian”. Hal ini berasal dari teorema Bayes yang menghitung probabilitas P bahwa beberapa hipotesis H benar jika ada kejadian E. Anda dapat menghitung probabilitas ini dengan mengambil probabilitas sebelumnya bahwa hipotesis tersebut benar P(H) dikalikan dengan probabilitas kejadian jika diketahui hipotesisnya benar P(E|H) dibagi dengan probabilitas total terjadinya peristiwa P(E):

Dalam persamaan P(H|E) ini, probabilitas hipotesis kita benar jika ada suatu kejadian disebut probabilitas posterior. Dapat juga dianggap bahwa probabilitas posterior sebanding dengan kemungkinan dikalikan dengan probabilitas sebelumnya.

Probabilitas posterior ∝ Kemungkinan x Probabilitas sebelumnya

Jadi yang ingin kita lakukan adalah menggunakan formulasi untuk memperbarui kemungkinan hipotesis kita seiring dengan semakin banyaknya peristiwa/informasi yang tersedia, yaitu kita ingin memaksimalkan kemungkinan kebenaran hipotesis tersebut.

Melihat lebih dekat matematika

Jadi kita mengetahui konsep penggunaan kembar tiga (u, i, j) daripada berpasangan untuk pemeringkatan dan apa yang dimaksud dengan inferensi Bayesian. Sekarang mari kita selami lebih dalam dan melihat secara spesifik dalam memperoleh kriteria pengoptimalan akhir kita. Saya akan meninggalkan beberapa hal jadi untuk penjelasan komprehensif lihat makalahnya.

Dengan menggunakan rumus Probabilitas posterior ∝ Kemungkinan x Probabilitas sebelumnyaprobabilitas posterior yang ingin kita maksimalkan dalam kasus ini adalah:

Bunyinya sebagai “probabilitas Θ jika diberikan ›u sebanding dengan probabilitas ›u jika diberi Θ dikalikan dengan probabilitas keseluruhan Θ”. Di sini ›u adalah struktur preferensi laten untuk pengguna u dan Θ mewakili parameter dari beberapa jenis model, seperti faktorisasi matriks atau kNN.

Jadi pada dasarnya kami ingin memaksimalkan probabilitas parameter Θ dengan struktur preferensi laten untuk pengguna ›u. Makalah ini menunjukkan kepada kita bahwa hasil kali kemungkinan p(›u | Θ) sama dengan hasil kali p(i ‹u j | Θ ):

Selanjutnya, kami mendefinisikan kemungkinan bahwa pengguna tertentu sebenarnya lebih memilih item yang diketahui i daripada item yang tidak diketahui j sebagai mengikuti:

Di sini σadalah fungsi sigmoid danx̂uij(Θ) adalah semacam fungsi yang memodelkan hubungan antara pengguna, item yang diketahui, dan item yang tidak diketahui berdasarkan sekumpulan parameter . BPR tidak menentukan fungsinya dan oleh karena itu, dapat digunakan dengan sejumlah kelas model yang berbeda. Dalam kasus kita, fungsi ini adalah selisih antara skor u dan jdikurangi dari skor u dan i:

Kita kemudian dapat menulis ulang untuk menggunakan fungsi sigmoid untuk kemungkinannya. Makalah ini juga menyarankan penggunaan ln sigmoid(log natural)berdasarkan MLE (Evaluasi Kemungkinan Maksimum):

Mengingat aturan hasil kali logaritma ( ln(a * b) = ln(a) + ln(b) ) sekarang kita dapat mengubah keseluruhan persamaan menjadi:

Berdasarkan hal ini, kami kemudian sampai pada kriteria pengoptimalan akhir untuk model kami:

  • Θ:Vektor parameter model kita.
  • x̂uij:Hubungan antara (u, i, j). Disini skor (u, j) dikurangi dengan skor (u, j).
  • ln: Logaritma natural
  • σ:Sigmoid logistik
  • λ:Lambda, hyperparameter regularisasi untuk model kami.
  • ||Θ||:Norma L2 parameter model kita

Model Tensorflow

Saya berasumsi Anda mengetahui dasar-dasar Tensorflow dan sebagai gantinya fokus pada implementasi ini secara spesifik. Jika Anda tidak terlalu peduli dengan hal spesifiknya, yang perlu Anda ketahui adalah bahwa Tensorflow adalah framework pembelajaran mesin yang, pada intinya, memungkinkan Anda menentukan operasi matriks dan vektor dalam sebuah grafik, lalu mengeksekusi grafik tersebut sambil memasukkan beberapa data ke dalamnya.

Oleh karena itu, berikut adalah beberapa node yang akan kami gunakan saat membuat grafik yang mungkin tidak terlalu jelas bagi Anda jika Anda belum pernah menulis apa pun di Tensorflow sebelumnya:

  • Variabel: Node yang mempertahankan statusnya dalam grafik di beberapa eksekusi. Inilah hal-hal dalam grafik yang ingin kami latih untuk meminimalkan fungsi kerugian.
  • Placeholder:Seperti namanya, ini adalah placeholder untuk data yang kemudian kami masukkan ke dalam grafik saat kami mengeksekusinya. Mereka tidak berisi data saat kita membuatnya, hanya bentuk data yang nantinya akan diterima.
  • Menyematkan pencarian:Mari kita mengambil baris dari tensor berdasarkan indeksnya. Mirip dengan mengindeks ke dalam array numpy.
  • Pengoptimal:Ada berbagai jenis pengoptimal, namun yang dilakukannya adalah menghitung fungsi kerugian lalu memperbarui nilai dalam grafik untuk proses selanjutnya guna meminimalkan kerugian tersebut.

Model

Kita akan mengimplementasikan BPR menggunakan faktorisasi matriks yang berarti mengambil matriks interaksi Rberukuran (semua pengguna x semua item)dan memfaktorkannya ke dalam matriks berukuran U (semua pengguna x fitur laten)dan Vukuran (fitur laten x semua item). Jadi kalau sudah selesai mau R ≈ U x V.

Kami akan menggunakan Stochastic Gradient Descent (SGD) untuk sampai pada perkiraan ini. Ia bekerja dengan menginisialisasi Udan V dengan nilai acak yang seragam dan kemudian, menggunakan kriteria pengoptimalan dari sebelumnya, secara terus menerus memperbaruinya dengan nilai baru untuk memaksimalkan probabilitas posterior, yaitu mendapatkan probabilitas yang semakin tinggi untuk R = U x V.

Mari kita lihat ilustrasi sederhana dari grafik yang akan kita terapkan dan bagaimana data akan mengalir melalui grafik tersebut.

Jadi kita mulai dari atas dengan masukan kita (placeholder) yang akan menjadi id pengguna u, id item yang dikenal i dan id item yang tidak diketahui j. Kami kemudian juga menginisialisasi matriks U dan V(variabel) secara acak.

Dari sini kami membuat tiga penyematan, satu untuk faktor pengguna, faktor item yang diketahui, dan faktor item yang tidak diketahui. Kami mengambil penyematan ini dan mengalikannya dengan bias untuk mendapatkan x̂ui dan x̂ujmasing-masing.

Selanjutnya, kita mengambil x̂ui dan x̂uj, menghitung x̂uijdan memasukkannya ke dalam log natural negatif — dari sigmoid — dari x̂uij. Jadi kita mendapatkan -ln σ(x̂uij).

Terakhir, kita menambahkannorma L2ke-ln σ(x̂uij)dan sampai pada fungsi kerugian akhir:

Mari kita kembangkan ini untuk melihatnya dalam bentuk yang sebenarnya akan diimplementasikan dalam kode:

(Jika mau, Anda juga dapat melewati tanda negatif pertama dan mengurangi ln σ(x̂ui-x̂uj) dari norma L2. Tidak yakin mana yang terbaik.)

Kumpulan data

Seperti sebelumnya, kami akan menggunakan dataset lastfm yang berisi perilaku mendengarkan 360.000 pengguna. Ini berisi id pengguna, id artis, nama artis dan berapa kali pengguna memainkan artis tertentu. Ada juga hal-hal tentang usia pengguna, jenis kelamin, negara, dll. Tapi kami tidak tertarik pada hal itu untuk saat ini.

Oke, ayo tulis!

Pertama, kita akan mengimpor perpustakaan yang kita perlukan, memuat kumpulan data, dan melakukan beberapa penyesuaian untuk membuatnya menjadi bentuk yang kita perlukan.

Selanjutnya, mari siapkan beberapa hyperparameter untuk model kita. Ini sama sekali tidak disetel jadi Anda harus bermain-main dengannya.

Sekarang ke hal-hal menyenangkan. Mari kita definisikan grafik Tensorflow seperti yang dibahas di atas. Kita mulai dengan menginisialisasi grafik dan kemudian mendefinisikan beberapa fungsi pembantu untuk membuat kode sedikit lebih bersih.

Kita membuat satu fungsi yang hanya menginisialisasi variabel Tensorflow dengan nilai acak, fungsi yang menggunakan fungsi tersebut untuk membuat variabel lalu menyematkannya menggunakan pencarian penyematan, dan fungsi lainnya untuk mendapatkan kembali nilai variabel berdasarkan namanya.

Kemudian ke grafik sebenarnya:

Pertama, kita membuat placeholder untuk u, i dan j yang nantinya bisa kita masukkan datanya. Kami menginisialisasi matriks U dan V dan membuat embeddings untuk u_factors, i_factors,dan j_factors. Kami juga membuat penyematan untuk bias kami i_bias dan j_bias.

Selanjutnya, kita menghitung skor untuk pengguna dan item i serta item j untuk mendapatkan x̂ui dan x̂uj lalu kita menghitung x̂uij.

Di sini kami juga menghitung skor AUC dan menambahkannya ke ringkasan Tensorflow sehingga kami dapat memantaunya selama pelatihan.

Untuk norma L2, yang perlu kita lakukan hanyalah mengkuadratkan setiap parameter dikalikan dengan nilai regularisasi lalu menjumlahkannya. Mengambil log natural negatif dari sigmoid x̂uij, ditambah norma L2 memberi kita fungsi kerugian akhir. Terakhir, kami menggunakan pengoptimal Adam bawaan untuk meminimalkan kerugian kami.

Masalahnya dengan Tensorflow adalah kami belum melakukan penghitungan sebenarnya. Anda tidak akan dapat menjalankan kode di atas dan mencetak beberapa nilai. Yang telah kita lakukan hanyalah mendefinisikan grafik, sekarang kita akan memasukkan data melalui sejumlah iterasi. Kita sudah membangun sistem pipa, sekarang saatnya menuangkan air ke dalamnya.

Untuk setiap epoch dan batch yang kami tentukan di hyperparameter, kami mengambil sampel sejumlah indeks acak dari kumpulan data kami dan kemudian mendapatkan id pengguna (u) dan id item yang diketahui (i) yang cocok indeks-indeks itu. Kami kemudian mengambil sampel 15.000 item acak yang tidak diketahui (j).

Item ini masuk ke feed_dict kami yang merupakan kamus yang akan kami masukkan ke dalam grafik kami. Kami kemudian menjalankan grafik dengan nilai-nilai tersebut, memperbarui bilah kemajuan dan menampilkan nilai kerugian dan AUC saat ini.

Dan itu saja. Sekarang kita dapat melatih model kita untuk beberapa periode dengan harapan kerugian terus menurun menuju 0 dan nilai AUC meningkat menuju 1.

Menemukan barang serupa

Sekarang kita memiliki model terlatih, kita dapat menggunakannya untuk menentukan peringkat beberapa item. Mari kita mulai dengan mencari beberapa artis yang mirip dengan Beyonce. Kita menggunakan fungsi pembantu get_variableyang kita gunakan sebelumnya untuk mengambil U dan V yang dilatih > vektor. Lalu kami menggunakan kode yang sama seperti yang kami lakukan pada ALS untuk menghitung artis yang paling mirip.

Berdasarkan penelusuran ini, artis yang paling mirip dengan Beyoncé adalah: Rihanna, Mariah Carey, Britney Spears, Black Eyed Peas, Michael Jackson, Nelly Furtado, Katy Perry, Alicia Keys, dan Justin Timberlake. Ingat, ini bukan berarti kesamaan genre atau gaya, melainkan perilaku mendengarkan. Tapi sepertinya itu masuk akal.

Menjalankannya lagi dengan Bob Dylan memberi kita hal berikut: The Beatles, Beck, The Rolling Stones, David Bowie, Pink Floyd, Radiohead, Led Zeppelin, The Cure, R.E.M dll. Setelah 50 epoch kita mendapatkan nilai kerugian 0,051 dan AUC nilai 0,997 atau 99,7%.

Membuat rekomendasi

Hal yang sama berlaku untuk membuat rekomendasi untuk pengguna tertentu. Setelah kita mendapatkan matriks U dan V, kita dapat menggunakan kode yang sama seperti ALS untuk mengembalikan n artis dengan peringkat tertinggi untuk pengguna tersebut.

Ringkasan

Jadi begitulah, implementasi dasar BPR menggunakan Tensorflow. Salah satu perbaikan pada algoritme yang diusulkan oleh penulis makalah asli yang tidak diterapkan di sini adalah mengubah cara kita mengambil sampel kembar tiga (u, i, j) kita. Anda dapat membaca lebih lanjut tentangnya di sini.

Referensi