推荐系统实践 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的基本控件及控件扩展的用法,和在平时的学习运用中一步一步查阅的资料.积累经验的集锦.标题及链接奉上,用一个小程序,开启了 ...
随机推荐
- tp3.2关闭debug save方法执行失败
解决该问题需要 清除缓存文件 将retime下的文件删除
- 03 . Vue基础之计算属性,组件基础定义和使用
vue组件 fetch请求组件 fetch XMLHttpRequest是一个设计粗糙的API, 配置和调用方式非常混乱,而且基于事件的异步模型写起来不友好,兼容性不好. <!DOCTYPE h ...
- ERP的协议管理的操作与设计--开源软件诞生27
赤龙ERP协议与订单进阶讲解--第27篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/re ...
- Django 配置 Mysql
先安装mysqlclient pip install mysqlclient sttings中的 DATABASES = { 'default': { 'ENGINE': 'django.db.bac ...
- Spring中@Translational注解失效场景
今天面试被问到@Translational注解什么场景下失效,我一脸懵逼,说的恍恍惚惚的,下来我就总结一下@Translational注解失效的场景! @Transactional 注解相信大家并不陌 ...
- JVM简单入门
目录 初识JVM 双亲委派机制 沙箱安全机制 Native PC计数器 方法区 栈 堆 工具分析OOM GC算法 GC算法总结 JMM 初识JVM JVM的位置:jre中包含jvm. 双亲委派机制 双 ...
- sql字段长度等于
select count(*) from boc_loan_apply where length(birthday)=7;
- vue中使用transition和animate.css动画效果
一.单个动画中,使用div中引用animate动画 1.下载依赖 npm install animate.css –save 2.main.js中全局引用 import animate from 'a ...
- java开发两年,这些线程知识你都不知道,你怎么涨薪?
前言 什么是线程:程序中负责执行的哪个东东就叫做线程(执行路线,进程内部的执行序列),或者说是进程的子任务. Java中实现多线程有几种方法 继承Thread类: 实现Runnable接口: 实现Ca ...
- Sound Forge批量转换音频格式,实现高效编辑音频
Sound Forge的批量处理功能可以实现批量格式转换.批量添加效果等功能,让用户可以在处理其他音频编辑任务的同时,自动完成格式转换.效果添加等重复性任务.接下来,一起来看看如何借助批处理转换器实现 ...