推荐系统三十六式学习笔记:原理篇.深度学习20|用RNN构建个性化音乐榜单

目录

  • 时间的重要性
  • 循环神经网络
  • 榜单生成
    • 1.数据
    • 2.建模
  • 总结

时间是一个客观存在的物理属性,很多数据都有时间属性,只不过大多时候都把它忽略了。前面讲到的绝大多数推荐算法,也都没有考虑“用户在产品上作出任何行为”都是有时间先后的。

正是认识到这一点,有一些矩阵分解算法考虑了时间属性,比如Time-SVD;但是,这种做法只是把时间作为一个独立特征加入到模型,仍然没有给时间一个正确的名分。

时间的重要性

时间属性反映在序列的先后上,比如用户周末在腾讯视频网站,中午看了动漫,下午又看了综艺,晚上又看了一部电影,这种先后的关系就是时间序列。

具体到推荐系统领域,时间序列就是用户操作行为的先后。绝大多数推荐算法都忽略操作的先后顺序,因为一方面忽略后也能取到不错的效果,另一方面深度学习和推荐系统还迟迟没有相见。

在深度学习大火之后,对时间序列建模被提上议事日程,业界有很多尝试,今天以Spotify的音乐推荐为例,介绍循环神经网络在推荐系统中的应用。

循环神经网络

循环神经网络,也常被称为RNN,是一种特殊的神经网络。再回顾一下神经网络的结构,示意图如下:
在这里插入图片描述
普通神经网络有是三个部分,输入层x,隐藏层h,输出层o,深度神经网络的区别就是隐藏层数量有很多,具体多少算深,没有定论。有几层的,也有几百层的。
把输入层和隐藏层之间的关系表示成公式后就是:
h = F ( W x ) h =F(Wx) h=F(Wx)
就是输入层x经过连接参数线性加权后,再有激活函数F变换成非线性输出给输出层。在输出层就是:
O = ϕ ( V h ) O =\phi(Vh) O=ϕ(Vh)
隐藏层输出经过输出层的网络连接参数线性加权后,再由输出函数变换成最终输出,比如分类任务就是Softmax函数。
那循环神经网络和普通神经网络的区别在哪?

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

我们把这个表示成示意图如下:
在这里插入图片描述
解释一下这个示意图,在时刻t,输入是xt,而隐藏层的输出不再是只有输入层xt,还有时刻t-1的隐层层输出h(t-1),表示成公式就是:

h t = F ( W x + U h t − 1 ) ht=F(Wx +Uh_{t-1}) ht=F(Wx+Uht1)

对比这个公式和前面普通神经网络的隐藏层输出,就是在激活函数的输入处多了一个 U h t − 1 Uh_{t-1} Uht1
我一直传递一个观点,隐藏层的东西,包括矩阵分解和各种Embedding得到的隐因子,是对很多表面纷繁复杂的现象所做的信息抽取和信息压缩。

那么上一个时刻得到的隐藏层,就是说对时间序列上一个时刻的信息压缩,让它参与到这一个时刻的隐藏层建设上来,物理意义就是认为这个时刻的信息不止和现在的输入有关,还和上一时刻的状态有关。这是时间序列本来的意义,也就是循环神经网络的意义。

榜单生成

了解了循环神经网络原理之后,我再和你一起来看下它如何应用在推荐系统中的。

在网络音乐推荐中,尤其是各类FM类APP,提倡的是一直听下去,比如是你在做家务时,你在开车时,一首歌接着一首歌地播下去,就很适合这些场景。

通常要做到这样的效果,有这么几种做法:
1.电台音乐DJ手工编排榜单,然后一直播放下去,传统广播电台都是这样的。
2.有非时序数据离线计算出推荐集合,然后按照分数逐一输出。
3.利用循环神经网络,把音乐榜单的生成看成是歌曲时间序列的生成,每一首歌地得到不仅受当前用户当前的特征影响,还受上一首歌影响。

Spotify采用了第三章办法,下面我就详细讲解这个推荐算法。

1.数据

个性化的榜单生成,不再是推荐一个一个独立的音乐,而是推荐一个序列给用户。所用的数据就是已有播单,或者用户的会话信息。其中用户会话信息就是,当一个用户在APP上所做的一系列操作。

把这些数据,看成一个一个的文档,每一个音乐文件就是一个一个的词。听完什么再听什么,就像是语言中词和词的关系。

2.建模

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

这个分类任务计算,输入是当前神经网络的隐藏状态,然后每一首歌都得到一个线性加权值,再由Softmax函数为每一首歌计算得到一个概率。表示如下:

P ( o t i ∣ h t ) = e v i h ∑ j ∈ M e v j h P(o_ti|h_t) =\frac{e^{v_ih}}{\sum_{j \in M}{e^{v_jh}}} P(otiht)=jMevjhevih

假如隐藏层有k个神经元,也就是说h是一个k维向量,输出层有m首歌可选,所以是一个One-hot编码的向量,也就是说一个m维向量,
只有真正输出那首歌i是1,其他都是0,那么输出层就有k乘以m个未知参数。

再往前,计算隐藏神经元输出时,不但用到输入层的信息,在这里,输入层也是一首歌,也有m首歌可以选择,所以输入向量仍然时一个One-hot编码的向量。

除此之外,每一个隐藏层神经元还依赖上一个时刻自己的输出值,隐藏层神经元是k个,一个k维向量。

按照隐藏层计算公式就是下面的样子。
h t = F ( W x t + U h t − 1 ) h_t= F(Wx_t +Uh_{t-1}) ht=F(Wxt+Uht1)

W就是一个mk的参数矩阵,U就是一个kk的参数矩阵。

循环神经网络在预测时的计算过程就是:

当用户听完一首歌,要预测下一首歌该推荐什么时,输入就是一个One-hot编码的m维向量,用mk的输入层参数矩阵,乘以这个m向量,隐藏层之间的kk参数矩阵,乘以上一个k维的隐藏状态矩阵,两者 都得到一个k维向量,相加后经过非线性激活函数,比如ReLU,这样就得到当前时刻的隐藏层输出值。

再用当前的时刻的隐藏层输出值,经过k*m的输出层参数矩阵,得到一个m维向量,最后用softmax把这个m维向量归一化成概率值,就是对下一首歌的预测,可以挑选最大概率的若干首歌作为输出,或者直接输出概率最高的那首歌直接播放。

这个计算过程示意图如下:

在这里插入图片描述
一个榜单生成模型的参数就是这么三大块。
1.连接输入和隐藏之间的矩阵 W m ∗ k W_m*k Wmk ;
2.连接上一个隐藏层状态和当前隐藏层转态的矩阵 U k ∗ k U_k*k Ukk;
3.连接隐藏层和输出层的矩阵 V k ∗ m V_k*m Vkm;

得到了这些参数,就得到了榜单推荐模型,这里就再简要讲一下神经网络的参数如何训练得到。
1.初始化参数;
2.用当前的参数预测样本的类别概率;
3.用预测的概率计算交叉熵;
4.用交叉熵计算参数的梯度;
5.用学习步长和梯度更新参数;
6.迭代上述过程直到满足设置的条件;

神经网络的参数学习大致也是这个过程,但略为复杂的地方是第四步和第五步,因为逻辑回归没有隐藏层,神经网络有隐藏层。

回到神经网络的训练,叫做误差方向传播。实际上就是链式求导法则,因为要更新参数,就需要计算参数再当前取值时的梯度,要计算梯度就要求导,要求导就要从交叉熵函数开始,先对输出层参数求导就算梯度,更新输出层参数,链式反应下去,对输入层参数求导计算梯度,更新输入层参数。

交叉熵是模型的目标函数,训练模型的目的就是要最小化它,也就是“误差反向传播”的“误差”。

循环神经网络相比于普通神经网络,唯一不同的就是多了一个参数矩阵,连接当前隐藏层和生意场隐藏层的参数矩阵U,
也是链式求导法则的传播路径,也就是多了一些求导计算,更新参数方式并没有什么不同。

总结

今天介绍了如何使用循环神经网络推荐音乐榜单,播单就是一个时间序列。

循环神经网络和普通神经网络相比,就是在两个时刻的隐藏状态之间多了网络连接,看上去这个网络连接只与上一个时刻有关,事实上,上一个转态又于上上状态有关,所以实际上任意一个时刻的状态与此前所有的状态有关的。

今天的应用虽然是以播放榜单为例,但其实循环神经网络还可以应用在很多其他地方。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:树状数组

树状数组 基本操作:1.快速求前缀和 2.修改一个数。 基本图示: lowbit:求出一个数字二进制最后一个1的位置; 原理: 我们发现,除了最后一个1,以及其后面的0,其余位置都是反&#xf…

翻牌器单独设置前后缀样式

翻牌器单独设置前后缀样式 <template><div :style"[fontStyle,styleBackGroundColor]"><!-- <span style"color: #1d1d1d"> {{optionData}}</span>--><!-- 设置前缀样式 --><span class"prefix" …

【全面介绍Oracle】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 目录 🎥前言🎥基本概念和安装🎥SQL语言🎥PL/SQL编程🎥数据库…

【UML用户指南】-34-应用UML

目录 1、事物 1.1、结构事物 1.2、行为事物 1.3、成组事物 1.4、注释事物 2、关系 2.1、依赖 2.2、关联 2.3、泛化 3、可扩展性 4、图 4.1、结构图 4.2、行为图 5、统一过程Rational 5.1、四个阶段 5.2、九个任务 5.3、制品 5.3.1、模型 5.3.2、其他制品 利…

CACTER直播预告:SMC2全面焕新——您的邮件系统专属安全管家

在数字化的浪潮中&#xff0c;科技革命和产业变革正重塑着企业的发展轨迹。邮箱作为企业内部&#xff0c;企业和企业之间沟通的桥梁&#xff0c;其安全性和效率性是保障企业顺畅运作和信息安全的基石。 随着网络攻击手段的不断翻新&#xff0c;邮件系统所面临的安全威胁日益加剧…

医院门诊预约挂号小程序模板源码

医院门诊预约挂号小程序模板源码,主要有&#xff1a;绿色的医院住院办理&#xff0c;门诊预约挂号微信小程序页面模板。包含&#xff1a;办卡绑定、快速办理预约挂号、门诊缴费、住院服务、医院信息、个人中心、添加就诊人、找医生等等。 医院门诊预约挂号小程序模板源码

vue 画二维码及长按保存

需求 想要做如下图的二维码带文字&#xff0c;且能够长按保存 前期准备 一个canvas安装qrcode&#xff08;命令&#xff1a;npm i qrcode&#xff09; 画二维码及文字 初始化画布 <template><div><canvas ref"canvas" width"300" he…

Qt常用基础控件总结—输入部件(QComboBox类和QLineEdit)

输入部件 下拉列表控件QComboBox 类 QComboBox 类是 QWidget 类的直接子类,该类实现了一个下拉列表(组合框)。 QComboBox 类中的属性函数 1)count:const int 访问函数:int count() const; 获取组合框中的项目数量,默认情况下,对于空组合框或未设置当前项目的组合框,…

4-2 文本向量化

4-2 文本向量化 文本向量化是自然语言处理&#xff08;NLP&#xff09;中的一个关键步骤&#xff0c;通过将文本数据转化为数值向量&#xff0c;使计算机能够理解和处理自然语言。本文将深入探讨文本向量化的各种方法&#xff0c;包括词袋模型&#xff08;Bag of Words&#x…

生物素-十一聚乙二醇-沙利度胺;Biotin-PEG11-Thalidomide

Biotin-PEG11-Thalidomide&#xff0c;即生物素-十一聚乙二醇-沙利度胺&#xff0c;是一种结合了生物素、十一聚乙二醇&#xff08;PEG11&#xff09;和沙利度胺的复杂化合物。以下是对该化合物的详细分析&#xff1a; 一、组成成分及特性 生物素&#xff08;Biotin&#xff09…

备份及恢复Sonarqube服务数据

基础数据&#xff1a; 源数据机ip&#xff1a;192.*.53 测试机ip&#xff1a;192.*.65 Sonarqube访问地址&#xff1a;http://192.*.65:9000/ 账户名&#xff1a;admin 密码&#xff1a;123456 数据库postgres&#xff1a; 版本&#xff1a;PostgreSQL 15.3 一、数据备份…

厨电,被AI重构的下一个十年|产业特稿

智能化赋能下&#xff0c;厨房从闲人免进的油污重地&#xff0c;到会朋交友的社交空间。随着老板、方太等头部厨电厂商纷纷布局AI&#xff0c;厨电行业的数字化、智能化正逐渐改变了人们和烹饪之间的交互&#xff0c;重塑着厨房固有的属性、定位和职能。 作者|斗斗 编辑|皮爷…

RSA算法java实现

基于RSA算法的Java示例代码&#xff0c;展示了如何进行公钥加密、私钥解密、私钥签名和公钥验签。 非堆成加密公私钥使用学习请查看&#xff1a;非堆成加密公私钥使用-CSDN博客 代码实现 package com.chengxuyuan.demo;import javax.crypto.Cipher; import java.security.*;…

3D互动+AR试戴,赋能珠宝品牌线上营销!

随着电商浪潮的汹涌而至&#xff0c;珠宝这一传统上依赖实体店铺销售的行业&#xff0c;正积极拥抱线上转型的浪潮。然而&#xff0c;面对珠宝商品高客单价及消费者对于亲身体验的强烈需求&#xff0c;线上销售面临诸多挑战&#xff0c;尤其是图片展示难以全面展现珠宝魅力&…

cache 设计

1. cache 概念扫描 简介&#xff1a; cache 是一种小容量的缓存空间&#xff0c;类似于较小的sram 。 它的存在着重解决逻辑访问外部存储&#xff08;ddr &#xff09;的时延。 通过一种预测算法&#xff08;cache 的换入和换出&#xff09;&#xff0c;将逻辑大概率访问的热点…

Milvus核心设计(2)-----TSO机制详解

目录 背景 动机 Timestamp种类及使用场景 Guarantee timestamp Service timestamp Graceful time Timestamp同步机制 主流程 时间戳同步流程 背景 Milvus 在设计上突出了分布式的设计,虽然Chroma 也支持分布式的store 与 query。但是相对Milvus来说,不算非常突出。…

【LangChain系列】【基于Langchain的Pandascsv Agent】

目录 前言一、LangChain1-1、介绍1-2、特点 二、Pandas&csv Agent2-1、安装2-2、Pandas&csv Agent介绍2-3、Pandas&csv Agent使用2-3-1、相关库的导入&#xff1a;2-3-2、设置要调用的模型&#xff08;我这里使用阿里的模型&#xff09;2-3-3、数据读取&展示2-…

华为USG6000V防火墙v1

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1&#x1f923;防火墙FW1web服务配置 2.网络配置 要求1&#xff1a;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 要求2&#xff1a;生产区不…

记一次酣畅淋漓的UDF提权(Linux)

外网打点就不放了&#xff0c;翻了一下具备suid权限的命令&#xff0c;没啥结果。 可疑的命令是/usr/lib/dbus-1.0/dbus-daemon-launch-helper但是没有找到用这个命令提权的资料。 弹shell后翻找一下源码&#xff0c;/app/api.py文件中链接了mysql&#xff0c;事出反常必有妖&…

Qt:18.状态栏(状态栏介绍、代码方式创建状态栏、在状态栏显示临时信息、在状态栏创建控件)

目录 1.状态栏介绍&#xff1a; 2.代码方式创建状态栏&#xff1a; 3. 在状态栏显示临时信息&#xff1a; 4.在状态栏创建控件&#xff1a; 1.状态栏介绍&#xff1a; Qt 状态栏是 QMainWindow 窗口的一部分&#xff0c;通常用于显示临时信息&#xff0c;如应用程序的状态、…