Xây dựng recommendation system đơn giản với deep learning

Hệ thống gợi ý (Recommender systems hoặc Recommendation systems) là một dạng của hệ hỗ trợ ra quyết định, cung cấp giải pháp mang tính cá nhân hóa mà không phải trải qua quá trình tìm kiếm phức tạp. Hệ gợi ý học từ người dùng và gợi ý các sản phẩm tốt nhất trong số các sản phẩm phù hợp.

Định nghĩa trên được tôi copy từ nguồn viblo. Để cho dễ hiểu và đơn giản, trong bài này tôi sẽ sử dụng dữ liệu bao gồm người dùng, các địa điểm và đánh giá của người dùng về các địa điểm mà họ đã đến. Mục tiêu là từ những đánh giá đã có của người dùng về từng địa điểm, chúng ta sẽ dự đoán đánh giá về những địa điểm mà họ chưa tới, nếu những đánh giá này đủ lớn, các địa điểm sẽ được gợi ý cho người dùng để họ tiếp tục đến.

Để có được dữ liệu, tôi đã viết một đoạn code nhỏ để lấy một chút dữ liệu đánh giá từ foody.

Ở đây chúng ta có các thông tin bao gồm thời gian đánh giá, người dùng, địa điểm, review và điểm số của người dùng đánh giá về địa điểm.

Tuy nhiên chúng ta không cần tất cả các thông tin này, vì vậy ở bước tiếp theo tôi sẽ chỉ lấy các thông tin về user, brand và score. Đối với trường hợp 1 user review brand nhiều lần, điểm số sẽ được lấy trung bình.

Tiếp theo tôi link từng user, item với một số duy nhất, cặp số [user, item] sẽ là input cho deep learning model. Kèm với đó tôi tạo dictionary để có thể dễ dàng tìm kiếm id thông qua user name hoặc ngược lại.

Dữ liệu đã sẵn sàng để đưa vào mô hình. Mô hình của chúng ta sẽ bao gồm embedding vector của từng cặp user và item được nối lại, tiếp đó là feed forward net, output là review của user đối với item.

Mô hình mạng khác giống với hình bên dưới.

Nguồn: oreilly

Khi train neural net, các bạn nên sử dụng máy tính có GPU hoặc thuê một dịch vụ cloud có GPU như aws hay paperspace. Cá nhân tôi sử dụng gói p2.xlarge để train model này.

Một điểm thú vị đó là khi model đã train xong chúng ta sẽ có được embedding vector của từng user và item.

Embedding vector của user Ken_sunlight

Chúng ta có thể sử dụng các vector này để thực hiện các phép toán trong không gian euclide như cộng trừ, hoặc có thể thực hiện clustering, tìm nearest neighbor… Nếu bạn thấy quen thuộc thì bạn đã đúng, điều này rất giống với word2vec.

Nguồn: Quora

Các kĩ thuật embedding có thể được sử dụng với nhiều biến số khác nhau, thậm chí Embed All The Things!

Việc tiếp theo khi train xong model đó là dự đoán rating của từng user với các địa điểm mà họ chưa tới. Trong hình dưới là 10 địa điểm tại Hồ Chí Minh mà user taiyo được dự đoán sẽ có đánh giá tốt nhất.

Một số câu hỏi

Q: Liệu có thể thêm các feature như tuổi, địa điểm của user vào mô hình?
A: Có thể. Bạn chỉ cần nối tiếp ở embedding layer. Tất nhiên là giá trị các feature này không thay đổi như embedding vector của user và item

Q: Liệu có cần phải train lại model từ đầu khi có thêm thông in review của user?
A: Có. Bởi khi đó điểm số trung bình của user review địa điểm có thể sẽ thay đổi.

Q: Vậy quá trình gợi ý sẽ như thế nào? Bởi để có được giá trị dự đoán của deep learning model sẽ mất khá nhiều thời gian.
A: Cá nhân tôi cho rằng model sẽ được train lại hàng ngày. Sau khi train xong thì kết quả của các cặp user-item sẽ được dự đoán và lưu lại trong database. Khi người dùng đăng nhập thì kết quả gợi ý sẽ được hiển thị thông qua câu lệnh truy vấn trên database chứ không phải chạy lại mô hình nữa.

Tài liệu đọc thêm

  1. https://www.slideshare.net/BenjaminLe4/deep-learning-for-personalized-search-and-recommender-systems
  2. https://www.oreilly.com/ideas/deep-matrix-factorization-using-apache-mxnet

Source: Deep Learning on Medium