Wide Deep 模型:记忆能力与泛化能力
实验和完整代码
完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main
引言
Wide & Deep 模型是一种结合了线性模型(Wide)和深度神经网络(Deep)的混合架构,以结合记忆(Memorization) 与泛化(Generalization) 能力,并有效解决了推荐系统中的稀疏高秩特征交互问题。该模型最初由 Google的Cheng 等人(2016)
提出,广泛应用于推荐系统、广告点击率预测等领域
1. 问题背景
1.1 推荐系统的核心挑战
推荐系统的核心任务是预测用户对物品的交互概率:
P ( y = 1 ∣ x ) = σ ( f ( x ) ) P(y=1|\mathbf{x}) = \sigma(f(\mathbf{x})) P(y=1∣x)=σ(f(x))
其中 x \mathbf{x} x 包含用户特征、上下文特征和物品特征。关键挑战在于:
- 记忆:捕获历史数据中频繁共现的特征组合
- 泛化:探索稀疏甚至未见过的特征与目标相关性的能力
这里介绍一下这两种能力:
1. 记忆能力:记住“强规则”的能力
-
什么是记忆能力:
模型像学生背公式一样,能直接记住历史数据中频繁出现的“特征组合”与结果的关系。例如:- 用户安装了 Netflix(特征A) + 看到过 Pandora(特征B) → 安装Pandora的概率极高(比如10%,而平均安装率仅1%)。
这种强关联性会被模型直接捕捉,形成类似“看到A就推荐B”的规则。
- 用户安装了 Netflix(特征A) + 看到过 Pandora(特征B) → 安装Pandora的概率极高(比如10%,而平均安装率仅1%)。
-
哪些模型擅长记忆能力:
简单模型(如逻辑回归、协同过滤)是记忆能力的“尖子生”。
原因:模型结构简单,特征权重直接决定结果。例如,逻辑回归遇到“Netflix & Pandora”组合时,只需给这个特征分配一个很大的权重,就能记住这条规则。 -
实际场景案例:
在Google Play推荐系统中,如果某个用户安装了视频类应用(如Netflix),同时历史数据显示这类用户安装音乐应用(如Pandora)的概率很高,模型会直接记住这种关联,优先推荐音乐类应用。
2.泛化能力:指模型在面对从未见过的稀疏特征时,能够捕捉到这些特征与最终标签之间的潜在关联。
模型能通过特征之间的隐含联系,推广到从未见过的场景。例如:
-
例如,矩阵分解方法(如隐因子模型)比传统的协同过滤算法具有更强的泛化能力,因为它通过学习用户和物品的隐向量,使得稀疏数据(如用户与特定物品之间的互动较少)也能通过这些隐向量得到合适的推荐得分。在这种情况下,即使是稀疏的特征组合,模型也能通过隐向量进行预测,从而获得稳定的推荐。
-
深度神经网络的泛化能力更为强大,因为它通过多个隐藏层的非线性变换,可以发掘数据中更为复杂和深层的潜在模式。即使是非常稀疏的特征向量输入,经过多层组合后,网络也能够平滑地输出推荐概率,这种能力是简单模型无法实现的。
1.2 传统方法的局限
方法 | 优势 | 缺陷 |
---|---|---|
线性模型 (Wide) | 显式特征交叉,可解释性强 | 依赖特征工程,无法泛化 |
深度模型 (Deep) | 自动学习特征交互,泛化能力强 | 对稀疏高秩数据易过泛化 |
模型架构如下
2. Wide & Deep 模型架构
模型细节如下:
2.1 Wide 组件
广义线性模型:
y w i d e = w w T [ x , ϕ ( x ) ] + b w y_{wide} = \mathbf{w}_w^T[\mathbf{x}, \phi(\mathbf{x})] + b_w ywide=wwT[x,ϕ(x)]+bw
其中:
- x \mathbf{x} x:原始稀疏特征
- ϕ ( x ) \phi(\mathbf{x}) ϕ(x):交叉特征变换,定义为:
ϕ k ( x ) = ∏ i = 1 d x i c k i c k i ∈ { 0 , 1 } \phi_k(\mathbf{x}) = \prod_{i=1}^d x_i^{c_{ki}} \quad c_{ki} \in \{0,1\} ϕk(x)=i=1∏dxickicki∈{0,1} - c k i c_{ki} cki 为特征选择指示函数
数学意义:
Wide模型本质上是一个线性模型
,用于处理特征之间的交互。它通过引入交叉特征(例如“用户已安装Netflix”和“推荐应用为Pandora”)来捕捉频繁出现的特征组合。交叉特征可以看作是特征之间的乘积,表示多个特征同时为真时的情况。 例如,假设有两个特征:性别(gender)和语言(language),它们的交叉特征可以表示为“性别=女性 且 语言=英语”,当这两个条件同时满足时,交叉特征的值为1。 通过这种交叉变换,宽模型能够有效地记忆那些频繁出现的特征交互,确保在推荐系统中准确预测用户的常见行为。
2.2 Deep 组件
前馈神经网络:
- 嵌入层:将稀疏特征映射为低维稠密向量
e i = Embedding ( x i ) ∈ R m \mathbf{e}_i = \text{Embedding}(x_i) \in \mathbb{R}^m ei=Embedding(xi)∈Rm - 隐层计算:
a ( l + 1 ) = ReLU ( W ( l ) a ( l ) + b ( l ) ) \mathbf{a}^{(l+1)} = \text{ReLU}(\mathbf{W}^{(l)}\mathbf{a}^{(l)} + \mathbf{b}^{(l)}) a(l+1)=ReLU(W(l)a(l)+b(l)) - 最终输出:
y d e e p = w d T a ( L ) + b d y_{deep} = \mathbf{w}_d^T \mathbf{a}^{(L)} + b_d ydeep=wdTa(L)+bd
意义:深度模型通过将类别特征映射到低维的稠密嵌入空间来实现对稀疏数据的泛化。每个类别特征会被映射为一个稠密向量,这些向量在训练过程中被优化,以捕捉特征之间的隐藏关系。嵌入向量的维度通常是几百个维度,这比原始的稀疏特征空间要小得多。 在深度模型中,经过嵌入层后,特征被传递到多个隐藏层,每个隐藏层通过一个非线性激活函数(如ReLU)进行计算。深度模型的目标是通过这些隐藏层的变换来学习更复杂的特征交互,并提高对未见特征组合的预测能力。
2.3 联合训练
概率输出:
P ( y = 1 ∣ x ) = σ ( y w i d e + y d e e p + b ) P(y=1|\mathbf{x}) = \sigma(y_{wide} + y_{deep} + b) P(y=1∣x)=σ(ywide+ydeep+b)
3. 代码实现
3.1 特征工程
特征类型 | 处理方式 |
---|---|
类别特征 | 哈希分桶 + 嵌入层 |
连续特征 | 分位数归一化 |
交叉特征 | 笛卡尔积生成 |
3.2 Code
class WideAndDeep(nn.Module):def __init__(self, num_wide, num_deep_dim, cat_deep_dims, cross_feature_indices, hidden_units, embedding_dim):"""Args:num_wide: Wide部分的特征数量cross_feature_indices: 需要交叉的特征索引列表,格式 [(i,j), (k,l), ...]num_deep_dim: Deep部分的数值型特征数量cat_deep_dims: Deep部分的类别特征维度列表hidden_units: 深度网络隐藏层维度列表embedding_dim: 嵌入维度"""super(WideAndDeep, self).__init__()#wide 部分self.cross_indices = cross_feature_indicesself.wide = nn.Linear(num_wide + len(cross_feature_indices), 1)#deep 部分self.embeddings = nn.ModuleList([nn.Embedding(dim, embedding_dim) for dim in cat_deep_dims])# 计算Deep部分输入维度deep_input_dim = num_deep_dim + len(cat_deep_dims) * embedding_dim#Deep 部分全连接层self.dnn = nn.Sequential()for i,unit in enumerate(hidden_units):self.dnn.add_module(name = f"fc_{i}",module = nn.Linear(deep_input_dim, unit))self.dnn.add_module(name = f"relu_{i}",module = nn.ReLU())deep_input_dim = unit#最终组合层self.final = nn.Linear(deep_input_dim + 1, 1) #wide部分和deep部分的输出相加def create_cross_features(self, x):"""动态生成交叉特征"""cross_features = []for i, j in self.cross_indices:feature = x[:, i] * x[:, j]cross_features.append(feature.unsqueeze(1))return torch.cat(cross_features, dim=1)def forward(self, num_x, deep_x ,cat_x,):"""Args:num_x: wide部分数值型特征deep_x: deep网络数值型特征cat_x: deep网络类别型特征"""num_x = num_x.float() # 确保转为float32deep_x = deep_x.float() # 确保转为float32cross_features = self.create_cross_features(num_x)wide_input = torch.cat([num_x, cross_features], dim=1)wide_output = self.wide(wide_input)#deep部分embeds = [] for i in range(len(cat_x[0])):embed = self.embeddings[i](cat_x[:, i])embeds.append(embed)deep_input = torch.cat(embeds, dim=1)deep_input = torch.cat([deep_input, deep_x], dim=1) #数值型特征和类别型特征拼接deep_output = self.dnn(deep_input)#wide和deep部分输出相加output = torch.cat([wide_output, deep_output], dim=1)output = self.final(output) #[batch_size,1]return torch.sigmoid(output).squeeze()
Reference
- Cheng, H. T., Koc, L., Harmsen, J., Shaked, T., Chandra, T., Aradhye, H., … & Ispir, M. (2016). Wide & Deep Learning for Recommender Systems. arXiv preprint arXiv:1606.07792.
- 王喆《深度学习推荐系统》
相关文章:

Wide Deep 模型:记忆能力与泛化能力
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 Wide & Deep 模型是一种结合了线性模型(Wide)和深度神经网络(Deep)的混…...

Hot100之矩阵
73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…...
Python语言的安全开发
Python语言的安全开发 引言 在信息技术迅速发展的今天,网络安全问题愈发凸显。随着Python语言的广泛应用,尤其是在数据分析、人工智能、Web开发等领域,其安全问题越来越受到重视。Python作为一门高效且易于学习的编程语言,虽然在…...

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心
所谓刷题,最重要的就是细心 📌 题目描述 在 X 进制 中,每一数位的进制不固定。例如: 最低位 采用 2 进制,第二位 采用 10 进制,第三位 采用 8 进制, 则 X 进制数 321 的十进制值为ÿ…...

java项目验证码登录
1.依赖 导入hutool工具包用于创建验证码 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency> 2.测试 生成一个验证码图片(生成的图片浏览器可…...

手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...

2025年2月2日(网络编程 tcp)
tcp 循环服务 import socketdef main():# 创建 socket# 绑定tcp_server socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server.bind(("", 8080))# socket 转变为被动tcp_server.listen(128)while True:# 产生专门为链接进来的客户端服务的 socketprint(&qu…...
【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)
【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…...

使用ollama本地部署Deepseek r1
1、下载ollama 在浏览器地址输入:https://ollama.com/ 选择windows版本的下载 2、安装ollama 3、运行ollama 安装完成后,打开命令行工具win r 在命令行输入:ollama 4、使用ollama下载并部署Deepseed r1 在ollama网站,下载…...

Unity飞行代码 超仿真 保姆级教程
本文使用Rigidbody控制飞机,基本不会穿模。 效果 飞行效果 这是一条优雅的广告 如果你也在开发飞机大战等类型的飞行游戏,欢迎在主页搜索博文并参考。 搜索词:Unity游戏(Assault空对地打击)开发。 脚本编写 首先是完整代码。 using System.Co…...
DeepSeek蒸馏模型:轻量化AI的演进与突破
目录 引言 一、知识蒸馏的技术逻辑与DeepSeek的实践 1.1 知识蒸馏的核心思想 1.2 DeepSeek的蒸馏架构设计 二、DeepSeek蒸馏模型的性能优势 2.1 效率与成本的革命性提升 2.2 性能保留的突破 2.3 场景适应性的扩展 三、应用场景与落地实践 3.1 智能客服系统的升级 3.2…...
使用 sunshine+moonlight 配置串流服务无法使用特殊键
最近了解到串流技术,使用的方案是 sunshine 为串流服务端,moonlight 为客户端,分别在 ipad,android,tv 端安装。 存在的问题 不管说什么平台都会有特殊键无法使用的问题,最初我发现在安卓电视,…...
5.角色基础移动
能帮到你的话,就给个赞吧 😘 文章目录 角色的xyz轴与移动方向拌合输入轴值add movement inputget controller rotationget right vectorget forward vector 发现模型的旋转改变后,xyz轴也会改变,所以需要旋转值来计算xyz轴方向。 …...

单细胞-第四节 多样本数据分析,下游画图
文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...
Linux的循环,bash的循环
Linux的循环,bash的循环 在 Linux 系统中,Bash 循环是最常用的循环实现方式(Bash 是 Linux 默认的 Shell),但广义上“Linux 的循环”可能涉及其他 Shell 或编程语言的循环结构。以下是 Bash 循环的详细解析及其在 Linux 环境中的…...

【DeepSeek开发】Python实现股票数据可视化
代码: Github:Python实现股票数据可视化代码https://github.com/magolan2000/Data-visualization/tree/master 软件环境:PyCharm 2022.3.1 数据来源:akshare 最近DeepSeek可谓是热度不断,因此想评判一下DeepSeek的编程…...

华为小米vivo向上,苹果荣耀OPPO向下
日前,Counterpoint发布的手机销量月度报告显示,中国智能手机销量在2024年第四季度同比下降3.2%,成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说,他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…...

毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统
目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 卷积神经网络 1.2 目标检测算法 1.3 注意力机制 二、 数据集 2.1 数据采集 2.2 数据标注 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 3.2 结果分析 最后 前言 📅大四是整个大学…...

el-table表格点击单元格实现编辑
使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中,使用 div 显示文本内容,单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData,tabClickIndex: null,tabClickLabel: ,用于判断是否…...

数据结构:时间复杂度
文章目录 为什么需要时间复杂度分析?一、大O表示法:复杂度的语言1.1 什么是大O?1.2 常见复杂度速查表 二、实战分析:解剖C语言代码2.1 循环结构的三重境界单层循环:线性时间双重循环:平方时间动态边界循环&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...