Gunosyデータ分析ブログ

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

ニュース記事配信のパーソナライズロジックのオフライン実験では何を見ているのか?

こんにちは。GunosyTechLab MediaMLチームでエンジニアをやっている 上村 id:muemura です。2020年4月に入社してから今まで在宅勤務で座椅子生活を続けているせいで、出社してオフィスチェアで作業したら腰が痛くなるバグを抱えています。

こちらの記事は Gunosy Advent Calendar 2021 の9日目の記事です。 昨日の記事は m-hamashita さんの「iTerm2 から kitty に移行した話 〜Hammerspoon で快適ターミナルライフ〜」でした。

本題

今日は9月頃に紹介したauサービスTodayの記事配信ロジックの続編*1で、記事配信ロジックにパーソナライズを導入する際のモデル *2 の評価方法に関連するお話です。

「複数のパーソナライズのモデルの候補から、どういったオフライン実験を経て、オンライン実験に用いるモデルを決定するのか」という事を軸に書いていきます。 また、折角のアドベントカレンダーなので、実際に実験をする中で苦労した事や得た知見なども書き納めて年末を迎えられればなと思います笑

data.gunosy.io

f:id:muemura:20211208102642p:plain

アルゴリズムについて

パーソナライズロジックのアルゴリズムは、現在もアプリ「グノシー」で使われている実績のあるものを採用しています。 アルゴリズムの詳細はこちらの記事を御覧ください。

簡単に説明すると、記事の画像と文章から記事ベクトルを生成する "Article Encoder" と、ユーザーの過去の記事クリック履歴をもとに記事ベクトルからユーザーベクトルを生成する "User Encoder" から成っています。

data.gunosy.io

オンライン実験とその制約

Gunosyではサービス改善に向けた新たな施策を検討する際に、施策がKPIにどのような変化をもたらすのかを、オンライン実験のA/Bテストで事前に検証することが一般的になっています。 ニュース記事のパーソナライズロジックの導入も例外ではなく、施策そのものの効果や、調節可能なパラメータの最適値を判断するためにA/Bテストを行います。

そこで直面するのが、数多あるモデルのバリエーションの中からどのようにオンライン実験に用いるモデルを決めるのかという問題です。 願わくは、全てのモデルをオンライン実験で検証できると良いのですが、サービスや施策の規模によっては、一つのA/Bテストでも長時間をかけて検証する必要があります。 したがってA/Bテストで検証できるモデルの数には限りがあり、多くのモデルのバリエーションの中から、実際にA/Bテストを行う有望なモデルを選ぶ必要があります。

今回の場合、推薦モデルのアーキテクチャは決めていたものの、

  • 学習データをどうするか(期間・ドメイン・サンプリングなど)
  • auサービスTodayのデータを用いたfine-tuneを行うか否か*3
  • 推薦モデルを学習する際の種々のハイパーパラメータをどうするか

といったバリエーションが存在し、これらのバリエーションの中から実際にオンライン実験を行うモデルを選ぶ必要がありました。

効率的なオフライン実験による解決

課題を解決するために必要なことが、タイトルにもあるオフライン実験の評価です。 オフライン実験を効率的に行うことで、オンライン実験でのミスマッチを減らすことができます。

そこで重要になるのが評価方法です。 今回は実際に評価に用いた、定量評価と定性評価、二つの評価を紹介します。

特に定性評価では、推薦記事リストがユーザーのどんなニーズを満たしているかを切り分け、 そのポイントごとに評価を行うことで、大まかな良し悪しの判定から脱却した評価を目指しました。 それにより推薦記事リストの定性的な評価であっても、より客観的な視点から良いモデルを効率的に選択し、オンライン実験に繋げることができます。

定量評価

ニュース記事の推薦リストを評価するため、ランキング評価指標を用います。 実際に用いた指標は以下の4つです。

  • AUC (ROC曲線)
  • nDCG
  • MRR
  • MAP

それぞれの指標の数式や意味は、こちらのブログなど、とても丁寧に書かれているブログがたくさんありますので、そちらを見ていただければと思います。 blog.brainpad.co.jp

これらの評価指標を用いることで、大まかにアルゴリズムの良し悪しが判断できるようになると思います。 しかし今回の実験では、アルゴリズムは固定で、学習データやハイパーパラメータなどの細かい違いを検証していたため、 大きく差が開くことはなく、あくまでも参考の数値として扱っていました。

定性評価

定性評価とは?

定量評価でモデルの良し悪しを判定しきれないとき、とても重要になるのがこの定性評価です。 定性評価では、ユーザーのクリック履歴を参考に推薦される記事のリストを作成し、目視でそのリストの良し悪しを判定します。

評価で重要なのは、ユーザーが満足したリストを提案できるかどうか、という部分です。 全体最適のように、全ユーザーに対して同じリストを提示するのであれば、多くのユーザーが満足するかどうかという部分に着目すれば良いと思います。 しかし、パーソナライズのように、個々のユーザーに異なるリストを提示する場合、それぞれのユーザーの目線に立って評価を行うことが重要になります。

何を見ているのか?

定性評価では様々なユーザーのクリック履歴を参考に、特定のモデルを使用した場合どのような記事のリストが推薦されるのかを確認します。 ここで重要になるのが、「ユーザー」をできるだけ広い視野で多角的に考えることです。 ユーザーによってはアプリの使い方も異なるでしょうし、見たい記事も変わってくるのが当然だと思います。 そのため、今回の実験では特に記事のクリックが、特定の記事カテゴリ*4 に偏っている/満遍なく読んでいる、クリックが多い/少ないユーザーに着目することで、多くのニーズを満たすことを目指しました。

パーソナライズのモデルでは、記事ベクトルとユーザーベクトルを生成し、それらの類似度を考慮して推薦を行う仕組みになっています。 ですので、それぞれのベクトルに対して評価を行っていく必要があります。 カテゴリの異なる記事や上記に挙げたユーザーに対して、それらのベクトルが似通っている記事リストを見比べ、大まかに以下の観点からモデルを比較しました。

  • 記事ベクトル
    • 同じカテゴリかどうか
      • 一番手っ取り早く確認する方法
      • カテゴリを更に分けたサブカテゴリレベルで同じ記事が推薦されると良い
    • 異なるカテゴリでも共通した話題かどうか
      • カテゴリを跨いで共通した地域やトピックについての記事が推薦されると良い
    • 文脈レベルで似ているかどうか
      • 共通したトピックのうち、さらに細かい文脈が同じ記事が推薦されると良い
  • ユーザーベクトル
    • 関連した記事が推薦されているか
      • ユーザーの興味がありそうな記事が推薦されると良い
    • 多様性があるかどうか
      • 同じような記事ばかりが推薦されていないと良い
      • 特にクリックがまだ少ないユーザーに対して推薦の幅が広い多様な記事を推薦したい

ここで重要なのは、如何に多くの観点から評価ができるかになります。 「推薦元と推薦先のリストが似ているから良い」のような、ざっくりした判断基準で定性評価を行ってしまうと、 最も良いモデルを吟味するときに、評価が曖昧なまま決定をすることにもなってしまいます。

また、その他の満足なリストを考える方法として、ペルソナを作った上でユーザーストーリーを組み立て、リストを作成して評価を行うことができます。 こちらは時間こそかかりますが、掘り下げがしやすく良い方法だと思います。

これらの評価は複数のモデルからの決定だけではなく、モデルの強みや弱さを見つけることにも等しいため、今後のアルゴリズムやモデルの改善にも繋がります。 実際に、現在はチームでもこれらの度重なる分析から得た改善点や知見をもとに、新たなパーソナライズロジックの改善に取り組むことができています。

評価で苦労したこと

オフライン実験

オフライン実験では、定量評価と定性評価を用いることでモデルの良し悪しを検討することができたのですが、その他にも苦労することがいくつかあったのでそちらも紹介します。

まずはオフライン評価に関連する部分で、モデルを大量に作成して評価を行うというプロセスがとても大変でした。 モデルの学習自体はAWSのEC2インスタンスで行っているのですが、学習に用いるスポットのGPUインスタンスが東京リージョンでは確保できず、別リージョンまで旅をしにいったりしていました。 そうなると、モデルの学習と評価を切り分けて実験することになり、モデルが増えるほど、評価まわりのコードをアドホックに修正していた箇所がミスに繋がってしまい、実験の結果を間違えて出してしまうことがありました。 こちらも最終的にはアドホックな修正を極力少なくなるようにパイプラインを整備することで解決しましたが、中々気付きにくい部分でもあるので苦労しました。

オンライン実験

また、オンライン実験の結果が思った通りにはいかず、難しいということもありました。 オフライン実験では、「これがベストだ」と自信を持ってオンライン実験に送り出してはいるのですが、あまり良い効果とならないこともありました(実世界はそう簡単ではないということですね...)。 しかし、これについても効率的にオフライン実験を行い、迅速にオンライン実験ができる環境を整えることで、実験サイクルをより早く回して、そのギャップを縮めることができると思います。

また、オフライン実験でのバイアスを除去して実験を行う手法*5もあるため、そういった観点から差をなくしていくといった方法を試して見るのも価値があると思います。

おわりに

まとめると、オフライン評価では定量評価と定性評価を組み合わせて評価することが重要です。 実際に今回の実験のようにアルゴリズムが同じで、データセットやハイパーパラメータを変えて学習しただけのモデル比較だと定量評価もほとんど変わらない結果になることも多いです。 しかしそういった場合にでも、より多くのユーザーに対する推薦記事リストを並べ、定性的に評価を行うことで、モデルの細かな良し悪しが見えてくる部分があることを改めて感じました。 正直、定性評価は大変ですが、さらなる改善のためこれからも取り組んでいきたいと思います!!

明日は、johnmanjiro さんの記事です!
Gunosy Advent Calendar 2021 はまだまだ続きます!お楽しみに!!

*1:記事が公開された当時はユーザー全員に同じ記事のリストを提供するロジックでした。

*2:本稿では、手法のことをアルゴリズム、データを用いて学習を行ったものをモデルとします。

*3:サービス開始直後であるためデータが少ないという背景もあります。

*4:記事毎に政治、スポーツ、エンタメのようなカテゴリ、また更に細かくしたサブカテゴリを割り振っています。

*5:https://doi.org/10.1145/1935826.1935878