推奨システムシリーズ(2):FFM理論と実践

背景

FMモデルに加えて、CTR / CVRの見積もりの​​タスクでは、[2]の外、新星FFM(フィールドを意識した因子分解マシン)モデルも活発なパフォーマンス。FM FFMは、アップグレードされたバージョンとして見ることができ、[3]勇知フアンは2016年にモデルを提案したが、その誕生は実務対応報告Rendleは2010年に出版され、他のモデルではカイである(FMもRendleが2010年に発表され)、元の論文は、[1]に書きました:

FFMのアイデアは、パーソナライズされたタグを持つ推薦システムのために提案された実務対応報告に由来します。

様々な深さの推奨モデルアウトする前に、FM / FFMモデルは、主要な輝きで、関連する競争が推奨します。今日、我々は良い櫛のFFMの原則を取るとどのように実践に理論を置くこと。

分析

1. FFM定義された式

モデルFMに比べ、FFMモデルは、ドメイン(フィールド)の概念を導入し(このアイデアは、実務対応報告に由来する[3])、グルーピング機能と見なすことができます。例えば、性同一性の観点では、2つの値が通常あります\(FEMALE \)、\ (MALE \) 性別のワンホットエンコードされた値は二つの別々の機能に分割することの後に、\(X_ {女性} \)\(X_ {MALE} \) 明らかに、これら2つの機能は、一般的な性質を持っている:すべてのセックスに属します。これらの2つの機能はつまり、彼らは同じ番号のフィールドを持って、同じフィールドの下にグループ化することができます。異なるドメイン間の特性は、有意差を持っている傾向があります。比較実際にFM、各機能のみ1つの隠れベクトル、特徴\(X_I \)常に同じ暗黙ベクトル用いて、他の機能と交差\(V_I \)をこの未分化の仕方オーバークロス、およびアカウントに共通(同じフィールド)と異なる特徴間の差(エキゾチック)を取りません。

次のようにFFM製剤が定義される
[Y = W 0 + \ sum_ {I = 1} ^ nw_ix_i + \ sum_ {I = 1} ^ {N - 1} \ sum_ {J = I + 1} ^ N- \ langle V_ {I、F_Jを\します}、V_ {J、のf_i} \ rangle x_ix_j \タグ{1} \] \(F \)ドメイン(フィールド)マッピング関数、\(F_iと\)のように表される\(X_I \)機能に対応するフィールド、数字。

式(1)FM比較を見つけることができ、2つの違いは、クロス暗黙ベクトルに対応する唯一の二次です。フィールドデータセット番号が設定されている\(F. \)を各特徴のためにそして、\(X_I \)有している\(F. \)一つに対応する暗黙のベクター、それぞれ、異なるクロスドメインの機能に適用された場合。寸法の提供暗黙ベクトル\(K \)、FFM 2次相互用語パラメーター\(NKF \)

2.解決

フィールドの導入以来、(1)式は、FMのように書き換えることができるFFMモデルように推定時間の複雑さにある\(O(KN ^ 2)\)

パラメータの勾配の導出を容易にするために、暗黙的なベクターは、以下のように表されている\(V_ {I、F_J} =(V_ {I、F_J} ^ 1、V_ {I、F_J} ^ 3、\ cdots、V_ {I、F_J} ^ K)\) 式(1)展開:
\ [Y = W 0 + \ sum_ {I = 1} ^ nw_ix_i + \ sum_ {I = 1} ^ {N - 1} \ sum_ {J = I + 1} ^ N- \ sum_ {Q = 1 } ^ {K} V_ {I
、F_J} ^ {Q} V_ {J、のf_i} ^ {Q} x_ix_jの\タグ{2} \] 場合のパラメータである\(W 0 \)\(\ FRAC {\の部分Y}} {{\部分}} = {0 1 \ W)

パラメータがある場合、\(W_i \)場合、\(\ FRAC {\部分{Y}} {\部分}} = {W_i X_I \)

パラメータがされた場合(V_ {I、F_J} \ ^ Qを\) 定数パラメータのみ考慮式(2)クロス用語として、他の。マッピング関係とフィールド数ので\(F \)は、その場合、均一な勾配パラメータもう少し複雑な数学的表現、データセットに依存する(しかし決定\(F \)を計算した後にウェル)ので、ここで時間が押されなし表。

3.性能評価

パラメータの上記セクションは、モデルのトレーニングの時間複雑度は、評価がまだ更新していると推定され、発現の均一な勾配はなかった\(V_ {I、F_J} ^ Qの\) 時間複雑度パラメータ。勾配のための式はありませんが、更新時間が定理に近づいパラメータの複雑さによって決定することができます。二つの極端なケース:. 1)\ \(1 = F)。 2)\(= N-F \) ;パラメータ更新時間複雑間に位置します。

1)\(1 = F. \) すべてのFMの同じ機能フィールド、FFM縮退ケースに属します。ことができる(F \)\式(2)のように表すことができ、一時的に省略
\ [\開始{整列}、Y = {}&W_0 + \ sum_ {i = 1} ^ nw_ix_i + \ sum_ {i = 1} ^ {N- 1} \ sum_ {J = + 1} ^ n個の\ sum_ {Q = 1} ^ {K} V_ {I} ^ {Q} V_ {J} ^ {Q} x_ix_j \ notag \\ = {}&W_0 + \ sum_ {i = 1} ^ nw_ix_i + \ sum_ {i = 1} ^ {N-1} \ sum_ {Q = 1} ^ {K} V_I ^ q個の\ sum_ {J = + 1} ^ {n}はV_ {J} ^ {Q} x_ix_j
\ notag \\ \端{整列} \タグ{3} \] 有し、
\ [\ =}は{始まる左整列\ {FRAC \部分{Y}} {\部分V_ {{I、 F_J} ^ Q}} = { }&\ FRAC {\部分{Y}} {\部分{V_ {I} ^ Q}} \ notag \\ = {}&\ sum_ {J = + 1} ^ { N} v_j ^ qx_ix_j \ notag \\
\端{整列} \タグ{4} \] したがって、パラメータ更新\(V_ {I、F_J} ^ Q \) 所要時間複雑\(O(N)\ )これは二次の項である\(NKF \)のパラメータの内の1つ、2次の項の合計更新時間の複雑さがあるのパラメータ(\)O(KN ^ 2)\

2)\(= N-F。\)場合、フィールドは、各機能は同じではありません。一般性を失うことなく、それが提供されてもよい\(F_iと= Iが\)式(2)のように表すことができる。この時点で、
\ [\ {整列} Y開始 = {}&W_0 + \ sum_ {i = 1} ^ nw_ix_i + \ sum_ {Iを= 1} ^ {N-1 } \ sum_ {J = + 1} ^ n個の\ sum_ {Q = 1} ^ {K} V_ {I、J} ^ {Q} V_ {J、I} ^ {Q } x_ix_j \ notag \\ \端{
{} \タグを整列5} \] 有し、
\ [\ =整列部分{Y \ {} \ {FRACを開始左} {\部分V_ {{I、Q}} ^} F_Jを= {}&\ FRAC {\部分{Y}} {\部分{V_ {I、J} ^ Q}} \ notag \\ = {}&V_ {J、I} ^ qx_ix_j \ notag \\ \端{ } \タグ{4} \整列
] したがって、パラメータ更新\(V_ {I、F_J} ^ Q \) 所要時間複雑\(O(1)\) これは二次の項である\(NKF \)のパラメータの内の1つ、2次の項の合計更新時間の複雑さがあるのパラメータ(\)O(KN ^ 2)\

要約すると、時間の複雑さは、2次の項パラメータ更新のために必要とされる\(O(KN ^ 2)\)ので、(0 \ W)\\(W_i \)パラメータ更新時間複雑度\(O(1)\ )、FFMのトレーニング時間の複雑さがあるので)\ \(O(KN ^ 2)

概要:FFMのトレーニング/推測時間複雑です\(O(KN ^ 2)\)

4.利点と欠点

利点:

  • 高次元データセット内のスパース性はよくやりました。

  • モデル、前記細かい特性のFM比較的高い精度。

短所:

  • ビッグタイムオーバーヘッド。FFM時間の複雑さがある\(O(KN ^ 2)\)、FMの時間複雑性はある\(O(KN)\)
  • マルチパラメータでは、正則化法だけでなく、トレーニング戦略の早期停止を設定する必要があり、あまりにも簡単にフィット。

5.ノート

データセットに必要なFFM [1]:

  • FFMsは、カテゴリの特徴を含み、バイナリフィーチャに変換されたデータセットのために有効であるべきです。
  • 変換セットが十分にスパースでない場合は、FFMsはあまり利益をもたらすように見えます。
  • 数値データセットにFFMsを適用することはより困難です。

1)を含むカテゴリデータは、特性を設定し、二値化処理に必要な機能します。

より良好な他のモデルと比較してパフォーマンス結果の2)より疎なデータセット。

3)FFMは難しい純粋な数値型のデータ・セットを適用しました。

データ前処理[4]:

そしてFMは、最高の第一の特徴の正規化と、その後の正規化をサンプリング。

ハイパーインパクトモデル[1]:

第暗黙ベクトルの次元がFFM FM暗黙ベクトルの次元よりもはるかに小さいことに留意されたい、すなわち\(FFM K_ {} \ LL FM K_ {} \)

1)非表示ベクトル寸法\(k個の\)の影響のモデルではありません。

2)正則化係数\(\ラムダ\)が大きすぎる場合には、簡単に逆に、貧しいフィッティングモデルにつながり、オーバーフィッティングに簡単です。

3)論文では、Adagradオプティマイザを使用して、グローバルな学習率\(\エータ\)は、スーパーパラメータです。場合は\(\エータ\)小さいレベルで、それが最高のパフォーマーすることができます。大きすぎる、簡単にオーバーフィッティングにつながります。小さすぎると、簡単underfitting。

アクセラトレーニングモデル[1,4]:

1)勾配分布計算; 2)適応学習レート; 3)マルチコア並列計算; 4)SSE3並列プログラミング命令と

実験

FMと一致\(MovieLens 100K \)データセット、評価5サンプルセットは正サンプルが1であり、他の負のサンプルが0に設定されている、バイナリ分類タスクを構築します。使用\(CrossEntropy \)損失関数、そして最後に使用し\(アダム\)最適化アルゴリズムを。

で使用される紙\(ロジスティック損失\)を使用しながら、1,1-二分のサンプルのように構成され\(Adagrad \)最適化アルゴリズムを[1]

コアのコードは次の通りであります:

class FFM(object):
    def __init__(self, vec_dim, feat_num, field_num, lr, lamda):
        self.vec_dim = vec_dim
        self.feat_num = feat_num
        self.field_num = field_num
        self.lr = lr
        self.lamda = lamda

        self._build_graph()

    def _build_graph(self):
        self.add_input()
        self.inference()
        self.add_metrics()

    def add_input(self):
        self.x = tf.placeholder(tf.float32, shape=[None, self.feat_num], name='input_x')
        self.y = tf.placeholder(tf.float32, shape=[None], name='input_y')

    def inference(self):
        with tf.variable_scope('linear_part'):
            w0 = tf.get_variable(name='bias', shape=[1], dtype=tf.float32)
            self.W = tf.get_variable(name='linear_w', shape=[self.feat_num], dtype=tf.float32)
            self.linear_part = w0 + tf.reduce_sum(tf.multiply(self.x, self.W), axis=1)
        with tf.variable_scope('interaction_part'):
            self.V = tf.get_variable(name='interaction_w', shape=[self.feat_num, self.field_num, self.vec_dim], dtype=tf.float32)
            self.interaction_part = tf.constant(0, dtype=tf.float32)
            for i in range(self.feat_num):
                for j in range(i+1, self.feat_num):
                    self.interaction_part += \
                        tf.reduce_sum(tf.multiply(self.V[i, field_map[j]], self.V[j, field_map[i]])) * \
                        tf.multiply(self.x[:, i], self.x[:, j])

        self.y_logits = self.linear_part + self.interaction_part
        self.y_hat = tf.nn.sigmoid(self.y_logits)

        self.loss = -tf.reduce_mean(self.y*tf.log(self.y_hat+1e-8) + (1-self.y)*tf.log(1-self.y_hat+1e-8))
        self.reg_loss = self.lamda*(tf.reduce_mean(tf.nn.l2_loss(self.W)) + tf.reduce_mean(tf.nn.l2_loss(self.V)))
        self.total_loss = self.loss + self.reg_loss

        self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.total_loss)

    def add_metrics(self):
        # acc
        self.pred_label = tf.cast(self.y_hat > 0.5, tf.int32)
        self.accuracy = tf.metrics.accuracy(self.y, self.pred_label)
        # auc
        self.auc = tf.metrics.auc(self.y, self.y_hat, num_thresholds=4000)

思考: FFMトレーニング速度が本当に遅いです。

参照

[1]ファン、Yuchinら。「CTR予測のためのフィールドを意識した分解マシン。」推薦システム第10回ACM会議の議事録ACM、2016。

[2] Rendle、S.(2010年12月)。因数分解マシン。データマイニングの2010年IEEE国際会議(頁995から1000)。IEEE。

[3] Rendle、ステファン、及びラースシュミットティーメ。「パーソナライズされたタグ勧告のための対相互作用テンソル分解。」Web検索やデータマイニングの第三ACM国際会議の議事録ACM、2010。

[4] https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html

[5] https://www.jianshu.com/p/781cde3d5f3d

[6] https://zhuanlan.zhihu.com/p/38241764

[7] https://zhuanlan.zhihu.com/p/64113429

[8] https://zhuanlan.zhihu.com/p/50692817

[9] https://blog.csdn.net/leadai/article/details/81713800

おすすめ

転載: www.cnblogs.com/yinzm/p/11712119.html