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

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

3天内不再提示

FFM理论与FFM实现细节

lviY_AI_shequ 来源:未知 作者:李倩 2018-07-20 16:10 次阅读

1、FFM理论

在CTR预估中,经常会遇到one-hot类型的变量,one-hot类型变量会导致严重的数据特征稀疏的情况,为了解决这一问题,在上一讲中,我们介绍了FM算法。这一讲我们介绍一种在FM基础上发展出来的算法-FFM(Field-aware Factorization Machine)。

FFM模型中引入了类别的概念,即field。还是拿上一讲中的数据来讲,先看下图:

在上面的广告点击案例中,

“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征都是代表日期的,可以放到同一个field中。同理,Country也可以放到一个field中。简单来说,同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户国籍,广告类型,日期等等。

在FFM中,每一维特征 xi,针对其它特征的每一种field fj,都会学习一个隐向量 v_i,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“Day=26/11/15”这个特征与“Country”特征和“Ad_type"特征进行关联的时候使用不同的隐向量,这与“Country”和“Ad_type”的内在差异相符,也是FFM中“field-aware”的由来。

假设样本的 n个特征属于 f个field,那么FFM的二次项有 nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程。

可以看到,如果隐向量的长度为 k,那么FFM的二次参数有 nfk 个,远多于FM模型的 nk个。此外,由于隐向量与field相关,FFM二次项并不能够化简,其预测复杂度是 O(kn^2)。

下面以一个例子简单说明FFM的特征组合方式。输入记录如下:

这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。

那么,FFM的组合特征有10项,如下图所示。

其中,红色是field编号,蓝色是特征编号。

2、FFM实现细节

这里讲得只是一种FFM的实现方式,并不是唯一的。

损失函数

FFM将问题定义为分类问题,使用的是logistic loss,同时加入了正则项

什么,这是logisitc loss?第一眼看到我是懵逼的,逻辑回归的损失函数我很熟悉啊,不是长这样的啊?其实是我目光太短浅了。逻辑回归其实是有两种表述方式的损失函数的,取决于你将类别定义为0和1还是1和-1。大家可以参考下下面的文章:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/6340129.html。当我们将类别设定为1和-1的时候,逻辑回归的损失函数就是上面的样子。

随机梯度下降

训练FFM使用的是随机梯度下降方法,即每次只选一条数据进行训练,这里还有必要补一补梯度下降的知识,梯度下降是有三种方式的,截图取自参考文献3:

总给人一种怪怪的感觉。batch为什么是全量的数据呢,哈哈。

3、tensorflow实现代码

本文代码的github地址:https://github.com/princewen/tensorflow_practice/tree/master/recommendation-FFM-Demo

这里我们只讲解一些细节,具体的代码大家可以去github上看:

生成数据这里我没有找到合适的数据,就自己产生了一点数据,数据涉及20维特征,前十维特征是一个field,后十维是一个field:

def gen_data(): labels = [-1,1] y = [np.random.choice(labels,1)[0] for _ in range(all_data_size)] x_field = [i // 10 for i in range(input_x_size)] x = np.random.randint(0,2,size=(all_data_size,input_x_size)) return x,y,x_field

定义权重项在ffm中,有三个权重项,首先是bias,然后是一维特征的权重,最后是交叉特征的权重:

def createTwoDimensionWeight(input_x_size,field_size,vector_dimension): weights = tf.truncated_normal([input_x_size,field_size,vector_dimension]) tf_weights = tf.Variable(weights) return tf_weights def createOneDimensionWeight(input_x_size): weights = tf.truncated_normal([input_x_size]) tf_weights = tf.Variable(weights) return tf_weights def createZeroDimensionWeight(): weights = tf.truncated_normal([1]) tf_weights = tf.Variable(weights) return tf_weights

计算估计值估计值的计算这里不能项FM一样先将公式化简再来做,对于交叉特征,只能写两重循环,所以对于特别多的特征的情况下,真的计算要爆炸呀!

def inference(input_x,input_x_field,zeroWeights,oneDimWeights,thirdWeight): """计算回归模型输出的值""" secondValue = tf.reduce_sum(tf.multiply(oneDimWeights,input_x,name='secondValue')) firstTwoValue = tf.add(zeroWeights, secondValue, name="firstTwoValue") thirdValue = tf.Variable(0.0,dtype=tf.float32) input_shape = input_x_size for i in range(input_shape): featureIndex1 = I fieldIndex1 = int(input_x_field[I]) for j in range(i+1,input_shape): featureIndex2 = j fieldIndex2 = int(input_x_field[j]) vectorLeft = tf.convert_to_tensor([[featureIndex1,fieldIndex2,i] for i in range(vector_dimension)]) weightLeft = tf.gather_nd(thirdWeight,vectorLeft) weightLeftAfterCut = tf.squeeze(weightLeft) vectorRight = tf.convert_to_tensor([[featureIndex2,fieldIndex1,i] for i in range(vector_dimension)]) weightRight = tf.gather_nd(thirdWeight,vectorRight) weightRightAfterCut = tf.squeeze(weightRight) tempValue = tf.reduce_sum(tf.multiply(weightLeftAfterCut,weightRightAfterCut)) indices2 = [I] indices3 = [j] xi = tf.squeeze(tf.gather_nd(input_x, indices2)) xj = tf.squeeze(tf.gather_nd(input_x, indices3)) product = tf.reduce_sum(tf.multiply(xi, xj)) secondItemVal = tf.multiply(tempValue, product) tf.assign(thirdValue, tf.add(thirdValue, secondItemVal)) return tf.add(firstTwoValue,thirdValue)

定义损失函数损失函数我们就用逻辑回归损失函数来算,同时加入正则项:

lambda_w = tf.constant(0.001, name='lambda_w') lambda_v = tf.constant(0.001, name='lambda_v') zeroWeights = createZeroDimensionWeight() oneDimWeights = createOneDimensionWeight(input_x_size) thirdWeight = createTwoDimensionWeight(input_x_size, # 创建二次项的权重变量 field_size, vector_dimension) # n * f * k y_ = inference(input_x, trainx_field,zeroWeights,oneDimWeights,thirdWeight) l2_norm = tf.reduce_sum( tf.add( tf.multiply(lambda_w, tf.pow(oneDimWeights, 2)), tf.reduce_sum(tf.multiply(lambda_v, tf.pow(thirdWeight, 2)),axis=[1,2]) ) ) loss = tf.log(1 + tf.exp(input_y * y_)) + l2_norm train_step = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)

训练接下来就是训练了,每次只用喂一个数据就好:

input_x_batch = trainx[t] input_y_batch = trainy[t] predict_loss,_, steps = sess.run([loss,train_step, global_step], feed_dict={input_x: input_x_batch, input_y: input_y_batch})

跑的是相当的慢,我们来看看效果吧:

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

    关注

    6

    文章

    935

    浏览量

    54759
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62415
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68327

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

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

收藏 人收藏

    评论

    相关推荐

    D类放大器原理及EMI抑制

    的音频放大器有AB类和D类两种。通常,AB类放大器能够提供好的音质,但效率欠佳,耗电较大;而D类放大器具有高效、低温升效应和高输出功率等特点。2. 理论分析:AB类放大器的工作原理类似于线性调节器
    发表于 10-16 15:55

    UCC28600准谐振反激节制IC 引脚功能

    接入。此端电压节制着IC的三个工作模式:准谐振(QR)模式、频率折返(FFM)模式及猝发模式(Borst Mode)。  3PIN CS:电流检测输入端。调节功率限制,可调制过流珍爱,CS端电压输人除夜电流检测电阻接人,再用两端之间的电譸arty?剐〉鹘诠β氏拗啤
    发表于 07-08 17:07

    简单线性回归代码实现细节分析

    机器学习100天-简单线性回归 [代码实现细节分析]
    发表于 05-22 10:16

    深度学习入门之基于python的理论实现

    深度学习入门-基于python的理论实现(2)
    发表于 06-19 11:22

    分立器件的实现细节

    ​概述负载开关电路日常应用比较广泛,主要用来控制后级负载的电源开关。此功能可以直接用IC也可以用分立器件搭建,分立器件主要用PMOS加三极管实现。本文主要讨论分立器件的实现细节。电路分析如下图所示R5模拟后级负载,Q1为开关,
    发表于 10-28 08:28

    数字信号处理-理论算法与实现

    本内容提供了数字信号处理-理论算法与实现 电子书,欢迎大家下载学习
    发表于 07-22 11:34 0次下载
    数字信号处理-<b class='flag-5'>理论</b>算法与<b class='flag-5'>实现</b>

    遗传算法理论、应用与软件实现

    遗传算法——理论、应用与软件实现-2002-1西安交通大学出版社-王小平。
    发表于 04-12 14:33 0次下载

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

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

    现阶段对尾气的处理方法

    SCR系统的厂家较多,常用的有东风添蓝系统、威孚利达系统、格兰富系统、依米泰克(Emitec)系统、CES的FFM版后处理系统、博世后处理系统、三立后处理系统、天纳克后处理系统、派格力后处理系统等等。
    的头像 发表于 12-08 14:21 3567次阅读

    数字信号处理——理论、算法与实现

    数字信号处理——理论、算法与实现说明。
    发表于 04-26 09:17 42次下载

    利用FFM机制进行的极微细机械加工

    随着超精密加工技术的发展,在机械加工中也需要纳米级的加工控制技术,从这个观点出发,近年来,利用扫描型探针显微镜(SPM)的极微细加工技术被广泛研究1)~5)。为了确立纳米级的机械加工技术, 考虑到化学效果,理解加工现象是重要的研究课题。
    发表于 03-30 14:34 631次阅读
    利用<b class='flag-5'>FFM</b>机制进行的极微细机械加工

    表面贴装快速恢复整流器FFM101 THRUFFM107 SOD-123FL规格书下载

    FFM101 THRUFFM107 SOD-123FL规格书下载
    发表于 04-01 16:51 0次下载

    华为EUV光刻解决相干光无法匀光问题

    该照明系统3包括视场复眼镜31(field flyeye mirror,FFM)、光阑复眼镜 32(diaphragm flyeye mirror,PFM)、中继镜组33;其中,中继镜组33通常可以包括两个或者两个以上的中继镜。
    的头像 发表于 11-21 11:09 884次阅读

    ATV 320同步与异步电机变频器编程手册

    当变频器热态达到最大热态的 70%,并且如果 [ 风扇模式 ] (FFM) 被设置为 [ 标准 ] (Std),则风扇会自动 起动。 对于 ATV320pppppW(S), [ 风扇模式 ](FFM) 被强制设为 [ 强制模式 ] (run), 将始终激活风扇。
    发表于 05-24 15:36 2次下载

    大模型部署框架FastLLM实现细节解析

    接着 大模型部署框架 FastLLM 简要解析 这篇文章首先梳理了一下FastLLM的调用链和关键的数据结构,然后解析了 FastLLM 的一些实现细节和CPU/GPU后端实现采用的优化技巧。
    的头像 发表于 07-27 10:48 1294次阅读
    大模型部署框架FastLLM<b class='flag-5'>实现</b><b class='flag-5'>细节</b>解析