data-science · Vietnamese · 10 min
🇺🇸 Read in EnglishXây dựng hệ thống gợi ý: Từ Collaborative Filtering đến Two-Tower Model
February 9, 2026
Từ Netflix đến Shopee — hệ thống gợi ý hoạt động thế nào, các thuật toán chính là gì, và bạn nên chọn cái nào cho bài toán của mình?
Netflix tiết kiệm khoảng 1 tỷ USD mỗi năm nhờ hệ thống gợi ý — không phải vì nó đoán đúng 100%, mà vì nó giảm đủ nhiều trường hợp người dùng rời bỏ dịch vụ vì không tìm được gì để xem. Đây là vấn đề mà bất kỳ DS engineer nào làm việc với dữ liệu người dùng đều sẽ gặp ở một thời điểm nào đó.
Bài này sẽ đi qua toàn bộ bức tranh: từ collaborative filtering cổ điển, matrix factorization, neural approaches, đến cold start và evaluation metrics — đủ để bạn hiểu hệ thống và đưa ra quyết định thiết kế đúng.
Bài toán cơ bản
Cho user u và một catalog I gồm hàng nghìn (hoặc hàng triệu) items — sản phẩm, phim, bài hát, bài đăng. Nhiệm vụ: xếp hạng một tập con cá nhân hóa của I cho u sao cho những items được xếp cao nhất là những items user có nhiều khả năng tương tác nhất.
Input thực tế không phải là rating 1–5 sao (explicit feedback) mà là click, purchase, play, view (implicit feedback) — tín hiệu yếu và nhiễu hơn, nhưng lại dồi dào hơn nhiều. Phần lớn hệ thống production xử lý implicit feedback.
Ba hướng tiếp cận chính
Collaborative Filtering
Ý tưởng cốt lõi: những user đã đồng ý trong quá khứ thì có xu hướng đồng ý trong tương lai. Không cần biết gì về nội dung item — chỉ cần lịch sử tương tác.
Có hai biến thể:
User-based CF: Tìm những users có hành vi giống u, gợi ý những items mà họ thích nhưng u chưa thấy. Vấn đề: tính toán similarity giữa tất cả cặp users là O(n²) — không scale với hàng triệu users.
Item-based CF: Tìm những items giống với những items mà u đã thích, gợi ý chúng. Amazon sử dụng biến thể này. Item similarity ổn định hơn user similarity theo thời gian, và có thể pre-compute offline.
Cả hai đều dùng cosine similarity hoặc Pearson correlation trên ma trận user-item. Điểm mạnh: đơn giản, dễ giải thích. Điểm yếu: cold start (user mới/item mới không có lịch sử), sparsity (99%+ entries trong ma trận là trống).
Content-Based Filtering
Thay vì nhìn vào người dùng khác, Content-Based Filtering (CBF) nhìn vào đặc trưng của items mà u đã thích và tìm items tương tự. Spotify dùng audio features — tempo, energy, key — để xây dựng user profile âm nhạc.
Ưu điểm rõ ràng: không có cold start cho items mới miễn là có metadata. Nhược điểm: filter bubble — model chỉ gợi ý những thứ giống những gì user đã thấy, thiếu serendipity. Ngoài ra, cần item metadata chất lượng, tốn công xây dựng.
Hybrid
Thực tế, mọi hệ thống production đều là hybrid theo cách nào đó. Netflix dùng weighted hybrid (điểm CF + điểm content). Cách phổ biến hơn trong industrial systems là cascade: Two-Tower model sinh ra candidate set → ranker neural network tái xếp hạng dùng thêm features. Hybrid cho accuracy tốt nhất nhưng phức tạp nhất để maintain.
Matrix Factorization: Nền tảng không thể bỏ qua
Collaborative Filtering thuần túy có vấn đề với sparsity. Matrix Factorization (MF) giải quyết điều này bằng cách học latent representations.
Ma trận tương tác R (users × items) được decompose thành hai ma trận nhỏ hơn: R ≈ P × Qᵀ, trong đó P (users × k) và Q (items × k) chứa k latent factors. k thường từ 32 đến 256.
SVD / Funk SVD: Tối thiểu hóa RMSE trên các ratings quan sát được bằng stochastic gradient descent. Simon Funk's variant đã giúp thắng Netflix Prize (2009). Library surprise implement phương pháp này tốt cho explicit ratings.
ALS (Alternating Least Squares): Thay thế lần lượt — fix P, giải Q dạng closed-form; rồi fix Q, giải P. Phù hợp hơn nhiều với implicit feedback vì có thể weight unobserved interactions (confidence weighting). Công thức confidence: c_ui = 1 + α × log(1 + frequency_ui) — items được tương tác nhiều lần có confidence cao hơn, nhưng không bằng 0 nếu chưa tương tác.
Library implicit implement ALS với GPU support, xử lý hàng triệu interactions hiệu quả. Đây là công cụ bạn nên thử đầu tiên với bài toán implicit feedback ở quy mô vừa.
Neural Collaborative Filtering
NCF (He et al., 2017) thay thế dot product của MF bằng một multi-layer perceptron (MLP), cho phép model học các tương tác phi tuyến giữa user và item embeddings.
Kiến trúc NeuMF đầy đủ có hai nhánh song song:
- GMF branch: dot product của user embedding và item embedding (giữ lại MF cổ điển)
- MLP branch: concatenate embeddings rồi đưa qua nhiều fully-connected layers
Output của hai nhánh được concatenate và đưa qua sigmoid để dự đoán xác suất tương tác.
Kết quả thực nghiệm: NCF vượt trội MF thuần túy trên MovieLens và Pinterest. Thêm layers giúp, nhưng diminishing returns sau 3–4 layers. Implementation với PyTorch ngắn hơn 100 dòng — đây là bước tự nhiên đầu tiên từ MF vào deep learning cho RecSys.
Wide & Deep và Two-Tower: Kiến trúc production
Wide & Deep
Wide & Deep (Cheng et al., 2016) được Google deploy trên Google Play cho hơn 1 tỷ users.
- Wide component: Generalized linear model trên raw features và cross-product features. Học memorization — "user đã install game loại A thường install game loại B."
- Deep component: DNN trên learned embeddings. Học generalization — khái quát hóa từ sparse inputs sang unseen feature combinations.
Hai components được train jointly. Successor models: DeepFM, xDeepFM — thay Wide bằng factorization machine để tự động học feature interactions.
Two-Tower (Dual Encoder)
Kiến trúc dominant cho candidate retrieval ở scale lớn tại YouTube, Google, Pinterest. Cấu trúc:
- User tower: Encode user context (lịch sử tương tác, demographics) thành một vector embedding
- Item tower: Encode item features (title, category, tags) thành một vector embedding
- Similarity: Dot product của hai vectors
Insight quan trọng: hai towers tách biệt cho phép pre-compute toàn bộ item embeddings offline. Khi serving, chỉ cần compute user embedding cho request hiện tại, rồi tìm K items gần nhất bằng approximate nearest neighbor (FAISS, ScaNN). Retrieval hàng tỷ items trong milliseconds.
Two-Tower cũng xử lý item cold start natively: item tower nhận raw features, không cần interaction history.
VAE-Based Recommendation
Mult-VAE (Liang et al., 2018) tiếp cận recommendation theo hướng generative model. Toàn bộ lịch sử tương tác của một user được xem như một bag-of-words. Encoder maps vector tương tác này vào một Gaussian latent space; decoder reconstruct phân phối xác suất trên toàn bộ catalog.
Multinomial likelihood (thay vì Gaussian) phù hợp hơn với implicit feedback. KL annealing (β-VAE) tránh posterior collapse trong training.
RecVAE (2020) cải thiện Mult-VAE với composite prior và alternating training encoder/decoder, đạt SOTA trên nhiều implicit feedback benchmarks vào thời điểm publish.
Cả hai model đặc biệt mạnh cho top-N recommendation với dense interaction data — lý thuyết phong phú hơn MF, thường competitive với các neural approaches nặng hơn.
Session-Based Recommendation: Khi người dùng ẩn danh
Nhiều e-commerce và media platforms ở Việt Nam có tỷ lệ lớn anonymous users — không đăng nhập, không có lịch sử. Model phải gợi ý chỉ dựa trên session hiện tại.
GRU4Rec (Hidasi et al., 2016): Đầu tiên áp dụng RNN (GRU) cho session-based recommendation. Model sequence of item clicks như time series. Dùng ranking loss (BPR hoặc TOP1) thay vì cross-entropy — quan trọng cho recommendation task. Cải thiện đáng kể so với item-to-item methods.
SASRec (Kang & McAuley, 2018): Self-attention (one-directional transformer, kiểu GPT) trên item sequences. Chỉ dùng N interactions gần nhất với left-to-right attention mask. Nhanh hơn GRU4Rec, đạt SOTA trên nhiều benchmarks. Thực tế: single attention head outperform multi-head.
BERT4Rec (Sun et al., 2019): Bidirectional transformer với Cloze task — mask ngẫu nhiên items trong sequence và predict chúng. Tốt hơn SASRec trên một số datasets nhưng compute nặng hơn.
Cold Start: Vấn đề đầu tiên gặp trong production
Cold start xảy ra ở ba cấp độ:
User cold start: User mới, không có lịch sử. Solutions:
- Onboarding questions ("Chọn 3 thể loại nhạc bạn thích")
- Demographic / contextual features
- Populate-then-personalize: gợi ý popular items trước, cá nhân hóa sau khi đủ data
- Content-based filtering cho đến khi có đủ interactions
Item cold start: Item mới, chưa có ai tương tác. Solutions:
- Dùng item content features để tìm items tương tự, kế thừa embedding của chúng
- Two-Tower: item tower xử lý raw features nên items mới có embedding ngay lập tức
- Explore-exploit: bandits force một số exposures cho items mới
System cold start: Hệ thống mới, không có data. Solutions:
- Pretrain trên public datasets (MovieLens, Amazon Reviews)
- Transfer learning từ domain liên quan
- Rule-based fallback (popular, new, curated)
MF và NCF gặp khó khăn nhất với cold start. Content-based filtering và Two-Tower có ưu thế rõ ràng ở đây.
Đánh giá đúng cách
Recommendation là bài toán information retrieval. Model trả về ranked list K items; ground truth là items user thực sự tương tác trong holdout set.
Precision@K: Trong K items được gợi ý, bao nhiêu cái user thực sự thích?
Precision@K = |recommended ∩ relevant| / K
Recall@K: Trong tổng số items user thích, bao nhiêu cái xuất hiện trong top-K?
Recall@K = |recommended ∩ relevant| / |relevant|
NDCG@K (Normalized Discounted Cumulative Gain): Metric position-aware. Items xếp cao hơn đóng góp nhiều hơn vào score. DCG@K = Σ relevance_i / log₂(i+1). NDCG@K = DCG@K / IDCG@K (normalize về [0,1]). Đây là metric được cite nhiều nhất trong research và industry.
Hit Rate@K: Binary — có ít nhất 1 relevant item trong top-K không? Average across users. Đơn giản và trực quan.
MRR (Mean Reciprocal Rank): mean(1 / rank_of_first_relevant_item). Tốt khi chỉ có 1 ground truth item (leave-one-out evaluation).
Evaluation protocol: Temporal split (train trước thời điểm T, test sau T) thực tế hơn leave-one-out. Tuyệt đối không dùng random split — gây data leakage khi dùng future interactions để predict past.
Ngoài accuracy, production systems còn track: diversity (tránh gợi ý items quá giống nhau), novelty (gợi ý items user chưa thấy), coverage (fraction of catalog được recommend), serendipity (bất ngờ nhưng liên quan). NDCG cao nhưng catalog coverage thấp → popularity bias đang là vấn đề.
Khi nào dùng thuật toán nào?
| Approach | Pros | Cons | Phù hợp khi |
|---|---|---|---|
| Item-based CF | Đơn giản, giải thích được | Cold start, không scale | Catalog nhỏ, cần explainability |
| ALS (MF) | Scalable, xử lý implicit tốt | Cold start, không có features | Scale vừa-lớn, implicit feedback |
| NCF | Tốt hơn MF, bắt non-linear | Train chậm hơn, khó tune | Khi MF đã là ceiling |
| Wide & Deep | Memorization + generalization | Feature engineering phức tạp | Large-scale với rich features, ranking stage |
| Two-Tower | Billion-scale, xử lý cold start | Cần ANN infra | Candidate generation ở scale lớn |
| Mult-VAE/RecVAE | Top-N mạnh, Bayesian | User-level inference chậm | Dense interaction data |
| GRU4Rec | Sequential, session-aware | RNN chậm, cần sequence data | Anonymous sessions |
| SASRec | Nhanh hơn RNN, SOTA | Cần đủ sequence length | Sequential với transformers |
| Hybrid | Accuracy tốt nhất | Phức tạp, latency | Production khi accuracy là ưu tiên |
Heuristic theo scale:
- < 10K users/items: Item-based CF hoặc SVD
- 10K–1M: ALS với
implicit, NCF trong PyTorch - > 1M: Two-Tower + FAISS, hoặc managed services (Vertex AI Recommendations, AWS Personalize)
Bước tiếp theo
Bức tranh toàn cảnh trên là nền tảng. Bước thực tế: bắt đầu với ALS trên MovieLens 1M (freely available tại grouplens.org), đo NDCG@10 và Recall@20, sau đó thử NCF để thấy delta. Đó là quy trình mà mọi ML engineer nên làm một lần — không phải để ship một model hoàn hảo, mà để xây dựng intuition về trade-offs thực sự của từng approach.
Những gì đang nổi lên trong 2024–2026: LLM-based RecSys (prompting LLMs để gợi ý), Graph Neural Networks với LightGCN cho sparse datasets, và multi-modal recommendations tích hợp image/audio embeddings từ CLIP. Hướng nào trong số này sẽ thành dominant paradigm vẫn còn là câu hỏi mở.
Sai Lầm Thường Gặp
- Dùng random split thay vì temporal split. Với recommendation systems, random split cho phép future interactions "nhiễm" vào training — model học từ tương lai để dự đoán quá khứ. Luôn dùng temporal split: train trên interactions trước thời điểm T, test trên sau T.
- Chỉ tối ưu offline metric (NDCG, Recall) mà không gắn với business KPI. NDCG cao trên validation set không đảm bảo CTR hay revenue tăng trong production. Cần A/B test để validate rằng model offline improvement chuyển thành business improvement thực sự.
- Bỏ qua popularity bias. Nếu không kiểm tra catalog coverage, model thường default về một tập nhỏ items phổ biến — serving đến mọi user gần như giống nhau. Thêm diversity và novelty metrics vào evaluation pipeline.
- Không thiết kế cold start từ đầu. Nhiều team build MF hoặc NCF mà không nghĩ đến user mới hay item mới, sau đó phải retrofit cold start solution — tốn kém hơn nhiều. Cold start handling phải là phần của thiết kế ban đầu.
- Over-engineering ngay từ đầu. Nhiều team skip ALS và build Two-Tower ngay lập tức — rồi phát hiện ra item-based CF đơn giản đã đủ tốt cho scale của họ. Luôn build baseline đơn giản nhất trước, tăng độ phức tạp khi có bằng chứng rõ ràng rằng nó cần thiết.
Tóm tắt:
- Ba hướng chính: Collaborative Filtering (từ lịch sử tương tác users), Content-Based (từ đặc trưng items), Hybrid (kết hợp cả hai) — mọi hệ thống production đều là hybrid ở một dạng nào đó
- Chọn theo scale: <10K → item-based CF hoặc SVD; 10K–1M → ALS với
implicit; >1M → Two-Tower + FAISS - Cold start là vấn đề đầu tiên cần thiết kế: Two-Tower và content-based có lợi thế cấu trúc; MF và NCF gặp khó nhất
- Đánh giá phải dùng temporal split; NDCG@K là metric chuẩn nhưng cần A/B test để confirm business impact
- Luôn bắt đầu với ALS đơn giản — chuyển sang kiến trúc phức tạp hơn chỉ khi ALS đã là performance ceiling
Nguồn tham khảo
- Neural Collaborative Filtering — He et al., 2017 (arXiv:1708.05031)
- Wide & Deep Learning for Recommender Systems — Cheng et al., 2016 (arXiv:1606.07792)
- Variational Autoencoders for Collaborative Filtering — Liang et al., 2018 (arXiv:1802.05814)
- Session-based Recommendations with Recurrent Neural Networks — Hidasi et al., 2016 (arXiv:1511.06939)
- Self-Attentive Sequential Recommendation — Kang & McAuley, 2018 (arXiv:1808.09781)
- BERT4Rec — Sun et al., 2019 (arXiv:1904.06690)