糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

Field-aware Factorization Machines in a Real-world Online Advertising System (WWW 2017) 読んだ

[1701.04099] Field-aware Factorization Machines in a Real-world Online Advertising System
Criteo で Field-aware Factorization Machines を活用している,という話.

気になった点をメモしておく.

複数マシンでの推定

  • Iterative Parameter Mixing を行っているがマシンが増えるほど収束が遅くなる
  • 学習率を大きくすると収束は早くなるが精度が悪くなる
  • そこで学習率を大きくしつつ AdaGrad を用いて精度良く収束させる

FFM と warm start

warm start

FFM を CTR に用いる際の実運用を考えてみると,時系列に従ってパラメータを再学習する必要がある.また, FFM は油断するとすぐに過学習をしてしまうため, early stopping (予測対象とは別に精度評価用のデータを用意し,そのデータに対する予測精度が悪化した時点で学習を止め,その 1 epoch 前のパラメータを返す) を行う必要がある.
なので,ある年の6月のCTRを予測するために1月から4月までを学習データ (train),5月のデータを early stopping 用のデータ (validation) としてパラメータを学習する.7月の CTR を予測するためには2月から5月までを train , 6月を validation にする,といった具合にデータをずらしていく必要がある.
一般にパラメータ推定は時間がかかるわけだが,よく考えてみると6月予測と7月予測とでは学習データの多くが重複している.なので,6月予測時に推定したパラメータを,7月予測時にパラメータの初期値に用いることで学習時間を削減することができる.これが warm start.

FFM における naive な warm start は失敗する

ロジスティクス回帰であれば大域的最適解を求めることができるのでこれで問題無い.しかし FFM だと案外問題になってくる.
これを検証するために Criteo data set で実験している.
データを(恐らく時系列に従って)90分割し,1から44ブロックを train,45ブロック目を validation, 46ブロック目を test にして推定と予測を行う.続いて,これを 1 ブロック次にずらして推定と予測を行う(2から45ブロックを train,46ブロックを validation,47ブロックをtest).これを最後まで続けてみる.
この時,何も考えずに warm start を行うと,期間が進めば進むほど予測精度は (warm start を用いないベースラインに比べ) どんどん悪化していく.これではよくない.

pre-mature warm-start

そこで提案しているのが pre-mature な warm-start.
手法はシンプルで, validation set に対する予測誤差が悪化したのが t epoch だとする.ここで推定を終え,t - 1 のパラメータを採用するのはこれまでと同様だが,次のパラメータ推定の初期値に採用するパラメータは t - 2 epoch のものを用いる.
これだけで計算時間も約半分に削減できるし (ベースラインで 7 epoch だったのが 2-3 epoch で終わっている),精度もむしろ良くなっている.
更に, pre-mature warm-start を行うことで train のブロック数を少なくしても十分な精度を発揮している.特に上記実験の期間が進めば進むほどその改善度合いは顕著になっている.
もっと極端な例としては train に 1 ブロックだけ用い, warm-start させなくともいいらしい.CTR においてはデータが多すぎると問題になるという話なのか,そもそも FFM があまりに複雑なモデルである,という話なのか,恐らく両者であると思われる.