NFM算法原理&实现
❄️

NFM算法原理&实现

text
NFM算法的Python代码实现
Tags
机器学习
深度学习
推荐系统
Created
Aug 25, 2022 10:38 AM

背景

由新加坡国立大学的研究人员于2017年提出了NFM模型,主要思路是用一个表达能力更强的函数代替原FM中二阶隐向量内积的部分;

原理

公式: 由深度学习网络实现;
notion image
notion image

特征交叉池化层(Bi-Interaction Pooling Layer)

在进行两两 K维Embedding向量的元素积操作后,对交叉特征向量求和,得到池化层的 K维 输出向量。再把该向量输入到上层的MLP全连接神经网络中,进行下一步的交叉。

代码实现

class NFM(Model): def __init__(self, feature_columns, hidden_units, output_dim, activation='relu', dropout=0): super(NFM, self).__init__() self.dense_feature_columns, self.sparse_feature_columns = feature_columns self.dnn_layers = DNNLayer(hidden_units, output_dim, activation, dropout) self.emb_layers = EmbedLayer(self.sparse_feature_columns) self.bn_layer = BatchNormalization() # 批标准化 self.output_layer = Dense(1, activation=None) def call(self, inputs, training=None, mask=None): dense_inputs, sparse_inputs = inputs[:, :13], inputs[:, 13:] emb = self.emb_layers(sparse_inputs) # [None, 26, embed_dim] # Bi-Interaction Layer emb = 0.5 * (tf.pow(tf.reduce_sum(emb, axis=1), 2) - tf.reduce_sum(tf.pow(emb, 2), axis=1)) # [None, embed_dim] x = tf.concat([dense_inputs, emb], axis=-1) x = self.bn_layer(x) x = self.dnn_layers(x) outputs = self.output_layer(x) return tf.nn.sigmoid(outputs)

参考