2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

tensorflow_recommendersをitem2itemに適応する場合の注意点

Last updated at Posted at 2022-01-27

※この記事はあくまで僕の備忘録であり、内容の整合性を保証するものではありません。

ユースケース

tensorflow_recommendersで、user / item間のデータで学習させた上で、Scannを使って、あるitemに近いitemを取得したい。
すなわち、tensorflow_recommendersで学習させたモデルで得たitemのembedding表現を利用して、似たアイテムを近似近傍探索で取得したいという状況である。
例えば、tensorflow_recommendersのチュートリアルのような学習をさせた状況を考える。

失敗例

チュートリアルにあるScannをそのままitem2itemに流用すると、おそらく失敗する。


scann = tfrs.layers.factorized_top_k.ScaNN(num_reordering_candidates=100)
scann.index_from_dataset(
    tf.data.Dataset.zip((lots_of_movies, lots_of_movies_embeddings))
)

_, titles = scann(model.movie_model(np.array(["42"])), k=3)

print(f"Top recommendations: {titles[0]}")

なぜなら、Scannは内積距離の最大化をする順でベクトルを取得してしまうのだが、tensorflow_recommendersで得られるembedding表現は正規化されていないからである。
なお、user-item間の場合にScannのデフォルト設定でうまくいくのは、内積がすなわち学習データのratingを表すためである。

解決策

Scannは内積距離とユークリッド距離の2つのmetricsを選択できる
そのため、item2itemでのレコメンドを取得したいのであれば、Scannを初期化する際にdistance_measure='squared_l2'を指定すれば問題なく動作すると考えられる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?