💨

レコメンドシステム——行列分解(Matrix Factorization )

2023/09/25に公開

シーリズの目次

レコメンドシステムのシーリズをここにまとめています。
https://zenn.dev/datasciencekun/articles/dc0f61c0ca7f8d

無料相談コース(未経験OK)

  • 機械学習やレコメンド分野に悩んでいる人
  • 機械学習やレコメンド分野に携わりたい人

ぜひ下記の無料コースへお申し込みください!
機械学習エンジニア、レコメンドエンジニアになるためのサポート

行列分解とは?

行列分解の紹介

箇人化の推薦でマトリックスの分解のモデルを使用するのは明らかにUserCF、ItemCFなどの伝統的な隣接の共同のフィルタリングの方法よりも優れています。これはまた、マトリックスの分解が現在の箇人化の推薦の研究分野の主流のモデルになっています。

行列分解とは、直観的に言うと、元の大行列を、二つの小行列の積に近似分解することですが、実際の推奨計算では大行列ではなく、分解した二つの小行列を使います。通り行列の原理を分解し、私たちは、もともと𝑚×𝑛発見の大行列分解𝑚×𝑘と𝑘×𝑛二つの小さな行列、ここにあまり出一次元ベクトルk,隠れ係数ベクトルです(Latent Factor Vector)。

マトリクス分解によるレコメンデーションアルゴリズムの中心となる仮説は、ユーザーやモノを隠語的意味(隠れ変数)で表現することであり、それらの積の関係が元の要素となります。この仮説が成り立つのは、実際のインタラクションデータは、ユーザーとモノの一部に共通の特徴を表し、モノでは属性特徴、ユーザーでは選好特徴として現れる一連の隠れた変数の影響を受けていると考えられるからです。それぞれの次元にもラベルの名前が決まっていないので「隠れ変数」と呼ばれています。

マトリクスを分解して得られた2つの暗黙変数を含む小マトリクスは、1つはユーザーの暗黙的な特徴を表し、1つはアイテムの暗黙的な特徴を表します。マトリクスの要素値は、対応するユーザーやアイテムがそれぞれの暗黙因子にどれだけ合致するかを表します。

映画を例にとると、映画にはいくつかの隠れた要素があるかもしれません。俳優、ジャンル、テーマ、時代…わかりやすくするために、隠し因子の数kは2で、コメディーとアクションの2つのジャンルを表しているとします。マトリクスを分解した2つの小マトリクスの分布は、2つのジャンルに対する映画の適合度と、2つのジャンルに対するユーザーの選好度を表しています。下記のように:

一般的に、暗黙の係数の数kは、ユーザーと映画の数よりもはるかに少なく選択されます。大行列を2つの小行列に分解することは、実際には、ユーザーと映画のk次元暗黙の係数空間上のマッピング((Dimension Reduction))。同時にユーザーと映画の表現をk次元空間上の分布位置に変換すると、映画とユーザーの距離が近いほどユーザーがその映画を好きになる可能性が高いことを示し、数値的には各ファクターの適合度の正負が一致することを示します。

行列分解の理路

機械学習の観点からマトリックスの分解を理解すると、私たちはすでに映画のスコアリングの予測は、実際には、元の大マトリックスは必ず間引きされていることを知っています。つまり、ある部分はスコアリングされ、ある部分は過度に評価されていません。そうでなければ、予測と推奨の必要はありません。この二つの小行列の積によって、大行列のスコアリングされていない箇所を補完するのです。

機械学習モデルでは最適な2つの小行列をどうやって作るかが問題になります大行列の一部にはスコアリングがありますから、大行列のスコアリングがある位置(実際の値)と、二つの小行列を掛け合わせたそれぞれの位置のスコアリング(予測値)との誤差が最小であればよいのですが、それは平均二乗誤差損失であり、それがモデルの目指す関数です。

このような暗黙的な因子を用いた機械学習モデルは一般に「隠語意味モデル」(LFM: Latent Factor Model)と呼ばれ、暗黙的な意味論を見つけるために最初にテキストの世界で考案されたため、隠語意味論とも呼ばれます。マトリクス分解は隠語分解モデルの代表で、多くの場所では、マトリクス分解のモデルをそのまま使っています。推薦アルゴリズムにおける隠語意味モデルの利点は、ユーザーとモノの情報の暗黙的な構造をモデル化することで、より深いユーザーとモノの関係を掘り起こすことができます。

行列分解の解析

特異値分解SVD(Singular Value Decomposition)

マトリクス分解というと、まず思い浮かぶのが特異値分解SVDです。理論的には、SVDは直接的に推奨することもできます。user-itemスコア行列AをSVD分解し、部分的に大きな特異値を選択することで同時に次元を下げることができます:

ここでkは行列Aの大きな部分特異値の数で、一般的にはユーザー数やモノの数よりもはるかに少ないものです。

予測iのユーザーに対する第jの物品の採点𝑎𝑖𝑗、计算は必要なだけ𝑢𝑇𝑖のシグマ𝑣𝑗すればいい。この方法では、スコアリングされていない箇所をすべて予測スコアリングし、最も高いスコアリングに対応したアイテムをいくつか見つけてユーザーに推薦することができます。

考え方はシンプルですが、特異値分解は、直接的に推奨に使うには問題が多いです。

  • SVD分解ではマトリクスが稠密であることが求められますが、現実のスコアリングのマトリクスは間引きが多く、空白が多く、そのままSVD分解を使うことはできません。SVDを使うためには、スコアリングのマトリクスの欠落値を、グローバル平均やユーザーアイテム平均で補って補完したマトリクスが必要です。次にSVDで分解して次元を下げます。パディング自体には多くの問題があります。一つはデータ量が大幅に増加し、アルゴリズムの複雑さが増してしまうことです。もう1つは、単純で乱暴なデータフィリングでは、データに歪みが生じやすいことです。
  • svd分解さの复雑さが高いと仮定し、一𝑚×𝑛の行列を分解さ時間の复雑さを𝑂(𝑛2∗𝑚+𝑛∗𝑚2)、実は𝑂𝑛(3)。mやnが小さい場合には、まだ無理はありませんが、レコメンデーションシーンの膨大なデータでは、mやnの値が大きくなることが多く、百万レベルのデータになることもあり、その際にSVD分解を行うのは計算コストが大きくなります。

従来のSVDをレコメンデーションシステムに直接適用することはできませんので、別のアプローチが必要です。

勾配降下法SGD(Stochastic Gradient Descent)

実例で紹介したいと思います。

次のようにR(5,4)の採点マトリックスがあります。(「-」はユーザーが採点していないことを示します。)
ここで行列R(n,m)はn行とm列で、nはuserの数、mはitemの数です。

現在のマトリクスR(5,4)からどのようにスコアリングされていない商品をどのようにスコアリングするのか(スコアが0のユーザーのスコアをどのようにして得るのか)を予測しますか?

行列RはPとQの積として近似的に表すことができます:R(n,m)≈ P(n,K)*Q(K,m)

マトリクス分解では、元のスコアリングのマトリクスを使いR_{m×n}二つの行列に分解します。P_{m×k}Q_{k×n} の積

になります。

行列P(n,K)はn個のuserとK個の特徴の間の関係行列を表します。K個の特徴は中間変数です。行列Q(K,m)の転置は行列Q(m,K)です。行列Q(m,K)はm個のitemとK個の特徴の間の関係行列です。交差検証の手法を用いて最適なK値を求めることができます。近似R(n,m)を得るためには行列Pと行列Qを求めなければなりません。

(Plus:オーバーフィットを防ぐため,正則化項を追加します)
【正則化損失関数を加えて解きます】

  1. まずは
  2. 一般的に解を求める過程で、より良い一般化能力を得るために、損失関数の中に正則項を入れてパラメータを制約します。L2関数を入れて:

    つまり
  3. 勾配降下法により、補正されたp成分およびq成分が得られます。:
  • 損失関数の負勾配を求めます:
  • 逆勾配に応じて変数が更新されます:
  1. アルゴリズムが最終的に収束するまで繰り返します(sum(e^2) <=閾値)
    【予測】以上のプロセスを使って、マトリクスが得られます



    これにより、商品jに対するユーザーiの評価を行うことができます。

まとめ

メリット

マトリクス分解は、高次元user-itemスコアのマトリクスを2つの低次元のユーザーとモノのマトリクスにマッピングすることで、データの間引き問題を解決します。マトリクス分解を使うと、次のようなメリットがあります:

  1. プログラミングが比較的容易で、ランダム勾配降下法を逐次反復すればモデルを訓練できます。より低い時間と空間の復雑さ、高次次元のマトリックスは2つの低次元のマトリックスのために記憶空間を節約して、訓練過程は比較的時間がかかりますが、オフラインで完了することができます;スコアリング予測はオンライン計算が一般的ですが、オフライントレーニングで得られたパラメータをそのまま使って、リアルタイムでレコメンドすることができます。
  2. 予測の精度は比較的高く、フィールドベースの協働フィルタリングやコンテンツフィルタリングなどの手法よりも精度が高いとされています。
  3. 非常に良い拡張性、ユーザーの特徴ベクトルとアイテムの特徴ベクトルに他の要素の特徴を追加するのに便利です。

デメリット

  1. モデルのトレーニングは時間がかかります。
  2. 推薦結果はうまく説明できません。

コード実例

https://github.com/datasciencekun/starmie/blob/master/recall/matrix_factorization_demo.ipynb

Discussion