WDL(Wide Deep Learning for Recommender Systems)——Google经典CTR预估模型

news2024/12/26 20:51:13

一、文章简介

        Wide & Deep Learning for Recommender Systems这篇文章介绍了一种结合宽线性模型和深度神经网络的方法,以实现推荐系统中的记忆和泛化。这种方法在Google Play商店的应用推荐系统中进行了评估,展示了其显著的性能提升。

推荐系统中的记忆和泛化

        为了实现记忆和泛化,Wide & Deep模型结合了宽线性模型和深度神经网络:

1.宽组件(Wide Component)

        宽组件的主要功能是实现记忆,即捕捉特征之间的频繁共现关系。这部分模型采用线性模型,利用交叉乘积特征来捕捉特征之间的高阶关系。

1). 原始输入特征和交叉乘积特征
  • 原始输入特征:这些是从用户和上下文数据中提取的直接特征。例如,用户的安装应用、语言、年龄等。
  • 交叉乘积特征:通过交叉乘积转换生成的新特征,这些特征通过组合原始特征来捕捉特征间的交互。例如,“AND(gender=female, language=en)”表示女性用户使用英语。
2). 公式

        宽组件的线性组合公式:

$\operatorname{Wide}(\mathbf{x})=\mathbf{w}_{\text {wide }}^T[\mathbf{x}, \phi(\mathbf{x})]$

其中:

  • \mathbf{x} 是原始输入特征向量。
  •  $\phi(\mathbf{x})$是交叉乘积特征向量。
  • $\mathbf{W}_{\text {wide }}$ 是宽组件的权重向量。
3). 记忆功能

        宽组件通过权重向量$\mathbf{W}_{\text {wide }}$​ 学习特征间的共现关系。例如,如果某用户安装了Netflix且展示了Pandora,则特征“AND(user_installed_app=netflix, impression_app=pandora)”的值为1,模型可以利用这个信息来进行记忆。

2.深组件(Deep Component)

        深组件的主要功能是实现泛化,即学习特征之间的潜在关系,处理未见过的新特征组合。深组件通过深度神经网络来实现,能够更好地捕捉复杂的非线性关系。

1).嵌入层

        类别特征嵌入:将高维稀疏的类别特征转化为低维稠密的嵌入向量。每个类别特征(如“language=en”)被映射到一个32维的嵌入向量。公式:

\mathbf{e} = Embedding (x)

其中,\mathbf{e} 是嵌入向量,\mathbf{x}是类别特征。

2).隐藏层
  • 连接嵌入和稠密特征:将所有嵌入向量和稠密特征连接在一起,形成一个约1200维的稠密向量。
  • 多层感知器:通过多层感知器(MLP)进行处理,通常包括3个ReLU层,每层执行非线性变换,捕捉复杂的特征关系

$\mathbf{a}^{(l)}=f\left(\mathbf{W}^{(l)} \mathbf{a}^{(l-1)}+\mathbf{b}^{(l)}\right)$

其中:

  • \mathbf{a}^{(l)}是第l层的激活值。
  • \mathbf{W}^{(l)}是第l层的权重矩阵。
  • \mathbf{b}^{(l)}是第l层的偏置向量。
  • f是激活函数,通常为ReLU
3).泛化功能

        深组件通过嵌入层和多层感知器学习特征之间的非线性关系,能够处理以前未见过的新特征组合。例如,通过学习用户的行为模式和上下文信息,模型可以生成新的推荐。

3).实例代码
import tensorflow as tf

# 创建一个简单的模型,包括一个嵌入层、一个隐藏层和一个输出层
model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim=4, output_dim=32, input_length=1),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),  # 隐藏层
    tf.keras.layers.Dense(1)  # 输出层
])

# 编译模型
model.compile(optimizer='adam', loss='mse')

# 打印嵌入层的权重(训练前)
print("嵌入层权重(训练前):")
print(model.layers[0].get_weights()[0])

# 创建简单的数据
import numpy as np
x_train = np.array([[0], [1], [2], [3]])
y_train = np.array([1.0, 2.0, 3.0, 4.0])

# 训练模型
model.fit(x_train, y_train, epochs=100, verbose=0)

# 打印嵌入层的权重(训练后)
print("嵌入层权重(训练后):")
print(model.layers[0].get_weights()[0])

3.结合记忆和泛化

        宽组件和深组件的输出通过加权和进行组合,作为最终的预测结果。在训练过程中,这两部分是同时优化的,使得模型能够平衡记忆和泛化的需求。具体过程如下:

1).计算宽组件的输出:

        宽组件的输出是原始输入特征和交叉乘积特征的线性组合:

$\operatorname{Wide}(\mathbf{x})=\mathbf{w}_{\text {wide }}^T[\mathbf{x}, \phi(\mathbf{x})]$

2).计算深组件的输出

深组件的输出是嵌入层和多层感知器处理后的结果:

$\operatorname{Deep}(\mathbf{x})=\mathbf{w}_{\text {deep }}^T \mathbf{a}^{\left(l_f\right)}$

其中, $\mathbf{a}^{\left(l_f\right)}$是深度模型最后一层的激活值。

3).组合输出

        宽组件和深组件的输出通过加权和进行组合,作为最终的预测值:

$P(Y=1 \mid \mathbf{x})=\sigma\left(\mathbf{w}_{\text {wide }}^T[\mathbf{x}, \phi(\mathbf{x})]+\mathbf{w}_{\text {deep }}^T \mathbf{a}^{\left(l_f\right)}+b\right)$

其中,$\sigma$ 是sigmoid激活函数,\mathbf{w}_{\text{wide}}\mathbf{w}_{\text{deep}}分别是宽组件和深组件的权重向量,$\mathbf{a}^{\left(l_f\right)}$是深组件最后一层的激活值,b是偏置项。

4).损失函数和优化

        使用逻辑损失函数(logistic loss function)进行联合训练,通过反向传播算法同时优化宽组件和深组件的参数:

L=-\frac{1}{N} \sum_{i=1}^N\left[y_i \log \left(\hat{y}_i\right)+\left(1-y_i\right) \log \left(1-\hat{y}_i\right)\right]

其中:

  • N 是样本的数量。
  • y_i​ 是第i个样本的实际标签(0 或 1)。
  • \hat{y}_i是第i个样本的预测概率,即样本属于类别 1 的概率。
  • \log是自然对数。
损失函数的意义
  • 当实际标签y_i 为 1 时,损失函数的第一项 y_i \log \left(\hat{y}_i\right)起作用,第二项为零。这部分损失鼓励模型将\hat{y}_i 尽可能地接近 1。
  • 当实际标签 y_i为 0 时,损失函数的第二项\left(1-y_i \right )\log\left(1-\hat{y}_i \right ) 起作用,第一项为零。这部分损失鼓励模型将 \hat{y}_i尽可能地接近 0。

通过最小化这个损失函数,模型会在预测时更加准确地反映实际标签。

逻辑损失函数的特性
  • 凸性:逻辑损失函数是一个凸函数,这意味着存在全局最优解(证明见下一篇博客)。
  • 概率解释:逻辑损失函数直接反映了模型预测概率的准确性,能够有效处理不平衡数据集。

4.结论与意义

  • Wide & Deep模型成功结合了记忆和泛化的优势,在推荐系统中表现出色。
  • 实际应用中,通过在线实验验证了其有效性和改进。
  • 提供了开源实现,为进一步研究和应用提供了基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决使用腾讯地图没超过额度却一直报“此key每日调用量已达到上限”

1、个人开发者配额说明 2、需要在 配额管理 的 账户额度 中进行配额的分配即可。 3、开发工具接口的调用就不会出现该报错了

【专项刷题】— 快排

1、颜色分类 - 力扣(LeetCode) 思路: 创建三个指针,然后把数组分为三个区域遍历代码: class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

如何快速开发一个简单的企业信息系统?O2OA手把手带你,高效开发!(附源码)

前言 想象一下,如果你的企业能够通过一个系统快速发布企业信息,员工们无论身在何处都能即时获取新信息,那该多好!告别email轰炸和口头传达的低效,O2OA企业应用开发平台让这一切变得简单。 今天,就让我们一…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

CCF-Csp算法能力认证, 202312-2因子化简含解析

CCF-Csp算法能力认证, 202312-1仓库规划含解析 前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?…

Java(九)——抽象类、抽象方法

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

Synchronized升级到重量级锁会发生什么?

我们从网上看到很多&#xff0c;升级到重量锁的时候不会降级&#xff0c;再来线程都是重量级锁 今天我们来实验一把真的是这样的吗 1.首选导入Java对象内存布局的工具库&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-…

django-vue-admin项目运行

文本主要对django-vue-admin项目进行了简要介绍&#xff0c;并且对前后端进行了源码安装和运行。在此基础上可作为管理系统二次开发的基础框架。 一.django-vue-admin简介和安装 1.简介 django-vue-admin项目是基于RBAC模型权限控制的中小型应用的基础开发平台&#xff0c;采…

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …

轨道交通全国产工控机:基于飞腾E2000Q的实现AFC系统控制器

AFC系统 提供基于Intel平台、NXP平台、Rockchip平台的核心板、 PICO-ITX板、3.5寸板、Mini-ITX主板以及嵌入式准系统等计算机硬件。产品具有出色的数据传输与处理能力&#xff0c;板载内存&#xff0c;CPU集成图形控制&#xff0c;提供丰富串口、USB、LAN、PCIe扩展接口等I/O接…

学会这个技巧,你的电子画册将秒变专业

在这个数字化的时代&#xff0c;电子画册已经成为展示个人和商业作品的重要方式。然而&#xff0c;许多人虽然拥有出色的内容&#xff0c;却因为缺乏一定的技巧&#xff0c;使得电子画册显得平凡无奇。学会这个技巧&#xff0c;你的电子画册将秒变专业&#xff0c;让你的作品在…

Docker容器下安装Matlab,无需挂载

Matlab的安装需要这些文件 传入ubuntu后&#xff0c;改过相关的文件权限后&#xff0c;发现还是无法挂载 这有可能是docker的安全管理策略导致容器不能挂载&#xff0c;因此采用不挂载形式&#xff0c;直接解压的方式安装Matlab 1.将iso改成zip&#xff0c;并解压 2.解压rar文件…

【深入C++】二叉搜索树

文章目录 什么是二叉搜索树二叉搜索树的接口1.查找操作2.插入操作3.中序遍历4.删除操作 所有代码总结 什么是二叉搜索树 二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一种特殊的二叉树&#xff0c;其每个节点最多有两个子节点&#xff0c;分别称为左子节点和…

MySQL 数据库 day 7.16

ok了家人们今天继续记录一下数据库,看看今天学了什么。 一.事物概述 1.1 环境准备 -- 账户表 create table account( id int primary key auto_increment, name varchar(20), money double );insert into account values (null,张三,1000); insert into account values (n…

Matlab Git管理

目录 1、Git配置 1.1 下载 1.2 注册账户 1.3 录入信息 2、matlab配置 2.1 测试git 2.2 创建git 1、Git配置 1.1 下载 使用镜像网站&#xff0c;选择合适的版本download git&#xff0c;一直点next&#xff0c;最后install。 CNPM Binaries Mirror (npmmirror.co…

区块链技术在智能家居中的创新应用探索

随着物联网技术的发展和智能家居市场的蓬勃发展&#xff0c;区块链技术作为一种去中心化的数据管理和安全保障技术&#xff0c;正在逐渐引入智能家居领域&#xff0c;并为其带来了新的创新应用。本文将探讨区块链技术在智能家居中的具体应用场景、优势以及未来发展方向。 智能家…

[MMU]现代计算机内存管理

现代计算机内存管理 内存管理 内存分配与回收 逻辑上对内存空间进行扩充 覆盖技术程序内存区域分为一个固定区和若干个覆盖区 将程序分为多个段&#xff0c;常用的段常驻内存放在固定区、不常用的在需要的时候调入覆盖区 必须由程序员声明覆盖结构 交换技术 虚拟内存 逻辑地址…

《JavaSE》------20.语法实践项目【图书管理系统】

目录 前言 一、图书管理系统成果展示 1.1 管理员&#xff1a; 1.2 普通用户&#xff1a; 二、 图书管理系统框架的搭建 2.1 book包 2.1.2 BookList类 2.2 operation包 2.2.0 IOperation接口 2.2.1 AddOperatoon类 2.2.2 FindOperation类 2.2.3 DelOperation类 2.2…

昇思MindSpore 应用学习-Vision Transformer图像分类

昇思MindSpore 应用学习-Vision Transformer图像分类(AI 代码解析) Vision Transformer图像分类 Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transform…

渗透测试靶机---Kioptrix5

渗透测试靶机—Kioptrix5 启动靶机&#xff0c;扫描ip&#xff0c;平平无奇 扫描 惯例&#xff0c;访问80&#xff0c;先看看 好像是没什么内容&#xff0c;查看页面源代码 搜素这个页面的框架&#xff1a; 直接拉下来查看就行 这里存在一个路径穿越 这里就暴露出来了更…