📈

GENDA インターン体験記(小川):レコメンドシステムのモデル開発からオンラインクレーンゲームにおけるA/Bテスト実施

に公開

はじめに

株式会社GENDA IT戦略部インターン生の小川です。
現在、大学院の修士1年生をしております!

今年の2〜4月にかけて、短期インターン生という形で株式会社GENDA IT戦略部にデータサイエンティストとして参加させていただきました。
インターン体験記という形で、インターンでの取り組みを振り返りたいと思います!

参加のきっかけ

去年の8月から東京大学発のエンジニアサークルUTokyo Tech Clubに6期生として加わり、フルスタックのWeb開発スキルを身につける研修や、実際にアプリ開発を行うハッカソンを修了しました。その後、同サークルのインターン紹介を通じてGENDAのIT戦略部に参加させていただきました。

サークルではWeb開発を学んだものの、機械学習の研究をしていたこともありデータサイエンティスト枠を希望して参加しました。インターン先としてGENDAを選んだ理由としては、

  • 社員の方々とお話しする機会をいただいた際に、皆楽しそうで雰囲気が良かったこと
  • 多岐に渡る事業を持つ会社であり、個人では扱えない規模の実データに触れられると思ったこと
  • 社内での勉強会など、成長できる環境が整っていると感じた

などがあります。

UTokyo Tech Clubについては↓↓こちら↓↓

やったこと

インターンでは主に、オンラインクレーンゲームアプリにおけるレコメンドシステムの改善業務に取り組みました。自身の取り組みを簡単にまとめたいと思います!

「レコメンドシステム」について

そもそも「レコメンドシステム」とはなんでしょう?

AmazonなどのECサイトを普段利用する方は、ユーザーのトップページに「あなたへのおすすめ」が表示されるのを見たことがあると思います。この「あなたへのおすすめ」を行うのがレコメンドシステムになります。

ECサイトにおけるレコメンドのイメージ
ECサイトにおけるレコメンドのイメージ

レコメンドは、ユーザーの嗜好に基づいて行われます。ユーザーの嗜好を表す評価を獲得する方法として、明示的獲得と暗黙的獲得があります。明示的獲得はユーザーがアイテムに星をつけてレビューを行うなどのユーザーが能動的に評価を与える方法です。一方、暗黙的獲得はユーザーのクリック履歴や閲覧履歴などの行動履歴からユーザーの評価を推定する方法になります。今回扱ったアプリケーションにおいてはユーザーから明示的にフィードバックを得る機能は実装されておらず、暗黙的に獲得された評価を用いて推薦を行いました。

レコメンドモデル開発

初めに取り組んだのが、モデルの選定・開発です。
モデルを選ぶ際には、

  • 実装コストが低く、インターンの短い期間で試行回数を稼げること
  • ある程度高い性能が見込めること
  • 軽量でチューニングが容易なこと

を重要視して、Pythonのライブラリimplicitに実装されている暗黙的評価に対する行列分解ベースの手法であるAlternating Least Squares (ALS)を使用しました。

この手法は、深層学習ベースの最新手法と比較して実装が容易かつ高速に動作します。また、適切にパラメタのチューニングを行うことで、最新の複雑なモデルにも匹敵する性能を示すことが論文[1]で報告されています。これらを踏まえて、短期インターンの限られた時間の中で性能改善を行うのに最適だと判断し、ALSによる行列分解ベースの推薦モデルの開発に取り組みました。

パラメタチューニング

モデルを作成した後は、モデルの性能を最大限引き出すためにパラメタのチューニングを行いました。
パラメタのチューニングには、optunaを使用しました。

パラメタチューニングに使用するオフラインの評価指標として、 Recall@K を採用しました。
Recall は、

\begin{aligned} Recall:&= \frac{True\ Positive}{True\ Positive + False\ Negative} \\ \\ &= \frac{推薦してプレイされたアイテム}{推薦してプレイされたアイテム + 推薦せずプレイされたアイテム} \\ \\ &= \frac{推薦してプレイされたアイテム}{実際にプレイされたアイテム} \end{aligned}

として定義され、 Recall@KK 件のアイテムを推薦した時の Recall になります。
今回のデータでは正例(各ユーザーの実際にプレイしたアイテム)が少なく、 Precision@K が過小評価されやすいため、評価指標として Recall@K を採用しました。

さらに、パラメタチューニングの実験管理の効率化を目的としてMLflowを導入しました。MLflowは、機械学習のライフサイクル管理を行うためのオープンソースプラットフォームです。MLflowの主要コンポーネントの一つであるMLflow Trackingを活用することで、試行ごとのパラメーターと評価値を簡単に保存・比較できるようになり、モデルの性能を一目で確認・管理できるようになりました。

MLflowによる実験管理
MLflowによる実験管理

A/Bテスト

最後に、開発したシステムを実環境に適用して、実際のユーザーを対象に推薦アイテムのクリック率を指標としたA/Bテストを実施しました。

今回はベイジアンA/Bテストを採用しました。ベイジアンA/Bテストを採用した主な理由は、結果の解釈性の高さとテスト運営の柔軟性です。ベイジアンA/Bテストでは、はじめに観測データから各モデル(旧モデルと新モデル)のクリック率の事後分布をベイズ推定によって予測します。続いて、得られた2つの事後分布を用いてモンテカルロシミュレーションを行い、「新モデルが既存モデルを上回る確率」や「クリック率の差の期待値」などの計算を行います。

ベイジアンA/Bテストでは結果が確率の形で得られます。これは、伝統的なA/Bテストにおけるp値のような誤解されやすい指標とは違って解釈が比較的容易です。そのため、統計的な専門知識がない方にも結果が理解しやすく、ビジネス上の意思決定に繋がりやすいという利点があります。また、テストを走らせながら継続的に事後分布の更新が行えるため明らかに差がついた場合にテストを早期に終了してリソースを節約したり、結果が拮抗している場合にテストを延長したりといった判断を統計的な妥当性を失わずに行えるという利点もあります。

成果発表

インターンの終わりには、3ヶ月間の成果をCTOの梶原さんやVPoEの荒井さんを始めとする社員の方々の前で発表する機会をいただきました!
分析やモデル開発を行うだけでなく、結果を正しく・わかりやすく伝えることも非常に重要であると改めて自覚するとともに、取り組みの内容をわかりやすくまとめることの難しさを痛感しました。

成果発表の様子成果発表の様子

おわりに

短期インターンの体験記という形で、自身が3ヶ月間で取り組んだ内容についてまとめさせていただきました!モデルの開発から評価まで短い期間で一気通貫で行う非常に貴重な体験ができました。

A/Bテストでは必ずしも期待通りの結果は得られませんでしたが、実務におけるデータサイエンスの難しさと面白さ、そしてオフライン評価とオンライン評価のギャップについて深く考える良い機会となったと感じています。

技術的に成長する良い機会となったことはもちろんのこと、インターン生での懇親会などのイベントも開催していただき非常に充実した時間を過ごすことができました!

今後は長期インターン生として活動させていただくこととなりました。今回の経験を糧に、
成果を出して会社に貢献できるように引き続き努力していきます!

脚注
  1. https://doi.org/10.1145/3523227.3548486 ↩︎

GENDA

Discussion