首页 > 编程知识 正文

fm,deepfm怎么处理连续值

时间:2023-05-03 07:59:13 阅读:14355 作者:2841

DeepFM实践场景FM模型DeepFM模型代码实践

场景

CTR估计是当前推荐系统的核心技术,其目的是估计用户点击推荐内容的概率。 在特征工程中,二次特征的交叉很重要,但人为特征的交叉很繁琐,需要很多领域和工作经验。 调频模型具有特征自动交叉的作用,可以学习二次特征,但不能学习更高阶的特征。 DNN可以学习高阶特征的组合,并将FM和DNN组合生成DeepFM模型。 本文简要介绍了调频模型和DeepFM调频模型,给出了一些代码案例。

调频模型作用:特征矢量化后,利用特征向量的点积作为交叉项的权重,进行自动二次交叉。

优点:泛化能力强,特别是在大规模稀疏特征场景中,对于不同时出现的特征交叉也可以学习权重。

本质上,MF模型是FM模型的特例,MF可以被认为是只有两个特征fields:user id和Item ID的FM模型,MF通过对这两个特征进行矩阵分解,目的是将这两个特征进行嵌入式表示FM可被视为MF模型的进一步扩展,除了用户id和Item ID这两种特征之外的许多类型的特征都可以进一步融入FM模型中,它们都将这些特征转换为嵌入式低维向量表示,然后将任何两种特征转换为嵌入式低维向量表示

算法效率:

从调频原始数学公式来看,在进行二次(2-order )特征组合时,假设存在n个不同的特征,则二次特征组合意味着任意两个特征交叉组合,因此调频的时间复杂度为n的平方

当改写二次特征交叉式时,复杂度为kn

DeepFM模型DeepFM模型包括FM和DNN两部分,FM模型可以提取低顺序特征,DNN可以提取高顺序特征。 不需要WideDeep模型的人工特征工程

代码的实践特征可分为以下两部分。

onehot的特征:用户属性、歌曲属性等

连续特征:用户在不合格类别的偏好、歌曲转化率等。

调频部分输入: onehot特征

DNN部分数据: concat(onehotdense ) )。

输入: feat_index(bxf ) feat _ value (bxf ) ) )。

嵌入式层,针对每个特征映射到k维嵌入式向量: B X F X K

# model self.embedding s=TF.nn.embedding _ lookup (self.weights [ ' feature _ embedding s ' ],self.feat _ index

----------firstorderterm-----------self.y _ first _ order=TF.nn.embedding _ loku p (self ) 1 self.y _ first _ order=TF.reduce _ sum (TF.multiply ) self.y_first_orst_orrst 2) none * f self.y _ ff elf.dropout _ keep _ FM [0] # none * f-------------- secondorderterm---------------------------- sum _ squarepartself.summed _ features _ emb=TF.reduce _ sum (self.embedding s, 1 ) none * k self.summed _ features _ emb _ square=TF.square (self.summed _ features _ emb ) # None * K # square _ sumpartself.squared _ features _ emb=TF.square (self.embedding s ) self.squared _ sum _ features _ emb secondorderself.y _ second _ order=0.5 * TF.subtract (self.summed _ features _ emb _ square,self.squared _aract )

----------deep component-----------self.y _ deep=TF.reshape (self.embedding s,shape=[ len(self.deep_layers ) ) :self.y_deep=TF.add ) TF.matmul ) self.y_deep, self.weights['layer ) ] self.weights [ ' bias _ % d ' % I ] (none * layer [ I ] *1if self.batch _ norm 3365374; y ) sope _ bn=' bn _ % d ' % I (# none * layer [ I ] *1self.y _ deep=self.deep _ layers _ activation ) self.y _ ayer self.dropout _ keep _ deep [ 1i ] # dropoutateachdeeplayer最后将deep层与FM层的输出concat合并,通过一层隐藏层sigmod输出

----------deep FM-------------if self.use _ fman dself.use _ deep 3360 concat _ input=TF rst_order, self.y_second_order] axis=1) elif self.use _ deep : concat _ input=self.y _ deep self.out=TF.add () (self.out=TF.nn.sigmoid (self.out ) self.loss=TF.losses.log_loss ) () ) 652 )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。