返回

深度CTR模型:NFM与AFM解析及代码实现

人工智能

在推荐系统和广告系统中,CTR(Click-Through Rate)预估至关重要。深度模型凭借其强大的学习能力,在CTR预估任务中取得了显著成就。本文将重点介绍两种深度CTR模型:NFM和AFM,并提供详细的代码实现。

NFM:引入Hadamard内积

NFM(Neural Factorization Machine)是一种深度CTR模型,在Wide & Deep模型的基础上进行改进。与Wide & Deep模型只考虑特征之间的线性交互不同,NFM引入了Hadamard内积,有效捕捉特征之间的非线性交互。

具体来说,NFM模型由以下部分组成:

  • Embedding层: 将离散特征嵌入到稠密向量空间,以学习特征的潜在表征。
  • 交互层: 采用Hadamard内积计算特征对之间的非线性交互。
  • 全连接层: 对交互结果进行全连接操作,学习特征之间的更高级交互。
  • 输出层: 使用Sigmoid函数输出CTR预估值。

Hadamard内积操作可以有效捕捉特征之间的非线性关系。对于特征对(f_i, f_j),其Hadamard内积为:

f_i ∘ f_j = [f_i^1 * f_j^1, f_i^2 * f_j^2, ..., f_i^d * f_j^d]

其中d是嵌入向量的维度。通过Hadamard内积,NFM模型可以学习到特征之间复杂的交互模式,从而提高CTR预估的准确性。

AFM:引入注意力机制

AFM(Attentional Factorization Machine)是一种深度CTR模型,在NFM的基础上进行进一步改进。AFM模型引入了注意力机制,可以重点关注特征对交互中最重要的特征。

AFM模型由以下部分组成:

  • Embedding层: 与NFM模型相同。
  • 交互层: 与NFM模型相同,采用Hadamard内积计算特征对之间的非线性交互。
  • 注意力层: 计算每个特征对交互的重要性权重。
  • 加权交互层: 对交互结果进行加权求和,重点关注重要特征对的交互。
  • 全连接层: 与NFM模型相同。
  • 输出层: 与NFM模型相同。

注意力层是AFM模型的关键创新。具体来说,对于特征对(f_i, f_j),其注意力权重计算为:

a_ij = W_a * [f_i ∘ f_j] + b_a

其中W_a和b_a是学习到的参数。通过注意力权重,AFM模型可以重点关注重要特征对的交互,从而进一步提高CTR预估的准确性。

代码实现

为了方便理解和应用NFM和AFM模型,我们提供了Python代码实现。代码中包含了模型的定义、训练和评估。

NFM模型

import tensorflow as tf

class NFM(tf.keras.Model):

    def __init__(self, feature_dim, embedding_dim):
        super(NFM, self).__init__()
        self.embedding = tf.keras.layers.Embedding(feature_dim, embedding_dim)
        self.fc = tf.keras.layers.Dense(1)

    def call(self, inputs):
        embeddings = self.embedding(inputs)
        inter_layer = tf.keras.layers.multiply([embeddings, embeddings])
        dense_layer = self.fc(inter_layer)
        return tf.nn.sigmoid(dense_layer)

# 加载数据
data = ...

# 创建模型
model = NFM(feature_dim, embedding_dim)

# 训练模型
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(data, epochs=10)

# 评估模型
results = model.evaluate(data)

AFM模型

import tensorflow as tf

class AFM(tf.keras.Model):

    def __init__(self, feature_dim, embedding_dim):
        super(AFM, self).__init__()
        self.embedding = tf.keras.layers.Embedding(feature_dim, embedding_dim)
        self.fc = tf.keras.layers.Dense(1)
        self.attention = tf.keras.layers.Dense(1)

    def call(self, inputs):
        embeddings = self.embedding(inputs)
        inter_layer = tf.keras.layers.multiply([embeddings, embeddings])
        attention_weights = self.attention(inter_layer)
        weighted_inter_layer = attention_weights * inter_layer
        dense_layer = self.fc(weighted_inter_layer)
        return tf.nn.sigmoid(dense_layer)

# 加载数据
data = ...

# 创建模型
model = AFM(feature_dim, embedding_dim)

# 训练模型
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(data, epochs=10)

# 评估模型
results = model.evaluate(data)

总结

NFM和AFM模型都是深度CTR模型的代表作,通过引入不同的创新技术,有效提高了CTR预估的准确性。NFM模型引入Hadamard内积,捕捉特征之间的非线性交互;AFM模型引入注意力机制,重点关注重要特征对的交互。通过代码实现,我们方便地理解和应用这些模型,以解决实际中的CTR预估问题。