推荐系统实践 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的基本控件及控件扩展的用法,和在平时的学习运用中一步一步查阅的资料.积累经验的集锦.标题及链接奉上,用一个小程序,开启了 ...
随机推荐
- 使用pipenv管理python虚拟环境
前言 近期的项目中,我开始尝试着从virtualenv管理python虚拟环境,切换到用pipenv来管理. 经过一段时间的使用,着实觉得pipenv使用的更加顺手,更加的便捷.这当然也延续了 Ken ...
- 前言「HarmonyOS应用开发基础篇」
场景一.随着智能设备种类的不断增多,我们基本上每人都有好几台智能设备,比如智能手机,平板,耳机,音响,穿戴设备等等.这些设备都具有独立性,偶尔的组合也是我们通过手动去搭配,并且不一定能够完全组合在一起 ...
- JS超酷时钟的制作
通过补充代码,实现时钟实时显示当前时间:年.月.日.时.分.秒.日期. <!DOCTYPE html> <html> <head lang="zh-CN&quo ...
- 软件工程作业--ATM自助银行服务系统
博客班级 AHPU软件工程 作业要求 ATM自助银行服务系统 作业目标 编码实现ATM自助银行服务系统 学号 3180701118 目录 一.作业要求 二.代码及运行界面 1.test类 2.User ...
- 第一章epoll
IO多路复用之epoll总结 1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll ...
- Spring源码之事务(一)— TransactionAutoConfiguration自动配置
总结: 在ConfigurationClassParser#parse()中会对deferredImportSelectorHandler进行处理(在处理@ComponentScan 自己所写@Com ...
- REDHAT 7.5beta 新推出的VDO功能
前言 关于VDO VDO的技术来源于收购的Permabit公司,一个专门从事重删技术的公司,所以技术可靠性是没有问题的 VDO是一个内核模块,目的是通过重删减少磁盘的空间占用,以及减少复制带宽,VDO ...
- Python_爬虫_百度图片
百度图片有些有编码问题,暂时不能爬取,多试几个 #思路:抓取图片地址,根据地址转存图片(注意名称):难点:转码 # -*- coding:utf-8 -*- from urllib import re ...
- spring boot配置MySQL8.0 Druid数据源
创建spring boot项目,在pom中添加相应依赖 <!--web--> <dependency> <groupId>org.springframework.b ...
- bWAPP----HTML Injection - Reflected (POST)
bWAPP--low--HTML Injection - Reflected (POST) 只不过是把传递方式换成post, 防护的三个级别和内容与GET相同 1 function htmli($da ...