【推薦システム】協調フィルタリングと深層学習によるレコメンドエンジンの基礎

プログラミング

Amazonの「この商品を買った人はこんな商品も買っています」、Netflixの「あなたへのおすすめ」。これらを支える「推薦システム(Recommender System)」は、現代のITビジネスにおいて最もダイレクトに売上を左右する機械学習アルゴリズムです。

推薦システムの大黒柱である古典的な「協調フィルタリング(Collaborative Filtering)」の理論から、最新のDeep Learningを活用した手法への進化について解説します。

1. 協調フィルタリング:行列分解(Matrix Factorization)のマジック

協調フィルタリングは「ユーザーがどのアイテムに何点の評価をつけたか」という巨大な行列(User-Item Matrix)から推薦を導きます。
しかし、現実のサービスでは「全ユーザーが全商品を評価する」ことはありえず、行列の99%以上が空っぽ(スパース:疎)になります。この空っぽのマス目の潜在的な評価値を高い精度で埋める魔法の数学的手法が、「SVD(特異値分解)」などに代表される行列分解(Matrix Factorization)です。

import numpy as np
from scipy.sparse.linalg import svds
# ユーザー(行) × アイテム(列) の評価行列 R (ほとんどが0で欠損)
# 例としてダミーデータを用意
R = np.array([
    [5, 3, 0, 1],
    [4, 0, 0, 1],
    [1, 1, 0, 5],
    [1, 0, 0, 4],
    [0, 1, 5, 4],
])
# 行列の平均を計算して各ユーザーの平均評価を引く(正規化)
user_ratings_mean = np.mean(R, axis=1)
R_demeaned = R - user_ratings_mean.reshape(-1, 1)
# scipyのSVD関数を使って k 個の潜在特異ベクトルへ分解 (ここはk=2とする)
U, sigma, Vt = svds(R_demeaned, k=2)
sigma = np.diag(sigma)
# 分解された3つの行列を掛け合わせることで、元の行列を「欠損が埋まった状態」で復元!
all_user_predicted_ratings = np.dot(np.dot(U, sigma), Vt) + user_ratings_mean.reshape(-1, 1)
# この予測結果(all_user_predicted_ratings)から、特定のユーザーがまだ買っていない(0だった)
# 列の中で最も数値が高いアイテムをソートすれば、それが最強の「おすすめ商品」となる。

2. 深層学習を用いたレコメンドへの進化

Matrix Factorizationは強力ですが、「商品の画像」や「ユーザーの年齢層」「テキストのレビュー内容」といった様々な種類のデータ(マルチモーダル要素)を行列の計算に混ぜ込むのが苦手です。

そこで近年では、ユーザーの特徴ベクトルとアイテムの特徴ベクトルをニューラルネットワークに入力し、お互いの複雑な非線形関係をMulti-Layer Perceptron(MLP)に学習させて「購入確率」を叩き出す『Neural Collaborative Filtering (NCF)』が標準になりつつあります。PyTorchの nn.Embedding を使うことで、ユーザーIDやアイテムIDを密なベクトルとしてネットワークの入力に自然に繋ぎ込むことが可能です。

まとめ:おすすめを制する者はECを制す

レコメンドエンジンは精度の改善(ほんの数パーセントのクリック率向上)がダイレクトに数億円の売上増に直結するため、データサイエンティストが最も情熱を注ぐ分野です。まずはレコメンド特化の定番書籍などで全体像を掴むのが第一歩となります。

コメント

タイトルとURLをコピーしました