Anewsへの応用を見越した既存ニュース推薦手法の性能確認実験

Tags
Anewsへの応用を見越した既存ニュース推薦手法の性能確認実験
Page content

ML事業部の金田です。今回はAnewsへの応用を見越して実施した、公開データセット(MINDデータセット)を用いた既存ニュース推薦手法の性能確認実験について紹介します。なお、実験で用いたコードはこちらに公開しています。

背景

当社の開発する法人向けサービスのAnewsには、ニュース推薦システムが実装されています(その概要は以前の記事で紹介したとおりです)。

このシステムは、製品開発の初期段階に構築されたものです。その際には顧客要求を素早く叶えることが優先されており、当時はニュース推薦システムの研究動向を十全にフォローアップできていませんでした。構築以降に実施されたシステム品質改善も、顧客から寄せられた問題の解消を目的としていたため、「そもそも技術的観点から現行システムにどの程度改善の余地があるのか?」という疑問に対して、これまで明確な回答を用意できていませんでした。

この問題を解消するため、現在R&Dユニットでは、製品で必要とされる機能プロトタイピング/機能改善の傍ら、ニュース推薦モデルに関する論文調査・社内データへの適用性確認(現行アルゴリズムとの比較評価)を試みています。このたび紹介する内容は、この調査の過程で生まれた、公開データセット(MINDデータセット)を用いた既存提案手法の性能確認結果になります。

MINDデータセット

MINDデータセット1 2は2020年にMicrosoft社の公開した、ニュース推薦のためのデータセットです。このデータセットはMSNニュース(英語)の利用ログから構築されたもので、次のデータを含んでいます。

  • 行動データ(behavior.tsv
    • あるクリック履歴(history)を持つユーザが行った、あるタイミングで提示されたニュースリストに対する反応(impressions)。データの概観は下図のとおりです。
図1. 行動データの概観
図1. 行動データの概観


  • ニュース記事データ(news.tsv)
    • 行動データに含まれるニュース記事の情報。各記事は以下の属性を持ちます。
      • 記事ID
      • タイトル
      • アブストラクト
      • 本文3
      • カテゴリ
      • サブカテゴリ

MINDデータセットには上記以外にもデータ/ニュース記事属性が含まれていますが、ここでは以降の実験に関係するものに絞って紹介しています。 (全容及び詳細に興味のある方は公式の説明をご確認ください)。

このデータセットで扱う問題は、「あるクリック履歴をもつユーザが、与えられたニュースをクリックするか否かの予測(2値分類問題)」です。 この問題を解くモデルを推薦システムとして応用する場合は、「モデルによる予測クリック確率が高いニュースをユーザに提示する」仕組みを作ることになります。

性能確認を行ったモデル

今回性能確認を行ったモデルは、NAML4・NRMS5の2つ及び、両者にいくつかの変更を加えたものになります。 モデルの選定背景には、ニュース推薦特有の問題があります。

ニュース推薦の特色は、推薦対象となるニュースが頻繁に入れ替わることにあります。このような状況では、次のような理由から他のユーザの行動を手がかりに使う推薦(協調型推薦)が難しくなります。
まず、ニュース推薦において推薦対象となる記事は、大抵の場合速報性を重視して最新のニュースになります。つまり、誰も読んだことがない記事を推薦する必要があります。
また、頻繁に配信対象が更新されてしまうので、似たような興味を持つユーザであっても、アクセスタイミングが異なる場合は読む記事が一致しない状況が起こりえます。 これは、「似たような興味を持つユーザは似たような行動履歴を持つ」という前提が成り立ちにくいことを意味します。

裏を返せば、ニュース推薦においては、配信されるニュース/ユーザが読んだニュースの意味を手がかりとして推薦を行う仕組み(コンテンツベース推薦)の構築が重要になります。 今回選定したモデルはどちらもコンテンツベース推薦を意識したモデルであり、MINDデータセットの論文2でもベースラインに選定されています。 ちなみに、どちらもMicrosoft社の研究機関が発表したモデルです。

モデルの基本構造

NAML, NRMSは似たような構造を持つモデルです。両者の構造は下図のように抽象化して表すことができます。

モデルの基本構造
図2. モデルの基本構造(論文 6 より引用)


各モデルにおいて、News Encoderはニュース記事の属性(タイトル、本文、カテゴリ等)を入力とし、その意味を表現するようなベクトル(以降記事ベクトルと表記)を出力します。
一方、User EncoderはNews Encoderによってベクトル化されたクリックされた記事の履歴を受け取り、ユーザの興味関心を表現するようなベクトル(以降ユーザベクトルと表記)を出力します。
News EncoderとUser Encoderは、同じ次元数のベクトルを出力します。これにより、あるユーザがある候補記事をクリックする確率は、ユーザベクトルと記事ベクトルの簡単な計算によって表現することができます。

今回扱うモデルでは、「ユーザベクトルと記事ベクトルの内積をsigmoid関数に通す」ことによりクリック確率を表現しています。 つまり、「2つのベクトルの向きが近い」かつ「ベクトルが大きい」ほど、クリック確率は大きくなります。

概観を掴んだところで、以降では各モデルについて確認していきます。

NAML

NAMLは2019年に発表されたモデルで、下図のような構造を持ちます。

NAMLモデルの構造
図3. NAMLモデルの構造(論文 4 より引用)


NAMLのUser EncoderはNews Encoderに比して簡潔な構造を持つため、User Encoder → News Encoderの順番で確認を行っていきます。

User Encoder (NAML)

NAMLのUser Encoderは、News Encoderによってベクトル化されたクリック履歴をAttentionで重み付けして足し合わせることによりユーザベクトルを出力します。 「今まで読んできた記事をバランス良く考慮する(=重みをつける)ことでユーザの嗜好を作る」仕組みになっているといえそうです。

News Encoder (NAML)

NAMLのNews Encoderでは、ニュースの各属性をベクトル化した上でAttentionによる重み付き和を取ることにより、記事ベクトル(図3.中の $ \boldsymbol{r} $ に相当)を出力します。 ここで利用される属性は以下のとおりです。

  • カテゴリ
  • サブカテゴリ
  • タイトル
  • 本文

各属性のベクトル化方法に関しては、以下2つに分けて考えることができます。

  • カテゴリカルな属性(カテゴリ・サブカテゴリ)のベクトル化
  • テキスト属性(タイトル・本文)のベクトル化

説明の都合上、前者の処理を行うモジュールをCategory Encoder、後者の処理を行うモジュールをText Encoderと呼ぶことにすると、NAMLのNews Encoderは下図のように捉えることができます。

NAMLモデルのNews Encoder(抽象化)
図3. NAMLモデルのNews Encoder(抽象化)


Category Encoderでは、「入力されたカテゴリカル属性をEmbedding Layerによって密なベクトルに変換した上で、Dense Layerに通す」処理を行います。 カテゴリカルな情報を扱う上ではベーシックなやり方であるように思われます。

一方、Text Encoderでは次のような処理が行われます。

  1. 単語列として与えられたテキストを、Embedding Layerによってベクトル列に変換する
  2. ベクトル列をCNN Layerに渡す
  3. 手順2.で出力されたベクトル列の各要素を、Attentionにより重み付けして足し合わせる

手順2.でCNN Layerを通過することにより、各単語を表現するベクトルには周囲の単語のベクトルが畳み込まれます。 これにより、単語のベクトルに周囲の文脈が反映されることが期待されます。 手順3.でこれらの重み付き和を取ることで、「周囲の文脈が反映された単語の意味をバランス良く考慮したベクトル」が記事ベクトルとして出力されるのを期待できそうです。

なお、手順1.で用いるEmbedding Layerは、学習済み単語埋め込みモデル(GloVe)の重みを使って初期化されます。 これにより、学習済みモデルですでに獲得されている単語の基本的な意味を推薦システムに活用することができます。

また、タイトル・本文の各Text Encoderにおいて、Embedidng Layerのパラメータは共有されています。

NRMS

NRMSも2019年に発表されたモデルですが、その時期はNAMLよりも新しいです。モデルの構造は下図のとおりです。

NRMSモデルの構造
図3. NRMSモデルの構造(論文 5 より引用)


NRMSは説明の都合上、News Encoder → User Encoderの順に確認を行っていくことにします。

News Encoder (NRMS)

NRMSのNews Encoderで行っている処理は、NAMLのText Encoderと非常に似通っています。 ただし、NRMSのNews Encoderにおいて入力として用いられるのはタイトル属性のみとなっており、以下の流れで記事ベクトルを出力します。

  1. 単語列として与えられたタイトルを、Embedding Layerによってベクトル列に変換する
  2. ベクトル列をmulti-head self-attention layer(以降SelfAttentionLayerと表記)に渡す
  3. 手順2.で出力されたベクトル列の各要素を、Attentionにより重み付けして足し合わせる

NAMLのTextEncoderとの違いは、CNN LayerがSelfAttentionLayerに置き換わっている点です。
SelfAttentionLayerはBERT等のTransformerモデルの内部で用いられている層です。 その内部で行われている処理はやや複雑なのですが、大雑把に捉えると「各単語に対応するベクトルに対し、入力文中の全単語のベクトルを重み付けして足し合わせる」ようなことを行っています。
ここで重要なのは「各単語のベクトルには、文中の全単語が考慮される」という点です。これにより、「周囲の文脈」しか扱えていなかったCNN Layerに比して、文章の意味をより高度に捉えることが期待できます。

なお、手順1.で用いるEmbedding Layerに関しては、NRMSにおいてもNAML同様に、学習済みGloVeモデルの重みで初期化されます。

User Encoder (NRMS)

NRMSのNews Encoderでは、以下の手順によりユーザベクトルを出力します。

  1. News Encoderによってベクトル化されたクリックされた記事の履歴をSelfAttentionLayerに通す
  2. 1.の出力をAttentionにより重み付けして足し合わせる

NAMLのUser Encoderとの違いは、SelfAttentionLayerの有無です。 クリック履歴をSelfAttentionLayerに通すことにより、クリックされた各記事のベクトルには記事同士の相互関係が反映されることが期待できます。

行った実験について

今回は上述のNAML, NRMSに加え、両者にいくつかの変更を加えたモデルの性能確認を行いました。
ここで加えたかった変更に対応している既存実装コードが見当たらなかったので6、実装も自前で行うこととしました。
調査の最終目的は社内推薦システムへの応用なので、本来やりたいことは社内データを用いた性能評価です。 しかし実装の妥当性を確認するため、まずは公開データセットで性能確認を行うことにしました。

今回の実験で各モデルに加えた変更は、大きく2つに分けられます。

一つは、News Encoderの入力とする記事属性です。今回は以下の3パターンを試しました。

  • タイトルのみ
  • タイトル+本文
  • タイトル+本文+カテゴリ+サブカテゴリ

「タイトルのみ」はNRMSのデフォルト設定、「タイトル+本文+カテゴリ+サブカテゴリ」はNAMLのデフォルト設定になります。 両者に加え、カテゴリ情報を持っていない社内記事データをモデルに入力することを見越して「タイトル+本文」の性能も確認することにしました。

もう一つは単語をベクトルに変換するEmbedding Layerです。今回は以下の2パターンを試しました。

  • Embedding Layerを学習済みGloVeの重みで初期化
  • Embedding Layerをtransformerベースのモデルに置換

前者はNAML, NRMSのデフォルト設定です。
後者の発想は前者と同じく、「学習済みモデルで獲得された言語に対する理解を推薦システムに応用する」というものです。 transformerモデルは様々な応用先で単語埋め込みモデル以上の性能が確認されているため、推薦システムにおいても同様の性能向上が期待されます。 今回の実験では、transformerモデルの中でもベーシックなBERT−base uncaesd7を利用しました。

以上をまとめると、2つのモデルに対し、記事属性3パターン x Embedding Layer2パターンの変更を加えるため、合計12通りのモデルの性能を確認することになります。 以降ではモデルの設定に応じて、以下の表のようなnotationを利用することにします。

利用する記事属性/Embeding Layerの種類GloVeBERT
タイトルのみ$ \text{NAML}_{T}$$ \text{NAML}^{BERT}_{T}$
タイトル+本文$ \text{NAML}_{T+B}$$ \text{NAML}^{BERT}_{T+B}$
タイトル+本文+カテゴリ+サブカテゴリ$ \text{NAML}_{T+B+C}$$ \text{NAML}^{BERT}_{T+B+C}$

ここではNAMLを取り上げて説明していますが、NRMSにも同様のnotationを適用します。

実は、両モデルに似たような変更を加えた実験は、すでにMINDデータセットの論文2で行われています(特にtransformerモデルを使う実験に関しては、別の論文8でもさらなる掘り下げが行われています)。
その実験を確認すると、概ね以下のような傾向が読み取れます。

  • NAMLよりNRMSの方が性能が高い
  • 利用する記事の属性を増やすと性能が上がる
  • Embeddingにtransformerモデルを利用すると性能が上がる

今回行った実験でも同様の傾向が確認できれば、実装の妥当性は概ね確認できたと言えそうです。

具体的な実験設定

利用するデータセットについて

MINDデータセットには、簡単に実験を行うためのサブセット(small版)が公開されています。今回の実験ではこれを用いて各種モデルの訓練&評価を行いました。 なお、small版にはtest setが含まれていないため、性能評価はvalidation setに対するスコアで行うこととしました。 以上の設定からもわかる通り、これは厳密な再現実験ではないことに留意してください。
また、データセットに含まれている「クリック履歴が存在しない行動データ」に関しては、train set, validation setの両方から除外しています。

訓練方法について

訓練時にはNAMLの論文4にならい、少し特殊な予測を行います。
ここではある学習サンプルが与えられたとき、そこから1つのクリックされた記事と、K個のクリックされなかった記事を適当に選びます。 そしてこのK+1個の記事の中から、どれがクリックされた記事であるかを予測します。その予測確率は、「ユーザベクトルと各記事ベクトルの内積を並べてK+1次元のベクトルを作り、それをSoftmax関数に通す」ことで得られます。 つまり、訓練時に解くのはK+1クラスの分類問題であり、損失も多クラス分類の損失として定義されます。

ここで定義された損失はWord2Vecの学習時の工夫として提案されたnegative samplingの発想を汲んでおり、提案論文9中ではこの損失も同様にnegative samplingと呼んでいます。「positive sampleに比べて遥かに多く存在するnegative sampleの情報を活用したい」という意図からこのような損失を定義したようです。

提案論文によると、downsamplingによりnegative sampleとpositve sampleを1:1にバランスさせた上で二値分類の誤差を損失とした場合に比べて、よい性能が得られたそうです。
同様にnegative sampleの情報を活用する方法としては、「negative sampleとpositive sampleをmini batch単位でK:1にバランスさせた上で、positive側にKだけ重みを掛けた二値分類誤差を用いる」ことも考えられそうです。 両者の性能差を比較してみるのも面白そうですが、今回の実験では取り扱いません。

評価指標について

評価指標は各種論文にならい、AUC, MRR, nDGC@5, nDGC@10を利用します。 各指標の評価内容をざっくり説明すると、次のようになります。

  • AUC: モデルがpositive sampleとnegative sampleを区別できていればいるほどスコアが大きくなる
  • MRR: 候補記事を予測クリック確率が高い順に並び替えて上から見ていったとき、positive labelのついた記事が出現するのが早ければ早いほどスコアが大きくなる
  • nDCG@5, nDCG@10: 候補記事をクリック予測クリック確率が高い順に並び替えたとき、positive labelのついた記事が上位に集まっているほどスコアが大きくなる

いずれの指標も、数値が大きければ大きいほどほどよい推論ができていることを示します。

学習時のパラメータについて

学習時に用いた代表的なパラメータは以下のとおりです。

  • 最大トークン長(タイトル): 30
  • 最大トークン長(本文): 128
  • 最大クリック履歴長: 50
  • 記事ベクトル・ユーザベクトルの次元数: 400
  • バッチサイズ: 128
  • learning rate:
    • GloVe使用時: 4e-4
    • BERT使用時: 1e-5
  • エポック数: 3
  • 学習の試行回数:各モデルごとに1回づつ

これらパラメータの設定時はいくつかの論文及び既存実装を参考にしました10が、記載が確認できなかったもの等については適当な数値を設定しています。その際にパラメータチューニングは行えていない点には留意ください。
その他のパラメータに関しては、リポジトリのconfigに設定されているデフォルト値をご確認ください。

なお、fine-tuneするBERTのレイヤーに関しては、論文8にならい出力側から数えた2層分としています。
また、GloVeモデルは公開されている学習済みモデル11のうち、語彙数が一番大きい640Bのモデルを利用しました。 GloVeモデル利用時のtokenizerは、学習済みモデルの作成条件12に合わせてStanford Tokenizerを利用しています。

訓練に利用したGPUはRTX2080 Ti1枚のみですが、gradient accumulationによってBERT利用時でも実質的なバッチサイズを一貫させています。

実験結果

各モデルの性能を前述の各指標で評価した結果は以下のとおりです。 なお、評価は学習におけるエポックの終了毎に行いました。 各図に載っているスコアは、そのうち最良のエポックのものになります。

AUC
図4. AUC


MRR
図5. MRR


nDCG@5
図5. nDCG@5


nDCG@10
図5. nDCG@10


まずGloVeを使用している6モデルについて確認すると、各スコアについて概ね期待通り「NAMLよりNRMSの方がスコアが高く、使う属性が多いほどスコアが高い」という傾向が確認できます。$ \text{NRMS}_{T+B} $ のスコアは期待をやや下回っていますが、パラメータチューニングによって挽回できる範囲にも思われます。

一方でBERTを使用しているモデルに関しては、期待と随分異なる傾向が見られます。具体的には、NRMSよりNAMLの方が全体的に高いスコアを出しており、カテゴリ属性を追加した際にスコアが落ち込んでいます。 とはいえ、AUC以外のスコアにおいて最高値を出しているのはBERTを利用したモデル($\mathrm{NAML}^{BERT}_{T+B}$)であることから、「Embeddingにtransformerモデルを利用すると性能が上がる」傾向は一応確認できていると言えそうです。

BERTを利用したモデルにおける期待と結果のズレの原因は、loss curve等を見る限りではエポック数が小さかったことに起因するunderfittingにありそうです。 また、BERTをfine-tuneする際に行われる学習安定化の工夫(learning rateのwarmupやAdamのbias correction13等)を特に盛り込んでいなかったので、スコアの上振れ/下振れが発生していることも考えられそうです。
少なくとも、BERTを利用したモデルを扱う場合には、もう少しパラメータのチューニングを行う必要があると言えそうです。

まとめ

今回の実験では、NAML・NRMSという2つのニュース推薦モデルに対し、いくつか変更を加えた上で性能確認の実験を行いました。 GloVeを利用したモデルについては概ね期待通りの結果が得られたものの、BERTを利用した場合に関してはまだまだチューニングの余地を残していることも確認できました。

また、試験的な結果ではありますが、社内のデータを用いた実験では、今回紹介したモデルを用いることで予測スコアがプロダクトで現状使われているアルゴリズムを上回ることも確認しました。 今後は、社内データを用いたより詳細な検証や、モデルの出力の定性的な評価も行いたいと思っています。

現在ストックマークでは、Anewsにおけるニュース推薦の課題を一緒になって考えてくれる気概のあるエンジニアやリサーチャーを絶賛募集中です!興味を持っていただけた方は、採用ページもぜひご覧ください!


  1. https://msnews.github.io/ ↩︎ ↩︎

  2. Wu, Fangzhao et al. “MIND: A Large-scale Dataset for News Recommendation.” ACL (2020). ↩︎ ↩︎ ↩︎

  3. 本文は配布されているデータセット中には含まれていませんが、公開されているクローラを利用することで得ることができます。 ↩︎

  4. Wu, Chuhan et al. “Neural News Recommendation with Attentive Multi-View Learning.” IJCAI (2019). ↩︎ ↩︎

  5. Wu, Chuhan et al. “Neural News Recommendation with Multi-Head Self-Attention.” EMNLP (2019). ↩︎

  6. 例えばMINDデータセットの公式サイト1でも紹介されているリポジトリの実装では、前述のモデル設定変更に対応していないように見受けられました。非公式実装リポジトリ12でも同様です。 ↩︎

  7. https://huggingface.co/bert-base-uncased ↩︎

  8. Wu, Chuhan et al. “Empowering News Recommendation with Pre-trained Language Models.” Proceedings of the 44th International ACM SIGIR Conference on Research and Development in Information Retrieval (2021). ↩︎ ↩︎ ↩︎

  9. Wu, Chuhan et al. “NPA: Neural News Recommendation with Personalized Attention.” Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (2019). ↩︎

  10. 最大トークン長(タイトル)、最大クリック履歴長、記事ベクトル・ユーザベクトルの次元数についてはNRMS著者による実装を参考にしています。最大トークン長(本文)についてはNAML著者の実装を参考に300を用いたかったのですが、メモリの都合上128に抑えることにしました。バッチサイズ及びBERT利用時のlearning rateは論文8を参考にしています。word embedding利用時のlearning rateに関しては、MicrosoftのNAML公式実装のlearning rate(バッチサイズ32に対し1e-4)を、バッチサイズ128に合わせて4倍したものを利用しています。 ↩︎

  11. https://nlp.stanford.edu/projects/glove/ ↩︎

  12. Pennington, Jeffrey et al. “GloVe: Global Vectors for Word Representation.” EMNLP (2014). ↩︎

  13. Mosbach, Marius et al. “On the Stability of Fine-tuning BERT: Misconceptions, Explanations, and Strong Baselines.” ArXiv abs/2006.04884 (2021). ↩︎