🌊

レコメンドシステム—— FM(Factorization Machine)の応用(リコール)

2023/09/27に公開

レコメンドシステムの紹介

レコメンドシステムには通常、いくつかの段階があります。

まず、ユーザーに提案されるアイテムを1,000個以下に絞り込む「リコール」があります。

次に、「ランキング」で、少数のアイテムを正確にソートするために複雑なモデルを使用できます。

最後に、「再ランキング」では、精緻なソート結果が得られても、通常はユーザーに直接表示されず、既読のアイテムの削除、多様性の確保、広告の組み込みなど、さまざまなビジネス戦略が追加されることがあります。その後、最終的な推薦結果が形成され、ユーザーに表示されます。

上記のオンラインレコメンドの2つの段階のタスク分割から、リコール段階は候補セットの計算が非常に多いため、速度を確保するために単純なモデルを使用し、少ない特徴を使用して一般化能力を確保し、ユーザーの興味をこの段階でできるだけ取り戻す必要があることがわかります。

一方、ランキング段階の主要な目標は精度であり、処理されるアイテムのデータ量が少ないため、できるだけ多くの特徴を使用し、比較的複雑なモデルを採用し、精度を最優先とすることができます。

FM(Factor Machines)モデルは、精度、解釈性、迅速な開発展開の特性を兼ね備えたモデルであり、リコール段階で広く使用されています。

FM公式の復習

まずFMの式を復習しましょう:

FM:y=w_0+\sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j>x_ix_j

IDや0-1特徴(例:ユーザーが男性かどうか、ユーザーが機械学習のプロファイルを持っているかどうかなど)がオンラインで使用される場合、公式を以下のように変更できます:

FM:y=w_0+\sum_{i=1}^{n}w_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j>

計算の際には、特徴値が1の特徴だけを取って上記の操作を行います。

公式の推理

FMの公式は理解しましたが、リコールはどうやって行うのでしょうか?

よくあるU2iリコール、すべての候補物質の材料のembeddingを計算してオフラインでインデックスを立てて、リアルタイムでuserのembeddingを計算して、それからuserのembeddingを使用してインデックス内で検索を行います(ベクトルデータベースを使用することができます)、100万単位の物質候補をミリ秒単位で見つけ出すことができます。

以下では、オンラインリアルタイム(ミリ秒単位)リコールの仕組みについて詳しく見ていきます。

FMの特徴は3つに分類されます:

  1. ユーザー側の特徴、消費履歴、ユーザーの基本情報などuserクラスの特徴
  2. アイテム側の特徴、一般的には、物品の内容理解の特徴、およびいくつかの消費データの特徴
  3. コンテキスト情報、(時間が発生した時、場所、など)

userによってitemを選別するので、コンテキストの特徴をユーザ側に配置することもできます。つまり:

v_i\{i=0......n\}=[v_u\{i=1.....m\},v_k\{k=m+1....n\}]

上記のFM式の特徴を2つに分割します。1つはユーザ側の特徴であり、もう1つはアイテム側の特徴です。ユーザー側の特徴をu_i、アイテム側の特徴をv_iとし、重みww_1w_2に分割すると、上の式はこうなります。

FM:y=w_0+\sum w1+\sum w2+\sum\sum<u_i,u_j>+\sum\sum<v_i,v_j>+\sum\sum<u_i,v_j>

w_0を除いて上記はユーザ特徴ウエイト、item特徴ウエイト、ユーザ内特徴交差、item内特徴交差、およびユーザ特徴とitem特徴の相互交差を表します。

オンラインでのリコール

リコールのシナリオでは、ユーザーに対してアイテムをリコールするため、すべてのアイテムに対して、ユーザーの特徴のウエイトとw_0、およびユーザー内の特徴の相互交差はすべて同じです。したがって、私たちが比較する必要があるのは:

ユーザーとitemのマッチングスコア=itemの一次ウエイト+item特徴内の交差+itemとユーザの特徴交差

注意:上記の公式の\sum\sum<u_i,v_j><\sum u_i, \sum v_j>になり、ユーザー側の全ての特徴ベクトルを足してitem側の全ての特徴ベクトルを足してdot積にしたのと同じです。
このように:(a+b+c)*(x+y+z)=ax+ay+az+bx+by+bz+cx+cy+cz

これで分かりますがユーザーのitemマッチングスコアは:

itemの一次ウエイト+item特徴内の交差+dot<itemベクトルの和,ユーザベクトルの和>

簡略化すれば:
マッチングスコア=item侧のスコア+dot<itemベクトルの和,ユーザベクトルの和>

そうすると、一般的なembeddingと一致させます。そして:

E_{user}=[1,ユーザベクトルの和]

E_{item}=[item侧のスコア,itemベクトルの和]

上記の式により、オフラインですべてのitemのembeddingを計算してインデックスを立て、オンラインでユーザーのembeddingを計算してそのままベクトルインデックスリコールを行うことができる。

上記が、FMを使用してembeddingベースのリコールを行う方法です。

Discussion