Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi

Jenengku Pavel Parkhomenko, aku pengembang ML. Ing artikel iki, aku arep ngomong babagan struktur layanan Yandex.Zen lan nuduhake perbaikan teknis, implementasine bisa nambah kualitas rekomendasi. Saka kiriman iki sampeyan bakal sinau carane nemokake sing paling relevan kanggo pangguna ing antarane jutaan dokumen mung sawetara milidetik; carane nggawe dekomposisi terus-terusan saka matriks gedhe (dumadi saka mayuta-yuta kolom lan puluhan yuta larik) supaya dokumen anyar nampa vektor ing puluhan menit; carane nggunakake maneh dekomposisi matriks artikel pangguna kanggo entuk perwakilan vektor sing apik kanggo video.

Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi

Database rekomendasi kita ngemot jutaan dokumen saka macem-macem format: artikel teks sing digawe ing platform kita lan dijupuk saka situs eksternal, video, narasi lan kiriman singkat. Pangembangan layanan kasebut digandhengake karo akeh tantangan teknis. Ing ngisor iki sawetara:

  • Dibagi tugas komputasi: nindakake kabeh operasi abot ing offline, lan ing wektu nyata mung nindakake aplikasi cepet saka model supaya tanggung jawab kanggo 100-200 ms.
  • Cepet njupuk menyang akun tumindak pangguna. Kanggo nindakake iki, kabeh acara kudu langsung dikirim menyang rekomendasi lan mengaruhi asil model.
  • Nggawe feed supaya pangguna anyar bisa cepet adaptasi karo prilaku. Wong sing lagi wae gabung karo sistem kudu ngrasa yen umpan balik kasebut mengaruhi rekomendasi.
  • Cepet ngerti sapa sing bakal menehi rekomendasi artikel anyar.
  • Nanggapi kanthi cepet babagan munculna konten anyar sing terus-terusan. Puluhan ewu artikel diterbitake saben dina, lan akeh sing duwe umur winates (kabar, warta). Iki sing mbedakake saka film, musik lan konten liyane sing dawa lan larang kanggo nggawe.
  • Transfer kawruh saka siji area domain menyang liyane. Yen sistem rekomendasi wis nglatih model kanggo artikel teks lan kita nambahake video kasebut, kita bisa nggunakake maneh model sing wis ana supaya jinis konten anyar luwih apik.

Aku bakal pitutur marang kowe carane kita ditanggulangi masalah iki.

Pamilihan calon

Kepiye cara nyuda jumlah dokumen sing ditimbang kaping pirang-pirang sajrone sawetara milidetik, kanthi meh ora ana penurunan kualitas peringkat?

Upaminipun kita dilatih akeh model ML, kui fitur adhedhasar mau, lan dilatih model liyane sing rangking dokumen kanggo pangguna. Kabeh bakal apik, nanging sampeyan ora bisa mung njupuk lan ngetung kabeh pratandha kanggo kabeh dokumen ing wektu nyata, yen ana mayuta-yuta dokumen iki, lan Rekomendasi kudu dibangun ing 100-200 ms. Tugas kanggo milih subset tartamtu saka mayuta-yuta, kang bakal ditingkat kanggo pangguna. Tahap iki biasane diarani seleksi calon. Ana sawetara syarat kanggo iku. Kaping pisanan, pilihan kudu kedadeyan kanthi cepet, supaya wektu bisa ditinggalake kanggo peringkat kasebut. Kapindho, kanthi nyuda jumlah dokumen kanggo peringkat, kita kudu ngreksa dokumen sing cocog karo pangguna kanthi lengkap.

Prinsip pemilihan calon kita wis berkembang, lan saiki wis tekan skema multi-tataran:

Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi

Kaping pisanan, kabeh dokumen dipérang dadi klompok, lan dokumen sing paling populer dijupuk saka saben klompok. Grup bisa dadi situs, topik, klompok. Kanggo saben pangguna, adhedhasar sejarahe, klompok sing paling cedhak karo dheweke dipilih lan dokumen sing paling apik dijupuk saka dheweke. Kita uga nggunakake indeks kNN kanggo milih dokumen sing paling cedhak karo pangguna ing wektu nyata. Ana sawetara cara kanggo mbangun indeks kNN; cara kita paling apik HNSW (Grafik Dunia Cilik sing Bisa Dilayari Hierarkis). Iki minangka model hirarki sing ngidini sampeyan nemokake N vektor paling cedhak kanggo pangguna saka database mayuta-yuta ing sawetara milliseconds. Kita ngindeks kabeh database dokumen kita ing offline. Wiwit telusuran ing indeks cukup cepet, yen ana sawetara embeddings kuwat, sampeyan bisa nggawe sawetara indeks (siji indeks kanggo saben embeddings) lan ngakses saben wong ing wektu nyata.

Kita isih duwe puluhan ewu dokumen kanggo saben pangguna. Iki isih akeh kanggo ngitung kabeh fitur, mula ing tahap iki kita nggunakake peringkat entheng - model peringkat abot sing entheng kanthi fitur sing luwih sithik. Tugas kanggo prédhiksi dokumen sing model abot bakal ana ing ndhuwur. Dokumen kanthi prediktor paling dhuwur bakal digunakake ing model abot, yaiku, ing tahap pungkasan peringkat. Pendekatan iki ngidini sampeyan nyuda database dokumen sing dianggep pangguna saka mayuta-yuta nganti ewonan ing puluhan milidetik.

ALS langkah ing runtime

Kepiye cara njupuk umpan balik pangguna langsung sawise klik?

Faktor penting ing rekomendasi yaiku wektu nanggepi umpan balik pangguna. Iki penting banget kanggo pangguna anyar: nalika wong mung miwiti nggunakake sistem rekomendasi, nampa feed non-pribadi dokumen saka macem-macem topik. Sanalika dheweke nggawe klik pisanan, sampeyan kudu langsung nganggep iki lan adaptasi karo kapentingane. Yen sampeyan ngetung kabeh faktor ing offline, respon sistem sing cepet bakal dadi mokal amarga wektu tundha. Dadi perlu kanggo ngolah tumindak pangguna ing wektu nyata. Kanggo tujuan kasebut, kita nggunakake langkah ALS nalika runtime kanggo mbangun perwakilan vektor pangguna.

Ayo kita nganggep kita duwe perwakilan vektor kanggo kabeh dokumen. Contone, kita bisa mbangun embeddings offline adhedhasar teks artikel nggunakake ELMo, BERT utawa model machine learning liyane. Kepiye carane entuk perwakilan vektor pangguna ing papan sing padha adhedhasar interaksi ing sistem kasebut?

Dhasar kekarepan panggolékan lan kagunaan kang umum saka user-document matrixAyo kita duwe m pangguna lan n dokumen. Kanggo sawetara pangguna, hubungane karo dokumen tartamtu dikenal. Banjur informasi iki bisa dituduhake minangka matriks m x n: baris cocog karo pangguna, lan kolom cocog karo dokumen. Amarga wong kasebut durung ndeleng sebagian besar dokumen, sebagian besar sel matriks bakal tetep kosong, dene liyane bakal diisi. Kanggo saben acara (kaya, ora seneng, klik) sawetara nilai diwenehake ing matriks - nanging ayo nimbang model sing disederhanakake sing kaya cocog karo 1, lan ora seneng cocog karo -1.

Ayo decompose matriks dadi loro: P (m x d) lan Q (d x n), ngendi d iku dimensi saka perwakilan vektor (biasane nomer cilik). Banjur saben obyek bakal cocog karo vektor d-dimensi (kanggo pangguna - baris ing matriks P, kanggo dokumen - kolom ing matriks Q). Vektor iki bakal dadi embeddings saka obyek sing cocog. Kanggo prédhiksi manawa pangguna bakal seneng karo dokumen, sampeyan mung bisa nggandaake embeddings.

Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi
Salah sawijining cara kanggo ngurai matriks yaiku ALS (Alternating Least Squares). Kita bakal ngoptimalake fungsi mundhut ing ngisor iki:

Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi

Ing kene rui minangka interaksi pangguna u karo dokumen i, qi minangka vektor dokumen i, pu minangka vektor pangguna u.

Banjur vektor pangguna sing optimal saka sudut pandang kesalahan kuadrat rata-rata (kanggo vektor dokumen tetep) ditemokake kanthi analitis kanthi ngrampungake regresi linier sing cocog.

Iki diarani "langkah ALS". Lan algoritma ALS dhewe iku kita gantian ndandani salah siji saka matriks (pangguna lan artikel) lan nganyari liyane, nemokake solusi optimal.

Untunge, nemokake perwakilan vektor pangguna minangka operasi sing cukup cepet sing bisa ditindakake nalika runtime nggunakake instruksi vektor. Trik iki ngidini sampeyan langsung njupuk umpan balik pangguna ing peringkat. Embedding padha bisa digunakake ing indeks kNN kanggo nambah pilihan calon.

Distributed Collaborative Filtering

Kepiye carane nggawe faktorisasi matriks disebarake tambahan lan kanthi cepet nemokake perwakilan vektor artikel anyar?

Isi ora mung sumber sinyal rekomendasi. Sumber penting liyane yaiku informasi kolaborasi. Fitur peringkat sing apik bisa dipikolehi kanthi tradisional saka dekomposisi matriks dokumen pangguna. Nanging nalika nyoba nindakake dekomposisi kasebut, kita nemoni masalah:

1. Kita duwe mayuta-yuta dokumen lan puluhan yuta pangguna. Matriks ora pas karo siji mesin, lan dekomposisi bakal suwe banget.
2. Umume isi ing sistem nduweni umur sing cendhak: dokumen tetep relevan mung sawetara jam. Mulane, perlu kanggo mbangun perwakilan vektor kanthi cepet.
3. Yen sampeyan mbangun dekomposisi sanalika sawise dokumen diterbitake, jumlah pangguna sing cukup ora bakal duwe wektu kanggo ngevaluasi. Mulane, perwakilan vektor sing paling mungkin ora apik banget.
4. Yen pangguna seneng utawa ora seneng, kita ora bakal bisa langsung njupuk akun kasebut ing dekomposisi.

Kanggo ngatasi masalah kasebut, kita ngetrapake dekomposisi sing disebarake saka matriks dokumen pangguna kanthi nganyari tambahan sing kerep. Carane persis apa iku bisa?

Upaminipun kita duwe kluster mesin N (N ing atusan) lan kita arep kanggo nindakake bosok mbagekke saka matriks ing wong-wong mau sing ora pas ing siji mesin. Pitakonan yaiku carane nindakake dekomposisi iki supaya, ing tangan siji, ana data sing cukup ing saben mesin lan, ing sisih liyane, supaya petungan kasebut bebas?

Carane kita bisa ing kualitas lan kacepetan pilihan saka Rekomendasi

Kita bakal nggunakake algoritma dekomposisi ALS sing diterangake ing ndhuwur. Ayo goleki carane nglakokake siji langkah ALS kanthi cara sing disebarake - langkah liyane bakal padha. Contone, kita duwe matriks dokumen sing tetep lan kita pengin nggawe matriks pangguna. Kanggo nindakake iki, kita bakal dibagi dadi N bagean kanthi garis, saben bagean bakal ngemot kira-kira jumlah garis sing padha. Kita bakal ngirim menyang saben mesin sel non-kosong saka larik sing cocog, uga matriks embeddings document (sakabèhé). Amarga ukurane ora gedhe banget, lan matriks pangguna-dokumen biasane arang banget, data iki pas karo mesin biasa.

Trik iki bisa diulang ing sawetara jaman nganti model konvergen, ngganti matriks tetep siji-siji. Nanging sanajan mangkono, dekomposisi matriks bisa njupuk sawetara jam. Lan iki ora ngrampungake masalah sing kudu cepet nampa embeddings saka dokumen anyar lan nganyari embeddings saka kang ana sethitik informasi nalika mbangun model.

Pambuka nganyari model inkremental cepet mbantu kita. Ayo kita duwe model sing dilatih saiki. Wiwit latihan, ana artikel anyar sing wis sesambungan karo pangguna, uga artikel sing ora ana interaksi sajrone latihan. Kanggo cepet entuk embeddings artikel kuwi, kita nggunakake embeddings pangguna dijupuk sak latihan gedhe pisanan model lan nindakake siji langkah ALS kanggo ngetung matriks document diwenehi matriks pangguna tetep. Iki ngidini sampeyan nampa embeddings cukup cepet - ing sawetara menit sawise dokumen diterbitake - lan asring nganyari embeddings saka dokumen anyar.

Kanggo nggawe rekomendasi langsung njupuk menyang akun tumindak manungsa, ing runtime kita ora nggunakake embeddings pangguna dijupuk offline. Nanging, kita nindakake langkah ALS lan entuk vektor pangguna sing nyata.

Transfer menyang area domain liyane

Kepiye cara nggunakake umpan balik pangguna babagan artikel teks kanggo nggawe perwakilan vektor video?

Kaping pisanan, kita mung nyaranake artikel teks, mula akeh algoritma sing dicocogake karo jinis konten iki. Nanging nalika nambahake jinis konten liyane, kita kudu ngganti model kasebut. Kepiye carane ngatasi masalah iki nggunakake conto video? Salah sawijining pilihan yaiku nglatih maneh kabeh model saka awal. Nanging iki mbutuhake wektu suwe, lan sawetara algoritma nuntut ukuran sampel latihan, sing durung kasedhiya ing jumlah sing dibutuhake kanggo jinis konten anyar ing wayahe pisanan urip ing layanan kasebut.

Kita lunga kanthi cara liya lan nggunakake model teks kanggo video kasebut. Trik ALS sing padha mbantu kita nggawe representasi vektor video. Kita njupuk perwakilan vektor pangguna adhedhasar artikel teks lan nindakake langkah ALS nggunakake informasi tampilan video. Dadi, kita entuk perwakilan vektor video kanthi gampang. Lan nalika runtime, kita mung ngetung jarak antarane vektor pangguna sing dipikolehi saka artikel teks lan vektor video.

kesimpulan

Ngembangake inti sistem rekomendasi wektu nyata mbutuhake akeh tantangan. Sampeyan kudu ngolah data kanthi cepet lan ngetrapake metode ML kanggo nggunakake data iki kanthi efektif; mbangun sistem distribusi kompleks sing bisa ngolah sinyal pangguna lan unit konten anyar ing wektu minimal; lan akeh tugas liyane.

Ing sistem saiki, desain kang aku diterangake, kualitas Rekomendasi kanggo pangguna mundak akeh bebarengan karo aktivitas lan dawa Tetep ing layanan. Nanging mesthi, ing kene dumunung kangelan utama: iku angel kanggo sistem langsung ngerti kapentingan wong sing wis sethitik interaksi karo isi. Ngapikake rekomendasi kanggo pangguna anyar minangka tujuan utama kita. Kita bakal terus ngoptimalake algoritma supaya konten sing cocog karo wong entuk feed luwih cepet, lan konten sing ora relevan ora ditampilake.

Source: www.habr.com

Add a comment