AutoEncoder系の手法でTop-N推薦まとめ

# はじめに

こんにちは。

今回は、Deep Learningの手法の中でもAutoEncoder系の手法(Denoising AutoEncoderやVariational AutoEncoderなど)をTop-N推薦タスクに適用した研究をいくつかまとめてみようと思います。

Deep Learningの手法を推薦タスクに適用するといった研究は近年増えています。
従来の推薦タスク用いられる協調フィルタリング系の手法にDeep learningを組み合わせる研究については、次のような記事があります。

* [DeepなFactorization Machinesの最新動向 (2018) - Gunosy データ分析ブログ](https://data.gunosy.io/entry/deep-factorization-machines-2018)
* [Collaborative Metric Learningの関連研究まとめ - Qiita](https://qiita.com/guglilac/items/3b938bcb811245df39a2)
* [IRGAN (SIGIR 2017)→GraphGAN (AAAI 2018)→CFGAN (CIKM 2018) を読んで GAN による購買予測/協調フィルタリングを学ぶ - 糞糞糞ネット弁慶](https://repose.hatenadiary.jp/entry/2018/11/09/091710)


特に、三番目の記事はGenerative Adversarial Network (GAN)を推薦タスクに用いた研究をまとめた記事ですが、IRGAN→GraphGAN →CFGANという流れで説明されています。

今回の記事もこれに倣って、

CDAE (2016)→Mult-VAE (2018)→RecVAE (2020)

という流れでまとめていきたいと思います。
それ以外の関連する手法については後ろに回していますので、詳しく知りたい方は論文を読まれることをお勧めいたします。


# Collaborative Denoising Auto-Encoders (CDAE) [Wu+, 2016]

一つ目は、Denoising Auto-Encoder (DAE)を推薦タスクに応用したCollaborative Denoising Auto-Encoders (CDAE)です。

論文リンクはこちらです。
[Collaborative Denoising Auto-Encoders for Top-N Recommender Systems](https://alicezheng.org/papers/wsdm16-cdae.pdf)

通常のAutoEncoderでは、入力と出力が近くなるようにEncoderとDecoderを学習していきます。
一方、DAEでは、入力にノイズを乗せ、AutoEncoderのようにEncoder、Decoderへと通し変換させ、得られる出力がノイズを乗せる前のデータに近くなるように学習します。


ノイズの乗せ方はいろいろありますが、今回推薦タスクに用いるノイズとして、入力ベクトルの各次元の値をランダムに0にする、という処理を採用しています。

CDAEのモデル全体は次のようになっています。

![CDAE_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449005/234ec495-fce5-a3eb-cec1-c2c38bf72059.png)


本論文で提案しているCDAEでは、入力にuser $u$ のinteractionの履歴 $\boldsymbol y_{u}$ (item数の次元を持ったベクトルで、過去にinteractionがあったitemに対応する次元のみ1が立っているようなone-hotベクトルを想像すると良いと思います。)を用いています。図はitemが5つである場合を表しています。


user $u$ のinteractionの履歴 $\boldsymbol y_{u}$ のうち一部を0にした $\boldsymbol{\tilde y_u}$ を入力し、EncoderとDecoderが変換を行い、得られた出力が一部を0にする前のinteractionの履歴 $\boldsymbol y_{u}$ に近づけるように学習します。

userのinteractionの履歴の一部をランダムに隠した状態から、userのitemへのinteractionの履歴を復元するというタスクを解くことで、Top-N推薦を行うというのが核となるアイデアです。

ここまでは単にDAEにuserのinteractionの履歴を入れているだけですが、CDAEではuserのembedding 
 $\boldsymbol V_u$を中間層に足すという工夫をしています。
上の図でいうと、赤いnodeやエッジがuser特有の情報になります。

Encoderだけ書くと、次のようになります。($h()$は活性化関数、$b$はバイアス項です。)

```math
\boldsymbol z_{u}= h(\boldsymbol W^\top \boldsymbol{\tilde y_{u}} + \boldsymbol V_u+ \boldsymbol b)

```


損失関数は、Squared LossやLogistic Lossを試しており、実験の結果ではLogistic Lossを用いた場合が良い結果となっています。
また、userのembeddingを足すという工夫をする場合としない場合で、足す工夫をしたCDAEが単純なDAEよりも良い性能を出していることも実験にて確認しています。


CDAEについては自分のブログにも解説記事を書いたので、よろしければそちらもどうぞ！

[【論文紹介】Collaborative Denoising Auto-Encoders for Top-N Recommender Systems (WSDM2016) - ぐぐりらにっき](https://www.smartbowwow.com/2020/03/collaborative-denoising-auto-encoders.html)


# Multinomial Variational Auto-Encoder (Mult-VAE) [Liang+, 2018]

論文はこちら。

[Variational Autoencoders for Collaborative Filtering](https://arxiv.org/abs/1802.05814)

先ほど説明したCDAEではDAEを用いていましたが、こちらのMult-VAEではその名の通り、Variational Auto-Encoder (VAE)を用いて推薦を行っています。
VAEは[こちら](https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24)で詳しく解説されています。

また、CDAEでは損失関数がSquared LossやLogistic Lossでしたが、こちらではVAEの再構成誤差の部分にMultinomial likelihoodを用いています。

多項分布を仮定することで、Top-N推薦に良い結果をもたらすのではという仮説のもと、この再構成誤差を用いたそうです。
極端な話、Logistic Lossでは予測されるuserのinteractionの履歴が、すべてのitemで1になるようなこともあり得るわけですが、Multinomial likelihoodであれば各itemに該当する確率の和が1になるという制約があるので、いい具合に順序がつくかも、という解釈でしょうか。

通常のVAEの損失関数は、ELBOとして次の式で書かれますが、第一項が再構成誤差(厳密には負の、ですが)であり、この部分がMultinomial likelihoodになります。


```math
\mathcal L(\boldsymbol x_u;\theta, \phi)= E_{q_{\phi}(\boldsymbol z_u|\boldsymbol x_u)}[\log p_{\theta}(\boldsymbol x_u|\boldsymbol z_u)-\mathrm {KL}(q_{\phi}(\boldsymbol z_u|\boldsymbol x_u)||p(\boldsymbol z_u))]
```

ただし、第一項はMultinomial likelihoodであり、

```math
\log p_{\theta}(\boldsymbol x_u|\boldsymbol z_u)=\sum_{i}\boldsymbol x_{ui}\log\pi_i(\boldsymbol z_u)
```

としています。
$\pi_i(\boldsymbol z_u)$は多項分布のuser $u$のitem $i$に該当する確率を予測したものです。
Decoderは最後に出力をsoftmaxにかけることで和が1になるようにして $\pi_i(\boldsymbol z_u)$ を出力するということです。


損失関数の第二項は事前分布と近似した分布のKLダイバージェンスですが、Mult-VAEではこのKLダイバージェンスを正則化項と見て、第二項に係数 $\beta$ をつけます。


```math
\mathcal L_{\beta}(\boldsymbol x_u;\theta, \phi)= E_{q_{\phi}(\boldsymbol z_u|\boldsymbol x_u)}[\log p_{\theta}(\boldsymbol x_u|\boldsymbol z_u)-\beta \mathrm {KL}(q_{\phi}(\boldsymbol z_u|\boldsymbol x_u)||p(\boldsymbol z_u))]
```

KL項に係数 $\beta$ をつけるというアイデアはこの論文自体のアイデアではなく、$\beta$-VAEと同じ形式です。

ただ、$\beta$-VAEはもともと特徴のdisentanglementを実現するためのモデルで、$\beta>1$ にすることでもつれのない特徴を得るのが目的でした。

$\beta$-VAEについてはこちらでも触れられています。

[深層生成モデルを巡る旅(2): VAE - Qiita](https://qiita.com/shionhonda/items/e2cf9fe93ae1034dd771#%CE%B2-vae-higgins-2017)

一方Mult-VAEでの $\beta$は $0<\beta<1$ の範囲で動かします。
論文中では、「**そんなにKL項の制約を満たさなくていいから、正しく再構成して良いレコメンドができればいいよね。なのでKL項の係数は通常のVAEよりも小さくします**」という主張がなされていました。

$\beta$ の決め方は、$\beta=0$ からスタートして、学習を進めるごとに大きくしていき1まで近づけます。
どこかで性能がピークを迎えるので、その地点での $\beta$ を記録しておき、再度 $\beta=0$ から学習します。
次は記録したピークの $\beta$ に到達したらそこからはその $\beta$ で学習し続ける、という方法を提案しています。
下図では $\beta=0.2$ を記録したあと再学習しています。

![スクリーンショット 2020-03-10 0.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449005/b7928798-fd07-a4d4-5de8-a0f131bfee8f.png)


実験ではMult-VAEの他に、DAEの損失関数にMultinomial likelihoodを用いたMult-DAEも比較対象としていました。結果、Mult-VAEが優れており、VAEを用いるのが良い結果をもたらすことを示しています。


# Recommender VAE (RecVAE) [Shenbin+, 2020]

論文はこちらです。

[RecVAE: a New Variational Autoencoder for Top-N Recommendations with Implicit Feedback](https://arxiv.org/abs/1912.11160)


Recommender VAE (RecVAE)は、先ほど説明したMult-VAEを改良した研究です。
具体的には、以下の点で改良されています。

* Encoderの構造を改良
* composite priorの提案
* KL項の $\beta$ の決め方の提案

基本的に、Mult-VAEと目的関数は同じくELBO由来となっています。
再構成誤差はMultinomial likelihoodを用いているし、KL項には係数 $\beta$ がかかっています。

## Encoderの構造

Encoderの構造は、swish activation functionやlayer normalizationを用いて改良したとのことです。
詳しく知りたい方は論文を参照していただきたいです。
次のような構造へ改造したそうです。

![スクリーンショット 2020-03-10 10.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449005/2d1f2e05-67e7-9662-1022-6564baca8981.png)


## composite prior

通常のVAEは、潜在表現 $\boldsymbol z_u$ の事前分布を標準正規分布としているのが普通だと思いますが、この研究ではこの事前分布にcomposite priorを提案しています。


composite priorは次のように定式化されます。

```math
p(\boldsymbol z|\boldsymbol \phi_{old}, \boldsymbol x)=\alpha \mathcal N(\boldsymbol z|0,\boldsymbol I)+(1-\alpha)q_{\boldsymbol \phi_{old}}(\boldsymbol z|\boldsymbol x)
```

第一項は通常の事前分布に用いられる標準正規分布です。
第二項は、一つ前のepochのencoderで近似される分布です。

強化学習でよく知られるforgettingという性能を低下させたり学習が不安定になる現象が今回も見られるので、このように一つ前のepochのencoderから大きく変化しすぎないように制限をかけるテクニックが有効だそうです。

## KL項の係数の決め方

Mult-VAEでも0から1へ学習を進めるにつれ大きくしていくなど、工夫を凝らしていましたが、なんとこの論文中では「**$\beta$ を学習中に変化させてもあまり結果に影響しなかったので、一定にした**」と書かれていました。

新しい $\beta$ の決め方は、userに依存させています。
なんやかんや計算したり仮定を入れたりして、結局次のように決めるのを提案しています。

```math
\beta = \gamma \sum_{i=1}^n \boldsymbol x_{ui} 
```

$\gamma$ はハイパーパラメータで、userによらず一定です。
後ろのsumは、user $u$ がinteractionしたitemの個数です。

## Denoisingはしないの？

僕はMult-VAEを読んだ時に、

「**DAEは入力の一部を0にして復元するから推薦に使えるのはしっくりくるけど、VAEが推薦できているのってよくわからなくない？**」

と思いました。

で、RecVAEを読んだら、

「**コードを見るとMult-VAEはdenoisingしていて、そうすると自分たちの結果と合う**」

と書いてありました。
そうであれば理解できるのですが、論文を見ただけだとMult-VAEはdenoisingしていないように見えたので、混乱しました。
Mult-VAE(denoisingあり)> Mult-DAEであれば、しっくりくる気はします。

というわけで(?)本研究でははっきりと、RecVAEでは入力にノイズをつけてencoderに通している、と書いています。

(間違って理解していたら申しわけありません。読んだ方、間違っていたら教えていただければ幸いです。)

# その他の関連する手法

ここまでで、本記事の本流の説明が終わりました。
最後に、AutoEncoder系で推薦を行う関連研究について軽く触れて終わろうと思います。

## Wasserstein autoencoders (aWAE)  [Zhong+, 2018]

論文リンク:
[Wasserstein Autoencoders for Collaborative Filtering](https://arxiv.org/abs/1809.05662)

こちらは、今回紹介したDAEやVAEではなくWasserstein autoencoders (WAE)を協調フィルタリングのタスクに用いた研究となっています。

## VAEGAN  [Yu+, 2019]

論文リンク:
[VAEGAN: A Collaborative Filtering Framework based on Adversarial Variational Autoencoders](https://www.ijcai.org/Proceedings/2019/584)

Adversarial Variational Bayes (AVB)という、VAEとGANを組み合わせたようなネットワークを推薦に使っている研究です。

<img width="678" alt="スクリーンショット 2020-03-10 17.06.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449005/223bef72-4077-350b-0186-53001b17cca5.png">


# おわりに

本記事では、AutoEncoder系の手法を推薦タスクに用いた研究をいくつか紹介しました。
今後は本記事の最後で軽く触れた論文についても、深く掘り下げて読んでみようと思います。



# 参考文献


* [Wu+, 2016] Yao Wu et al. ["Collaborative Denoising Auto-Encoders for Top-N Recommender Systems"](https://www.researchgate.net/publication/311488341_Collaborative_Denoising_Auto-Encoders_for_Top-N_Recommender_Systems) WSDM, 2016.
*  [Liang+, 2018] Dawen Liang et al. ["Variational Autoencoders for Collaborative Filtering"](https://arxiv.org/abs/1802.05814) WWW, 2018.
* [Shenbin+, 2020]
 Ilya Shenbin et al. ["RecVAE: a New Variational Autoencoder for Top-N Recommendations with Implicit Feedback"](https://arxiv.org/abs/1912.11160) WSDM, 2020.
* [Zhong+, 2018] Jingbin Zhong and Xiaofeng Zhang. ["Wasserstein Autoencoders for Collaborative Filtering"](https://arxiv.org/abs/1809.05662) arXiv preprint arXiv:1711.01558, 2018.
* [Yu+, 2019] Xianwen Yu et al. ["VAEGAN: A Collaborative Filtering Framework based on Adversarial Variational Autoencoders"](https://www.ijcai.org/Proceedings/2019/584) IJCAI, 2019.