Mempercepat Pembangkitan Kandidat dalam Sistem Rekomendasi Menggunakan Milvus yang dipasangkan dengan PaddlePaddle
Jika Anda memiliki pengalaman dalam mengembangkan sistem rekomendasi, Anda mungkin pernah menjadi korban dari setidaknya salah satu hal berikut ini:
- Sistem sangat lambat saat mengembalikan hasil karena jumlah kumpulan data yang sangat banyak.
- Data yang baru dimasukkan tidak dapat diproses secara real time untuk pencarian atau kueri.
- Penerapan sistem pemberi rekomendasi adalah hal yang menakutkan.
Artikel ini bertujuan untuk mengatasi masalah yang disebutkan di atas dan memberikan beberapa wawasan untuk Anda dengan memperkenalkan proyek sistem rekomendasi produk yang menggunakan Milvus, database vektor sumber terbuka, yang dipasangkan dengan PaddlePaddle, sebuah platform pembelajaran mendalam.
Artikel ini akan menjelaskan secara singkat alur kerja minimal dari sistem rekomendasi. Kemudian dilanjutkan dengan memperkenalkan komponen-komponen utama dan detail implementasi proyek ini.
Alur kerja dasar dari sebuah sistem pemberi rekomendasi
Sebelum masuk lebih jauh ke dalam proyek itu sendiri, pertama-tama mari kita lihat alur kerja dasar dari sistem rekomendasi. Sistem rekomendasi dapat memberikan hasil yang dipersonalisasi sesuai dengan minat dan kebutuhan pengguna yang unik. Untuk membuat rekomendasi yang dipersonalisasi, sistem melewati dua tahap, yaitu pembuatan kandidat dan pemeringkatan.
2.png
Tahap pertama adalah pembuatan kandidat, yang mengembalikan data yang paling relevan atau serupa, seperti produk atau video yang sesuai dengan profil pengguna. Selama pembuatan kandidat, sistem membandingkan sifat pengguna dengan data yang tersimpan di database, dan mengambil data yang mirip. Kemudian selama pemeringkatan, sistem menilai dan menyusun ulang data yang diambil. Akhirnya, hasil yang berada di bagian atas daftar ditampilkan kepada pengguna.
Dalam kasus sistem rekomendasi produk kami, pertama-tama sistem membandingkan profil pengguna dengan karakteristik produk dalam inventaris untuk menyaring daftar produk yang sesuai dengan kebutuhan pengguna. Kemudian sistem menilai produk berdasarkan kemiripannya dengan profil pengguna, memberi peringkat, dan akhirnya mengembalikan 10 produk teratas kepada pengguna.
3.png
Arsitektur sistem
Sistem rekomendasi produk dalam proyek ini menggunakan tiga komponen: MIND, PaddleRec, dan Milvus.
MIND
MIND, kependekan dari "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", adalah sebuah algoritma yang dikembangkan oleh Alibaba Group. Sebelum MIND diusulkan, sebagian besar model AI yang lazim untuk rekomendasi menggunakan vektor tunggal untuk mewakili beragam minat pengguna. Namun, satu vektor saja tidak cukup untuk merepresentasikan minat pengguna secara tepat. Oleh karena itu, algoritma MIND diusulkan untuk mengubah berbagai minat pengguna menjadi beberapa vektor.
Secara khusus, MIND mengadopsi jaringan multi-minat dengan perutean dinamis untuk memproses beberapa minat dari satu pengguna selama tahap pembuatan kandidat. Jaringan multi-minat adalah lapisan ekstraktor multi-minat yang dibangun di atas mekanisme perutean kapsul. Jaringan ini dapat digunakan untuk menggabungkan perilaku pengguna di masa lalu dengan berbagai minatnya, untuk memberikan profil pengguna yang akurat.
Diagram berikut menggambarkan struktur jaringan MIND.
4.png
Untuk merepresentasikan sifat pengguna, MIND mengambil perilaku pengguna dan minat pengguna sebagai input, dan kemudian memasukkannya ke dalam lapisan embedding untuk menghasilkan vektor pengguna, termasuk vektor minat pengguna dan vektor perilaku pengguna. Kemudian vektor perilaku pengguna dimasukkan ke dalam lapisan ekstraktor multi-minat untuk menghasilkan kapsul minat pengguna. Setelah menggabungkan kapsul minat pengguna dengan penyematan perilaku pengguna dan menggunakan beberapa lapisan ReLU untuk mengubahnya, MIND mengeluarkan beberapa vektor representasi pengguna. Proyek ini telah menetapkan bahwa MIND pada akhirnya akan menghasilkan empat vektor representasi pengguna.
Di sisi lain, ciri-ciri produk melewati lapisan penyematan dan diubah menjadi vektor item yang jarang. Kemudian setiap vektor item melewati pooling layer untuk menjadi vektor padat.
Ketika semua data diubah menjadi vektor, sebuah lapisan perhatian ekstra yang sadar label diperkenalkan untuk memandu proses pelatihan.
PaddleRec
PaddleRec adalah pustaka model pencarian berskala besar untuk rekomendasi. Ini adalah bagian dari ekosistem Baidu PaddlePaddle. PaddleRec bertujuan untuk memberikan solusi terintegrasi kepada para pengembang untuk membangun sistem rekomendasi dengan cara yang mudah dan cepat.
5.png
Seperti yang telah disebutkan di paragraf pembuka, para insinyur yang mengembangkan sistem rekomendasi sering kali harus menghadapi tantangan berupa kegunaan yang buruk dan penyebaran sistem yang rumit. Namun, PaddleRec dapat membantu para pengembang dalam beberapa aspek berikut:
Kemudahan penggunaan: PaddleRec adalah pustaka sumber terbuka yang merangkum berbagai model populer di industri ini, termasuk model untuk pembuatan kandidat, pemeringkatan, pemeringkatan ulang, multitasking, dan banyak lagi. Dengan PaddleRec, Anda dapat langsung menguji keefektifan model dan meningkatkan efisiensinya melalui iterasi. PaddleRec menawarkan cara mudah untuk melatih model untuk sistem terdistribusi dengan kinerja yang sangat baik. Ini dioptimalkan untuk pemrosesan data skala besar dari vektor yang jarang. Anda dapat dengan mudah menskalakan PaddleRec secara horizontal dan mempercepat kecepatan komputasinya. Oleh karena itu, Anda dapat dengan cepat membangun lingkungan pelatihan di Kubernetes menggunakan PaddleRec.
Dukungan untuk penyebaran: PaddleRec menyediakan solusi penerapan online untuk model-modelnya. Model-modelnya segera siap digunakan setelah pelatihan, menampilkan fleksibilitas dan ketersediaan yang tinggi.
Milvus
Milvus adalah basis data vektor yang menampilkan arsitektur cloud-native. Milvus bersumber terbuka di GitHub dan dapat digunakan untuk menyimpan, mengindeks, dan mengelola vektor penyematan besar-besaran yang dihasilkan oleh jaringan syaraf tiruan dan model pembelajaran mesin (ML) lainnya. Milvus merangkum beberapa pustaka pencarian perkiraan tetangga terdekat (ANN) kelas satu termasuk Faiss, NMSLIB, dan Annoy. Anda juga dapat mengembangkan Milvus sesuai dengan kebutuhan Anda. Layanan Milvus sangat tersedia dan mendukung pemrosesan batch dan stream terpadu. Milvus berkomitmen untuk menyederhanakan proses pengelolaan data yang tidak terstruktur dan memberikan pengalaman pengguna yang konsisten dalam lingkungan penerapan yang berbeda. Milvus memiliki fitur-fitur berikut:
Performa tinggi saat melakukan pencarian vektor pada kumpulan data yang sangat besar.
Komunitas yang mengutamakan pengembang yang menawarkan dukungan multi-bahasa dan toolchain.
Skalabilitas cloud dan keandalan yang tinggi bahkan saat terjadi gangguan.
Pencarian hibrida yang dicapai dengan memasangkan pemfilteran skalar dengan pencarian kemiripan vektor.
Milvus digunakan untuk pencarian kemiripan vektor dan manajemen vektor dalam proyek ini karena dapat menyelesaikan masalah pembaruan data yang sering terjadi dengan tetap menjaga stabilitas sistem.
Implementasi sistem
Untuk membangun sistem rekomendasi produk pada proyek ini, perlu dilakukan beberapa langkah berikut:
- Pengolahan data
- Pelatihan model
- Pengujian model
- Menghasilkan kandidat item produk
- Penyimpanan data: vektor item diperoleh melalui model yang telah dilatih dan disimpan di Milvus.
- Pencarian data: empat vektor pengguna yang dihasilkan oleh MIND dimasukkan ke dalam Milvus untuk pencarian kemiripan vektor.
- Pemeringkatan data: masing-masing dari empat vektor memiliki
top_k
vektor item yang mirip, dan empat set vektortop_k
diberi peringkat untuk menghasilkan daftar akhirtop_k
vektor yang paling mirip.
Kode sumber proyek ini dihosting di platform Baidu AI Studio. Bagian berikut ini adalah penjelasan rinci tentang kode sumber untuk proyek ini.
Langkah 1. Pemrosesan data
Dataset asli berasal dari dataset buku Amazon yang disediakan oleh ComiRec. Namun, proyek ini menggunakan data yang diunduh dan diproses oleh PaddleRec. Lihat dataset AmazonBook di proyek PaddleRec untuk informasi lebih lanjut.
Dataset untuk pelatihan diharapkan muncul dalam format berikut, dengan setiap kolom mewakili:
Uid
: Identitas pengguna.item_id
: ID item produk yang telah diklik oleh pengguna.Time
: Stempel waktu atau urutan klik.
Dataset untuk pengujian diharapkan muncul dalam format berikut, dengan setiap kolom mewakili:
Uid
: Identitas pengguna.hist_item
: ID item produk dalam perilaku klik pengguna historis. Jika ada beberapahist_item
, maka akan diurutkan berdasarkan stempel waktu.eval_item
: Urutan aktual saat pengguna mengklik produk.
Langkah 2. Pelatihan model
Pelatihan model menggunakan data yang telah diproses pada langkah sebelumnya dan mengadopsi model pembuatan kandidat, MIND, yang dibangun di atas PaddleRec.
1. Langkah 3. Masukan model
Di dygraph_model.py
, jalankan kode berikut ini untuk memproses data dan mengubahnya menjadi input model. Proses ini mengurutkan item yang diklik oleh pengguna yang sama dalam data asli sesuai dengan cap waktu, dan menggabungkannya untuk membentuk sebuah urutan. Kemudian, pilih secara acak item``_``id
dari urutan tersebut sebagai target_item
, dan ekstrak 10 item sebelum target_item
sebagai hist_item
untuk input model. Jika urutan tidak cukup panjang, maka dapat ditetapkan sebagai 0. seq_len
haruslah panjang sebenarnya dari urutan hist_item
.
def create_feeds_train(self, batch_data):
hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
target_item = paddle.to_tensor(batch_data[1], dtype="int64")
seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
return [hist_item, target_item, seq_len]
Lihat skrip /home/aistudio/recommend/model/mind/mind_reader.py
untuk kode pembacaan dataset asli.
2. Model jaringan
Kode berikut ini adalah ekstrak dari net.py
. class Mind_Capsual_Layer
mendefinisikan lapisan ekstraktor multi-bunga yang dibangun di atas mekanisme perutean kapsul bunga. Fungsi label_aware_attention()
mengimplementasikan teknik perhatian sadar-label dalam algoritma MIND. Fungsi forward()
dalam class MindLayer
memodelkan karakteristik pengguna dan menghasilkan vektor bobot yang sesuai.
class Mind_Capsual_Layer(nn.Layer):
def __init__(self):
super(Mind_Capsual_Layer, self).__init__()
self.iters = iters
self.input_units = input_units
self.output_units = output_units
self.maxlen = maxlen
self.init_std = init_std
self.k_max = k_max
self.batch_size = batch_size
# B2I routing
self.routing_logits = self.create_parameter(
shape=[1, self.k_max, self.maxlen],
attr=paddle.ParamAttr(
name="routing_logits", trainable=False),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
# bilinear mapping
self.bilinear_mapping_matrix = self.create_parameter(
shape=[self.input_units, self.output_units],
attr=paddle.ParamAttr(
name="bilinear_mapping_matrix", trainable=True),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
class MindLayer(nn.Layer):
def label_aware_attention(self, keys, query):
weight = paddle.sum(keys * query, axis=-1, keepdim=True)
weight = paddle.pow(weight, self.pow_p) # [x,k_max,1]
weight = F.softmax(weight, axis=1)
output = paddle.sum(keys * weight, axis=1)
return output, weight
def forward(self, hist_item, seqlen, labels=None):
hit_item_emb = self.item_emb(hist_item) # [B, seqlen, embed_dim]
user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
if not self.training:
return user_cap, cap_weights
target_emb = self.item_emb(labels)
user_emb, W = self.label_aware_attention(user_cap, target_emb)
return self.sampled_softmax(
user_emb, labels, self.item_emb.weight,
self.embedding_bias), W, user_cap, cap_weights, cap_mask
Lihat skrip /home/aistudio/recommend/model/mind/net.py
untuk struktur jaringan spesifik MIND.
3. Pengoptimalan model
Proyek ini menggunakan algoritma Adam sebagai pengoptimal model.
def create_optimizer(self, dy_model, config):
lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
optimizer = paddle.optimizer.Adam(
learning_rate=lr, parameters=dy_model.parameters())
return optimizer
Selain itu, PaddleRec menulis hyperparameter di config.yaml
, jadi Anda hanya perlu memodifikasi file ini untuk melihat perbandingan yang jelas antara keefektifan kedua model untuk meningkatkan efisiensi model. Ketika melatih model, efek model yang buruk dapat diakibatkan oleh model yang kurang pas atau terlalu pas. Oleh karena itu, Anda dapat memperbaikinya dengan memodifikasi jumlah putaran pelatihan. Dalam proyek ini, Anda hanya perlu mengubah parameter epochs di config.yaml
untuk menemukan jumlah putaran pelatihan yang tepat. Selain itu, Anda juga dapat mengubah pengoptimal model, optimizer.class
, atau learning_rate
untuk debugging. Berikut ini menunjukkan bagian dari parameter di config.yaml
.
runner:
use_gpu: True
use_auc: False
train_batch_size: 128
epochs: 20
print_interval: 10
model_save_path: "output_model_mind"
# hyper parameters of user-defined network
hyper_parameters:
# optimizer config
optimizer:
class: Adam
learning_rate: 0.005
Lihat skrip /home/aistudio/recommend/model/mind/dygraph_model.py
untuk implementasi yang lebih rinci.
4. Pelatihan model
Jalankan perintah berikut untuk memulai pelatihan model.
python -u trainer.py -m mind/config.yaml
Lihat /home/aistudio/recommend/model/trainer.py
untuk proyek pelatihan model.
Langkah 3. Pengujian model
Langkah ini menggunakan dataset pengujian untuk memverifikasi performa, seperti tingkat recall dari model yang telah dilatih.
Selama pengujian model, semua vektor item dimuat dari model, lalu diimpor ke Milvus, basis data vektor sumber terbuka. Baca dataset pengujian melalui skrip /home/aistudio/recommend/model/mind/mind_infer_reader.py
. Muat model pada langkah sebelumnya, dan masukkan dataset pengujian ke dalam model untuk mendapatkan empat vektor minat pengguna. Cari 50 vektor item yang paling mirip dengan empat vektor minat di Milvus. Anda dapat merekomendasikan hasil yang dikembalikan kepada pengguna.
Jalankan perintah berikut untuk menguji model.
python -u infer.py -m mind/config.yaml -top_n 50
Selama pengujian model, sistem menyediakan beberapa indikator untuk mengevaluasi keefektifan model, seperti Recall@50, NDCG@50, dan HitRate@50. Artikel ini hanya memperkenalkan modifikasi satu parameter. Namun, dalam skenario aplikasi Anda sendiri, Anda perlu melatih lebih banyak epoch untuk mendapatkan efek model yang lebih baik. Anda juga dapat meningkatkan efektivitas model dengan menggunakan pengoptimal yang berbeda, mengatur tingkat pembelajaran yang berbeda, dan meningkatkan jumlah putaran pengujian. Anda disarankan untuk menyimpan beberapa model dengan efek yang berbeda, dan kemudian memilih salah satu yang memiliki kinerja terbaik dan paling sesuai dengan aplikasi Anda.
Langkah 4. Membuat kandidat item produk
Untuk membangun layanan pembuatan kandidat produk, proyek ini menggunakan model terlatih pada langkah sebelumnya, dipasangkan dengan Milvus. Selama pembuatan kandidat, FASTAPI digunakan untuk menyediakan antarmuka. Ketika layanan dimulai, Anda dapat langsung menjalankan perintah di terminal melalui curl
.
Jalankan perintah berikut untuk menghasilkan kandidat awal.
uvicorn main:app
Layanan ini menyediakan empat jenis antarmuka:
- Memasukkan: Jalankan perintah berikut untuk membaca vektor item dari model Anda dan menyisipkannya ke dalam koleksi di Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/insert_data' \
-H 'accept: application/json' \
-d ''
- Menghasilkan kandidat awal: Masukkan urutan produk yang diklik oleh pengguna, dan cari tahu produk berikutnya yang mungkin diklik oleh pengguna. Anda juga dapat membuat kandidat item produk dalam kelompok untuk beberapa pengguna sekaligus.
hist_item
pada perintah berikut adalah vektor dua dimensi, dan setiap baris mewakili urutan produk yang telah diklik oleh pengguna di masa lalu. Anda dapat menentukan panjang urutan. Hasil yang dikembalikan juga merupakan kumpulan vektor dua dimensi, setiap baris mewakiliitem id
yang dikembalikan untuk pengguna.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/recall' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"top_k": 50,
"hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
- Menanyakanjumlah total item produk: Jalankan perintah berikut untuk mengembalikan jumlah total vektor item yang tersimpan dalam database Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/count' \
-H 'accept: application/json' \
-d ''
- Menghapus: Jalankan perintah berikut untuk menghapus semua data yang tersimpan dalam database Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/qa/drop' \
-H 'accept: application/json' \
-d ''
Jika Anda menjalankan layanan pembuatan kandidat di server lokal Anda, Anda juga dapat mengakses antarmuka di atas di 127.0.0.1:8000/docs
. Anda dapat bermain-main dengan mengklik empat antarmuka dan memasukkan nilai untuk parameter. Kemudian klik "Cobalah" untuk mendapatkan hasil rekomendasi.
6.png
7.png
Rekap
Artikel ini terutama berfokus pada tahap pertama pembuatan kandidat dalam membangun sistem rekomendasi. Artikel ini juga memberikan solusi untuk mempercepat proses ini dengan menggabungkan Milvus dengan algoritma MIND dan PaddleRec dan oleh karena itu telah mengatasi masalah yang diajukan di paragraf pembuka.
Bagaimana jika sistem sangat lambat saat mengembalikan hasil karena jumlah dataset yang sangat banyak? Milvus, basis data vektor sumber terbuka, dirancang untuk pencarian kemiripan yang sangat cepat pada kumpulan data vektor yang padat yang berisi jutaan, miliaran, atau bahkan triliunan vektor.
Bagaimana jika data yang baru dimasukkan tidak dapat diproses secara real time untuk pencarian atau kueri? Anda dapat menggunakan Milvus karena mendukung pemrosesan batch dan stream terpadu dan memungkinkan Anda untuk mencari dan menanyakan data yang baru dimasukkan secara real time. Selain itu, model MIND mampu mengubah perilaku pengguna baru secara real-time dan memasukkan vektor pengguna ke dalam Milvus secara instan.
Bagaimana jika penerapan yang rumit terlalu mengintimidasi? PaddleRec, sebuah library yang kuat yang merupakan bagian dari ekosistem PaddlePaddle, dapat memberi Anda solusi terintegrasi untuk menerapkan sistem rekomendasi atau aplikasi lain dengan cara yang mudah dan cepat.
Tentang penulis
Yunmei Li, Zilliz Data Engineer, lulus dari Universitas Sains dan Teknologi Huazhong dengan gelar di bidang ilmu komputer. Sejak bergabung dengan Zilliz, ia telah bekerja mengeksplorasi solusi untuk proyek open source Milvus dan membantu pengguna untuk menerapkan Milvus dalam skenario dunia nyata. Fokus utamanya adalah pada NLP dan sistem rekomendasi, dan ia ingin lebih memperdalam fokusnya di dua bidang ini. Dia suka menghabiskan waktu sendirian dan membaca.
Mencari lebih banyak sumber daya?
- Lebih banyak kasus pengguna dalam membangun sistem rekomendasi:
- Membangun Sistem Rekomendasi Produk yang Dipersonalisasi dengan Vipshop dengan Milvus
- Membangun Aplikasi Perencanaan Lemari Pakaian dan Pakaian dengan Milvus
- Membangun Sistem Rekomendasi Berita Cerdas di Dalam Aplikasi Berita Sohu
- Pemfilteran Kolaboratif Berbasis Item untuk Sistem Rekomendasi Musik
- Membuat dengan Milvus: Rekomendasi Berita yang Didukung AI di Dalam Peramban Seluler Xiaomi
- Lebih banyak proyek Milvus yang berkolaborasi dengan komunitas lain:
- Bergabunglah dengan komunitas sumber terbuka kami:
- Alur kerja dasar dari sebuah sistem pemberi rekomendasi
- Arsitektur sistem
- Implementasi sistem
- Rekap
- Tentang penulis
- Mencari lebih banyak sumber daya?
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word