行列分解は単純なエンベディング モデルです。与えられた フィードバック マトリックス A 。ここで は ユーザー(またはクエリ)の数、 アイテムの数、 モデルは次のことを学習します。
- ユーザー エンベディング マトリックス ここで、行 i はユーザー i のエンベディングです。
- アイテムのエンベディング マトリックス ここで、行 j はアイテム j のエンベディングです。
エンべディングは、積が 適切に近似できると判断しました。ここで、 エントリ は単なるドット積 ユーザーのエンベディング に近づけたいアイテム 。
目的関数の選択
直感的な目的関数の一つに、二乗距離があります。そのためには、 観測されたエントリのすべてのペアについて、誤差の二乗和を最小化します。
この目的関数では、観測されたペア (i, j) のみに対する合計を、 フィードバック マトリックス内のゼロ以外の値に対して行われます。ただし、 すべての値が 1 の行列であれば 損失を最小限に抑え、効果的なレコメンデーションができないモデルを生成 一般化がうまくいきません
観測されていない値を 0 として扱い、すべての値を 表します。これに対応するのは、 フロベニウスの 2 乗 その近似値との間の距離 :
この二次問題は、次を使用して解くことができます。 行列の特異値分解(SVD)。ただし、 SVD も優れたソリューションではありません 非常にスパースである可能性があります。 たとえば、すべての動画を 各ユーザーが再生した全動画と YouTube の視聴回数を比べます。 解 (モデルの近似 がゼロに近くなり、その結果、 一般化パフォーマンスの点で優れています。
一方、加重行列分解では、目的を分解します。 次の 2 つの合計に代入されます。
- 観測されたエントリの合計。
- モニタリングされていないエントリの合計(ゼロとして処理されます)。
ここで、 は 2 つの用語に重み付けを行うハイパーパラメータ どちらかに偏ることがないようにしましょう このハイパーパラメータを調整することが非常に重要です。
ここで、 はクエリ i とアイテム j の頻度の関数です。
目的関数を最小化する
目的関数を最小化する一般的なアルゴリズムには次のものがあります。
確率的勾配降下法 (SGD) 損失関数を最小限に抑えるための汎用的な方法です。
重み付き交互最小二乗(WALS)は、これに特化しています。 学習します
2 つの行列 U と V のそれぞれにおいて、目的は二次関数です( 問題は一緒に凸部ではありません)。WALS は エンベディングをランダムにしてから、以下を交互に繰り返します。
- を修正し、 解決しています。
- を修正し、 解決しています。
各段階は(線形系の解法によって)正確に解くことができ、 配布できます。この手法では、各ステップが収束することが保証されます。 確実に損失が減少します
SGD と WALS の比較
SGD と WALS にはメリットとデメリットがあります。 比較については、以下の情報をご覧ください。
SGD
非常に柔軟であり、他の損失関数を使用できる 使用できます。
並列化可能。
低速 - 収束が早くありません。
確認できないエントリの処理が困難(必要に応じて 負サンプリングまたは重力を使用します)。
WALS
損失二乗のみに依存します。
並列化可能。
SGD よりも速く収束する。
監視されていないエントリの処理が容易。