16.5. Cá nhân hóa Xếp hạng trong Hệ thống Đề xuất

Trong những phần trước, mô hình được huấn luyện và kiểm tra trên các đánh giá đã biết và chỉ các phản hồi trực tiếp là được xét đến. Phương pháp này có hai khuyết điểm: Thứ nhất, đa phần các phản hồi trong thực tế không dưới dạng trực tiếp mà là gián tiếp, và phản hồi trực tiếp thường khó thu thập hơn. Thứ hai, những cặp người dùng - sản phẩm chưa biết lại hoàn toàn bị bỏ qua, dù chúng có thể được sử dụng để dự đoán sở thích người dùng. Điều này khiến cho các phương pháp trên không phù hợp khi mà những đánh giá không phải là thiếu do ngẫu nhiên mà đến từ thị hiếu của người dùng. Những cặp người dùng - sản phẩm chưa biết là sự pha trộn giữa các phản ánh tiêu cực (người dùng không hứng thú với sản phẩm) và các giá trị còn thiếu (có lẽ sau này người dùng sẽ tương tác với sản phẩm). Ta đơn thuần bỏ qua những cặp chưa biết này trong phương pháp phân rã ma trận và AutoRec. Rõ ràng là những mô hình này không có khả năng phân biệt giữa những cặp đã biết và cặp chưa biết và thường không phù hợp với tác vụ cá nhân hóa xếp hạng (personalized ranking).

Từ đó, một nhóm mô hình đề xuất hướng tới việc tạo ra danh sách xếp hạng đề xuất từ phản hồi gián tiếp dần trở nên phổ biến. Thông thường, những mô hình cá nhân hóa xếp hạng có thể được tối ưu bằng các phương thức tiếp cận theo từng điểm, theo từng cặp hoặc theo danh sách. Cách tiếp cận từng điểm xét từng tương tác một và huấn luyện một bộ phân loại hoặc một bộ hồi quy để dự đoán sở thích cá nhân. Phân rã ma trận và AutoRec được tối ưu với các mục tiêu theo từng điểm. Cách tiếp cận theo từng cặp xét một cặp sản phẩm với mỗi người dùng và nhắm tới việc xấp xỉ thứ bậc tối ưu của cặp sản phẩm đó. Thường thì cách tiếp cận theo từng cặp phù hợp với tác vụ xếp hạng hơn do việc dự đoán thứ bậc tương đối gần với bản chất của việc xếp hạng. Cách tiếp cận theo danh sách ước chừng thứ bậc của toàn bộ danh sách các sản phẩm, ví dụ như trực tiếp tối ưu hệ số Độ lợi Chiết khấu Tích luỹ Chuẩn (Normalized Discounted Cumulative Gain - NDCG). Tuy nhiên, cách tiếp cận theo danh sách phức tạp hơn và đòi hỏi tài nguyên tính toán cao hơn so với cách tiếp cận theo từng điểm và theo từng cặp. Trong phần này, chúng tôi sẽ giới thiệu hai loại mất mát/mục tiêu của cách tiếp cận theo từng cặp, mất mát Cá nhân hóa Xếp hạng Bayes (Bayesian Personalized Ranking) và mất mát Hinge, cùng với cách lập trình từng loại mất mát tương ứng.

16.5.1. Mất mát Cá nhân hóa Xếp hạng Bayes và Cách lập trình

Cá nhân hóa Xếp hạng Bayes (BPR) [Rendle et al., 2009] là một hàm mất mát cá nhân hóa xếp hạng theo cặp, có xuất phát từ bộ ước lượng hậu nghiệm cực đại (maximum posterior estimator). Nó được sử dụng rộng rãi trong nhiều mô hình đề xuất hiện nay. Dữ liệu huấn luyện cho BPR bao gồm cả các cặp tích cực lẫn tiêu cực (các giá trị còn thiếu). Nó giả sử rằng người dùng ưa thích sản phẩm tích cực hơn tất cả các sản phẩm chưa biết.

Trong công thức, dữ liệu huấn luyện được xây dựng bằng tuple dưới dạng \((u, i, j)\), tức biểu diễn rằng người dùng \(u\) ưa thích sản phẩm \(i\) hơn sản phẩm \(j\). Công thức Bayes trong BPR được cho dưới đây nhắm tới việc cực đại hóa xác suất hậu nghiệm:

(16.5.1)\[p(\Theta \mid >_u ) \propto p(>_u \mid \Theta) p(\Theta)\]

trong đó \(\Theta\) biểu diễn các tham số của một mô hình đề xuất bất kỳ, \(>_u\) biểu diễn tổng xếp hạng mong muốn cá nhân hóa của tất cả sản phẩm cho người dùng \(u\). Ta có thể xây dựng công thức của bộ ước lượng hậu nghiệm cực đại để rút ra tiêu chuẩn tối ưu khái quát của tác vụ cá nhân hóa xếp hạng.

(16.5.2)\[\begin{split}\begin{aligned} \text{BPR-OPT} : &= \ln p(\Theta \mid >_u) \\ & \propto \ln p(>_u \mid \Theta) p(\Theta) \\ &= \ln \prod_{(u, i, j \in D)} \sigma(\hat{y}_{ui} - \hat{y}_{uj}) p(\Theta) \\ &= \sum_{(u, i, j \in D)} \ln \sigma(\hat{y}_{ui} - \hat{y}_{uj}) + \ln p(\Theta) \\ &= \sum_{(u, i, j \in D)} \ln \sigma(\hat{y}_{ui} - \hat{y}_{uj}) - \lambda_\Theta \|\Theta \|^2 \end{aligned}\end{split}\]

trong đó \(D := \{(u, i, j) \mid i \in I^+_u \wedge j \in I \backslash I^+_u \}\) là tập huấn luyện, với \(I^+_u\) ký hiệu cho sản phẩm mà người dùng \(u\) thích, \(I\) ký hiệu cho toàn bộ sản phẩm, và \(I \backslash I^+_u\) là toàn bộ sản phẩm khác ngoại trừ các sản phẩm mà người dùng đó ưa thích. \(\hat{y}_{ui}\)\(\hat{y}_{uj}\) lần lượt là điểm số dự đoán của người dùng \(u\) đối với sản phẩm \(i\)\(j\). Tiên nghiệm \(p(\Theta)\) là một phân phối chuẩn với kỳ vọng bằng không và ma trận phương sai - hiệp phương sai \(\Sigma_\Theta\). Ở đây ta coi \(\Sigma_\Theta = \lambda_\Theta I\).

../_images/rec-ranking.svg

Fig. 16.5.1 Minh họa Cá nhân hóa Xếp hạng Bayes.

Ta sẽ lập trình lớp cơ sở mxnet.gluon.loss.Loss và ghi đè phương thức forward để xây dựng hàm mất mát cá nhân hóa xếp hạng Bayes. Ta bắt đầu bằng việc nhập lớp Loss và mô-đun np.

from mxnet import gluon, np, npx
npx.set_np()

Lập trình cho mất mát BPR như sau.

#@save
class BPRLoss(gluon.loss.Loss):
    def __init__(self, weight=None, batch_axis=0, **kwargs):
        super(BPRLoss, self).__init__(weight=None, batch_axis=0, **kwargs)

    def forward(self, positive, negative):
        distances = positive - negative
        loss = - np.sum(np.log(npx.sigmoid(distances)), 0, keepdims=True)
        return loss

16.5.2. Mất mát Hinge và Cách lập trình

Mất mát Hinge trong tác vụ xếp hạng có sự khác biệt so với mất mát Hinge được cung cấp trong thư viện gluon thường sử dụng trong các bộ phân loại như SVM. Mất mát được sử dụng cho tác vụ xếp hạng trong hệ thống đề xuất có dạng như sau.

(16.5.3)\[\sum_{(u, i, j \in D)} \max( m - \hat{y}_{ui} + \hat{y}_{uj}, 0)\]

trong đó \(m\) là khoảng cách biên an toàn. Mất mát này nhằm mục đích đẩy các sản phẩm tiêu cực ra xa khỏi các sản phẩm tích cực. Giống như BPR, nó nhằm tối ưu hóa khoảng cách thích đáng giữa mẫu dương và mẫu âm thay vì đầu ra tuyệt đối, khiến cho nó phù hợp với hệ thống đề xuất.

#@save
class HingeLossbRec(gluon.loss.Loss):
    def __init__(self, weight=None, batch_axis=0, **kwargs):
        super(HingeLossbRec, self).__init__(weight=None, batch_axis=0,
                                            **kwargs)

    def forward(self, positive, negative, margin=1):
        distances = positive - negative
        loss = np.sum(np.maximum(- distances + margin, 0))
        return loss

Hai loại mất mát này có thể thay thế lẫn nhau cho tác vụ cá nhân hóa xếp hạng trong hệ thống đề xuất.

16.5.3. Tóm tắt

  • Có ba loại mất mát xếp hạng hiện có trong tác vụ cá nhân hóa xếp hạng trong hệ thống đề xuất, bao gồm các phương pháp theo từng điểm, theo từng cặp và theo danh sách.
  • Hai loại mất mát theo cặp: mất mát cá nhân hóa xếp hạng Bayes và mất mát Hinge, có thể được sử dụng thay thế lẫn nhau.

16.5.4. Bài tập

  • Liệu có biến thể nào khác của mất mát BPR và mất mát Hinge không?
  • Bạn có thể tìm mô hình đề xuất nào khác sử dụng mất mát BPR hoặc mất mát Hinge không?

16.5.5. Thảo luận

16.5.6. Những người thực hiện

Bản dịch trong trang này được thực hiện bởi:

  • Đoàn Võ Duy Thanh
  • Đỗ Trường Giang
  • Phạm Hồng Vinh
  • Phạm Minh Đức
  • Nguyễn Lê Quang Nhật
  • Lê Khắc Hồng Phúc

Cập nhật lần cuối: 06/10/2020. (Cập nhật lần cuối từ nội dung gốc: 30/06/2020)