xDeepFMとは　~推薦アルゴリズム~ 

#はじめに
今回はレコメンダシステムのxDeepFMを紹介していきます。元の論文は[ここから](https://arxiv.org/pdf/1803.05170.pdf)確認できます。

概要に入る前に簡単にFactorization Machinesの説明をします。既知の場合は「概要」まで飛ばしてください。

機械学習の分野では特徴量エンジニアリングが重要になり、その中の一つに"cross features"や"multi-way features"と呼ばれる手法があります。たとえば$x_1,x_2$を説明変数としたとき、$x_1*x_2$を新たな説明変数として用いることをcross featuresと呼びます。しかし、正しいcross featuresを得るにはドメイン知識が必要ですし、変数が多いデータでcross featuresを行うことは実現性がありません。また、このようにして作ったcross featuresは未知の変数の相互作用は説明できません。
そこで、Factorization Machine(FM)があります。各特徴i(m-dim)をmよりずっと小さい次元であるD次元の潜在要素ベクトル$v_i=[v_{i1},v_{i2},\cdot\cdot,v_{iD}]$に埋め込み、特徴の相互作用を$f(i,j)=\<v_i,v_j\>x_ix_j$で表現します。この論文では$v_{i1}$をbitと呼びます。

しかし、FMの欠点は有用でない組み合わせの特徴の相互作用を生み出し結果を悪くしてしまうことにあります。そこで特徴量の表現力が強いDNNを使おうとするモデルが生まれました。DNNを活用したFNNとPNNは、しかし、高次元の特徴量の相互作用に焦点を当てており、低次元の特徴量の相互作用をあまり捉えることができていませんでした。そこでWide&DeepとDeep FMはそのような問題点を解決しました。しかし、DNNは高次元の特徴量の相互作用を暗示的に行なっているため、特徴の相互作用がどの次元まで行われているかに関する理論的帰結はありません。さらに、FMはベクトルワイズに特徴を作用させるのに対してDNNはbitワイズに作用させるため、DNNが果たして効果的なのかは疑問が残っています。そこで今回の論文では明示的でベクトルワイズな特徴の交互作用を学習するニューラルネットワークモデルを提案します。今回のモデルはDeep & Cross Networkに基づいていますが、このモデルは特別な形の交互作用のみ捉えることしかできません。今回扱うxDeepFMは高次元の明示的な交互作用と暗示的な作用と伝統的なFMを組み合わせたモデルになり、これらの問題の解決をはかります。

#概要

### Embedding Layer
Embedding Layer(埋め込み層)はone-hot encodingなどの特徴を低次元で密なベクトルにします。
![スクリーンショット 2019-07-24 13.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/a009f575-f888-ea8b-f403-e1e3e0c70bfb.png)
ここで、上の画像の例を見てみましょう。これはone-hot encodingで書かれている特徴で、useridやgenderはfieldです。一方、1578のような具体的なuser idやmaleというのはfeatureになります。
![スクリーンショット 2019-07-24 13.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/23a42077-9a27-31ae-408d-d09cd4d221f1.png)
Embedding layerはe=[$e_1,e_2,\cdot,\cdot,e_m$]というベクトルを出力します。ここで、mはfieldの数で$e_i$は、あるfieldのembeddingを表します。one-hot encodingでは各field内のfeatureの数はまちまちでしたが、embeddingの場合は長さは同じになります。

### 暗示的な高次元の交互作用
暗示的な高次元の特徴の交互作用は以下のようにして学習していきます。
![スクリーンショット 2019-07-24 14.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/6b8e1503-0600-3fb8-d1c3-6e72dab7907d.png)
ここで、kは層の深さで$\sigma$は活性化関数です。これは下の図で"FM layer or Product Layer"の部分を取り除いたものになります。
![スクリーンショット 2019-07-24 14.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/70da79ef-998e-de07-c346-b4884ec4d1de.png)
PNNとDeep FMは上記の構造に加え、two-wayのベクトルワイズの交互作用を明示的に加えてます(上図のFM layer or Product Layerにあたります)。PNNはproduct layerの出力をDNNに加えるのに対して、Deep FMはFM layerを直接output unitに接続しています。

### 明示的な高次元の交互作用
CrossNetは明示的な高次元の特徴の交互作用を可能にしています。隠れ層は以下のように計算されています。
![スクリーンショット 2019-07-24 14.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/917fb4b4-ede8-c191-8fdc-071dcde19fe8.png)
下図はこの式を図示したものになります。
ここで、cross networkのk層目の出力$x_k$は$x_0$のスカラー倍になります。
![スクリーンショット 2019-07-24 14.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/b5858400-6dfc-c609-83dd-dc5da6c936bd.png)
しかし、CrossNetの欠点は各隠れ層が$x_0$のスカラー倍にしかならない点やbit wiseで交互作用を求めている点にあります。

### Compressed Interaction Network
今回扱うxDeepFMはCINというネットワークを持ちます。CIN(Compressed Interaction Network)は以下の特徴を持ちます。

* ベクトルワイズで交互作用を求める
* 高次元の交互作用が明示的である
* 交互作用の次元が増えても複雑さが指数的に増えない

field embeddingの出力を$X^0$とすると、$X_{i,*}^0=e_i$となり、Dはfield embeddingの次元になります。CINのk層目の出力は$X^k\in \mathcal{R}^{H_k\times D}$となります。$H_k$はk層での特徴ベクトルの数で$H_0=m$になります。
![スクリーンショット 2019-07-24 14.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/004366eb-d1a2-af6d-159e-65371b99f021.png)
ここで、$1\leq h\leq H_k$,$W^{k,h}\in \mathcal{R}^{H_{k-1}\times m}$はh番目の特徴ベクトルに対するパラメーターです。◦ はHadamard productで⟨a1, a2, a3⟩◦ ⟨b1,b2,b3⟩ = ⟨a1b1, a2b2, a3b3⟩となります。ここで$X^k$は$X^{k-1}$と$X^0$の明示的な交互作用により導き出され、交互作用の程度は層の深さとともに増えていきます。embedding vectorの構造を保ったままの交互作用なので、ベクトルワイズになっています。
このCINはCNNのように捉えることができます。
![スクリーンショット 2019-07-25 15.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/f84a94ae-2b5d-a5a9-e872-4fc06adf7a8d.png)
$X^k$と$X^0$の外積の結果を$Z^{k+1}$とすると、これを画像として扱うことができます。そして$W^{k,h}$はfilterになります。filterは$Z^{k+1}$のembedding次元 (D)に沿ってスライドさせます。$X_{i,\*}^{k+1}$ はfeature mapと呼ばれます。そのため、$X^{k+1}$は$H_{k+1}$の異なるfeature mapの集合になります。
次は上図の(c)を参照してください。全ての隠れ層$X^k$はoutput unitと繋がりがあります。まず、各隠れ層のfeature mapのsum poolingを適用します。
![スクリーンショット 2019-07-25 15.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/5083bb6c-0c7a-5966-25c9-358ed50ad032.png)
ここで$i\in [1,H_k]$。こうしてpoolingベクトル$p^k=[p_1^k,p_2^k,\cdot,\cdot,p_{H_k}^k]$を得ます。全ての隠れ層からのpoolingベクトルはoutput unitのまえで結合され、$p^{+}=[p^1,p^2,\cdot,\cdot,p^T]\in \mathcal{R}^{\sum_{i=1}^T H_i}$となります。もし、CINをバイナリーの分類に用いるとしたら、output unitは
![スクリーンショット 2019-07-25 15.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/b6ae7320-b143-a00f-0aa1-a17134d05da1.png)
となります。

### CINの分析

#### Space Complexity
CINの合計のパラメーターの数は$\sum_{k=1}^{T}H_k\times(1+H_{k-1}\times m)$となり、embedding次元Dからは独立です。一方で、T layersのDNNは$m\times D \times H_1 + H_T+\sum_{k=2}^{T}H_k\times H_{k-1}$個パラメーターがあり、これはembedding次元Dとともに増加します。たいてい、mと$H_k$は大きくないので、$W^{k,h}$のスケールは許容されます。ただ必要な場合は、L orderの分解が可能で$U^{k,h}\in \mathcal{R}^{H_{k-1}\times L}$と$V^{k,h}\in \mathcal{R}^{m\times L}$を用いて、
![スクリーンショット 2019-07-25 16.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/a787dd2c-d315-4cd5-239b-032b681f5ab9.png)
と表せます。ここで、L<<H, L<<mです。今後、各隠れ層はある一定の数だけのfeature map(H個)を持つと仮定します。L order分解でspace complexityは$O(mTH^2)$から$O(mTHL+TH^2L)$に減らせます。

#### Time Complexity 
テンソル$Z^{k+1}$を計算するコストは$O(mHD)$時間で、T LayerのCINの計算は$O(mH^2DT)$時間かかります。一方で、T LayersのDNNは$O(mHD+H^2T)$時間でCINの方がコストが高いことがわかります。そのため、CINの欠点はtime complexityにあることがわかります。

#### Polynomial Approximation
演繹的にk層目のh番目のfeature mapは以下のように表せることがわかります。
![スクリーンショット 2019-07-25 16.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/3bb04fd7-8abe-b80b-48b6-cca23d7205cf.png)
従来のpolynomialは$O(m^k)$係数がありましたが、CINでは$O(km^3)$でpolynomialを近似できます。

### Combination with Implicit Networks

![スクリーンショット 2019-07-25 16.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/0868705e-6202-c00f-0e25-c61ef9306239.png)
普通のDNNは暗示的な特徴の相互作用を学習するため、CINとDNNはお互いを補う合う関係にあるといえます。両者を結合することでモデルをより強くすることができます。xDeepFMのoutput unitは結果として以下のようになります。
![スクリーンショット 2019-07-25 16.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/12601602-d437-13e3-e01d-ce33d8a44e53.png)
ここで、$\sigma$はシグモイド関数で、aはinput featuresで$x_{dnn}^k,p^{+}$はそれぞれDNNの出力とCINの出力になります。
損失関数は以下のようになります。
![スクリーンショット 2019-07-25 17.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/ed7b0b67-fde6-11cb-616a-a4e40ab71f84.png)
最適化は以下の目的関数を最小化することで行われます。
![スクリーンショット 2019-07-25 17.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347235/ef7c0ccc-0032-64d5-2105-bd5c24cde1f3.png)