Skip to content

協調フィルタリングとは?仕組み・種類・実務の注意点

**協調フィルタリング(Collaborative Filtering, CF)**は、本番のレコメンド エンジンの大半を支えるアルゴリズム系統です。前提はこうです。「あるユーザーが 何を好むかは、他のユーザーたちの行動から予測できる」。アイテム自体の情報 — 商品説明もカテゴリ体系もユーザープロフィールも — 一切使わず、「誰が何に 接触したか」の行動ログだけで動きます。

このミニマリズムこそ、CF が最初に試すべき手法である理由です。EC サイトも メディアもアプリも、行動データならすでに持っています。そしてそのデータの 上では、よく調整された古典的 CF は今なお驚くほど強力です。このページでは、 主要な CF 手法の仕組み、実務で暗黙的フィードバックが主役になる理由、 そして計画段階で織り込むべき落とし穴 — コールドスタート、スパース性、 人気バイアス — を解説します。

先に全体像(レコメンダーとは何か、データ → 学習 → 配信のパイプライン)を 押さえたい場合は レコメンドエンジンとはから どうぞ。

インタラクション行列

すべての CF 手法は同じ心象風景から出発します。行がユーザー、列がアイテムの 巨大な行列です。セルにはそのユーザーのそのアイテムへのフィードバックが 入ります — そしてセルのほとんどは空です。各ユーザーが接触するのはカタログの ごく一部だからです。CF の仕事は、埋まっているセルのパターンを手がかりに、 「空のセルのうちどこに高い興味が隠れているか」を予測することです。

セルに何が入るかで、フィードバックは 2 つの体制に分かれます。

  • 明示的フィードバック — ユーザーが選好を表明したもの。星 4 つ、低評価 など。値には段階があり「嫌い」も表現できますが、カバレッジは貧弱です。 評価してくれるのはごく一部のユーザーで、しかも偏ったサンプルです。
  • 暗黙的フィードバック — 行動から観測されるもの。購買、クリック、再生、 カート追加。負例がなく(買われなかった商品は「嫌い」かもしれないし、単に 「見られていない」だけかもしれない)、段階もなく、「あったか、なかったか」 だけ。その代わり、ほぼすべてのアクティブユーザーについて大量にあります。

研究の世界は明示的な評価値とともに発展しましたが、本番システムは圧倒的に 暗黙的フィードバックで動いています。企業が実際に持っているのは購買や クリックのログだからです。これは数学も変えます。評価値を予測するのでは なく、観測されたペアを正例、それ以外を「負例」ではなく「未観測」として 扱い、ユーザーが接触しそうな確信度でアイテムをランキングします。評価値用に 設計されたアルゴリズムはこの体制にうまく移植できないことが多く、だからこそ 暗黙的フィードバック専用のモデルが存在します。

近傍法: ユーザーベースとアイテムベース

最初期の、そして最も直感的な CF 手法は、行列の行同士・列同士の類似度を 直接使います。

ユーザーベース CF は、行動履歴の重なりが大きいユーザー — いわば「趣味の 隣人」— を見つけ、隣人が持っていて自分がまだ持っていないものを勧めます。 説明はしやすいのですが、ユーザーの行はセッションごとに変わるため近傍が 不安定で、数百万ユーザー規模でのユーザー間類似度計算は高コストです。

アイテムベース CF は軸を反転します。「ほぼ同じユーザー集合が両方に接触 しているなら、その 2 つのアイテムは似ている」。リクエスト時にはユーザーの 履歴にあるアイテムを起点に、それらと類似度の高いアイテムを勧めます。 アイテム間類似度はユーザー間よりはるかに安定していて、オフラインで事前計算 でき、「この商品を買った人はこんな商品も」ウィジェットをそのまま実現します — あれは種アイテム 1 つに対するアイテムベース CF です。類似度は通常、 インタラクション列同士のコサイン類似度で、超人気アイテムの影響を抑える 重み付けを加えることもあります。RP3beta のようなグラフ / ランダムウォーク 系の変種は同じ発想の発展形で、共購買データに強い手法です。

行列分解

近傍法は生のインタラクションベクトルを比較しますが、**行列分解(Matrix Factorization, MF)**は一歩進んで、コンパクトな表現を学習します。各ユーザー と各アイテムに、たとえば 64 個の数値からなる短い潜在因子ベクトルを割り当て、 ユーザーベクトルとアイテムベクトルの内積がそのユーザーの興味の強さを近似 するようにします。因子は人手で設計するのではなくデータから浮かび上がる もので、価格感度やジャンルのような解釈可能な次元に対応することもよく あります。

暗黙的フィードバックでの定番は iALS(implicit Alternating Least Squares)です。観測されたインタラクションを確信度付きの正例、未観測ペアを 弱い負例として扱い、ユーザー因子とアイテム因子を交互に解いて収束させます。 ランキング損失を使う BPR(Bayesian Personalized Ranking)系は、「観測 されたアイテムは未観測より上位に来るべき」というペアワイズな順序を直接最適化 します。打ち切り SVD や(Dense)SLIM 系の線形モデルも、古典的な道具箱の 一角です。

MF は低次元の因子にパターンを「圧縮」させるため、共起の暗記に頼る近傍法より 疎なデータでの汎化に優れます。代償は解釈のしにくさと、無視できない ハイパーパラメータ面 — 因子数、正則化、確信度の重み — で、これらはランキング 品質を実際に左右します。まともなパイプラインが既定値のコピーではなく データセットごとのチューニングを行うのはこのためです。

実務の落とし穴

CF の弱点はよく知られています。最初から計画に織り込みましょう。

  • ユーザーのコールドスタート。 新規ユーザーには履歴がなく、純粋な CF は 手がかりを持ちません。標準的なフォールバックは人気アイテム、または 「いま見ているアイテム」を種にしたアイテム間レコメンド(履歴が一切不要) です。
  • アイテムのコールドスタート。 誰も接触していない新着アイテムは CF では 推薦できません。インタラクションが貯まるまでは、コンテンツベース手法や 手動配置で新着を露出させるのが自然なハイブリッド構成です。
  • スパース性。 ユーザーとアイテムが数百万規模なら、行列は 99% 以上 空です。極端に薄いデータではシンプルなモデルが有利になり、アイテム KNN や 人気順ベースラインが MF に勝つこともあります。これは経験的な問いです — 思い込みではなく、自分のデータで複数アルゴリズムを評価してください。
  • 人気バイアス。 行動データは人気アイテムに支配されており、素朴な CF は それを増幅して全員にベストセラーを勧めがちです。対策には類似度の減衰 (RP3beta の β パラメータはまさにこのためにあります)と、人気順ベース ラインとの常時比較があります。チューニングした CF が「売れ筋を出すだけ」に 勝てないなら、個人化はまだ元を取れていません。
  • フィードバックループ。 レコメンドがクリックを生み始めると、明日の学習 データは今日のモデルを反映します。非個人化の枠や探索をある程度残し、 オフライン指標だけでなく A/B テストで測定しましょう。

Recotem で実践する協調フィルタリング

ここまでの内容は、そのまま Recotem がパッケージしている領域 です。Recotem は irspack の上に構築 されています。irspack は C++/Eigen による高速な暗黙的フィードバック 協調フィルタリングのライブラリで、購買ログやクリックログはまさにこの体制の データです。レシピに試したい CF アルゴリズムを列挙すると、内蔵の Optuna 探索がそれぞれをチューニングし、オフラインのランキング指標で最良のものを 残します。

yaml
name: purchase_log
source:
  type: csv
  path: ./interactions.csv
schema:
  user_column: user_id
  item_column: item_id
training:
  algorithms: [IALS, CosineKNN, RP3beta, TopPop]
  metric: ndcg
  n_trials: 40
output:
  path: ./artifacts/purchase_log.recotem

アルゴリズム名はこのページの内容と一対一に対応します。IALS は暗黙的 フィードバック向けの行列分解、CosineKNN はアイテムベースの近傍法 CF、 RP3beta は人気減衰付きのグラフ系変種、TopPop はすべての実験に含める べき人気順ベースラインです。DenseSLIMTruncatedSVDBPRFM(BPR 損失の 行列分解)も利用できます — 全リストは レシピリファレンスを参照してください。 コールドスタートのフォールバックは配信 API 側にも組み込まれています。未知の ユーザーには明示的な 404 UNKNOWN_USER が返るのでアプリケーション側で フォールバックでき、 :recommend-related は匿名訪問者にも機能するアイテム間レコメンドを提供します。

次のステップ