entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

BigQueryを使ったレコメンド改善事例とその仕組み

pixiv運営本部、おすすめ改善チームのogaです。pixiv上で最近行った、イラストのレコメンド改善事例とその技術的な部分について紹介します。

概要

今回の取り組みでは、ブラウザ版pixivのトップページなどに表示しているイラストの「おすすめ作品」機能に対して、「最近投稿された作品を優先してレコメンドする」という変更を加えました。

この施策は以下の2点を期待して実施したものです。

  • 作品を閲覧しているユーザーが、投稿されたばかりのイラストをより多く見られるようになること
  • 作品を投稿しているユーザーが、最近投稿した作品への反応をより多くもらえるようになること

背景としては、ユーザーがトップページを訪問する際、同じ作品が何度も表示されているという状況がありました。

ある日におすすめ作品として表示されたイラストの、投稿時期別の割合を下に載せました。何ヶ月も前に投稿されたイラストが7割を占めていることがわかります。

新しく投稿された作品を優先的にレコメンドすることで、ユーザーの元により多くの作品が届くようにすることを狙っての施策でした。

レコメンドの仕組み

今回はBigQueryを使った推薦の仕組みを実装しました。

BigQueryはGoogleによるフルマネージドなデータウェアハウスのサービスで、社内では主にデータ分析用途で使われています。今回はこれを分析だけでなくイラストのレコメンドのスコア計算に使いました。

BigQueryを使った理由

社内では以前から使われているレコメンドの仕組みがあるのですが、サーバーとして常に起動しておく必要があったり、デプロイの手間があったり短い期間で試行錯誤するのにはあまり向いていないという問題がありました。

BigQueryなら計算に使うSQLを書き換えるだけで簡単にレコメンドの内容を変更できますし、データの読み込みにかかる時間や計算による負荷をあまり気にせずにレコメンドの計算ができるため試行錯誤しやすい、といった利点があります。もともとユーザーの行動ログをBigQueryに載せてあったので、それらを扱いやすい状況であったことも大きな理由の一つでした。

処理の流れ

具体的な処理の流れは以下の通りです。

  1. ユーザーの行動からイラストの類似度を計算する
  2. 結果をBigQueryからダウンロードしてpixivのDBに書き込む
  3. ユーザーが最近ブックマークしたイラストに対して推薦があれば表示する

1. ユーザーの行動からイラストの類似度を計算する

ユーザーが行ったイラストのブックマークのデータを使って、アイテムベースの協調フィルタリングをします。

イラストごとにユーザーのブックマークの情報からベクトルを作って、イラスト間でベクトルの類似度のスコアを計算します。この時にブックマークしたかどうかだけでなく作品につけられているタグの情報も使い、ブックマークしているユーザーと作品のタグのペアの情報が似ているものがレコメンドとして出てくるようにしました。

今回の施策では推薦元が全期間のイラスト、推薦先が直近1週間のイラストに絞ることで最近のイラスト優先のレコメンドを実現しました。この結果を既存のレコメンドと混ぜることで最近の作品がおすすめされやすくします。

おすすめのスコア計算としては、単純に共起頻度を使ったりコサイン類似度を計算したりと、いくつかの方法を試しました。

疑似コードを載せておきます。

2. 結果をBigQueryからダウンロードしてpixivのDBに書き込む

結果の行数が多いので、BigQueryから直接ダウンロードはできません。一旦Google Cloud Storageに書き出す必要があります。

Google Cloud Storageにエクスポートする際はサイズ制限を考慮し、複数のファイルに分割して出力する必要がありました。エクスポート先のファイル名に*を指定すると分割して連番で置き換えて出してくれるので便利です。

この後ダウンロードしてきた計算結果をMySQLに挿入します。現在は毎回全データを更新しているため、BigQueryでのクエリ実行時間よりも長い時間がかかってしまっています。

3. ユーザーが最近ブックマークしたイラストに対して推薦があれば表示する

ユーザーがおすすめを表示するページにアクセスしたときに、最近のブックマークに対するおすすめがあれば表示します。

同じような作品だけを表示してもユーザーにはクリックされづらくなくなるのか、単純にスコアの上位だけを表示するのではなく候補を多めに取ってきてランダムに表示したほうが効果が良かったです。

施策の結果

今回の変更の効果を調べるため、ユーザーを「最近投稿されたイラストを優先したレコメンドを表示するグループ」と「既存のままのレコメンドを表示するグループ」の2つに分けてクリック数などの変化を見ました。

結果としては意図通り、対象にした最近のイラストが表示される割合が増えました。

クリック数に悪影響が出る心配もありましたが、クリック数も上がっていました。

まとめ

  • BigQueryを使ったレコメンドの仕組みを導入しました
    • BigQueryにデータが集約されているので、SQLを書くだけで簡単に計算できました。
    • SQLの実行結果をDBに入れてサービス側から参照するだけのシンプルな仕組みになっています。
    • 実行が数分で終わるので、手元でいろいろなスコア付けやフィルタリングの条件を試せるようになりました。
  • 最近のイラストを優先しておすすめすることでユーザーのクリック数を増加させることができました
    • 単純におすすめされるイラストのバリエーションが増えたことによる効果もあるとは思いますが、より新鮮な作品をおすすめするという変更で、よりユーザーの行動を活発にできたことはよかったと思います。

宣伝

ピクシブではデータをWebサービスに生かすエンジニアを募集しています。

募集要項 / Wantedly

レコメンド改善に興味のあるエンジニアの方は、こちらからご応募ください! https://www.wantedly.com/projects/209847

20191219020937
oga
pixivでデータ周りの仕事にエンジニアとして関わっています。最近はBigQueryやレコメンド、機械学習に興味があります。SQL大好き!