推荐系统总结5(推荐实例)

2018-09-06  本文已影响0人  andyham

19 Youtobe的深度学习推荐视频列表(向量的各种嵌入)

19.1 深度学习介绍

矩阵分解是把原来用户和物品之间的大矩阵,分解成了两个小矩阵相乘。这两个小矩阵小在哪?原始的矩阵中,表示每个用户的向量是物品,表示每个物品的向量是用户,两者向量的维度都特别高不说,还特别稀疏,分解后用户向量和物品向量不但维度变得特别小,而且变稠密了。业界还把这个稠密的向量叫做隐因子,意图直观说明它的物理意义:用户背后的偏好因子,物品背后的主题因子。

实际上,完全可以把矩阵分解看成是一种浅层神经网络,只有一层。

这个示意图表示了一个用户 Ui,评分过的物品有 I2 和 I4,分解后的矩阵隐因子数量是 2,用户 Ui 的隐因子向量就是 [w1, w2],物品 I2 的隐因子向量是 [w3, w5],物品 I4 的隐因子向量是 [w4, w6]。同时,建议把逻辑回归看成一个没有隐藏层的神经网络。

因此深度学习可以帮助推荐系统的地方:第一个叫做 Embedding,就是嵌入(Word2vec 也是一种 Embedding),第二个叫做 Predicting,就是预测(Wide&Deep)。

19.2 实例

首先,Youtube 把推荐的预测任务看成是一个多分类,这个和之前常规的推荐系统要么预测行为要么预测评分的做法不太一样,而是把候选物品当成多个类别,预测用户下一个会观看哪个视频。

这个公式中 U 是用户 C 是场景,输入时视频的嵌入向量和用户的嵌入向量。这里就涉及了先要使用深度神经网络,从用户历史反馈行为和场景信息中学习物品和用户的嵌入向量。

1.根据观看历史把视频变成了嵌入向量,然后平均后作为输入特征之一,用各种xxx2vec,把观看历史看成文档,观看的视频看成词。

2.搜索 Query 也变成了嵌入向量,平均之后作为输入特征之二。

3.人口统计学信息统统都嵌入了。还加入视频的年龄信息,也就是在预测时,视频上传多久了。

4.所有这些不同的嵌入向量拼接成一个大的输入向量,经过深度神经网络,在输出层以 Softmax 作为输出函数,预测下一个观看视频。

在模型训练时,以 Softmax 作为输出层,但是在实际线上预测服务时,由于模型关心相对顺序,所以并不需要真的去计算 Softmax,而是拿着用户的特征向量做近似的近邻搜索,只生成最相近的一些推荐结果。 整个推荐系统非常好理解,也比较好落地,所有的模型都可以通TensorFlow 快速实现。

总结:从 YouTube 的推荐系统可以看出,深度学习主要贡献在于特征表达学习和排序模型上。

---------------------------------

20 RNN用在音乐推荐列表上(时间因素作为重要考虑因素)

20.1 RNN的概述

循环神经网络,也常被简称为 RNN,是一种特殊的神经网络。一句话总结:循环神经网络和普通神经网络相比,就是在两个时刻的隐藏状态之间多了网络连接。看上去这个网络连接只与上一个时刻有关,事实上,上一个状态又与上上个状态有关,所以实际上任意一个时刻的状态是与此前所有的状态有关的。

回顾一下 经典神经网络:有三个部分,输入层 x,隐藏层 h,输出层 o,深度神经网络的区别就是隐藏层数量有很多。

把输入层和隐藏层之间的关系表示成公式后就是:

就是输入层 x 经过连接参数线性加权后,再有激活函数 F 变换成非线性输出给输出层。 在输出层就是:

隐藏层输出经过输出层的网络连接参数线性加权后,再由输出函数变换成最终输出,比如分类任务就是 Softmax函数。

那循环神经网络和普通神经网络的区别在哪?

区别就在于:普通神经网络的隐藏层参数只有输入 x 决定,因为当神经网络在面对一条样本时,这条样本是孤立的,不考虑前一个样本是什么,循环神经网络的隐藏层不只是受输入 x 影响,还受上一个时刻的隐藏层参数影响。对比如下:

在时刻 t,输入是 xt,而隐藏层的输出不再是只有输入层 xt,还有时刻 t-1 的隐藏层输出 h(t-1),表示成公式如下。对比这个公式和前面普通神经网络的隐藏层输出,就是在激活函数的输入处多了一个 Uht-1。别小看多这一个小东西,它背后的意义非凡。

现在这个时刻的信息不只和现在的输入有关,还和上一个时刻的状态有关。这是时间序列本来的意义,也就是循环神经网络的意义。

下面分为:建模和训练两个方面来说。

RNN的建模:你可以把播单生成看成由若干步骤组成,每一步吐出一个音乐来。这个吐出音乐的动作实际上是一个多分类问题,类别数目就是总共可以选择的音乐数目,如果有 100 万首歌可以选择,那么就是一个 100 万分类任务。

训练过程设计的公式和参数较多,简单来说,和默认的神经网络相比,多了3个参数:

1.连接输入和隐藏之间的矩阵mk

2.连接上一个隐藏状态和当前隐藏状态的矩阵kk

3.连接隐藏层和输出层的矩阵km

如此一来,循环神经网络在预测时的计算过程就是当用户听完一首歌,要预测下一首歌该推荐什么时,输入就是一个 One-hot 编码的 m 维度向量,用 m 乘以 k 形状的输入层参数矩阵,乘以这个 m 向量,然后用隐藏层之间的 k 乘 k 参数矩阵,去乘以上一个隐藏状态向量,两者都得到一个 k 维向量,相加后经过非线性激活函数,这样就得到当前时刻的隐藏层输出值。再用当前时刻的隐藏层输出值,经过 k 乘以 m 形状的输出层参数矩阵,得到一个 m 维向量,再用 Softmax 把这个 m 维向量归一化成概率值,就是对下一首歌的预测,可以挑选最大概率的若干首歌作为输出,或者直接输出概率最高的那首歌直接播放。

再说RNN的训练:简单的说和普通神经网络相比,用的是误差方向传播。实际上就是链式求导法则,训练模型的目的就是要最小化交叉熵是模型的目标函数,也就是“误差反向传播”的“误差”。

总结:一个循环神经网络的参数训练有何不同呢?唯一不同就是多了一个参数矩阵,连接当前隐藏层和上一次隐藏层的参数矩阵 U,也是链式求导法则的传播路径,也就是多了一些求导计算,更新参数方式并没有什么不同。

----------------------------------------

21 贝叶斯平均用在排行榜(时间 ,热门,平均度)

为什么要用排行榜?没有排行榜,无法做冷启动。也是更新老用户的重要来源。简单的排行榜直接统计某种指标,按照大小去排序。在社交网站上,按照点赞数、转发数、评论数去排序,电商网站上按照销量去排序。简单,容易上线运行,但我只能说这样做不靠谱,不靠谱的原因在于以下的几个问题。

1. 没有时间,无法反映排行榜和时间的关系。

2.马太效应,好的更好,差的看不见。

3.容易被刷榜。

既然朴素的排行榜有这些弊端,那么就针对他们来一一设计应对措施。

1.时间因素

排行榜中的物品,想象它们每一个都是炙手可热的,那么这个温度按照热力学定律来讲,随着时间推移就一定会耗散到周围,温度就会下降。Hacker News 计算帖子的热度就用到了这个思想,做法用公式表达是下面这个样子。

P:得票数,去掉帖子作者自己投票,所以减一。

T:帖子距离现在的小时数,加上帖子发布到被转帖至 Hacker News 的平均时长。

G:帖子热度的重力因子。

另一个考虑时间因素的排行榜算法是牛顿冷却定律。内容类似,需要配上一个系数,反映物品自然冷却的快慢。可以由程序员自己调试或者借鉴,具体可以查阅互联网。

2.除了时间还有点赞和否赞

以国外类似知乎的问答网站为例:

Qviews: 问题的浏览次数。 Qanswers: 问题的回答数。 Qscore:问题的得分(赞成数 - 反对数)。Ascore:答案的得分。Qage: 问题发布距离当前的时间。Qupdated: 问题最后一次修改距离当前的时间。

这个问题热门程度计算方式,也考虑了时间因素。分母反映了问题的陈旧程度,修改问题可以让问题不要衰老过快分子有三部分构成:左边是问题的浏览量,反映了问题的受关注程度;中间是问题的回答量和问题本身的质量分数的乘积,高质量、回答多的问题占优势;右边是答案的总质量分

3. 如何不被刷榜

前面两种排行榜分数计算法,都是以用户投票的绝对数量作为核心的,换个思路来看,从比例来看也是可以的。比如电影点评网站通常会有一个 Top250,这也是一种排行榜,以好评比例作为核心来计算排行榜分数。

这个排行榜计算公式,叫做“贝叶斯平均”。R,物品的平均得分,这个很简单,有多少人评分,把他们评分加起来除以人数就是了;v,参与为这个物品评分的人数;m,全局平均每个物品的评分人数;C,全局平均每个物品的平均得分;别看这个公式简单,它反映了这么几个思想在里面:

如果物品没多少人为它投票,也就是评价人数不足,那么v 就很小,m 就很大,公式左边就很小,右边就很大,于是总分算出来很接近右边部分,也就是接近全局平均分 C

如果物品投票人数很多,那么 v 很大,m 很小,分数就接近它自己的平均分 R

这个公式的好处是:所有的物品,不论有多少人为它评分,都可以统一地计算出一个合理的平均分数,当然,在实际应用中,略有改变。

----------------------------------------------------------------

22 权重和去重

22.1 权重

抓取了用户的标签了,到到底要保留多少标签呢?需要一个简单加权采样的算法,每次召回时并不使用全部用户标签,而是按照采样一部分标签来使用,这样可以保留更多用户标签,减少召回计算复杂度。

如果对应有限数据集,使用指数分布加权采样。

对应无线数据集,用蓄水池采样。

22.2 去重

去重分为两个部分,对内容的去重(找到两个一样的内容,去掉一个),和对推荐内容的去重(类似的东西,不要推荐给同一个用户)

22.2.1 内容去重

内容去重很简单,直观的思路是分词,然后提取关键词,再两两计算词向量之间的距离,距离小于一定阈值后就判定为重复。然而,这对于海量内容,比如几千万以上的内容来说简直就是灾难。Google 在 07 年公开了他们内部的内容重复检测算法Simhash这个带有hash算法简单有效,甚至造福了今天的信息流推荐产品。如果只是hash效验就不值得说了,这个 Simhash 奇妙在哪呢?(具体算法可参考网络)如果部分出现的key word比较少,算法对它hash生成的向量不影响结果,意味着,如果如果小部分无关紧要的修改,依然能判断这两个文章是同一个文章(以往hash效验,修改一个标点符号,都是认为是两篇文章)。

22.2.2 推荐去重

防止已经推荐的内容被重复推荐。这个刚需和上述内容重复相比,最大的不同就是过滤对象不同,上述 Simhash 过滤对象是内容本身,而这里则一般是内容的 ID。有一个有点老但很好用的做法,Bloomfilter,布隆过滤器。布隆过滤器的原理也要用到哈希函数。包含两部分:一个很长的二进制位向量,和一系列哈希函数。

这个示意图中,原始的模式串经过三个互相独立的哈希函数,映射到 8 位二进制向量中的三个位置了。原始的模式串集合经过这样的处理后,就得到一个很大的二进制向量。在应用阶段时,假如来了一个模式串 s,需要查询是否在这个集合中,也需要经过同样的上述步骤。

每个哈希函数对这个模式串 s 哈希后都得到一个整数,看看这个整数在二进制向量中所指示的位置是不是 1,如果每个哈希函数所指示的位置都是 1,就说明模式串 s 已经在集合中了。

上一篇 下一篇

猜你喜欢

热点阅读