深度学习推荐系统(1)

  • 什么是推荐系统?
    • 推荐系统使用的评价指标
      • 用户满意度
      • 预测准确度
        • 评分预测
        • TopN推荐
      • 覆盖率
      • 多样性
      • 新颖性
      • AUC曲线
      • 其他指标
    • CTR 问题
  • deepcrossing
    • 特征输入
    • Embedding 层
    • Stacking 层
    • Multiple Residual Units 层
      • 残差网络
        • 残差块
        • 残差网络搭建
    • Scoring层
  • 总结
  • 参考资料

什么是推荐系统?

在信息时代,消费者希望能快速找到自己希望看到的信息,生产者则希望消费者能快速注意到自己的信息,对自己产品感兴趣。为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。

推荐系统的作用就是通过分析用户的历史行为给用户的兴趣建模, 从而主动给用户推荐给能够满足他们兴趣和需求的信息。

推荐系统使用的评价指标

一个模型当然要有评价指标,推荐系统使用的评价指标有:用户满意度、预测准确度、覆盖率、多样性、新颖性、AUC曲线

用户满意度

用户的满意度毫无疑问非常重要,但无法直接离线计算,只能通过用户调查或者在线实验获得,一般通过购买率,与购买率类似的点击率,用户停留时间转化率等指标都可以用来度量用户的满意度。

预测准确度

用来度量用户的实际行为与推荐系统预测结果的准确度,该指标是最重要的离线评价指标,因为可以通过离线计算得到。预测准确度最常用的两个指标是评分预测TopN推荐

评分预测

预测用户对物品的评分行为成为评分预测,评分预测模型通过对用户的历史物品评分记录进行建模,进而得到用户的兴趣模型,然后使用该模型预测用户未未见过商品的评分。

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE) 计算。

对于测试集中的一个用户uuu和物品iii,令 ruir_{ui}rui用户uuu对物品iii 的实际评分,而rui^\hat{r_{ui}}rui^是推荐模型预测出的评分,那么RMSE可以定义为:
$$ RMSE = \sqrt{\frac{\sum_{u,i \in T}(r_{ui} - \hat{r}{ui})^2}{|T|}}

 def RMSE(records):return math.sqrt(sum([(rui - pui)*(rui - pui) for u,i,rui,pui in records]) \/ float(len(records)))

MAE定义为:MAE定义为: MAE: MAE = \frac{\sum{u,i \in T}|r_{ui} - \hat{r}_{ui}|}{|T|} $$

def MAE(records):return sum([abs(rui-pui) for u,i,rui,pui in records]) \/ float(len(records))

RMSE由于存在平方项,使得使得用户真实评分与推荐系统预测评分相差较大的用户加大了惩罚,即该评测指标对系统要求更加的苛刻

TopN推荐

推荐系统在给用户推荐物品的时候,往往会给用户一个列表的推荐物品,这种场景下的推荐成为是TopN推荐,该推荐方式最常用的预测准确率指标一般是精确率(precision)和召回率(recall),令R(u)R(u)R(u)为通过推荐模型得到的推荐列表,T(u)T(u)T(u)为用户在实际场景中(测试集)的行为列表.

精确率(precision): 分类正确的正样本个数占分类器判定为正样本的样本个数比例(这里R(u)R(u)R(u)相当于是模型判定的正样本)
Precision=∑u∈U∣R(u)∩T(u)∣∑u∈U∣R(u)∣Precision= \frac{\sum_{u \in U}|R(u) \cap T(u)|}{\sum_{u \in U}|R(u)|} Precision=uUR(u)uUR(u)T(u)

召回率(recall): 分类正确的正样本个数占真正的正样本个数的比例(这里的T(u)T(u)T(u)相当于真正的正样本集合)
Recall=∑u∈U∣R(u)∩T(u)∣∑u∈U∣T(u)∣Recall= \frac{\sum_{u \in U}|R(u) \cap T(u)|}{\sum_{u \in U}|T(u)|} Recall=uUT(u)uUR(u)T(u)

有时候为了更加全面的评估TopN推荐,通常会选取不同的推荐列表长度计算多组精确率与召回率然后分别绘制出精确率曲线和召回率曲线。

覆盖率

可以理解为是推荐系统发掘物品能力的一种评价指标,有两种定义方式:信息熵和基尼系数

信息熵定义覆盖率: 其中p(i)p(i)p(i)是物品iii的流行度除以所有物品流行度之和
H=−∑i=1np(i)logp(i)H = -\sum_{i=1}^n p(i) logp(i) H=i=1np(i)logp(i)
基尼系数定义覆盖率: 其中iji_jij是按照物品流行度p从小到大排序的物品列表中第jjj个物品
G=1n−1∑j=1n(2j−n−1)p(ij)G=\frac{1}{n-1} \sum_{j=1}^{n}(2j-n-1)p(i_{j}) G=n11j=1n(2jn1)p(ij)

多样性

推荐系统需要尽可能覆盖到不同类别的商品,满足用户的满意程度。

度量推荐列表中物品的多样性换句话说就是度量推荐列表中所有物品之间的不相似性,可以通过不同的相似性函数来度量推荐列表中商品的相似性,比如商品基于内容的相似,基于协同过滤的相似,这样就可以得到不同角度的多样性.

令函数s(i,j)s(i,j)s(i,j)为物品iii和物品jjj的相似性,那么用户推荐列表的多样性可以定义为: Diversity(R(u))=1−∑i,j∈R(u)s(i,j)12∣R(u)∣(∣R(u)∣−1)Diversity(R(u))=1-\frac{\sum_{i,j \in R(u)}s(i,j)}{\frac{1}{2}|R(u)|(|R(u)|-1)} Diversity(R(u))=121R(u)(R(u)1)i,jR(u)s(i,j)

推荐系统整体的多样性可以定义为所有用户推荐列表多样性的平均值:
Diversity=1U∑u∈UDiversity(R(u))Diversity = \frac{1}{U} \sum_{u\in U}Diversity(R(u)) Diversity=U1uUDiversity(R(u))

新颖性

为了让用户感到新颖,最简单的方法就是给用户推荐他们之前没有看过的物品,根据物品的平均流行程度来判断,流行程度越低越新颖。

AUC曲线

AUC(Area Under Curve),ROC曲线下与坐标轴围成的面积。

召回率与准确率(上述已经进行了说明),下面是另一种形势的定义,本质上都是一样的:
Recall=TPTP+FNRecall = \frac{TP}{TP+FN}\ Recall=TP+FNTP
Precise=TPTP+FPPrecise=\frac{TP}{TP+FP} Precise=TP+FPTP
ROC(Receiver Operating Characteristic Curve)曲线:

OC曲线的横坐标为假阳性率(False Positive Rate, FPR),N是真实负样本的个数, FP是N个负样本中被分类器预测为正样本的个数。

纵坐标为真阳性率(True Positive Rate, TPR),P是真实正样本的个数,TP是P个正样本中被分类器预测为正样本的个数。

其他指标

信任度:用户对推荐系统的结果本身的认可感。

实时性:当用户买苹果手机的时候,立即推荐苹果耳机等配件。而不是等到第二天收集了用户购买行为,再离线计算推荐算法,第二天推荐苹果耳机。这就叫实时性。

健壮性:防止攻击的性能。假如我是商户,我可以叫大量人来阅览点击我的商品,那么推荐系统极有可能会增加推荐我的商品的概率。这就是恶意攻击。因为推荐系统本身是通过收集用户行为而推荐的。针对这种情况,除了选择健壮性较高的算法之外,还可以设计推荐系统时尽量使用代价比较高的行为。比如,在购买行为和浏览行为中主要使用购买行为。在使用数据前,进行攻击检测,从而对数据进行清理。

CTR 问题

CTR(Click-Through-Rate)即点击通过率,是互联网广告常用的术语,指网络广告(图片广告/文字广告/关键词广告/排名广告/视频广告等)的点击到达率,即该广告的实际点击次数(严格的来说,可以是到达目标页面的数量)除以广告的展现量(Show content)。
CTR是衡量互联网广告效果的一项重要指标。

CTR点击率预估,是一个二分类问题。
输入:user,Item,context
输出:该item被点击的概率或者是否被点击(取决于是否使用了sigmoid函数)

deepcrossing

deepcrossing于2016年由微软提出,该模型真正的把深度学习运用到推荐模型中。

模型的主要结构

特征输入

模型的输入有类别型特征(广告ID等)和数值型特征(广告预算等),对于类别型特征,我们需要进行one-hot编码处理,而数值型特征 一般需要进行归一化处理。

Embedding 层

Embedding层连接着输入的特征层,作用是将稀疏的类别型特征转成稠密的Embedding向量。Embedding本身来源于NLP中,也是将独热编码转化为词向量。

代码实现

def build_embedding_layers(feature_columns, input_layers_dict, is_linear):# 定义一个embedding层对应的字典embedding_layers_dict = dict()# 将特征中的sparse特征筛选出来sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns)) if feature_columns else []# 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度if is_linear:for fc in sparse_feature_columns:embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, 1, name='1d_emb_' + fc.name)else:for fc in sparse_feature_columns:embedding_layers_dict[fc.name] = Embedding(fc.vocabulary_size + 1, fc.embedding_dim, name='kd_emb_' + fc.name)return embedding_layers_dict

Embedding回答了稀疏特征向量如何稠密化的问题。

Stacking 层

这个层是把不同的Embedding特征和数值型特征拼接在一起,形成新的包含全部特征的特征向量。也就是传统的连接层

实现方法,先将所有的数值特征拼接起来,然后将所有的Embedding拼接起来,最后将数值特征和Embedding特征拼接起来作为DNN的输入,这里TF是通过Concatnate层进行拼接。

def concat_embedding_list(feature_columns, input_layer_dict, embedding_layer_dict, flatten=False):# 将sparse特征筛选出来sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), feature_columns))embedding_list = []for fc in sparse_feature_columns:_input = input_layer_dict[fc.name] # 获取输入层_embed = embedding_layer_dict[fc.name] # B x 1 x dim  获取对应的embedding层embed = _embed(_input) # B x dim  将input层输入到embedding层中# 是否需要flatten, 如果embedding列表最终是直接输入到Dense层中,需要进行Flatten,否则不需要if flatten:embed = Flatten()(embed)embedding_list.append(embed)return embedding_list
#将所有的dense特征拼接到一起
dense_dnn_list = list(dense_input_dict.values())
dense_dnn_inputs = Concatenate(axis=1)(dense_dnn_list) # B x n (n表示数值特征的数量)# 因为需要将其与dense特征拼接到一起所以需要Flatten,不进行Flatten的Embedding层输出的维度为:Bx1xdim
sparse_dnn_list = concat_embedding_list(dnn_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=True) sparse_dnn_inputs = Concatenate(axis=1)(sparse_dnn_list) # B x m*dim (n表示类别特征的数量,dim表示embedding的维度)# 将dense特征和Sparse特征拼接到一起
dnn_inputs = Concatenate(axis=1)([dense_dnn_inputs, sparse_dnn_inputs]) # B x (n + m*dim)

Multiple Residual Units 层

Multiple Residual Units 层连接着Stacking Layer和最后输出结果的Scoring Layer,使用了残差网络的思想。

残差网络

在深度学习中,随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。

当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征,那么VGG-100的效果应该会和VGG-16的效果相同。所以,我们可以在VGG-100的98层和14层之间添加一条直接映射(Identity Mapping)来达到此效果。

从信息论的角度讲,由于DPI(数据处理不等式)的存在,在前向传输的过程中,随着层数的加深,Feature Map包含的图像信息会逐层减少,而ResNet的直接映射的加入,保证了 l+1l+1l+1层的网络一定比 lll层包含更多的图像信息。

基于这种使用直接映射来连接网络不同层直接的思想,残差网络应运而生。

残差块

残差网络是由一系列残差块组成的。一个残差块可以用表示为:
yl=h(xl)+F(xl+Wl)y_{l}=h(x_{l})+F(x_{l}+W_{l})yl=h(xl)+F(xl+Wl)
xl+1=f(yl)x_{l+1}=f(y_{l})xl+1=f(yl)

残差块分成两部分直接映射部分和残差部分。 h(xl)h(x_{l})h(xl)直接映射f(.)f(.)f(.)是激活函数,反应在下图中是左边的曲线F(xl+Wl)F(x_{l}+W_{l})F(xl+Wl)残差部分,一般由两个或者三个卷积操作构成,即下图中右侧包含卷积的部分。

残差块

图中Weight在卷积网络中是指卷积操作,addition是指单位加操作。1x1卷积是为了处理xlx_{l}xl可能和 xl+1x_{l+1}xl+1的Feature Map的数量不一样,用来升维或者降维。

残差网络搭建

残差网络的搭建分为两步:

使用VGG公式搭建Plain VGG网络
在Plain VGG的卷积网络之间插入Identity Mapping,注意需要升维或者降维的时候加入 1x1卷积。

在deepcrossing中,通过多层残差网络对特征向量各个维度充分的交叉组合, 使得模型能够抓取更多的非线性特征和组合特征信息, 增加模型的表达能力。解决了如何解决特征自动交叉组合的问题。

代码:

# DNN残差块的定义
class ResidualBlock(Layer):def __init__(self, units): # units表示的是DNN隐藏层神经元数量super(ResidualBlock, self).__init__()self.units = unitsdef build(self, input_shape):out_dim = input_shape[-1]self.dnn1 = Dense(self.units, activation='relu')self.dnn2 = Dense(out_dim, activation='relu') # 保证输入的维度和输出的维度一致才能进行残差连接def call(self, inputs):x = inputsx = self.dnn1(x)x = self.dnn2(x)x = Activation('relu')(x + inputs) # 残差操作return x

对比:
一个基本残差块的实现

def resnet_v1(x):x = Conv2D(kernel_size=(3,3), filters=16, strides=1, padding='same', activation='relu')(x)x = res_block_v1(x, 16, 16)x = res_block_v1(x, 16, 32)x = Flatten()(x)outputs = Dense(10, activation='softmax', kernel_initializer='he_normal')(x)return outputs

Scoring层

二分类采用逻辑回归,多分类采用softmax

总结

学习了最基础的deepcrossing模型,了解了推荐系统是什么,并了解了残差网络。

参考资料

https://blog.csdn.net/wuzhongqiang/article/details/108948440
https://github.com/datawhalechina/team-learning-rs
https://blog.csdn.net/qq_32023541/article/details/79716927
https://zhuanlan.zhihu.com/p/42706477
https://zhuanlan.zhihu.com/p/97847698

Datewhale组队学习——深度学习推荐系统(1)相关推荐

  1. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程

    深度学习 免费课程 by David Venturi 大卫·文图里(David Venturi) 深入学习深度学习,提供15项免费在线课程 (Dive into Deep Learning with ...

  2. 浅谈如何学习深度学习(经验之谈,仅供参考)

    浅谈如何学习深度学习 方向 书籍 视频 方向 首先,要选择一个感兴趣的方向,或者说是将深度学习与自己的专业.学校的优势学科相结合. 计算机视觉(数字图像处理.图像分类.目标检测.图像语义分割.目标跟踪 ...

  3. 动手学深度学习——深度学习介绍及软件安装

    动手学深度学习是李沐教授在哔哩哔哩上发布的专栏视频,专栏链接如下: https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358 ...

  4. 最新版动手学习深度学习和GAN电子书免费下载!

    今天给大家推荐一个GAN方面的优质公众号---机器学习与生成对抗网络.该公众号里分享了几本深度学习.GAN等好的电子书资源! 强烈推荐李沐等人的<动手学习深度学习>最新版!完整中文版 PD ...

  5. AI:2020年6月21日北京智源大会演讲分享之20:00-21:00邱锡鹏教授《如何学习深度学习》

    AI:2020年6月21日北京智源大会演讲分享之20:00-21:00邱锡鹏教授<如何学习深度学习> 导读:首先感谢北京智源大会进行主题演讲的各领域顶级教授,博主受益匪浅,此文章为博主在聆 ...

  6. 【杂谈】如何在言有三本人的随时答疑下, 长期而系统地学习深度学习和计算机视觉,这是有三AI的完整计划...

    对深度学习从业者要说的话 深度学习的前身是神经网络,属于机器学习技术中的一种,诞生于半个多世纪以前,随着计算硬件水平的提升,工业大数据的积累以及相关理论的完善,如今得以在各行各业大展拳脚.从应用领域来 ...

  7. 【杂谈】2020年如何长期、系统,全面地学习深度学习和计算机视觉,这是有三AI的完整计划...

    对深度学习从业者要说的话 深度学习的前身是神经网络,属于机器学习技术中的一种,诞生于半个多世纪以前,随着计算硬件水平的提升,工业大数据的积累以及相关理论的完善,如今得以在各行各业大展拳脚.从应用领域来 ...

  8. 学习深度学习需要哪些知识_您想了解的有关深度学习的所有知识

    学习深度学习需要哪些知识 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) Corona was a huge challenge for many ...

  9. 【深度学习】学习深度学习的最好方法

    学习深度学习的最好方法 亲自实现,从零开始编写能运行的程序,一遍看源代码一边思考.只有这样才能正确理解深度学习,才能对那些看起来很高级的技术有完整的理解. 不依赖第三方库,从最基础的开始实现起,对于理 ...

  10. 动手学习深度学习的PDF电子版

    动手学习深度学习的PDF电子版 相应的视频 Pytorch的Git地址 书 动手学习深度学习2 Bert的应用

最新文章

  1. 技巧 | OpenCV中如何绘制与填充多边形
  2. 超级干货,一文看懂大数据的前世今生
  3. JavaWeb 入门篇(7) 初次总结
  4. JAVA 多用户商城系统b2b2c---配置中心和消息总线
  5. maven下载源码linux,Maven 下载 源码和javadoc 命令
  6. vue 开发环境搭建
  7. excel导入 HSSFWorkbook和XSSFWorkbook
  8. 如何画圆柱_什么是最速降线?如何来验证一下呢?这里用SolidWorks来试一试
  9. Python基础学习笔记之(一)
  10. Android彻底组件化方案实践
  11. set集合判断集合中是否有无元素_第八章 集合
  12. makefile模板
  13. 10月24日学习内容整理:自增约束条件,外键,修改表,复制表
  14. python实现画板功能并操作数据库
  15. CentOS6和CentOS7进入单用户模式重置root密码
  16. 《5分钟商学院》--读书笔记
  17. 目标检测算法综述(近20年)
  18. 双核浏览器切换内核(模式)的行为分析
  19. 简单家用nas搭建,只需要这个路由器
  20. JSP智能小区物业管理系统

热门文章

  1. 机器视觉在服务机器人中的应用
  2. RT-Thread 入门学习笔记 - 熟悉$Sub$$main与$Super$$main
  3. ambari 修改服务器名,ambari - Ambari无法运行用于修改用户配置单元的自定义钩子 - 堆栈内存溢出...
  4. [程序人生]--人生架构三个层次:智慧是大脑,选择是躯干,知识文化是血肉
  5. 创智汇集,汉韵流芳!大创智国风汉服赏与您相约十月
  6. 01Node.js入门+留言本实操
  7. arcgis标注转为注记后,如何批量修改注记及牵引线颜色
  8. 计算机的ip地址和用户名和密码是什么原因,电脑的ip地址账户和密码忘记怎么办...
  9. spring——事务动态代理造成属性为null
  10. Python小记:14.数据分析基础知识点汇总