逻辑回归(LR)

在介绍FM系列之前,我想首先简单介绍一下逻辑回归。通常来说,逻辑回归模型能够综合利用更多的信息,如用户、物品、上下文等多种不同的特征,生成更为全面的结果。另外,逻辑回归将推荐问题看成一个分类问题。通过预测正样本的概率对物品进行排序,这里的正样本可以是用户观看了某个视频,也可以是用户点击了某个商品,或者用户播放了某个音乐等等。逻辑回归模型将推荐问题转换成了CTR(click throught rate)预估的问题。

步骤

一般来说,逻辑回归模型的推荐过程分成以下几步:

将用户年龄、性别等信息,商品名称、属性等信息,以及上下文等信息转换成数值型特征向量。

将逻辑回归作为优化目标,利用样本数据对逻辑回归模型进行训练,调整模型内部参数。

在模型服务阶段,将特征向量的输入到模型当中,得到用户“点击”等正反馈的概率。

按照正反馈的概率对物品进行排序,得到推荐列表。

这里的逻辑回归也使用了梯度下降的算法。这里我推荐一篇文章专门介绍逻辑回归的数学原理,感兴趣的读者可以继续阅读。另外特别要说明的事是,逻辑回归是分类模型,不是回归模型。

优点

有着具体的数学含义作为支撑。由于CTR模型符合伯努利分布,所以使用逻辑回归作为CTR模型符合逻辑规律。

可解释性强,能够通过权重对各个因素进行定位,给出结果的可解释性原因。

实际工程需要。由于易于并行化、模型简单以及训练开销小等特点,逻辑回归受到了广泛认可。

局限

表达能力不强,无法进行特征交叉、特征筛选等操作等

POLY2

POLY2是最简单的特征交叉的算法,直接对特征进行暴力组合,看看它的数学形式就能知道

\[\mathrm{POLY2}(w,x)=\sum_{j_1=1}^{n-1}\sum_{j_2=j_1+1}^{n}w_{h(j_1,j_2)}x_{j_1}x_{j_2}

\]

直接对特征进行两两交叉,并对交叉后的特征组合赋予权重。POLY2仍然是线性模型,训练方法与逻辑回归模型并无区别。

局限

对于很多互联网数据,通常使用的是one-hot编码,无选择的特征交叉使得特征向量更加稀疏,对于权重缺乏有效训练,甚至无法收敛。

权重参数直接上升了一个数量级,计算量难以接受

Factorization Machines(FM)

为了解决POLY2的局限,FM模型使用了两个向量内积取代了单一的权重系数。FM模型为每个特征学习了一个隐权重向量,在做特征交叉时使用两个特征隐向量的内积作为交叉特征的权重。如以下公式:

\[\mathrm{FM}(w,x)=\sum_{j_1=1}^{n-1}\sum_{j_2=j_1+1}^{n}(w_{j_1}w_{j_2})x_{j_1}x_{j_2}

\]

FM引入特征隐向量与矩阵分解中的隐向量有异曲同工之妙。通过引入特征隐向量的方式,把POLY2当中\(n^2\)级别的权重参数降低到了\(nk\),极大地降低了训练开销。

另外,由于特征隐向量的存在,使得模型具备了计算特征组合权重的能力,如家具,蔬菜两种特征中的一个训练样本,(桌子,西红柿),就不需要同时出现桌子和西红柿才能学习这种特征组合。另外,当出现新的样本事也能通过计算过的特征隐向量进行在线服务。

同样的,FM也可以使用梯度下降法进行学习,不失实时性和灵活性。我们看一下PyTorch版本的FM是如何实现的吧。

import torch as torch

import torch.nn as nn

import numpy as np

import torch.nn.functional as F

class FeaturesLinear(nn.Module):

def __init__(self, field_dims, output_dim=1):

super(FeaturesLinear, self).__init__()

print("field_dims: ", field_dims)

self.fc = nn.Embedding(sum(field_dims), output_dim)

self.bias = nn.Parameter(torch.zeros((output_dim,)))

# accumulation add function to sparse the categories like:[1,3,4,7]==>[1,4,8,15]

self.offsets = np.array((0, *np.cumsum(field_dims)[:-1]), dtype=np.long)

def forward(self, x):

"""

to change the category Serial number to ordered number

like we got x = [2, 4] means category_1's id is 2, and category_2's id is 4

assume field_dims like [3, 8], category_1 has 3 ids, category_2 has 8 ids. ==> offsets=[0, 3]

x = [0 + 2, 4 + 3] ==> [2, 7]

"""

x = x + x.new_tensor(self.offsets).unsqueeze(0)

return torch.sum(self.fc(x), dim=1)+self.bias

class FeaturesEmbedding(nn.Module):

def __init__(self, field_dims, embed_dim):

super(FeaturesEmbedding, self).__init__()

self.embedding = nn.Embedding(sum(field_dims), embed_dim)

self.offsets = np.array((0, *np.cumsum(field_dims)[:-1]), dtype=np.long)

nn.init.xavier_uniform_(self.embedding.weight.data)

def forward(self, x):

x = x + x.new_tensor(self.offsets).unsqueeze(0)

return self.embedding(x)

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

import torch.nn.functional as F

from base import BaseModel

import torch as torch

import torch.nn as nn

from model.layers import *

class FM(BaseModel):

def __init__(self, field_dims=None, embed_dim=None):

super().__init__()

self.linear = FeaturesLinear(field_dims)

self.embedding = FeaturesEmbedding(field_dims, embed_dim)

self.fm = FactorizationMachine(reduce_sum=True)

def forward(self, x):

x = self.linear(x) + self.fm(self.embedding(x))

x = torch.sigmoid(x.squeeze(1))

return x

Field-aware Factorization Machine(FFM)

还是为了解决数据特征系数的问题,FFM在FM的基础上进一步改进,在模型中引入域的概念,即field。将同一个域的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个域,分别学习一个隐变量,该隐变量不仅与特征相关,也与域相关。

\[\mathrm{FFM}(w,x)=\sum_{j_1=1}^{n-1}\sum_{j_2=j_1+1}^{n}(w_{j_1,f_2}w_{j_2,f_1})x_{j_1}x_{j_2}

\]

按照我的理解,引入特征域的概念实际上是希望每种特征都能够针对性对其他特征有更合适的权重,也就是学习域与域之间的权重分布,作为特征隐变量。但是与此同时,计算复杂度从\(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

from model.layers import *

class FFM(nn.Module):

def __init__(self, field_dims, embed_dim):

super().__init__()

self.linear = FeaturesLinear(field_dims)

self.ffm = FieldAwareFactorizationMachine(field_dims, embed_dim)

def forward(self, x):

ffm_term = torch.sum(torch.sum(self.ffm(x), dim=1), dim=1, keepdim=True)

x = self.linear(x) + ffm_term

return x.squeeze(1)

参考

推荐系统fmlr_推荐系统实践 0x0c FM系列(LR/FM/FFM)相关推荐

  1. 推荐系统召回四模型之:全能的FM模型

    原文地址:https://zhuanlan.zhihu.com/p/58160982?utm_source=ZHShareTargetIDMore&utm_medium=social& ...

  2. 推荐系统入门(五):GBDT+LR(附代码)

    推荐系统入门(五):GBDT+LR(附代码) 目录 推荐系统入门(五):GBDT+LR(附代码) 引言 1. GBDT模型 2. LR模型 3. GBDT+LR模型 4. 编程实践 实战 思考 参考资 ...

  3. 推荐系统[八]算法实践总结V0:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  4. 从原理到策略算法再到架构产品看推荐系统 | 附Spark实践案例

    原文链接:mp.weixin.qq.com  作者 | HCY崇远 01 前言 本文源自于前阵子连续更新的推荐系统系列,前段时间给朋友整理一个关于推荐系统相关的知识教学体系,刚好自身业务中,预计明年初 ...

  5. 机器学习在B站推荐系统的应用实践

    猜你喜欢 0.2022年人才市场洞察及薪酬指南 1.[免费下载]2022年1月份热门报告 2.[实践]小红书推荐中台实践 3.微信视频号实时推荐技术架构分享 4.腾讯QQ看点推荐场景的多目标架构实践 ...

  6. 高并发推荐系统架构设计实践

    猜你喜欢 0.[免费下载]2022年1月热门报告盘点1.腾讯QQ信息流推荐业务实践2.小红书推荐中台实践3.微信视频号的实时推荐技术架构分享4.预训练模型在华为信息流推荐系统中的探索和应用5.腾讯PC ...

  7. 【实践】数据科学在搜索、广告、推荐系统的应用实践.pdf(附下载链接)

    今天给大家带来前Twitter数据科学家.现快手搜索分析负责人王建强先生所做的分享<数据科学在搜索.广告.推荐系统的应用实践.pdf>.关注数据科学及相关应用的伙伴们别错过了!(到小程序省 ...

  8. 【实践】图片主题模型在推荐系统的应用实践.pdf(附下载链接)

    今天给大家带来搜狐视频王超先生所做的分享<图片主题模型在推荐系统的应用实践.pdf>.本次分享主要包含如下三大部分: 1.推荐系统与内容理解: 2.基于目标检测的图片主题模型: 3.基于特 ...

  9. 【组队学习】【32期】推荐系统-新闻推荐系统实践

    推荐系统-新闻推荐系统实践 航路开辟者:罗如意 领航员:肖桐 航海士:汪志鸿.吴忠强.赖敏材.王辰玥.毛伟.宋禹成.陈雨龙.管柯琴 基本信息 开源内容:https://github.com/dataw ...

最新文章

  1. Yolov5总结文档(理论、代码、实验结果)
  2. UA PHYS515 电磁理论II 静电场问题6 正交函数系简介
  3. 如何避免把软件装到C盘
  4. matlab样本序列的时域波形,时域信号matlab实现
  5. mysql .pdb是什么文件_计算广告算法到底要做什么?
  6. Taro+react开发(37)箭头函数括号加个return
  7. python MultipartEncoder
  8. 终于在五一之前打了SP3
  9. Oracle 数据库升级
  10. Rust: codewars 的Duplicate Encoder
  11. usb转rs232驱动无效,已经电脑自动扫描检测硬件改动.设备无法运行错误代码10
  12. 罗技鼠标显示无法连接服务器,罗技无线鼠标接收器无法配对的详细解决办法
  13. 全球与中国心脏临床信息系统(CIS)市场深度研究分析报告
  14. css文字闪光特效,利用js css3实现文字闪光滑过动画特效
  15. python 编写 cgi 脚本
  16. JSP的 页面访问执行流程
  17. python delta_Python 函数
  18. 世纪佳缘钓鱼白帽子,互联网安全的边界如何界定?
  19. html+css+js 简易笔记
  20. ~~~实用工具~~~

热门文章

  1. 日期格式无法识别_Excel – 将各种伪日期批量转化为真日期
  2. tcp对连接断开的感知——保活定时器
  3. Image flow使用
  4. GCD(Grand Central Dispatch)
  5. Lua字符串库中的几个重点函数介绍
  6. Solaris下怎样改动文件创建时间及查询
  7. git pull ---rebase
  8. 如何查看linux下的环境变量
  9. TOP10十大GPS导航手机(有车一族必备手机)
  10. Enterprise Vault 2007 软硬件兼容性