ML事業部の金田です。今回はAnewsへの応用を見越して実施した、公開データセット(MINDデータセット)を用いた既存ニュース推薦手法の性能確認実験について紹介します。なお、実験で用いたコードはこちらに公開しています。 当社の開発する法人向けサービスのAnewsには、ニュース推薦システムが実装されています(その概要は以前の記事で紹介したとおりです)。 このシステムは、製品開発の初期段階に構築されたものです。その際には顧客要求を素早く叶えることが優先されており、当時はニュース推薦システムの研究動向を十全にフォローアップできていませんでした。構築以降に実施されたシステム品質改善も、顧客から寄せられた問題の解消を目的としていたため、「そもそも技術的観点から現行システムにどの程度改善の余地があるのか?」という疑問に対して、これまで明確な回答を用意できていませんでした。 この問題を解消するため、現在R&Dユニットでは、製品で必要とされる機能プロトタイピング/機能改善の傍ら、ニュース推薦モデルに関する論文調査・社内データへの適用性確認(現行アルゴリズムとの比較評価)を試みています。このたび紹介する内容は、この調査の過程で生まれた、公開データセット(MINDデータセット)を用いた既存提案手法の性能確認結果になります。 MINDデータセット^MIND_URLは2020年にMicrosoft社の公開した、ニュース推薦のためのデータセットです。このデータセットはMSNニュース(英語)の利用ログから構築されたもので、次のデータを含んでいます。
MINDデータセットには上記以外にもデータ/ニュース記事属性が含まれていますが、ここでは以降の実験に関係するものに絞って紹介しています。
(全容及び詳細に興味のある方は公式の説明をご確認ください)。 このデータセットで扱う問題は、「あるクリック履歴をもつユーザが、与えられたニュースをクリックするか否かの予測(2値分類問題)」です。
この問題を解くモデルを推薦システムとして応用する場合は、「モデルによる予測クリック確率が高いニュースをユーザに提示する」仕組みを作ることになります。 今回性能確認を行ったモデルは、NAML2・NRMS3の2つ及び、両者にいくつかの変更を加えたものになります。
モデルの選定背景には、ニュース推薦特有の問題があります。 ニュース推薦の特色は、推薦対象となるニュースが頻繁に入れ替わることにあります。このような状況では、次のような理由から他のユーザの行動を手がかりに使う推薦(協調型推薦)が難しくなります。 裏を返せば、ニュース推薦においては、配信されるニュース/ユーザが読んだニュースの意味を手がかりとして推薦を行う仕組み(コンテンツベース推薦)の構築が重要になります。
今回選定したモデルはどちらもコンテンツベース推薦を意識したモデルであり、MINDデータセットの論文4でもベースラインに選定されています。
ちなみに、どちらもMicrosoft社の研究機関が発表したモデルです。 NAML, NRMSは似たような構造を持つモデルです。両者の構造は下図のように抽象化して表すことができます。
各モデルにおいて、News Encoderはニュース記事の属性(タイトル、本文、カテゴリ等)を入力とし、その意味を表現するようなベクトル(以降記事ベクトルと表記)を出力します。 今回扱うモデルでは、「ユーザベクトルと記事ベクトルの内積をsigmoid関数に通す」ことによりクリック確率を表現しています。
つまり、「2つのベクトルの向きが近い」かつ「ベクトルが大きい」ほど、クリック確率は大きくなります。 概観を掴んだところで、以降では各モデルについて確認していきます。 NAMLは2019年に発表されたモデルで、下図のような構造を持ちます。
NAMLのUser EncoderはNews Encoderに比して簡潔な構造を持つため、User Encoder → News Encoderの順番で確認を行っていきます。 NAMLのUser Encoderは、News Encoderによってベクトル化されたクリック履歴をAttentionで重み付けして足し合わせることによりユーザベクトルを出力します。
「今まで読んできた記事をバランス良く考慮する(=重みをつける)ことでユーザの嗜好を作る」仕組みになっているといえそうです。 NAMLのNews Encoderでは、ニュースの各属性をベクトル化した上でAttentionによる重み付き和を取ることにより、記事ベクトル(図3.中の $ \boldsymbol{r} $ に相当)を出力します。
ここで利用される属性は以下のとおりです。 各属性のベクトル化方法に関しては、以下2つに分けて考えることができます。 説明の都合上、前者の処理を行うモジュールをCategory Encoder、後者の処理を行うモジュールをText Encoderと呼ぶことにすると、NAMLのNews Encoderは下図のように捉えることができます。
Category Encoderでは、「入力されたカテゴリカル属性をEmbedding Layerによって密なベクトルに変換した上で、Dense Layerに通す」処理を行います。
カテゴリカルな情報を扱う上ではベーシックなやり方であるように思われます。 一方、Text Encoderでは次のような処理が行われます。 手順2.でCNN Layerを通過することにより、各単語を表現するベクトルには周囲の単語のベクトルが畳み込まれます。
これにより、単語のベクトルに周囲の文脈が反映されることが期待されます。
手順3.でこれらの重み付き和を取ることで、「周囲の文脈が反映された単語の意味をバランス良く考慮したベクトル」が記事ベクトルとして出力されるのを期待できそうです。 なお、手順1.で用いるEmbedding Layerは、学習済み単語埋め込みモデル(GloVe)の重みを使って初期化されます。
これにより、学習済みモデルですでに獲得されている単語の基本的な意味を推薦システムに活用することができます。 また、タイトル・本文の各Text Encoderにおいて、Embedidng Layerのパラメータは共有されています。 NRMSも2019年に発表されたモデルですが、その時期はNAMLよりも新しいです。モデルの構造は下図のとおりです。
NRMSは説明の都合上、News Encoder → User Encoderの順に確認を行っていくことにします。 NRMSのNews Encoderで行っている処理は、NAMLのText Encoderと非常に似通っています。
ただし、NRMSのNews Encoderにおいて入力として用いられるのはタイトル属性のみとなっており、以下の流れで記事ベクトルを出力します。 NAMLのTextEncoderとの違いは、CNN LayerがSelfAttentionLayerに置き換わっている点です。 なお、手順1.で用いるEmbedding Layerに関しては、NRMSにおいてもNAML同様に、学習済みGloVeモデルの重みで初期化されます。 NRMSのNews Encoderでは、以下の手順によりユーザベクトルを出力します。 NAMLのUser Encoderとの違いは、SelfAttentionLayerの有無です。
クリック履歴をSelfAttentionLayerに通すことにより、クリックされた各記事のベクトルには記事同士の相互関係が反映されることが期待できます。 今回は上述のNAML, NRMSに加え、両者にいくつかの変更を加えたモデルの性能確認を行いました。 今回の実験で各モデルに加えた変更は、大きく2つに分けられます。 一つは、News Encoderの入力とする記事属性です。今回は以下の3パターンを試しました。 「タイトルのみ」はNRMSのデフォルト設定、「タイトル+本文+カテゴリ+サブカテゴリ」はNAMLのデフォルト設定になります。
両者に加え、カテゴリ情報を持っていない社内記事データをモデルに入力することを見越して「タイトル+本文」の性能も確認することにしました。 もう一つは単語をベクトルに変換するEmbedding Layerです。今回は以下の2パターンを試しました。 前者はNAML, NRMSのデフォルト設定です。 以上をまとめると、2つのモデルに対し、記事属性3パターン x Embedding Layer2パターンの変更を加えるため、合計12通りのモデルの性能を確認することになります。
以降ではモデルの設定に応じて、以下の表のようなnotationを利用することにします。 ここではNAMLを取り上げて説明していますが、NRMSにも同様のnotationを適用します。 実は、両モデルに似たような変更を加えた実験は、すでにMINDデータセットの論文[^MIND]で行われています(特にtransformerモデルを使う実験に関しては、別の論文7でもさらなる掘り下げが行われています)。 今回行った実験でも同様の傾向が確認できれば、実装の妥当性は概ね確認できたと言えそうです。 MINDデータセットには、簡単に実験を行うためのサブセット(small版)が公開されています。今回の実験ではこれを用いて各種モデルの訓練&評価を行いました。
なお、small版にはtest setが含まれていないため、性能評価はvalidation setに対するスコアで行うこととしました。
以上の設定からもわかる通り、これは厳密な再現実験ではないことに留意してください。 訓練時にはNAMLの論文[^NAML]にならい、少し特殊な予測を行います。 ここで定義された損失はWord2Vecの学習時の工夫として提案されたnegative samplingの発想を汲んでおり、提案論文8中ではこの損失も同様にnegative samplingと呼んでいます。「positive sampleに比べて遥かに多く存在するnegative sampleの情報を活用したい」という意図からこのような損失を定義したようです。 提案論文によると、downsamplingによりnegative sampleとpositve sampleを1:1にバランスさせた上で二値分類の誤差を損失とした場合に比べて、よい性能が得られたそうです。 評価指標は各種論文にならい、AUC, MRR, nDGC@5, nDGC@10を利用します。
各指標の評価内容をざっくり説明すると、次のようになります。 いずれの指標も、数値が大きければ大きいほどほどよい推論ができていることを示します。 学習時に用いた代表的なパラメータは以下のとおりです。 これらパラメータの設定時はいくつかの論文及び既存実装を参考にしました9が、記載が確認できなかったもの等については適当な数値を設定しています。その際にパラメータチューニングは行えていない点には留意ください。 なお、fine-tuneするBERTのレイヤーに関しては、論文[^MIND-BERT]にならい出力側から数えた2層分としています。 訓練に利用したGPUはRTX2080 Ti1枚のみですが、gradient accumulationによってBERT利用時でも実質的なバッチサイズを一貫させています。 各モデルの性能を前述の各指標で評価した結果は以下のとおりです。
なお、評価は学習におけるエポックの終了毎に行いました。
各図に載っているスコアは、そのうち最良のエポックのものになります。
まず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 correction12等)を特に盛り込んでいなかったので、スコアの上振れ/下振れが発生していることも考えられそうです。 今回の実験では、NAML・NRMSという2つのニュース推薦モデルに対し、いくつか変更を加えた上で性能確認の実験を行いました。
GloVeを利用したモデルについては概ね期待通りの結果が得られたものの、BERTを利用した場合に関してはまだまだチューニングの余地を残していることも確認できました。 また、試験的な結果ではありますが、社内のデータを用いた実験では、今回紹介したモデルを用いることで予測スコアがプロダクトで現状使われているアルゴリズムを上回ることも確認しました。
今後は、社内データを用いたより詳細な検証や、モデルの出力の定性的な評価も行いたいと思っています。 現在ストックマークでは、Anewsにおけるニュース推薦の課題を一緒になって考えてくれる気概のあるエンジニアやリサーチャーを絶賛募集中です!興味を持っていただけた方は、採用ページもぜひご覧ください!背景
MINDデータセット
性能確認を行ったモデル
まず、ニュース推薦において推薦対象となる記事は、大抵の場合速報性を重視して最新のニュースになります。つまり、誰も読んだことがない記事を推薦する必要があります。
また、頻繁に配信対象が更新されてしまうので、似たような興味を持つユーザであっても、アクセスタイミングが異なる場合は読む記事が一致しない状況が起こりえます。
これは、「似たような興味を持つユーザは似たような行動履歴を持つ」という前提が成り立ちにくいことを意味します。モデルの基本構造
一方、User EncoderはNews Encoderによってベクトル化されたクリックされた記事の履歴を受け取り、ユーザの興味関心を表現するようなベクトル(以降ユーザベクトルと表記)を出力します。
News EncoderとUser Encoderは、同じ次元数のベクトルを出力します。これにより、あるユーザがある候補記事をクリックする確率は、ユーザベクトルと記事ベクトルの簡単な計算によって表現することができます。NAML
User Encoder (NAML)
News Encoder (NAML)
NRMS
News Encoder (NRMS)
SelfAttentionLayerはBERT等のTransformerモデルの内部で用いられている層です。
その内部で行われている処理はやや複雑なのですが、大雑把に捉えると「各単語に対応するベクトルに対し、入力文中の全単語のベクトルを重み付けして足し合わせる」ようなことを行っています。
ここで重要なのは「各単語のベクトルには、文中の全単語が考慮される」という点です。これにより、「周囲の文脈」しか扱えていなかったCNN Layerに比して、文章の意味をより高度に捉えることが期待できます。User Encoder (NRMS)
行った実験について
ここで加えたかった変更に対応している既存実装コードが見当たらなかったので5、実装も自前で行うこととしました。
調査の最終目的は社内推薦システムへの応用なので、本来やりたいことは社内データを用いた性能評価です。
しかし実装の妥当性を確認するため、まずは公開データセットで性能確認を行うことにしました。
後者の発想は前者と同じく、「学習済みモデルで獲得された言語に対する理解を推薦システムに応用する」というものです。
transformerモデルは様々な応用先で単語埋め込みモデル以上の性能が確認されているため、推薦システムにおいても同様の性能向上が期待されます。
今回の実験では、transformerモデルの中でもベーシックなBERT−base uncaesd6を利用しました。
利用する記事属性/Embeding Layerの種類
GloVe
BERT
タイトルのみ
$ \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}$
その実験を確認すると、概ね以下のような傾向が読み取れます。
具体的な実験設定
利用するデータセットについて
また、データセットに含まれている「クリック履歴が存在しない行動データ」に関しては、train set, validation setの両方から除外しています。訓練方法について
ここではある学習サンプルが与えられたとき、そこから1つのクリックされた記事と、K個のクリックされなかった記事を適当に選びます。
そしてこのK+1個の記事の中から、どれがクリックされた記事であるかを予測します。その予測確率は、「ユーザベクトルと各記事ベクトルの内積を並べてK+1次元のベクトルを作り、それをSoftmax関数に通す」ことで得られます。
つまり、訓練時に解くのはK+1クラスの分類問題であり、損失も多クラス分類の損失として定義されます。
同様にnegative sampleの情報を活用する方法としては、「negative sampleとpositive sampleをmini batch単位でK:1にバランスさせた上で、positive側にKだけ重みを掛けた二値分類誤差を用いる」ことも考えられそうです。
両者の性能差を比較してみるのも面白そうですが、今回の実験では取り扱いません。評価指標について
学習時のパラメータについて
その他のパラメータに関しては、リポジトリのconfigに設定されているデフォルト値をご確認ください。
また、GloVeモデルは公開されている学習済みモデル10のうち、語彙数が一番大きい640Bのモデルを利用しました。
GloVeモデル利用時のtokenizerは、学習済みモデルの作成条件11に合わせてStanford Tokenizerを利用しています。実験結果
少なくとも、BERTを利用したモデルを扱う場合には、もう少しパラメータのチューニングを行う必要があると言えそうです。まとめ