KDD2020で気になった論文を読む その2
PinnerSage: Multi-Modal User Embedding Framework for
Recommendations at Pinterest
https://arxiv.org/pdf/2007.03634.pdf
以降文中の画像は論文中からの引用になります。
概要
多様なembeddingsを介してユーザーを表現し、それを活用して高品質なレコメンドを提供するPinterest独自の推薦システムであるPinnerSageの紹介とそのロジックについて。
作り方としては、階層的なクラスタリング手法によってユーザー行動をまとまったクラスタにし、代表的なpin(テキスト付きの画像)を介して効率的かつ解釈性をもってクラスタをまとめあげる。
このロジックにより単体のEmbedding手法よりもA/Bテストで良い結果を得られた。
pinterestのレコメンドシステムと課題
下記のような多様な目的それぞれに対して異なった最適化アルゴリズムが適用される。
(a)TopPageのPinレコメンド。Feed型で無限スクロールされる
(b)3rd partyのe-commerceサイトに飛ばすショッピングのレコメンド
(c)パーソナライズ検索
(d)パーソナライズ広告
(e)パーソナライズpinボードレコメンド
など
数百万ユーザーに対して十億オーダーのアイテムからパーソナライズされたレコメンドを提供するにあたっては「いかに効率的にユーザーの複数のfacetをエンコードするか」になる。
例えば、人の関心は短期的な物もあれば長期に渡る物もあったりするので、そういった興味関心の進化に対応するためには、単一の高次元EmbeddingVectorではなく、Multi-Embeddingなモデルが必要であると考えている。
しかし、このアプローチはまだ適用が少なく、以下の課題に対しては完全には議論されていない。
- ユーザーに対してどれくらいのEmbeddingが必要か
- 何億人ものユーザーに対してどう推論を回し、embeddingsを更新するのか
- パーソナライズレコメンドを生成するためにどのようにembeddingを選択するか
- 本番環境でMulti-Embeddingsモデルが通用するか
デザイン選択
- pinのembeddinsは固定
ユーザーとアイテムのembeddingsを同時に学習するアプローチが先行研究としてあるが、この方法はモデルが複雑になり、推論に時間がかかるためリアルタイム推論には不向き。
また、複数のトピックに関する興味があった時に、それを近くにするように学習するのは実は避けたいことで、あくまでもPinの類似性を保持した状態にしたい。
- embeddingの数に制約を入れない
これにより、ユーザーの理解に制限が入るし、最悪ことなる概念を統合してしまうことで悪いレコメンドになってしまう。
これを、ユーザーの行動を階層的凝集型クラスタリングアルゴリズムを用いることで解決する。
- medoidsベースのクラスタ表現
centroidよりも外れ値に強いmedoidsを使う。また、medoidsでは対象のpinが代表になるので、pinのidをキャッシュしていればクロスユーザー、クロスアプリケーションで共有できる。
- 候補探索時のmedoidsサンプリング
コストを抑えるためと、ユーザーが過剰にアイテムを浴びせられるのを防ぐ。
- リアルタイム更新のための二本立てのアプローチ
ユーザーの直近のニーズに対応することも大事だし、同時に60-90日のアクティビティに基づいた正確なレコメンドも大事。
これを一つの仕組みで対応するのは難しいので、長期的な情報に基づいた推論はdailyのバッチ推論で対応し、オンライン推論では直近の日にちの情報に対応する。
- 近似近傍探索
任意のmodoids(pin)をクエリとして与えると、近傍のk個のpinを取得する。
アプローチ
pinのembeddingsの作成ロジックは下記のGNNベースの物を利用している。
[1806.01973] Graph Convolutional Neural Networks for Web-Scale Recommender Systems
ゴールはそれぞれのユーザーに対して複数のembeddingsを推論すること。
先行調査として、ユーザーが次にアクションするピンのembeddingsに対してどのようにユーザーのembeddingsを作ると関連した物を用意できるか検証した。
直近の履歴1件を利用するのに対して、全ての履歴から近傍を選ぶのがもっとも性能がいいが、これは全てのデータを保持するのでシステム的に負荷が高い。一方でこれを3-meansでクラスタリングしたcentroidのembeddingsものから近傍を出すと、性能はやや劣化するもののある程度いいものがだせそうかつ、実システムに適用が可能になりそうだった。
ユーザーのpinするアイテムは複数の興味からなっているので、履歴から複数のembeddingsを生成しレコメンドすることに意味がありそう。
Stepとしては
- ユーザーの直近90日のアクションを少量のクラスタにする
Ward方を用いて階層的クラスタリングを行う
- それぞれのクラスタに対して、medoidベースの表現を計算
クラスタ内のpinの中で他のpinとの距離が最小となるpinをmedoidとして選出
- ユーザーに対して、それぞれのクラスタの重要度を計算
システム概要
ANN検索
Pixieという自社の候補検索のフレームワークがある。
下記の工夫でレイテンシなどのコスト削減。
- インデックス作成方法の検証
- 候補となるindexの削減
重複削除、画像が大半をしめるような低品質のpinなど
- medoidを利用することでcacheする内容をembeddingsではなくpinのidにする
サービング
先述したとおり、長期的な情報に基づいた推論はdailyのバッチ推論で対応し、オンライン推論では直近の日にちの情報に対応する。
- バッチ推論
過去90日のアクションをもとにdailyで推論を実施。medoidとそれに付随するimportanceをlistとしてKVSに格納。
- オンライン推論
直近20個のアクションをオンラインの推論で用いる。
実験
実際にクラスタを確認すると、ユーザーの複数の興味をうまく分割できている。
また、レコメンドの結果ももっとも関心のあるであろう上位3トピックに関連するpinをレコメンドできている。
オンラインの実験により、baselineの単体のembeddingモデル(アクションを起こしたpinのembeddingを時間遅れで重み付けした平均)と比較して、アクション全体の数、並びにユーザーごとのアクションの数が増加した。
オフラインでも単一のEmbeddingsを使う手法としてLSTM、GRU、HierTCNなど、multi embeddingsとしてはクラスタリングアルゴリズム、embeddingsの手法、クラスタの重要度を決めるためのパラメータの設定などをいくつか検証している。
少なくとも単一のEmbeddingsを使うロジックよりもmulti embeddingsの手法の方が大きく性能が改善している。