0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FM和深度网络DNN的结合成为了CTR预估问题中主流的方法

lviY_AI_shequ 来源:未知 作者:李倩 2018-08-30 10:46 次阅读

1、引言

在CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系。但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,因此学者们通过Deep Network来建模更高阶的特征之间的关系。

因此 FM和深度网络DNN的结合也就成为了CTR预估问题中主流的方法。有关FM和DNN的结合有两种主流的方法,并行结构和串行结构。两种结构的理解以及实现如下表所示:

今天介绍的NFM模型(Neural Factorization Machine),便是串行结构中一种较为简单的网络模型。

2、NFM模型介绍

我们首先来回顾一下FM模型,FM模型用n个隐变量来刻画特征之间的交互关系。这里要强调的一点是,n是特征的总数,是one-hot展开之后的,比如有三组特征,两个连续特征,一个离散特征有5个取值,那么n=7而不是n=3.

顺便回顾一下化简过程:

可以看到,不考虑最外层的求和,我们可以得到一个K维的向量。

对于NFM模型,目标值的预测公式变为:

其中,f(x)是用来建模特征之间交互关系的多层前馈神经网络模块,架构图如下所示:

Embedding Layer和我们之间几个网络是一样的,embedding 得到的vector其实就是我们在FM中要学习的隐变量v。

Bi-Interaction Layer名字挺高大上的,其实它就是计算FM中的二次项的过程,因此得到的向量维度就是我们的Embedding的维度。最终的结果是:

Hidden Layers就是我们的DNN部分,将Bi-Interaction Layer得到的结果接入多层的神经网络进行训练,从而捕捉到特征之间复杂的非线性关系。

在进行多层训练之后,将最后一层的输出求和同时加上一次项和偏置项,就得到了我们的预测输出:

是不是很简单呢,哈哈。

3、代码实战

终于到了激动人心的代码实战环节了,本文的代码有不对的的地方或者改进之处还望大家多多指正。

本文的github地址为:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-NFM-Demo

本文的代码根据之前DeepFM的代码进行改进,我们只介绍模型的实现部分,其他数据处理的细节大家可以参考我的github上的代码.

模型输入

模型的输入主要有下面几个部分:

self.feat_index = tf.placeholder(tf.int32, shape=[None,None], name='feat_index') self.feat_value = tf.placeholder(tf.float32, shape=[None,None], name='feat_value') self.label = tf.placeholder(tf.float32,shape=[None,1],name='label') self.dropout_keep_deep = tf.placeholder(tf.float32,shape=[None],name='dropout_deep_deep')

feat_index是特征的一个序号,主要用于通过embedding_lookup选择我们的embedding。feat_value是对应的特征值,如果是离散特征的话,就是1,如果不是离散特征的话,就保留原来的特征值。label是实际值。还定义了dropout来防止过拟合。

权重构建

权重主要分以下几部分,偏置项,一次项权重,embeddings,以及DNN的权重

def _initialize_weights(self): weights = dict() #embeddings weights['feature_embeddings'] = tf.Variable( tf.random_normal([self.feature_size,self.embedding_size],0.0,0.01), name='feature_embeddings') weights['feature_bias'] = tf.Variable(tf.random_normal([self.feature_size,1],0.0,1.0),name='feature_bias') weights['bias'] = tf.Variable(tf.constant(0.1),name='bias') #deep layers num_layer = len(self.deep_layers) input_size = self.embedding_size glorot = np.sqrt(2.0/(input_size + self.deep_layers[0])) weights['layer_0'] = tf.Variable( np.random.normal(loc=0,scale=glorot,size=(input_size,self.deep_layers[0])),dtype=np.float32 ) weights['bias_0'] = tf.Variable( np.random.normal(loc=0,scale=glorot,size=(1,self.deep_layers[0])),dtype=np.float32 ) for i in range(1,num_layer): glorot = np.sqrt(2.0 / (self.deep_layers[i - 1] + self.deep_layers[i])) weights["layer_%d" % i] = tf.Variable( np.random.normal(loc=0, scale=glorot, size=(self.deep_layers[i - 1], self.deep_layers[i])), dtype=np.float32) # layers[i-1] * layers[i] weights["bias_%d" % i] = tf.Variable( np.random.normal(loc=0, scale=glorot, size=(1, self.deep_layers[i])), dtype=np.float32) # 1 * layer[i] return weights

Embedding Layer这个部分很简单啦,是根据feat_index选择对应的weights['feature_embeddings']中的embedding值,然后再与对应的feat_value相乘就可以了:

# Embeddings self.embeddings = tf.nn.embedding_lookup(self.weights['feature_embeddings'],self.feat_index) # N * F * K feat_value = tf.reshape(self.feat_value,shape=[-1,self.field_size,1]) self.embeddings = tf.multiply(self.embeddings,feat_value) # N * F * K

Bi-Interaction Layer我们直接根据化简后的结果进行计算,得到一个K维的向量:

# sum-square-part self.summed_features_emb = tf.reduce_sum(self.embeddings, 1) # None * k self.summed_features_emb_square = tf.square(self.summed_features_emb) # None * K # squre-sum-part self.squared_features_emb = tf.square(self.embeddings) self.squared_sum_features_emb = tf.reduce_sum(self.squared_features_emb, 1) # None * K # second order self.y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square, self.squared_sum_features_emb)

Deep Part将Bi-Interaction Layer层得到的结果经过一个多层的神经网络,得到交互项的输出:

self.y_deep = self.y_second_order for i in range(0, len(self.deep_layers)): self.y_deep = tf.add(tf.matmul(self.y_deep, self.weights["layer_%d" % i]), self.weights["bias_%d" % i]) self.y_deep = self.deep_layers_activation(self.y_deep) self.y_deep = tf.nn.dropout(self.y_deep, self.dropout_keep_deep[i + 1])

得到预测输出为了得到预测输出,我们还需要两部分,分别是偏置项和一次项:

# first order term self.y_first_order = tf.nn.embedding_lookup(self.weights['feature_bias'], self.feat_index) self.y_first_order = tf.reduce_sum(tf.multiply(self.y_first_order, feat_value), 2) # bias self.y_bias = self.weights['bias'] * tf.ones_like(self.label)

而我们的最终输出如下:

# out self.out = tf.add_n([tf.reduce_sum(self.y_first_order,axis=1,keep_dims=True), tf.reduce_sum(self.y_deep,axis=1,keep_dims=True), self.y_bias])

剩下的代码就不介绍啦!好啦,本文只是提供一个引子,有关NFM的知识大家可以更多的进行学习呦。

4、小结

NFM模型将FM与神经网络结合以提升FM捕捉特征间多阶交互信息的能力。根据论文中实验结果,NFM的预测准确度相较FM有明显提升,并且与现有的并行神经网络模型相比,复杂度更低。

NFM本质上还是基于FM,FM会让一个特征固定一个特定的向量,当这个特征与其他特征做交叉时,都是用同样的向量去做计算。这个是很不合理的,因为不同的特征之间的交叉,重要程度是不一样的。因此,学者们提出了AFM模型(Attentional factorization machines),将attention机制加入到我们的模型中,关于AFM的知识,我们下一篇来一探究竟。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4732

    浏览量

    100393
  • dnn
    dnn
    +关注

    关注

    0

    文章

    59

    浏览量

    9029

原文标题:推荐系统遇上深度学习(七)--NFM模型理论和实践

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【我是电子发烧友】如何加速DNN运算?

    深度神经网络DNN)目前是许多现代AI应用的基础。自从DNN在语音识别和图像识别任务中展现出突破性的成果,使用DNN的应用数量呈爆炸式增
    发表于 06-14 21:01

    神经网络DNN知识点总结

    DNN:关于神经网络DNN的知识点总结(持续更新)
    发表于 12-26 10:41

    什么是深度学习?使用FPGA进行深度学习的好处?

    FPGA实现。易于适应新的神经网络结构深度学习是一个非常活跃的研究领域,每天都在设计新的 DNN。其中许多结合了现有的标准计算,但有些需要全新的计算
    发表于 02-17 16:56

    什么是DNN_如何使用硬件加速DNN运算

    深度神经网络DNN)目前是许多现代AI应用的基础。自从DNN在语音识别和图像识别任务中展现出突破性的成果,使用DNN的应用数量呈爆炸式增加
    的头像 发表于 07-08 06:45 2.2w次阅读
    什么是<b class='flag-5'>DNN</b>_如何使用硬件加速<b class='flag-5'>DNN</b>运算

    FM和FFM原理的探索和应用的经验

    FM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司举办的CTR预估比赛中获得不错的战绩。美团点评技术团队在搭建DSP
    发表于 10-12 17:25 0次下载
    <b class='flag-5'>FM</b>和FFM原理的探索和应用的经验

    详解DNN训练中出现的问题与解决方法方法

    由于深度神经网络DNN)层数很多,每次训练都是逐层由后至前传递。传递项1梯度非常大,以此修正网络会不断震荡,无法形成一个收敛网络。因而
    的头像 发表于 12-25 14:34 7152次阅读
    详解<b class='flag-5'>DNN</b>训练中出现的问题与解决<b class='flag-5'>方法方法</b>

    用于理解深度神经网络的CLass增强型注意响应(CLEAR)方法

    我们提出了CLass增强的注意响应(CLEAR):一种可视化和理解深度神经网络DNN)在给定特定输入的情况下做出的决策的方法
    的头像 发表于 11-12 06:11 1957次阅读

    回顾3年来的所有主流深度学习CTR模型

    微软于2016年提出的Deep Crossing可以说是深度学习CTR模型的最典型和基础性的模型。如图2的模型结构图所示,它涵盖了深度CTR模型最典型的要素,即通过加入embeddin
    的头像 发表于 07-18 14:33 6120次阅读
    回顾3年来的所有<b class='flag-5'>主流</b><b class='flag-5'>深度</b>学习<b class='flag-5'>CTR</b>模型

    使用神经网络实现语音驱动发音器官运动合成方法详细资料说明

    实现一种基于深度神经网络的语音驱动发音器官运动合成方法, 并应用于语音驱动虚拟说话人动画合成。 通过
    发表于 12-05 15:53 15次下载
    使用神经<b class='flag-5'>网络</b>实现语音驱动发音器官运动<b class='flag-5'>合成方法</b>详细资料说明

    基于注意力机制的深度兴趣网络点击率模型

    广告点击率(CTR)是互联网公司进行流量分配的重要依据,针对目前点击率预估精度较低的问题,结合通用的神经网络解决方案,构建一种基于注意力机制的深度
    发表于 03-12 10:55 5次下载
    基于注意力机制的<b class='flag-5'>深度</b>兴趣<b class='flag-5'>网络</b>点击率模型

    综述深度神经网络的解释方法及发展趋势

    深度神经网络具有非线性非凸、多层隐藏结构、特征矢量化、海量模型参数等特点,但弱解释性是限制其理论发展和实际应用的巨大障碍,因此,深度神经网络解释方法
    发表于 03-21 09:48 18次下载
    综述<b class='flag-5'>深度</b>神经<b class='flag-5'>网络</b>的解释<b class='flag-5'>方法</b>及发展趋势

    浅析深度神经网络DNN)反向传播算法(BP)

    深度神经网络DNN)模型与前向传播算法 中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Bac
    的头像 发表于 03-22 16:28 3598次阅读
    浅析<b class='flag-5'>深度</b>神经<b class='flag-5'>网络</b>(<b class='flag-5'>DNN</b>)反向传播算法(BP)

    基于深度神经网络的因果形式语音增强方法

    传统的基于深度神经网络DNN)的语音增强方法由于采用非因果形式的输入,在处理过程中具有固定延时,不适用于实时性要求较高的场合。针对这一问题,从网络
    发表于 06-10 11:29 8次下载

    BP神经网络属于DNN

    深度神经网络(Deep Neural Network,简称DNN)则是指具有多个隐藏层的神经网络,可以处理复杂的数据和任务。那么,BP神经网络
    的头像 发表于 07-03 10:18 592次阅读

    深度神经网络(DNN)架构解析与优化策略

    深度神经网络(Deep Neural Network, DNN)作为机器学习领域中的一种重要技术,以其强大的特征学习能力和非线性建模能力,在多个领域取得了显著成果。DNN的核心在于其多
    的头像 发表于 07-09 11:00 1299次阅读