与传统的浅层机器学习相比, 深度学习具备优秀的自动提取抽象特征的能力,而且随着分布式计算平台的快速发展,大数据的处理能力获得极大的提高,使得近年来DL在工程界获得普遍的应用,包括图像识别,语音识别,天然语言处理等领域,并取得比传统机器学习更好的效果提高。另外一方面,智能推荐系统,本质上是从一堆看似杂乱无章的原始流水数据中,抽象出用户的兴趣因子,挖掘出用户的偏好,所以把深度学习与推荐系统相结合成为近年来DL发展的一个新热点,事实上,Spotify,Netflix,Facebook,Google等公司早已经对如何把深度学习应用到推荐系统中有了不少深刻研究,并在实际应用中取得了很好的效果提高 [1]。算法
本文是深度学习在推荐系统实践应用系列文章的第一篇,详细介绍了如何把受限玻尔兹曼机(Restricted Boltzmann Machine, 下面统一简称RBM)应用到咱们当前线上的推荐系统中,包括RBM的原理,在推荐系统的应用及其并行化实现的细节,后面两篇会详细介绍另外两个咱们目前正在研究使用的深度神经网络,分别是递归神经网络(Recurrent Neural Network, RNN)和卷积神经网络(Convolutional Neural Network, CNN),详细介绍它们的原理,如何与智能推荐相结合以及线上的模型效果。网络
之因此把RBM做为第一篇进行讲解,一方面是由于它的结构相对比较简单,是一个只有可视层和隐藏层两层结构的网络;另外一方面,从严格意义上说,RBM并不属于深层神经网络,它只是一个两层结构,并不“深”,但它同时也是构成其余深度神经网络的经常使用层次组件,所以,理解如何把RBM应用到推荐系统上,将有助于理解后面几个更复杂的深度学习算法的应用。架构
一:受限玻尔兹曼机与推荐系统机器学习
1.1 RBM网络结构定义分布式
咱们首先给出RBM的网络结构定义,RBM是由可视层和隐藏层相互链接的一个彻底二分图网络结构,以下图所示,每个神经元是一个二值单元,也就是每个神经元的取值只能等于0或1:函数
RBM的网络结构具备这样的特色: 可视层的每个神经元与隐藏层的每个神经元相互链接;可视层神经元之间,隐藏层神经元之间没有连线,这为咱们后面的训练提供了一个很好的假设性条件:同一层的各神经元之间是相互独立的。对上面的网络结构,咱们首先来定义下面的参数:性能
1.2 RBM与协同过滤学习
上一小节咱们对RBM的结构定义进行了简要的阐述,那么怎么把该模型应用到推荐系统中呢?RBM本质上是一个编码解码器,具体来讲,经过RBM,咱们能够把原始输入数据从可视层映射到隐藏层,获得原始输入数据的隐因子(latent factor)向量表示,这一过程也称为编码过程,而后利用获得的隐藏层向量从新映射回可视层,获得新的可视层数据,这个过程称为解码过程,咱们的目标是让解码后的结果能和原始数据尽可能接近,这样,在解码的过程当中,咱们不但能获得已评分物品的新的评分数据,还能对未评分的物品的得分进行预测,这些未评分物品的分数从高到低的排序造成推荐列表。大数据
从上面的分析能够看出,咱们将RBM应用到推荐中去要解决下面的两个问题:优化
1. 如何用可视层来表示用户的听歌流水数据?
2. 如何处理missing数据?
正如上一段咱们提到,用户的原始输入数据只对部分极少数的歌曲有评分,对没有评分的歌曲对应的神经元,也就是上图中的missing神经元,在训练权重时咱们并不考虑这部分数据,每个用户的数据将构成一个独立的RBM子模型,每个用户的子模型只对其中关联到的权重值调整作出贡献,同理,每个权重值的参数更新只由与该权重值相关联的用户数据来决定。
下面咱们来看看修正的RBM模型对数据编码和解码的过程:
编码过程:利用原始数据,咱们求取隐藏层的隐向量表示,这个过程是由条件几率公式求得:
下图是编码过程的动态图展现:
二:模型最优化 - 对比散度(contrastive divergence)
经过第一部分的叙述,咱们已经知道了RBM的网络结构以及如何与推荐系统相结合,那么如今咱们的问题就是如何训练模型,对于RBM来讲,就是要训练出三个权重参数: 链接可视层与隐藏层的权重W,可视层结点的偏移量visbias,隐藏层结点的偏移量hidbias。
对于机器学习模型来讲,咱们首先要肯定咱们的目标训练函数是什么,对于RBM模型,它本质上是一个编码解码的过程,所以咱们很天然的想法是:指望通过RBM编码和解码后的数据与原始的输入数据尽可能接近,这也是最大似然参数估计的思想,即咱们的最优化目标函数为:
训练RBM的最大困难在于负梯度的计算,Hinton教授于2002年提出了对比散度的算法,它有效解决了RBM训练速度的难题,也是当前RBM的标准训练算法,对比散度的思想是经过一种合理的采样方法, 以较少的采样样原本近似负梯度的全部组合空间,具体实现过程就是:咱们从原始的输入数据出发,通过编码解码后获得新的可视层输入,这一个过程称为1步Gibbs采样,而后利用通过相同的过程,获得,重复这个过程次,最后获得,这个值就是最后负梯度的近似,这个过程被称为步Gibbs采样过程,下图就是步Gibbs采样过程的动态图展现:
三:对比散度的并行化实现
当前对RBM的并行化训练已经有比较成熟的平台,如Theano,Caffe,TensorFlow等,咱们在实现的过程没有采用上面的平台架构,而是采用了spark集群来训练,对比散度训练RBM过程本质上是一个梯度降低的最优化过程,下图是算法在spark的执行流程图:
根据前面的描述,每个用户的数据构成一个RBM子网络,集群首先是对数据和子模型进行切分,模型和数据在运行的过程当中将被分配到不一样的executor中执行,获得每个子模型的正梯度以及k步Gibbs采样后的负梯度,而后子结果传送回driver端进行合并,通常来讲为了防止所有数据返回形成driver端的网络通信压力以及内存压力,咱们能够采用树聚合的方式来优化,下图是树深度为2和树深度为4的效果图,注意不一样线条的颜色表明数据在不一样的单元中传输,从图中能够看出,深度越大,计算的步骤会变长,但每一次传输到driver的数据会减小,能够防止driver端内存溢出的问题。
四:线上模型融合
通过前面三节的分析,咱们已经对RBM如何做用于推荐系统,RBM模型的训练等都有了比较深刻的了解,最后咱们须要利用训练好的模型来生成推荐数据并与其余算法模型进行融合,对推荐结果数据的计算,是利用已经训练完的权重参数,对输入数据进行一次编解码的过程,解码后的新数据,不但能从新生成已经操做过的数据的得分,还能对未操做过的数据预测得分,也就是1.2节的missing数据,这些missing数据的得分帮助咱们对推荐数据进行排序。
要实现这个过程,咱们有下面两种作法:一是直接离线批量生成全部用户的数据,但这种作法的计算量很是巨大;二是把训练好的权重单独保存,推荐数据的生成放到在线层实时计算,以下图所示:
在应用中,咱们采用的是第二种方法,这种作法相比第一种方法的好处有两个:一是结果不依赖于离线任务,防止了离线任务的失败对线上数据的影响;二是线上实时计算的结果数据可以与现有的算法模型数据的融合更加灵活,包括后续数据处理的规则过滤,重排序等。
五:小结
本文详细分析了RBM在推荐系统中的应用,从文中分析能够看出,RBM对推荐系统的提高主要得益于它具备自动提取抽象特征的能力,这也是深度学习做用于推荐系统的基础。后面的文章中,将继续分析RNN和CNN如何在提取抽象特征的基础上,进一步提高推荐系统的性能。