打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
亚马逊商城如何知道用户爱好?揭秘Keras推荐系统

小编说:你是否有过这样的经历?当你在亚马逊商城浏览一些书籍,或者购买过一些书籍后,你的偏好就会被系统学到,系统会基于一些假设为你推荐相关书目。为什么系统会知道,在这背后又藏着哪些秘密呢?

本文选自《Keras快速上手:基于Python的深度学习实战》一书。

Keras 简介

Keras 是Python 中一个以CNTK、TensorFlow 或者Theano 为计算后台的深度学习建模环境。相对于常见的几种深度学习计算软件,比如TensorFlow、Theano、Caffe、CNTK、Torch 等,Keras 在实际应用中有如下几个显著的优点。

  • Keras 在设计时以人为本,强调快速建模,用户能快速地将所需模型的结构映射到Keras 代码中,尽可能减少编写代码的工作量,特别是对于成熟的模型类型,从而加快开发速度。

  • 支持现有的常见结构,比如卷积神经网络、时间递归神经网络等,足以应对大量的常见应用场景。

  • 高度模块化,用户几乎能够任意组合各个模块来构造所需的模型。在Keras 中,任何神经网络模型都可以被描述为一个图模型或者序列模型,其中的部件被划分为以下模块:神经网络层、损失函数、激活函数、初始化方法、正则化方法、优化引擎。这些模块可以以任意合理地方式放入图模型或者序列模型中来构造所需的模型,用户并不需要知道每个模块后面的细节。这种方式相比其他软件需要用户编写大量代码或者用特定语言来描述神经网络结构的方法效率高很多,也不容易出错。

  • 基于Python,用户也可以使用Python 代码来描述模型,因此易用性、可扩展性都非常高。用户可以非常容易地编写自己的定制模块,或者对已有模块进行修改或者扩展,因此可以非常方便地开发和应用新的模型与方法,加快迭代速度。

  • 能在CPU 和GPU 之间无缝切换,适用于不同的应用环境。当然,我们强烈推荐GPU 环境。

推荐系统

当你在亚马逊商城浏览一些书籍,或者购买过一些书籍后,你的偏好就会被系统学到,系统会基于一些假设为你推荐相关书目。系统从百万甚至上亿的内容或商品中把有用的东西高效地显示给用户,这样可以为用户节省很多自行查询的时间,也可以提示用户可能忽略的内容或商品,使用户更有黏性,更愿意花时间待在网站上,从而使商家赚取更多的利润,即使流量本身也会使商家从广告中受益。

那么推荐系统背后的魔术是什么呢?其实任何推荐系统本质上都是在做排序。

互联网科技时代,数据是最根本的。充分利用各平台数据,把系统里所有的音乐、电影、应用等从高到低进行喜好排序,把排名高的推荐给用户,用户喜欢了,推荐系统自然就会有价值。

你可能注意到了,排序的前提是对喜好的预测。那么喜好的数据从哪里来呢?这里有几个渠道,比如你和产品有过互动,看过亚马逊商城的一些书,或者买过一些书,那么你的偏好就会被系统学到,系统会基于一些假设给你建立画像和构建模型。你和产品的互动越多,数据点就越多,画像就越全面。除此之外,如果你有跨平台的行为,那么各个平台的数据汇总,也可以综合学到你的偏好。比如谷歌搜索、地图和应用商城等都有你和谷歌产品的互动信息,这些平台的数据可以通用,应用的场景有很大的想象力。平台还可以利用第三方数据,比如订阅一些手机运营商的数据,用来多维度刻画用户

那推荐系统又是如何建立模型、知道用户爱好的?作者提供了两种重要的算法:矩阵分解模型和深度模型,快来一起探个究竟吧!

1.矩阵分解模型

矩阵分解可以认为是一种信息压缩。这里有两种理解。第一种理解,用户和内容不是孤立的,用户喜好有相似性,内容也有相似性。压缩是把用户和内容数量化,压缩成 k 维的向量。把用户向量维度进行压缩,使得向量维度变小,本身就是信息压缩的一种形式;向量之间还可以进行各种计算,比如余弦(Cosine)相似性,就可以数量化向量之间的距离、相似度等。第二种理解,从深度学习的角度,用户表示输入层(User Representation)通常用 One Hot编码,这没问题,但是通过第一层全连接神经网络就可以到达隐藏层,就是所谓的嵌入层(Embedding Layer),也就是我们之前提到的向量压缩过程。紧接着这个隐藏层,再通过一层全连接网络就是最终输入层,通常用来和实际标注数据进行比较,寻找差距,用来更新网络权重。从这个意义上讲,完全可以把整个数据放进神经系统的框架中,通过浅层学习把权重求出来,就是我们要的向量集合了。经过这么分析,矩阵分解在推荐系统中是如何应用的就显而易见了。

假设有用户和内容(比如电影)的互动数据,其中一种情况是 Netflix 的打分模式,即用户会给电影进行 1~5 的打分;另一种情况是基于用户行为的,比如用户是否看了某部电影、看了多长时间等。通常第二种模式更加值得信赖,因为用户看电影的行为被机器日志所记录,是真实的数据,不需要担心数据不准确或者有偏差的问题。

这两种情形都可以用矩阵分解来解决。假设数据库里m 个用户和 n 部电影,那么用户电影矩阵的大小就是 m×n。每个单元 (i,j) 用R ij 表示用户是否看了该电影,即0 或 1。我们把用户和电影用类似 Word2Vec 的方法分别进行向量表示,把每个用户 i 表示成 d 维向量 X i ,把每部电影 j 表示成 d 维向量 Y j 。我们要寻找 X i 和 Y j ,使得 X i ×Y j和用户电影矩阵 R ij 尽可能接近,如图所示。这样对于没出现过的用户电影对,通过 X i ×Y j 的表达式可以预测任意用户对电影的评分值。

用数学表达式可以这么写:

注意:这里d 是一个远小于m; n 的数。从机器学习的角度来说,模型是为了抓住数据的主要特征,去掉噪声。越复杂、越灵活的模型带来的噪声越多,降低维度则可以有效地避免过度拟合现象的出现。

1.深度神经网络模型

下面展示进阶版的深度模型。我们将建立多层深度学习模型,并且加入 Dropout技术。

这个模型非常灵活。因为如果有除用户、电影之外的数据,比如用户年龄、地区、电影属性、演员等外在变量,则统统可以加入模型中,用嵌入的思想把它们串在一起,作为输入层,然后在上面搭建各种神经网络模型,最后一层可以用评分等作为输出层,这样的模型可以适用于很多场景。深度模型的的架构如下图所示。

首先,做用户和电影的嵌入层。

第三个小神经网络,在第一、二个网络的基础上把用户和电影向量结合在一起。

然后加入Dropout 和relu 这个非线性变换项,构造多层深度模型。

因为是预测连续变量评分,最后一层直接上线性变化。当然,读者可以尝试分类问题,用Softmax 去模拟每个评分类别的概率。

将输出层和最后的评分数进行对比,后向传播去更新网络参数。

接下来要给模型输入训练数据。

首先,收集用户索引数据和电影索引数据。

收集评分数据。

构造训练数据。

然后,用小批量更新权重。

模型训练完以后,预测未给的评分。

最后,对训练集进行误差评估。

训练数据的误差在0.8226 左右,大概一个评分等级不到的误差。

你可能会问,为什么这个误差和之前矩阵分解的浅层模型误差的差距比较大?作者的理解是,这里的Dropout 正则项起了很大的作用。虽然我们建了深层网络,但是由于有了Dropout 这个正则项,必然会造成训练数据的信息丢失(这种丢失会让我们在测试数据时受益)。就好比加了L1, L2 之类的正则项以后,估计的参数就不是无偏的了。因此,Dropout 是训练误差增加的原因,这是设计模型的必然结果。但是,需要记住的是,我们始终要对测试集上的预测做评估,训练集的误差只是看优化方向和算法是否大致有效。

《Keras快速上手:基于Python的深度学习实战》

俞栋、张察博士亲笔作序力荐,谷歌、微软、Twitter、Facebook、Airbnb等公司多位资深数据科学家倾情力荐。

作者:谢梁 鲁颖 劳虹岚

图书链接:https://item.jd.com/12134119.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
达观数据基于Deep Learning的中文分词尝试
一些基本概念
问题解决:构建基于深度学习架构的推荐系统!
如何用Python实现iPhone X的人脸解锁功能?
推荐系统中基于深度学习的混合协同过滤模型
从零搭建推荐体系: 推荐体系和评估体系(下)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服