推荐系统实践 0x0c FM系列
逻辑回归(LR)
在介绍FM系列之前,我想首先简单介绍一下逻辑回归。通常来说,逻辑回归模型能够综合利用更多的信息,如用户、物品、上下文等多种不同的特征,生成更为全面的结果。另外,逻辑回归将推荐问题看成一个分类问题。通过预测正样本的概率对物品进行排序,这里的正样本可以是用户观看了某个视频,也可以是用户点击了某个商品,或者用户播放了某个音乐等等。逻辑回归模型将推荐问题转换成了CTR(click throught rate)预估的问题。
步骤
一般来说,逻辑回归模型的推荐过程分成以下几步:
- 将用户年龄、性别等信息,商品名称、属性等信息,以及上下文等信息转换成数值型特征向量。
- 将逻辑回归作为优化目标,利用样本数据对逻辑回归模型进行训练,调整模型内部参数。
- 在模型服务阶段,将特征向量的输入到模型当中,得到用户“点击”等正反馈的概率。
4 按照正反馈的概率对物品进行排序,得到推荐列表。
这里的逻辑回归也使用了梯度下降的算法。这里我推荐一篇文章专门介绍逻辑回归的数学原理,感兴趣的读者可以继续阅读。另外特别要说明的事是,逻辑回归是分类模型,不是回归模型。
优点
- 有着具体的数学含义作为支撑。由于CTR模型符合伯努利分布,所以使用逻辑回归作为CTR模型符合逻辑规律。
- 可解释性强,能够通过权重对各个因素进行定位,给出结果的可解释性原因。
- 实际工程需要。由于易于并行化、模型简单以及训练开销小等特点,逻辑回归受到了广泛认可。
局限
- 表达能力不强,无法进行特征交叉、特征筛选等操作等
POLY2
POLY2是最简单的特征交叉的算法,直接对特征进行暴力组合,看看它的数学形式就能知道
\]
直接对特征进行两两交叉,并对交叉后的特征组合赋予权重。POLY2仍然是线性模型,训练方法与逻辑回归模型并无区别。
局限
- 对于很多互联网数据,通常使用的是one-hot编码,无选择的特征交叉使得特征向量更加稀疏,对于权重缺乏有效训练,甚至无法收敛。
- 权重参数直接上升了一个数量级,计算量难以接受
Factorization Machines(FM)
为了解决POLY2的局限,FM模型使用了两个向量内积取代了单一的权重系数。FM模型为每个特征学习了一个隐权重向量,在做特征交叉时使用两个特征隐向量的内积作为交叉特征的权重。如以下公式:
\]
FM引入特征隐向量与矩阵分解中的隐向量有异曲同工之妙。通过引入特征隐向量的方式,把POLY2当中\(n^2\)级别的权重参数降低到了\(nk\),极大地降低了训练开销。
另外,由于特征隐向量的存在,使得模型具备了计算特征组合权重的能力,如家具,蔬菜两种特征中的一个训练样本,(桌子,西红柿),就不需要同时出现桌子和西红柿才能学习这种特征组合。另外,当出现新的样本事也能通过计算过的特征隐向量进行在线服务。
同样的,FM也可以使用梯度下降法进行学习,不失实时性和灵活性。我们看一下PyTorch版本的FM是如何实现的吧。
class FactorizationMachine(nn.Module):
def __init__(self, reduce_sum=True):
super(FactorizationMachine, self).__init__()
self.reduce_sum = reduce_sum
def forward(self, x):
"""
$\frac{1}{2}\sum_{k=1}^{K}[(\sum_{i=1}^{n}v_{ik}x_i)^2-\sum_{i=1}^{n}v_{ik}^2x_i^2]$
:param x: float tensor of size (batch_size, num_fields, embed_dim)
:return:
"""
square_of_sum = torch.sum(x, dim=1) ** 2
sum_of_square = torch.sum(x ** 2, dim=1)
ix = square_of_sum - sum_of_square
if self.reduce_sum:
ix = torch.sum(ix, dim=1, keepdim=True)
return 0.5 * ix
Field-aware Factorization Machine(FFM)
还是为了解决数据特征系数的问题,FFM在FM的基础上进一步改进,在模型中引入域的概念,即field。将同一个域的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个域,分别学习一个隐变量,该隐变量不仅与特征相关,也与域相关。
\]
按照我的理解,引入特征域的概念实际上是希望每种特征都能够针对性对其他特征有更合适的权重,也就是学习域与域之间的权重分布,作为特征隐变量。但是与此同时,计算复杂度从\(nk\)上升到了\(n^2k\),在实际应用中需要在效果和工程投入进行权衡。
我们看一下相关代码:
class FieldAwareFactorizationMachine(nn.Module):
def __init__(self, field_dims, embed_dim):
super().__init__()
self.num_fields = len(field_dims)
self.embeddings = nn.ModuleList([
nn.Embedding(sum(field_dims), embed_dim) for _ in range(self.num_fields)
])
self.offsets = np.array((0, *np.cumsum(field_dims)[:-1]), dtype=np.long)
for embedding in self.embeddings:
nn.init.xavier_uniform_(embedding.weight.data)
def forward(self, x):
x = x + x.new_tensor(self.offsets).unsqueeze(0)
xs = [self.embeddings[i](x) for i in range(self.num_fields)]
ix = list()
for i in range(self.num_fields-1):
for j in range(i+1, self.num_fields):
ix.append(xs[j][:, j] * xs[i][:, j])
ix = torch.stack(ix, dim=1)
return ix
参考
【机器学习】逻辑回归(非常详细)
ottsion/deeplite
推荐系统实践 0x0c FM系列的更多相关文章
- FM系列
在计算广告中,CTR是非常重要的一环.对于特征组合来说,业界通用的做法主要有两大类:FM系列和Tree系列.这里我们来介绍一下FM系列. 在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征 ...
- 推荐系统实践 0x0d GBDT+LR
前一篇文章我们介绍了LR->FM->FFM的整个演化过程,我们也知道,效果最好的FFM,它的计算复杂度已经达到了令人发指的\(n^2k\).其实就是这样,希望提高特征交叉的维度来弥补稀疏特 ...
- 协同滤波 Collaborative filtering 《推荐系统实践》 第二章
利用用户行为数据 简介: 用户在网站上最简单存在形式就是日志. 原始日志(raw log)------>会话日志(session log)-->展示日志或点击日志 用户行一般分为两种: 1 ...
- zz京东电商推荐系统实践
挺实在 今天为大家分享下京东电商推荐系统实践方面的经验,主要包括: 简介 排序模块 实时更新 召回和首轮排序 实验平台 简介 说到推荐系统,最经典的就是协同过滤,上图是一个协同过滤的例子.协同过滤主要 ...
- 个性化排序算法实践(一)——FM算法
因子分解机(Factorization Machine,简称FM)算法用于解决大规模稀疏数据下的特征组合问题.FM可以看做带特征交叉的LR. 理论部分可参考FM系列,通过将FM的二次项化简,其复杂度可 ...
- 推荐系统实践 0x07 基于邻域的算法(2)
基于邻域的算法(2) 上一篇我们讲了基于用户的协同过滤算法,基本流程就是寻找与目标用户兴趣相似的用户,按照他们对物品喜好的对目标用户进行推荐,其中哪些相似用户的评分要带上目标用户与相似用户的相似度作为 ...
- 推荐系统实践 0x0b 矩阵分解
前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...
- 推荐系统实践 0x09 基于图的模型
用户行为数据的二分图表示 用户的购买行为很容易可以用二分图(二部图)来表示.并且利用图的算法进行推荐.基于邻域的模型也可以成为基于图的模型,因为基于邻域的模型都是基于图的模型的简单情况.我们可以用二元 ...
- Extjs的学习及MIS系统实践应用(系列文章)
本系列文章从Extjs的实际运用出发,结合系统开发的实践经验,详细解释Extjs的基本控件及控件扩展的用法,和在平时的学习运用中一步一步查阅的资料.积累经验的集锦.标题及链接奉上,用一个小程序,开启了 ...
随机推荐
- ps怎么做发光字体效果 ps中最简单的发光字教程
ps中最简单的发光字教程 我们先用[文字工具]输入文字(比如:发光效果),字体填充为白色,如图所示. 我们选中文字的图层,点击[FX]找到[外发光],如图所示. 接着,我们在外发光里面把颜色设置为紫色 ...
- Java--关于cpu占用解决方案
关于cpu占用高的解决方案--java篇 通俗一点:找到进程,找到下面的线程,找到线程正在做的事,分析线程正在做的事. 一.查看cpu占用高的进程 top命令可以查看(假设%cpu已经属于很高了,我们 ...
- 归档空间满了 导致Imp卡住
今天在使用exp imp将生产环境数据库导入到测试环境的过程中,imp的时候 发现在导入某张表的时候卡住了. 起初是以为该表比较大的缘故,后来过了很久 发现还是卡在那里. 最后分析原因 发现设置的归档 ...
- 浅析TCP协议---转载
https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...
- 菜鸟试做GUI简单数据库查询界面 python+tkinter+mysql
一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: ...
- SQL Server DATEDIFF() 函数用法
定义和用法 DATEDIFF() 函数返回两个日期之间的时间,例如计算年龄大小. DATEDIFF(datepart,startdate,enddate)startdate 和 enddate 参数是 ...
- 工作流(workflow)
1,JBPM 工作流(开源历史悠久) 2,activity 工作流(开源历史悠久) 3,workable 工作流(功能比较强大,但是开源维护缓慢,比较注重商业化) 以上三个是主流的工作流
- 死磕以太坊源码分析之rlpx协议
死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...
- 重新认识C++的"cin >>"、"cout <<" 简简单单 - 快快乐乐
重新认识C++的"cin >>"."cout <<" 简简单单 - 快快乐乐 JERRY_Z. ~ 2020 / 11 / 24 转载请 ...
- java开发三年,Java中接口的使用你得知道,不然你凭什么涨薪
接口概述: 接口是Java语言中的一种引用类型,是方法的"集合",所以接口的内部主要就是定义方法,包含常量,抽象方法(JDK 7及以前),额外增加默认方法和静态方法(JDK 8), ...