はじめに
こんにちは。研究開発チームの関です。 最近毎週日曜日の恋するワンピースの更新を楽しみに生きています。好きなツッコミは「この船の航海士は誰?」です。 あと虹のコンキスタドールのベストアルバム「THE BEST OF RAINBOW」は皆さん買いましたか? 健康にいいので毎日聞きましょう。
この記事はGunosy Advent Calendar 2018の22日目の記事です。 昨日はcou_zさんの「【年末年始に読みたい】Gunosyエンジニアが2018年に購入した書籍まとめ」でした。
皆さんFactorization Machinesは好きですよね。 予測モデル構築においてはXGBoostと並んでとりあえずやっておくべき手法として知られています。 今回のエントリではKDD2018で発表されたxDeepFMを読み解きながら、 DeepなFactorization Machineの現状について、特にネットワークアーキテクチャの発展を中心に見ていきたいと思います。
Factorization Machines (FM)は特徴量の交互作用をうまく計算できるモデルです。
例えば年齢を表す特徴量と、性別を表す特徴量があった場合、10代の男性というAND条件の特徴を年齢と性別の交互作用で表現します。
すべての交互作用について学習をしようとすると、重みの数が著しく増えますし、対応する学習データの数も少なくなります。困りますね。
そこでFactorization Machinesです。交互作用の重みを各特徴量に対応するベクトルの内積で表現することでやっていくことにしています。
具体的には以下の式ですね。 FMといえばこの定義ですが、正確にはこれは2nd-order Factorization Machinesです。
なにが2nd-orderなのかといえば、変数の交互作用が と2つの変数となっています。
これが2次の交互作用なので2nd-orderです。理想的にはすべての変数に対して交互作用が存在する気がしますが、高次になると計算が大変で難しいです。 また最近では現実的に解けるHigh-OrderなFMも提案されていますが、高次にしても3次ぐらいまでしか精度が上がっていかないみたいです。
これはデータに潜在的に存在するノイズの原因で高次の学習はしんどいのでは、と言われています。 詳しい説明とか実装は、社会にいろいろなブログが存在するのでそちらを読んでください。*1 さて最小二乗法の3次元版として話題なDeep Learningの話です。*2
Deep Learningは原理的には変数の重み付け和と非線形変換を繰り返す手法なので、理想的には積んだ層の数だけ交互作用が考慮されているはずですね。
そういう意味ではDeep LearningはFactorization Machinesといえるかもしれません。
しかし残念ながらそう簡単にはいきません。 xDeepFM[Lian+, KDD2018]に紹介されていた手法をもとにDeepなFactorization Machinesの研究を追っていきます。 DeepなFactorization Machinesを考える上で一番基礎的だと考えられているモデルです。
内容としては普通の多層ニューラルネットですが、入力データを各変数ごとにEmbeddingしている点が特徴です。
広告データやウェブのデータは画像などと違いカテゴリカルな変数が多いので、それぞれを異なるものと考えてEmbedすることによって効率的に学習しようとしていると推測されます。 FNNとほぼ同時期に提案されたDCNはほぼ同じアーキテクチャです。Microsoftのチームで広告のクリック率推定問題を扱っています。
異なるのは上に積まれているのが、ResNetだという点です。 ほぼ同時期で、同じようなアーキテクチャですが、Factorization Machinesの文脈ではよくFNNのほうが引用されています。
これはFNNがオープンなデータで実験しており、パラメータなども公開しているのに対して、
DCNは企業内の内部データに対する実験になっていた点があるのかなと思います。
一方で後発の論文での比較結果を見る限り上に積まれているのがResNetなので、FNNよりこちらのほうが精度が高いようです。 これも同時期のモデルです。Googleのチームにより提案されています。
カテゴリカル変数をEmbedして扱うところまでは一緒なんですが、違うところは線形モデルを出力層でくっつけていることです。
こんなんで上手くいくの?って思っちゃうんですけどうまく行っちゃってます。上記FNN、DCNより強いです。
TensorflowにAPIがあってすぐ使えるのも魅力的ですね。 ここまで紹介してきた手法は高次な交互作用を扱っているんですが、
Embedしたベクトルの各要素同士の交互作用なので、変数Aと変数Bというような明示的な交互作用ではないです。
いうなればbit単位の交互作用を扱っているモデルといえます。
ですがWide&Deepで見られるように、低次元な特徴を出力にうまく反映させるのは難しいです。
これは深層学習全般にいえることで、
例えばCNNは画素の周辺の情報が重要でフィルタによって重要な情報が取れるという低次元な特徴のとり方をアーキテクチャに導入しています。
カテゴリカル変数は交互作用が重要ということをアーキテクチャに組み込めないかというのがPNNで考えていることです。 以下にアーキテクチャと式を示します。 ,
,
,
] 工夫されているのがのところで、との和として表現されています。
は通常の入力変数の重み付け和ですが、
は としてが生成されるように2次の交互作用になっています。
は内積、外積、もしくはその組み合わせを用いています。
つまり2次の交互作用を明示的にLayerとして定義していることになります。 Criteoのデータセットによる結果はこのようになっておりまして、embedを積み上げたFNNより、明示的に2次の交互作用を入力したPNNのほうが良い結果となっています。
(IPNNは内積、OPNNは外積、PNN*は内積と外積の組み合わせです)
面白いですね。深層学習は特徴を自動で生み出すみたいなことはよく雑な文章で書かれますが、これを見る限り、やはりデータの気持ちをアーキテクチャで表現することは非常に大事だとわかります。
xDeepFMの著者はこのように明示的に交互作用を入力することをvector単位の交互作用と言っています。 次に紹介するモデルはWide & Deepの発展形といえばいいんでしょうか。 FM層はFactorization Machinesと全く同等です。そしてFM層の上に層がなく直接出力層とつながっています。
つまり交互作用はより高次に学習させるより、そのまま出力につなげたほうがいいんじゃんという主張になっています。
こんなんでうまくいくのかという気持ちになるんですが、うまくいくんですねこれが。 このような結果です。そもそもPNNよりLR+DNN(実質Wide & Deep)のほうが強いんですね、悲しいことです。
DNN+FMとDeepFMの違いはFMへの入力をembedするかどうかですね。
つまるところ明示的な交互作用に対して層を積んでいくのは相性が悪いのでしょうか?Deep Learningまるでわかりません。 こちらはADKDDにおけるGoogleのチームによる論文です。
高次の交互作用をどう考慮するか、という問題に対してより明示的にしたアーキテクチャを提案しています。 これだけだとよくわからないので、CrossLayerの式と概念図を示します。 つまり入力となると各層の出力との積を入力とするアーキテクチャといえます。
明示的に入力変数との交互作用を考慮しようという意図があります。 強い手法との比較ではないですが、シンプルなDNNに比べて良い結果がでており、高次の交互作用を明示的に設計することでよい学習ができていることが示唆されています。 ようやく本エントリの本題である、xDeepFMの紹介に入ります。 ここまで紹介してきたDeepなFactorization Machinesを振り返ると以下のようなことが言えると思います。 これを踏まえ xDeepFMのコンセプトは以下となっています。 vector単位で明示的に高次の特徴を学習するアーキテクチャとしてCINを提案しています。 伝搬の式は以下のようになります。 ここでであり、 i-th fieldを として、embedされた特徴量が各fieldにはいることとします。 Dはembeddingの次元です。 として、はk層目の次元数、です。 はHadamard productです。
例としてこのようになります。 RNNに似ていますね。入力が各層にはいり、各層の出力が隠れ層のように振る舞っています。 そして各層の出力はsum poolingされ、シグモイド関数で出力されます。 ,
] ではこれで高次の特徴を学習できているのかを見てみましょう。 シングルモデル同士の比較を行っています。
層の数が交互作用の次元です。CriteoのデータセットはLogrossはDNNのほうがいいですが、それ以外はCINがoverperformeしています。
Bing Newsのデータでは層の数が5層になっているのでかなり高次のデータを活用していることがわかりますね。いいことです。
このようにCINで明示的に高次の交互作用をvector単位で学習することができ、その結果良かったことがわかりました。 さてCINで高次の特徴をvector単位で明示的に学習できました。
これをimplicitな特徴と組み合わせましょう。そう、Wide & Deepですね。アーキテクチャを示します。 壮大ですね。やっていくぞという気概を感じます。
CINと、通常のDNNに加えて線形モデルもくっついています。 ところでこのアーキテクチャの図なにかに似ていると思いませんか?
似ていませんかそうですか。こちらからは以上です。 結果です。すべてのデータセットでoverperformeしました。よかったですね。
つまり高次の交互作用については暗黙的なものと明示的なものを組み合わせると良いといえます。
一方でLayerの数はそこまで大きくないですね。最大でも4次の交互作用までしか考慮されていないといえそうです。 公式、非公式で各アーキテクチャの実装が公開されているので紹介しておきます。 CTR予測系の各種手法を実装&検証できるように公開しているリポジトリです。強いです。
なお実装については非公式実装です。 今回紹介した手法のなかでは以下の手法が公開されています。 公式です。というかTensorflowのAPIです 公式実装です。
github.com 公式実装です。
github.com 以上KDD2018のxDeepFMを読み解きながら、近年のDeepなFactorization Machinesの動向についてまとめてみました。
変数明示的に組み合わせたほうがよかったり、上に積んでもうまくいかなかったり、新鮮に感じる結果が多かったです。
Wide and Deepあたりのパラダイムはなんでもありという感じで気持ちがいいですね。
低次の特徴をいれたほうがいいというのは、RNNの勾配損失問題とかともなんか近いものを感じます。
もしかしたら、データと計算リソースが無限にあればこういう凝ったアーキテクチャとかもいらないのかもしれないですね。
このあたりの分野が今後どのように進展していくのかは注目していきたいと思います。 *1:すごく参考になりました: http://echizen-tm.hatenablog.com/entry/2016/09/11/024828 *2:現実には松尾先生が「Deep Learningは最小二乗法のおばけみたいなもの」といって、それをだれかがAIは最小二乗法の3次元化と解釈したらしいですね。 https://medium.com/@tokoroten/%E3%81%8A%E3%81%98%E3%81%95%E3%82%93%E3%81%AF%E4%BD%95%E6%95%85newspicks%E3%82%92%E8%AA%AD%E3%82%80%E3%81%AE%E3%81%8B-59ebb60543b0
Factorization Machines [Rendle, ICDM2010]とは
Deep LearningにおけるFactorization Machines
Factorization-machine suppoerted Neural Network (FNN) [Zhang+, ECIR2016]
Deep Crossing Network (DCN) [Shan+, KDD2016]
Wide & Deep [Cheng+, arXiv:1606.07792 (2016)]
Product-based Neural Network (PNN) [Qu+, ICDM2017]
DeepFM [Guo+, IJICAI2017]
Deep Cross Network (CrossNet) [Wang+, ADKDD2017]
xDeepFM [Lian+, KDD2018]
コンセプト
Compressed Interaction Network (CIN)
eXtreme Deep Factorization Machines (xDeepFM)
各アーキテクチャの実装
DeepCTR
Wide and Deep
PNN
xDeepFM
まとめ
参考文献