排序层-深度模型-2017:NeuralCF【CF与深度学习的结合】【局限:基于协同过滤的思想进行构造的,没有引入更多其他类型的特征】
沿着协同过滤的思路, 发展出了矩阵分解技术,将协同过滤中的共现矩阵分解为用户向量矩阵和物品向 量矩阵。其中,用户u 隐向量和物品i 隐向量的内积,就是用户u 对物品i评分 的预测。
沿着矩阵分解的技术脉络,结合深度学习知识,新加坡国立大学的研究 人员于2017年提出了基于深度学习的协同过滤模型NeuralCF。
一、从深度学习的视角重新审视矩阵分解模型
Deep Crossing模型中,Embedding层的主要作用是将 稀疏向量转换成稠密向量。
事实上,如果从深度学习的视角看待矩阵分解模型, 那么矩阵分解层的用户隐向量和物品隐向量完全可以看作一种Embedding方法。最终的“Scoring层”就是将用户隐向量和物品隐向量进行内积操作后得到“相 似度”,这里的“相似度”就是对评分的预测。
综上,利用深度学习网络图的方 式来描述矩阵分解模型的架构,如图3- 8所示。
在实际使用矩阵分解来训练和评估模型的过程中,往往会发现模型容易处于 欠拟合的状态,究其原因是因为矩阵分解的模型结构相对比较简单,特别是“输 出层”(也被称为“Scoring层”),无法对优化目标进行有效的拟合。这就要求模 型有更强的表达能力,在此动机的启发下,新加坡国立大学的研究人员提出了 NeuralCF 模型。
二、NeuralCF模型的结构
如图3-9所示,NeuralCF用 “多层神经网络+输出层”的结构替代了矩阵分 解模型中简单的内积操作。这样做的收益是直观的:
- 一是让用户向量和物品向量 做更充分的交叉,得到更多有价值的特征组合信息;
- 二是引入更多的非线性特征, 让模型的表达能力更强。
以此类推,事实上,用户和物品向量的互操作层可以被任意的互操作形式所 代替,这就是所谓的“广义矩阵分解”模 型 ( Generalized Matrix Factorization )。
原始的矩阵分解使用“内积”的方式让用户和物品向量进行交互,为了进一 步让向量在各维度上进行充分交叉,可以通过“元素积”(element-wise product, 长度相同的两个向量的对应维相乘得到另一向量)的方式进行互操作,再通过逻 辑回归等输出层拟合最终预测目标。NeuralCF中利用神经网络拟合互操作函数的 做法是广义的互操作形式。在介绍PNN模型、Deep&Cross模型的章节中,还会 介绍更多可行的互操作形式。
再进一步,可以把通过不同互操作网络得到的特征向量拼接起来,交由输出 层进行目标拟合。NeuralCF的论文中给出了整合两个网络的例子(如图3-10所示)。可以看出,NeuralCF混合模型整合了上面提出的原始NeuralCF模型和以 元素积为互操作的广义矩阵分解模型。这让模型具有了更强的特征组合和非线性 能力。
三、NeuralCF模型的优势和局限性
NeuralCF模型实际上提出了一个模型框架,它基于用户向量和物品向量这两 个 Embedding层,利用不同的互操作层进行特征的交叉组合,并且可以灵活地进 行不同互操作层的拼接。从这里可以看出深度学习构建推荐模型的优势一利用 神经网络理论上能够拟合任意函数的能力,灵活地组合不同的特征,按需增加或 减少模型的复杂度。
在实践中要注意:并不是模型结构越复杂、特征越多越好。一是要防止过拟 合的风险,二是往往需要更多的数据和更长的训练时间才能使复杂的模型收敛, 这需要算法工程师在模型的实用性、实时性和效果之间进行权衡。
NeuralCF模型也存在局限性。由于是基于协同过滤的思想进行构造的,所以 NeuralCF模型并没有引入更多其他类型的特征,这在实际应用中无疑浪费了其他 有价值的信息。此外,对于模型中互操作的种类并没有做进一步的探究和说明。 这都需要后来者进行更深入的探索。
相关文章
- Intel汇编语言程序设计学习-第五章 过程-下
- Head First Python 学习笔记-Chapter3:文件读取和异常处理
- 学习ASP.NET Core Razor 编程系列十六——排序
- 学习ASP.NET MVC(十)——排序
- 如何学习数据结构?
- 想要学习设计模式,你得先会看类图,一张图读懂UML
- 【学习笔记31】JavaScript冒泡排序和选择排序
- 帮你学习Java语言的游戏
- 分钟级在线深度学习在手淘信息流排序模型中的探索与实践
- 深度学习在美团搜索广告排序的应用实践
- 【21天学习经典算法】直接选择排序(附Python完整代码)
- OSGI框架学习
- JavaScript权威指南学习笔记2
- AWS服务学习
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
- java学习-排序及加密签名时数据排序方式
- dice学习
- 毫米波雷达学习(二)——IF信号相位
- Docker学习教程目录
- Python学习---Python环境变量安装问题0907
- Python学习---IO的异步[asyncio +aiohttp模块]
- 初步学习pg_control文件之二
- 【嵌入式Linux学习】11、Samba服务安装与配置
- Linux学习笔记(1)linux的开关机及重启
- JS学习第11天——函数进阶(this指向、严格模式、高阶函数、闭包、递归)
- lucence学习系列之一 基本概念
- Java接口学习(接口的使用、简单工厂、代理模式、接口和抽象类的区别)