← Writing

data-science · Vietnamese · 9 min

🇺🇸 Read in English

RecVAE: Khi mô hình tuyến tính đánh bại mạng nơ-ron — và khi thì không

March 9, 2026

RecVAE (WSDM 2020) cải thiện Mult-VAE với bốn thay đổi kỹ thuật có chủ đích — nhưng trên tập MSD, một mô hình tuyến tính đơn giản vẫn thắng. Đây là bài học thực tế nhất từ bài báo.

NDCG@100 = 0.389 vs 0.326. Mô hình tuyến tính nghiệm dạng bít mạng nơ-ron được tinh chỉnh suốt nhiều tháng. Đây không phải lỗi thực nghiệm — đây là kết quả được in thẳng trong bảng 1 của bài báo RecVAE (WSDM 2020).

RecVAE là bước kế thừa trực tiếp từ Mult-VAE [Liang et al., 2018] — mô hình VAE chuẩn mực cho bài toán collaborative filtering với implicit feedback (lượt click, lượt nghe, lượt mua). Bài báo không cố tạo ra một kiến trúc hoàn toàn mới mà đặt câu hỏi cụ thể hơn: Mult-VAE đang sai ở đâu, và sửa từng điểm đó theo hướng nào? Kết quả là bốn thay đổi kỹ thuật độc lập, mỗi thứ có lý do rõ ràng — và một bài học khó chịu về giới hạn của neural model trên dữ liệu thưa.

Mult-VAE làm gì và thiếu gì

Trước khi hiểu RecVAE, cần hình dung Mult-VAE hoạt động như thế nào. Mô hình xem lịch sử tương tác của mỗi user như một vector nhị phân (hoặc count) trên toàn bộ item catalog, sau đó encode nó thành một phân phối Gaussian trên không gian latent, rồi decode ngược lại để sinh ra một phân phối xác suất trên tất cả items. Hàm loss là ELBO tiêu chuẩn: reconstruction term (multinomial likelihood) trừ đi beta * KL(q||p), trong đó p = N(0, I).

Hai vấn đề nổi cộm:

Vấn đề 1: Prior cố định không theo kịp encoder. Trong amortized inference, một encoder chung được train trên toàn bộ user. Khi encoder update theo batch của user A, embedding của user B có thể bị "kéo lệch" mà không có cơ chế nào giữ nó ổn định. Prior N(0,I) quá xa so với posterior thực tế của user, tạo ra gradient lớn và bất ổn định — đặc biệt tệ với sparse user ít tương tác.

Vấn đề 2: Beta không phân biệt user. Một scalar beta duy nhất áp dụng đồng đều cho user có 5 lượt tương tác lẫn user có 500 lượt. Với user thưa, KL term quá mạnh sẽ ép posterior về gần prior, xóa đi thông tin cá nhân hóa. Với user dày, KL term quá yếu thì không đủ regularization.

Bốn thay đổi của RecVAE

1. Composite prior — mượn ý tưởng từ Reinforcement Learning

Thay vì dùng N(0,I) làm prior cố định, RecVAE dùng một mixture:

p(z | phi_old, x) = alpha * N(z | 0, I) + (1 - alpha) * q_{phi_old}(z | x)

Trong đó phi_old là tham số encoder của epoch trước, bị freeze lại. Mixture này kết hợp hai thành phần: prior chuẩn (ngăn overfitting) và posterior cũ (ngăn encoder quên đi những gì đã học). Ý tưởng xuất phát từ Proximal Policy Optimization (PPO) trong RL — ở đó, trust-region constraint giữ policy mới không đi quá xa policy cũ sau mỗi update.

Trong thực tế, implementation dùng ba component với trọng số 3/20 (standard normal), 3/4 (old posterior — dominant), và 1/10 (broad normal với log sigma^2 = 10, đóng vai phủ rộng). Vì KL giữa Gaussian và mixture này không có dạng closed-form, tác giả dùng Monte Carlo sampling. Ablation cho thấy composite prior một mình đã cộng ~0.006 NDCG@100 trên ML-20M so với Mult-VAE.

2. Beta thích nghi theo user — từ first principles

Thay vì beta cố định hoặc annealing schedule, RecVAE suy luận từ ELBO đầy đủ rằng KL weight đúng phải tỉ lệ với số lượt tương tác của user:

beta'(x_u) = gamma * |X_observed_u|

User có nhiều tương tác nhận KL weight lớn hơn — posterior của họ được phép lệch xa prior vì có đủ dữ liệu để hỗ trợ một embedding cá nhân hóa. User thưa nhận KL weight nhỏ — posterior bị đẩy về prior, tương đương regularization mạnh hơn. Gamma là một scalar duy nhất cần cross-validate (0.005 cho ML-20M, 0.0035 cho Netflix, 0.01 cho MSD).

Ý tưởng này đơn giản đến mức có thể copy sang bất kỳ beta-VAE nào cho recommendation mà không cần thay đổi kiến trúc.

3. Alternating training — encoder và decoder không nên train cùng nhau

Lấy cảm hứng từ Alternating Least Squares (ALS) trong matrix factorization, RecVAE tách biệt hai pha training:

  • Pha encoder: update encoder với dropout noise trên input (tỉ lệ 0.5), Menc lần.
  • Pha decoder: update decoder trên input sạch (không noise), Mdec lần. Tỉ lệ Menc:Mdec = 3:1.

Tại sao? Decoder của RecVAE là một linear layer đơn giản (W * z + b) — về bản chất là item embedding matrix. Áp dụng denoising lên decoder là over-regularization cho một thành phần đã under-parameterized. Encoder phức tạp hơn nhiều (multi-layer densely-connected) nên cần noise để generalize. Tách hai pha ra và áp dụng noise chỉ khi cần là một lựa chọn thiết kế tường minh hiếm thấy trong các bài báo deep learning.

4. Kiến trúc encoder denser hơn

Encoder dùng densely-connected fully-connected layers (ý tưởng từ DenseNet), swish activation, và layer normalization. Input là user feedback vector đã L2-normalize. Output là [mu, log sigma^2] cho diagonal Gaussian posterior. Dropout chỉ bật trong pha encoder training, tắt trong evaluation và pha decoder.

Kết quả thực nghiệm: hai câu chuyện khác nhau

RecVAE được đánh giá trên ba tập dữ liệu lớn theo protocol của Mult-VAE:

DatasetUsersItemsRecVAE NDCG@100Mult-VAE NDCG@100EASE^R NDCG@100
MovieLens-20M136,67720,7200.4420.4260.420
Netflix Prize463,43517,7690.3940.3860.393
MSD571,35541,1400.3260.3160.389

Trên ML-20M, RecVAE thắng rõ ràng (+1.6pp so với Mult-VAE, +2.2pp so với EASE^R). Trên Netflix, RecVAE và EASE^R về cơ bản hòa (cách nhau 0.001). Trên MSD, EASE^R thắng cách biệt 6.3 điểm phần trăm.

EASE^R (Embarrassingly Shallow AutoEncoders for Sparse Data) là mô hình tuyến tính nghiệm dạng — không có gradient descent, không có latent space, chỉ giải một bài toán tối ưu closed-form. Bài báo RecVAE không giải thích được hoàn toàn tại sao EASE^R lại thắng trên MSD.

Tại sao mô hình tuyến tính thắng trên MSD?

Bài báo thừa nhận đây là câu hỏi mở. Nhưng có một số giả thuyết có căn cứ:

MSD là tập sparse nhất trong ba. 571,355 users, 41,140 songs, 33.63M interactions. Với collaborative filtering, sparsity cực cao có nghĩa là rất ít "collaborative signal" — mỗi user chỉ nghe một phần nhỏ catalog. Neural model cần đủ data để học non-linear patterns; khi signal thưa, overfitting lấn át và mô hình tuyến tính có regularization tốt lại thắng.

Item catalog của MSD rộng hơn tương đối (41,140 songs so với ~17,000–20,000 movies). Không gian item lớn hơn, mỗi item càng ít data, collaborative signal càng loãng.

EASE^R regularize tốt cho sparse setting. Closed-form solution của EASE^R tương đương ridge regression trên item-item similarity — regularization mạnh và uniform, không phụ thuộc vào heuristic tuning.

Câu trả lời thực tế cho practitioners: Test cả hai. EASE^R có implementation gần như trivial và chạy rất nhanh — không có lý do gì để không dùng nó làm baseline trước khi invest vào RecVAE.

Giới hạn cần biết trước khi deploy

gamma phải tune theo dataset. Không có công thức tính gamma từ đặc tính dữ liệu — phải grid search. Đây là chi phí tuning thực tế.

Alternating training loop phức tạp hơn Mult-VAE. Cần maintain separate objectives, track phi_old giữa các epochs, đảm bảo decoder nhận clean input trong đúng pha. Không phải bẫy khó vượt qua, nhưng cần test kỹ integration.

Không hỗ trợ cold-start cho item mới. RecVAE là pure collaborative filtering — item phải xuất hiện trong training data. User mới có thể handle được (feed interaction vector qua frozen encoder), nhưng item mới thì không.

Không xử lý sequential recommendation. User history được xem là bag of items — thứ tự không quan trọng. Nếu bài toán đòi hỏi modeling thứ tự (session-based, next-item prediction), cần một kiến trúc khác.

Bộ nhớ với item catalog lớn. Decoder là một linear layer với kích thước |items| x latent_dim. Với catalog hàng triệu items, đây là constraint về memory, không phải compute.

Ai nên dùng RecVAE?

RecVAE phù hợp cho:

  • Hệ thống đang dùng Mult-VAE và muốn cải thiện không thay đổi infrastructure
  • Tập dữ liệu dense (nhiều tương tác per user, như phim hoặc nhạc trên platform lớn)
  • Implicit feedback (clicks, views, plays) — không phải explicit rating
  • Không cần sequential modeling

Nếu tập dữ liệu sparse và team chưa có Mult-VAE, thử EASE^R trước. Nếu EASE^R đã đủ tốt, RecVAE có thể không cần thiết.

Official implementation trên GitHub bằng PyTorch, được cite trong bài báo gốc. Practitioners đã quen Mult-VAE có thể chuyển sang RecVAE trong khoảng 200–300 dòng code thay đổi theo ước tính của tác giả.


Bốn thay đổi của RecVAE — composite prior, user-adaptive beta, alternating training, và encoder architecture — đều có lý do kỹ thuật rõ ràng và đều được ablation verify. Đây là kiểu engineering paper hiếm: không thêm complexity vì thêm complexity, mà vì mỗi thứ giải quyết một vấn đề cụ thể đã được chẩn đoán. Kết quả trên MSD nhắc nhở rằng "neural nhiều hơn" không phải lúc nào cũng tốt hơn — và một baseline tuyến tính mạnh vẫn là điểm khởi đầu không thể bỏ qua.

Sai Lầm Thường Gặp

  • Bỏ qua EASE^R baseline. EASE^R implement chưa đến 20 dòng và thường competitive với RecVAE. Nếu bạn skip nó, bạn không biết mình đang invest complexity để đổi lấy bao nhiêu improvement thực sự.
  • Dùng gamma từ paper mà không tune lại. Giá trị gamma trong paper được tối ưu trên dataset cụ thể của tác giả và có thể rất khác với dataset của bạn. Grid search là bắt buộc.
  • Implement alternating training sai pha. Alternating training loop cần phi_old được lưu đúng cách và decoder nhận clean input trong đúng pha. Implement sai sẽ cho kết quả gần như Mult-VAE và bạn sẽ không biết tại sao RecVAE không cải thiện.
  • Dùng RecVAE cho sparse dataset. RecVAE được thiết kế cho dense implicit feedback. Với sparse data, EASE^R hoặc ALS thường tốt hơn với ít phức tạp hơn nhiều.
  • Dùng RecVAE khi cần sequential modeling. RecVAE xem user history như bag-of-items — thứ tự không quan trọng. Với next-item prediction hoặc session-based recommendation, đây là giới hạn kiến trúc, không phải hyperparameter.

Tóm tắt:

  • RecVAE cải thiện Mult-VAE với 4 thay đổi có mục tiêu: composite prior, user-adaptive beta, alternating training, encoder architecture — mỗi thay đổi được ablation verify với lý do kỹ thuật rõ ràng
  • Thiết kế cho dense implicit feedback; không xử lý item cold-start và không model sequential behavior
  • Luôn benchmark EASE^R trước — baseline tuyến tính này thường competitive và implement trivial
  • Gamma phải tune per-dataset; alternating training loop cần implement cẩn thận
  • Nếu dataset sparse hoặc team chưa có Mult-VAE, EASE^R là điểm bắt đầu tốt hơn RecVAE
recommendation-systemsvaedeep-learningcollaborative-filtering

Nguồn tham khảo

  1. RecVAE: A New Variational Autoencoder for Top-N Recommendations with Implicit Feedback — arXiv
  2. RecVAE — Official Implementation (GitHub)
  3. RecVAE — Papers With Code