【論文紹介】Neural Factorization Machines for Sparse Predictive Analytics - 1月 22, 2019 こんにちは、ぐぐりら(@guglilac)です。 最近、Factorization Machines(FM)を勉強しています。 なぜかというと、去年の年末にこの記事を読んで、おもしろそうだなと思ったからです。 [DeepなFactorization Machinesの最新動向 (2018) - Gunosyデータ分析ブログ](https://data.gunosy.io/entry/deep-factorization-machines-2018) 最近よくこのワードを聞くので、せっかくだし勉強しておくと論文読み会とかで出てきた時に楽しめるようになるかな、というモチベです。 今回は、deep + FMなもので上の記事で紹介されていなかったNeural Factorization Machines for Sparse Predictive Analytics(NFM)を読んだので、紹介記事を書いていきたいと思います。 NFMまでの研究の流れを追ってみようという気持ちのため、これより最近の論文(xDeepFMとか)は読んでないです。 いずれ読みたいです。 論文のリンク↓ Neural Factorization Machines for Sparse Predictive Analytics (追記) xDeepFMを読みました。 記事書いたのでよろしければ! xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systemsを読んだ ## 下準備 紹介に入る前に、キャッチアップをどんな風に進めていったかも一応書いときます。 協調フィルタリング関連の話題すらほとんど知らなかったので、ちゃんと論文を読めるようになる前にいろいろ前準備として勉強が必要でした(今もそんなに詳しいわけではもちろんないですが笑) まず普通のFMとはなんぞや、というところから調べました。 この辺りを参考にさせていただきました。 [一歩Matrix Factorization、二歩Factorization Machines、三歩Field-aware Factorization Machines…『分解、三段突き!!』 - F@N Ad-Tech Blog](https://tech-blog.fancs.com/entry/factorization-machines) カテゴリカルな変数を入力とする機械学習では、one-hot encodingしたものを入力とするが、このときにencodeされるベクトルはスパースになります。 カテゴリカルな変数どうしの交互作用を考慮したい、という考えでモデルを作ろうとすると、one hotなベクトルのままモデルに入力していると、トレーニングデータに入っていないデータがきた時にうまく対処できません。 また、交互作用を全ての組み合わせの項分入れると数が膨大になりつらいです。 このような問題から、FMでは一般に高次元のonehotベクトルを低次元のベクトルのembedして、そのベクトルの内積で交互作用を表現します。 ## NFMの概要 上で見たように、FMはカテゴリカル変数の交互作用を考えられるモデルです。 ですが、各重みについていうと線形モデルになっていて、表現力に欠けます。 そこで、交互作用の部分をより複雑なものでも表現できるように、非線形なモデルを用います。 具体的には、FMの交互作用の部分を$f(x)$に置き換えるということをします。 この$f(x)$をdeepなモデルでうまく作ります。 NFMはFMの交互項のところを$f(x)$で置き換えて一般化したものになっています。 以下でモデルの具体的な構成を見ますが、実際にNFMのhidden layerを0にして、prediction layerの重みを全て要素が1のベクトルをにするとNFMはFMに一致することがわかります。 (さらに、細かいことですが、 prediction layerの重みはフリーにしてもhidden layerの個数を0にすると、embedding layerに取り込まれると考えられるので、実質hidden layerを取り去るとprediction layerの重みによらずFMに一致する。(論文中の注釈参照) ) ## Neural Factorization Machines(提案手法) $f(x)$の部分は4つのcomponentからなります。 * embedding layer * bi-intaraction pooling layer * hidden layer * prediction layer 図にするとこんなかんじ。 embedding layerはFMと同じで、one hotベクトルを低次元なベクトルに変換します。 肝は二つ目のbi-intaraction pooling layerで、得られた低次元なベクトルの交互作用を抽出して一本のベクトルを得るlayerになります。 $x_i$が$i$番目の要素が立っているか(one hotベクトルの成分と思って) $v_i$がそれをembedしたベクトル。 embedしたベクトルをもとのonehot ベクトルの重みで重み付けしたあと、すべての変数の組み合わせでその要素積を計算します。これが特徴$i,j$の交互作用を表しています。 で、要素積(これはベクトルになる)の総和をbi-intaraction pooling layerの出力とします。 あとは普通にhidden layer(線形変換+活性化関数)を幾つか通して、prediction layerで重みと内積とってスカラーに落として出力します。これが$f(x)$. ## 利点 関連研究のFMやwide & deep やdeep crossと比較して、こんな良さがあります * dropoutやBNなどのテクニックが使えて収束が速い、過学習防止 * wide&deepやdeep crossより初期値についてロバストなので学習が楽 * 明示的に交互作用をモデルに組み込んでいるので層が少なくてすむ ## wide & deepなどとの差分は NFMのbi-interaction poolingをconcatenationに置き換えるとwide&deepやdeep crossになるぜ!と言っています. wide & deepはcross-product transformationというのを使ってwideの方で交互作用を考慮した表現を得るみたいな工夫をしているとかの細かい違いはあるけど、まあだいたい一緒です。 ちなみに今回の実験で、wide & deepはcross-product transformationを使っていない。(そういう特徴量エンジニアリングをしないでどこまでいけるか、みたいなのが研究の主旨だしね) 単純にwide & deepのdeepパートは、カテゴリ変数をembedして、ベクトル全部をconcatしてMLPに突っ込んでいます。(contiuous featuresはそのままconcat) deep crossは提案されたのがwide&deepより前で、wide(線形和)の要素はない(はず)。deepの部分が似てる(concatしたあとがMLPではなくresnetかどうかという違いはあるけど) concatでは、明示的に変数間の交互作用をうまく扱えていないから、その上のhideen layerを多く積まなくちゃいけなくなり、そのせいで学習が難しくなっているよね、というのが研究のモチベーションぽい。 concatだと変数(embedされたベクトル)同士の交互作用というより、要素ごとの交互作用を考えていることになるので、うまく交互作用を取り出せずにhidden layerに頼らざるを得ない、みたいな感じです。 [DeepなFactorization Machinesの最新動向 (2018) - Gunosyデータ分析ブログ](https://data.gunosy.io/entry/deep-factorization-machines-2018) でも書いてありますが、bitレベルでの交互作用か、vectorレベルでの交互作用か、みたいなところです。 「画像は周辺の情報を組み合わせるといい特徴が取れる」という問題(というかデータ)の性質をうまく扱うためにCNNが考案されたように、「カテゴリカルな変数が交互作用を考慮するといい特徴が取れる」という性質をうまく扱うレイヤーとしてbi-interaction poolingを作ってみたよ、みたいなイメージですかね。 ## 実験 三つの観点から実験してます。 ### dataset * frappe * movie lens 実データ二つ。 負例がないので、正例ログ一つにつきそのユーザーのlogとして存在しないものを2つ負例ラベルつけて加えている 入力データは全てonehot encodingしている. ### models * NFM(提案手法) * FM * HOFM * wide & deep * deep cross ### RQ1(Study of Bi-Interaction Pooling) * 普通のL2正則化よりdropoutかけたほうが過学習を抑えられてていいね * Batch normalizationを入れると収束が早くなるね ### RQ2(Impact of Hidden Layers) * 層なし(つまり普通のFMに近い)のと一層のを比較すると一層のやつが強い * けど、層を増やしまくっても性能は下がっていく(一層のやつが最強) * すでにBi-interaction-poolingで交互作用が取れていて一層で十分なのでは * bi-intaraction-poolingの部分をconcateに変えると層を増やす効果が現れた * けど、色々やっても結局NMF-1が一番強かったのでconcateにする必要もないよねという * ちなみにconcateにするとwide&deepになるのは前述の通り * NFMのemmbedding layerの初期値をFMで得られるものに設定したら学習が速くなるよ * 最終的なlossはランダム初期値でも同じ => 初期値に対してロバスト * 既存手法二つはランダム初期値だとFM初期値より悪かったので、学習が難しくて使いづらいね ### RQ3(Performance Comparison) * 概ねNFMが勝っていていい感じ * HOFM(FMの高次元の交互作用を考えているモデル)がFMよりいい * 高次元の交互作用を考える価値あり * 線形で高次元の交互作用を考えているHOFMより非線形のNFMの方が強いね * しかもパラメータの個数も少なくて済むし * deep crossが弱い * 学習が難しくて精度が出ない. * over fittingしている説 ## おわりに 論文中のconclusionで、 「最近deep learningはいっぱい層を積んで無理やり高性能なGPUを使って最適化してしまえばうまくいくぜ、的な論文が多いけど、ちゃんと解きたい問題に合わせて適切なアーキテクチャを選択、考案することで簡単に学習できるような努力はするべきだし、そういう方向に研究が進んでいって欲しい」 みたいなことが書かれてて、「おっ、既存手法にあるwide & deep を出したgoogle への皮肉か?」となってちょっと楽しかったです。 この論文読んでてわかりやすかったので、次はdeep + FMでより最近のものを読んで見たいと思います。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント Unknown2019年2月7日 18:02当ブログ拝見致しました。競プロ・Web・MLと幅広いテーマで記事を書かれており、感激しております。当方は株式会社データグリッド(https://datagrid.co.jp/)CTOの小川と申します。弊社ではGANsを主幹技術としたクリエイティブなAIを用いた事業を展開しております。もしご興味を持たれましたら、ご一報いただけると幸いです。よろしくお願い致します。返信削除返信返信コメントを追加もっと読み込む... コメントを投稿
当ブログ拝見致しました。競プロ・Web・MLと幅広いテーマで記事を書かれており、感激しております。当方は株式会社データグリッド(https://datagrid.co.jp/)CTOの小川と申します。弊社ではGANsを主幹技術としたクリエイティブなAIを用いた事業を展開しております。もしご興味を持たれましたら、ご一報いただけると幸いです。よろしくお願い致します。
返信削除