Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

動画アプリの推薦システムを開発しました @au5Gチャンネル

はじめに

こんにちは、Gunosy Tech Lab (GTL) MediaMLチームの上村です。今回のブログでは、先日プレスリリースがあった au 5Gチャンネル へのレコメンド機能の提供についてご紹介したいと思います。

gunosy.co.jp

「au 5Gチャンネル」とは*1

「au 5Gチャンネル」はドラマ・アニメ・映画、音楽などのエンタメ情報や生活に根差したお役立ち情報、かわいい動物達の癒し動画や話題のおもしろ動画など、様々なジャンルのトレンド動画をザッピング感覚でお楽しみいただけるアプリです。 また、5Gマップにて生活圏が5Gエリアかどうかを確認でき、5Gエリア化された際にお知らせする機能もご利用いただけます。

レコメンド動画リストの提供

プレスリリースにもある通り、Gunosyのニュース記事推薦で培った技術とノウハウを活かして、au 5Gチャンネル のユーザーの興味関心に沿った動画を提供する動画推薦アルゴリズムを開発しました。動画の視聴などのユーザーの行動ログからユーザーの興味を推定することでユーザーに合わせたレコメンド動画リストを提供します。

開発したシステムについて

システム構成

今回 au 5Gチャンネル にレコメンド動画リストを提供するために作成したシステムの概略図がこちらです。

構成としては、動画コンテンツを取得するクローラと、ユーザーの行動データを受け取りレコメンド動画リストを提供するAPI、また動画コンテンツのスコアリング等を行うバッチシステムから成り立っています。これらは全てAWS上にてシステム構築を行っています。

API

アプリからリクエストを受け取り、レコメンドリストをレスポンスするAPIでは、ユーザーの行動ログに応じた動画コンテンツリストを配信しています。 裏側では、AWSの ECS on Fargate で動作させており、負荷の具合やピーク時間帯によってオートスケーリングを行うような設定を組んでいるため、大規模なリクエストがきても耐えられるシステムになっています。また、API自体は golang の goa*2 フレームワークを用いて作成していて、ロギングとして fluentd、サービスメッシュとして envoy を組み合わせています。

また、本番環境での稼働前には、locust*3 を使った負荷試験や、想定した挙動となるかのテストケース、故意に障害を発生させた場合のアラートなどの検証を行った上でリリースを行っています。

バッチ

動画コンテンツを人気順に並べるためのスコアリングや、ユーザー行動ログのETLなどのバッチ処理を行っています。 裏側では Python での処理をメインとしたイメージを作成して、Digdag ワークフローにて定期的に ECS タスクを走らせています。

動画推薦アルゴリズム

レコメンド動画リスト

レコメンド動画リストでは、より長い時間視聴される人気な動画コンテンツが優先してリストの上位に現れやすくするようなスコアリングを行っています。 その他の要素として、動画の新旧により価値が変わるコンテンツのスコア調整や、より多様な動画がリストに表示されるようなロジックを組み込んでいます。

レコメンドリストにユーザーの興味関心を取り入れる手法として、行動ログからパーソナライズ動画推薦モデルを構築し導入しています。 このモデルでは、動画に対するユーザーの興味関心度合いをスコア化して取り込むことで、ユーザーの興味関心に合わせたリストを生成しています。

またモデルを構築する際には、ユーザーが一定時間以上視聴した動画コンテンツを興味関心だと仮定することで、リストから対象ユーザーの興味をモデル化しています。 推薦候補のコンテンツの中でより長く視聴するコンテンツに高いスコアを与えるようなニューラルネットワークを学習し使用しています。

ニュース記事推薦とのギャップ

ニュース記事推薦に関する知見の積み上げは社内にありましたが、ニュース記事と動画コンテンツの推薦では、コンテンツ自体の素性やユーザーの行動ログ上での興味の現れ方などに大きなギャップがある部分ではありました。

例えばユーザーの行動ログにおいて、ニュース記事推薦ではクリックログから興味を捉える手法が一般的です。 しかし、今回の au 5Gチャンネル のアプリは「起動時に自動で動画が再生されスワイプで次の動画が再生される」という特徴があるため、同様の手法ではユーザーの興味を捉えることができませんでした。 そのため、前述のように「一定時間以上視聴したログにより興味があると仮定する」手法を用いることで、ユーザーの興味をモデル化することができました。 この視聴時間の閾値については、ユーザーの視聴時間の分布をはじめとした、ユーザーの興味がある動画での視聴傾向の分析や、動画推薦モデルのオフライン検証において閾値を変動させたときの評価等から決定しています。

このようなギャップを動画推薦システムのサーベイや、ログの分析などを行うことで解消していくことで、独自のアルゴリズムを構築することができました。

推薦アルゴリズムのオンライン検証

実際に開発した動画推薦アルゴリズムを用いたレコメンド動画リストを提供して、アプリ上でA/Bテストによるオンライン検証を行い、動画コンテンツの再生時間を大幅に伸ばすことができました🎉

現在では、今回開発した動画推薦アルゴリズムで作成される動画リストを全ユーザーに体験してもらえるようになっています。

開発を振り返って

開発が終了した後にチームでKPTを行い、初の動画推薦モデル構築を喜ぶ声や、逆にアプリ開発に関わった関係各社とのコミュニケーションをもっとうまくできた可能性もあった、等の反省点も出ました。総じて有意義で学びのある開発経験だったと感じています。

個人的にもシステム全体のインフラやAPI、バッチ等の構築等は学びが多く、楽しみながら開発できました。また、本番環境でのリリースに重要なテストケースの確認や負荷試験なども、中々一から作ることがないと触れることがない検証を行えたことも良い経験になったと感じています。一方で、現状見えているアルゴリズムの課題点やAPIのレイテンシ改善などの課題も存在しているため、今後これらを解決できるように開発を続けていきたいと思います。