返回顶部
首页 > 资讯 > 前端开发 > VUE >如何理解系统经典模型Wide与Deep
  • 119
分享到

如何理解系统经典模型Wide与Deep

2024-04-02 19:04:59 119人浏览 安东尼
摘要

这篇文章主要介绍“如何理解系统经典模型Wide与Deep”,在日常操作中,相信很多人在如何理解系统经典模型Wide与Deep问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何

这篇文章主要介绍“如何理解系统经典模型Wide与Deep”,在日常操作中,相信很多人在如何理解系统经典模型Wide与Deep问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解系统经典模型Wide与Deep”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

摘要

在大规模特征的场景当中,我们通常(2016年之前)是使用将非线性特征应用在线性模型上的做法来实现的,使用这种方式,我们的输入会是一个非常稀疏的向量。虽然我们要实现这样的非线性特征,通过一些特征转化以及特征交叉的方法是可以实现的,但是这会需要消耗大量的人力物力。

这个问题其实我们之前在介绍FM模型的时候也曾经提到过,对于FM模型来说,其实解决的也是同样的问题。只是解决的方法不同,FM模型的方法是引入一个n x  k的参数矩阵V来计算所有特征两两交叉的权重,来降低参数的数量以及提升预测和训练的效率。而在本篇paper当中,讨论的是使用神经网络来解决这个问题。

解决问题的核心在于embedding,embedding直译过来是嵌入,但是这样并不容易理解。一般来说我们可以理解成某些特征的向量表示。比如Word2Vec当中,我们做的就是把一个单词用一个向量来表示。这些向量就称为word  embedding。embedding有一个特点就是长度是固定的,但是值一般是通过神经网络来学习得到的。

我们可以利用同样训练embedding的方式来在神经网络当中训练一些特征的embedding,这样我们需要的特征工程的工作量就大大地减少。但是仅仅使用embedding也是不行的,在一些场景当中可能会引起过拟合,所以我们需要把线性特征以及稀疏特征结合起来,这样就可以让模型既不会陷入过拟合,又可以有足够的能力可以学到更好的效果。

简介

正如我们之前文章所分享的一样,推荐系统也可以看成是搜索的排序系统。它的输入是一个用户信息以及用户浏览的上下文信息,返回的结果是一个排好序的序列。

正因为如此,对于推荐系统来说,也会面临一个和搜索排序系统一个类似的挑战——记忆性和泛化性的权衡。记忆性可以简单地理解成对商品或者是特征之间成对出现的一种学习,由于用户的历史行为特征是非常强的特征,记忆性因此可以带来更好的效果。但是与之同时也会有问题产生,最典型的问题就是模型的泛化能力不够。

对于泛化能力来说,它的主要来源是特征之间的相关性以及传递性。有可能特征A和B直接和label相关,也可能特征A与特征B相关,特征B与label相关,这种就称为传递性。利用特征之间的传递性,  我们就可以探索一些历史数据当中很少出现的特征组合,从而获得很强的泛化能力。

在大规模的在线推荐以及排序系统当中,比如像是LR这样的线性模型被广泛应用,因为这些模型非常简单、拓展性好、性能很强,并且可解释性也很好。这些模型经常用one-hot这样的二进制数据来训练,举个例子,比如如果用户安装了netflix,那么user_installed_app=netflix这个特征就是1,否则就是0。因此呢,一些二阶特征的可解释性就很强。

比如用户如果还浏览过了Pandora,那么user_installed_app=netflix,impression_app=pandora这个联合特征就是1,联合特征的权重其实就是这两者的相关性。但是这样的特征需要大量的人工操作,并且由于样本的稀疏性,对于一些没有在训练数据当中出现过的组合,模型就无法学习到它们的权重了。

但是这个问题可以被基于embedding的模型解决,比如之前介绍过的FM模型,或者是深度神经网络。它可以通过训练出低维度下的embedding,用embedding向量去计算得到交叉特征的权重。然而如果特征非常稀疏的话,我们也很难保证生成的embedding的效果。比如用户的偏好比较明显,或者是商品比较小众,在这样的情况下会使得大部分的query-item的pair对没有行为,然而由embedding算出来的权重可能大于0,因此而导致过拟合,使得推荐结果不准。对于这种特殊的情况,线性模型的拟合、泛化能力反而更好。

在这篇paper当中,我们将会介绍Wide &  Deep模型,它在一个模型当中兼容了记忆性以及泛化性。它可以同时训练线性模型以及神经网络两个部分,从而达到更好的效果。

论文的主要内容有以下几点:

Wide & Deep模型,包含前馈神经网络embedding部分以及以及线性模型特征转换,在广义推荐系统当中的应用

Wide & Deep模型在Google Play场景下的实现与评估,Google Play是一个拥有超过10亿日活和100w  App的移动App商店

推荐系统概述

这是一张经典的推荐系统的架构图:

如何理解系统经典模型Wide与Deep

当用户访问app  store的时候会生成一个请求,这个请求当中会包含用户以及上下文的特征。推荐系统会返回一系列的app,这些app都是模型筛选出来用户可能会点击或者是购买的app。当用户看到这些信息之后,会产生一些行为,比如浏览(没有行为)、点击、购买,产生行为之后,这些数据会被记录在Logs当中,成为训练数据。

我们看下上面部分,也就是从DataBase到Retrieval的部分。由于Database当中的数据量过大,足足有上百万。所以我们想要在规定时间内(10毫秒)给所有的app都调用模型打一个分,然后进行排序是不可能的。所以我们需要对请求进行Retrieval,也就是召回。Retrieval系统会对用户的请求进行召回,召回的方法有很多,可以利用机器学习模型,也可以进行规则。一般来说都是先基于规则快速筛选,再进行机器学习模型过滤。

进行筛选和检索结束之后,最后再调用Wide &  Deep模型进行CTR预估,根据预测出来的CTR对这些APP进行排序。在这篇paper当中我们同样忽略其他技术细节,只关注与Wide &  Deep模型的实现。

Wide & Deep原理

首先我们来看下业内的常用的模型的结构图:

如何理解系统经典模型Wide与Deep

这张图源于论文,从左到右分别展示了Wide模型,Wide &  Deep模型以及Deep模型。从图上我们也看得出来所谓的Wide模型呢其实就是线性模型,Deep模型是深度神经网络模型。下面结合这张图对这两个部分做一个详细一点的介绍。

Wide部分

Wide部分其实就是一个泛化的形如如何理解系统经典模型Wide与Deep的线性模型,就如上图左边部分所展示的一样。y是我们要预测的结果,x是特征,它是一个d维的向量如何理解系统经典模型Wide与Deep。这里的d是特征的数量。同样w也是一个d维的权重向量如何理解系统经典模型Wide与Deep,b呢则是偏移量。这些我们在之前线性回归的模型当中曾经都介绍过,大家应该也都不陌生。

特征包含两个部分,一种是原始数据直接拿过来的数据,另外一种是我们经过特征转化之后得到的特征。最重要的一种特征转化方式就是交叉组合,交叉组合可以定义成如下形式:

如何理解系统经典模型Wide与Deep

这里的是一个bool型的变量,表示的是第i个特征的第k种转化函数的结果。由于使用的是乘积的形式,只有所有项都为真,最终的结果才是1,否则是0。比如"AND(gender=female,language=en)"这就是一个交叉特征,只有当用户的性别为女,并且使用的语言为英文同时成立,这个特征的结果才会是1。通过这种方式我们可以捕捉到特征之间的交互,以及为线性模型加入非线性的特征。

Deep部分

Deep部分是一个前馈神经网络,也就是上图当中的右侧部分。

如何理解系统经典模型Wide与Deep

我们观察一下这张图会发现很多细节,比如它的输入是一个sparse的feature,可以简单理解成multihot的数组。这个输入会在神经网络的第一层转化成一个低维度的embedding,然后神经网络训练的是这个embedding。这个模块主要是被设计用来处理一些类别特征,比如说item的类目,用户的性别等等。

和传统意义上的one-hot方法相比,embedding的方式用一个向量来表示一个离散型的变量,它的表达能力更强,并且这个向量的值是让模型自己学习的,因此泛化能力也大大提升。这也是深度神经网络当中常见的做法。

Wide & Deep合并

Wide部分和Deep部分都有了之后,通过加权的方式合并在一起。这也就是上图当中的中间部分。

如何理解系统经典模型Wide与Deep

最上层输出之前其实是一个sigmoid层或者是一个linear层,就是一个简单的线性累加。英文叫做joint,paper当中还列举了joint和ensemble的区别,对于ensemble模型来说,它的每一个部分是独立训练的。而joint模型当中的不同部分是联合训练的。ensemble模型当中的每一个部分的参数是互不影响的,但是对于joint模型而言,它当中的参数是同时训练的。

这样带来的结果是,由于训练对于每个部分是分开的,所以每一个子模型的参数空间都很大,这样才能获得比较好的效果。而joint训练的方式则没有这个问题,我们把线性部分和深度学习的部分分开,可以互补它们之间的缺陷,从而达到更好的效果,并且也不用人为地扩大训练参数的数量。

系统实现

app推荐的数据流包含了三个部分:数据生产、模型训练以及模型服务。用一张图来展示大概是这样的:

如何理解系统经典模型Wide与Deep

数据生产

在数据生产的阶段,我们使用app在用户面前曝光一段时间作为一个样本,如果这个app被用户点击安装,那么这个样本被标记为1,否则标记为0。这也是绝大多数推荐场景下的做法。

在这个阶段,系统会去查表,把一些字符串类别的特征转化成int型的id。比如娱乐类的对应1,摄影类的对应2,比如收费的对应0,免费的对应1等等。同时会把数字类型的特征做标准化处理,缩放到[0,  1]的范围内。

模型训练

paper当中提供了一张模型的结构图:

如何理解系统经典模型Wide与Deep

从上图当中我们可以看到,左边是一些连续性的特征,比如年龄,安装的app数量等等,右边是一些离散型的特征,比如设备信息,安装过的app等等。这些离散型的特征都会被转化成embedding,之后和右边的连续性特征一起进入神经网络进行学习。paper当中使用的是32维的embedding。

模型每次训练会使用超过500  billion的样本数量进行训练,每次搜集到了新的训练数据都会训练模型。但是如果每一次训练我们都从头开始的话,显然会非常缓慢,并且会浪费大量的计算资源。因此paper当中选择了一种增量更新的模式,也就是说在模型更新的时候,会加载旧模型的参数,再使用最新的数据进行更新训练。在新模型更新上线之前,会先验证模型的效果,确认效果没有问题之后再进行更新。

模型服务

当模型被训练好被加载进来之后,对于每一个请求,服务器都会从recall系统当中获取一系列候选的app,以及用户的特征。接着调用模型对每一个app进行打分,获取了分数之后,服务器会对候选的app按照分数从高到低进行排序。

为了保证服务器的响应能力,能够在10ms时间内返回结果,paper采取了多线程并发执行的方法。老实讲,我觉得这份数据有点虚。因为现在的模型没有不使用并发执行的,但即使是并发执行,使用深度学习进行预测也很难保证效率能够到达这种程度。也许是还采用了其他的一些优化,但是paper里没有全写出来。

模型结果

为了验证Wide & Deep模型的效果,paper在真实的场景当中从两个角度进行了大量的测试。包括app的获取量以及服务的表现。

App 获取量

在线上环境进行了为期3周的A/B测试,1个桶作为对照桶,使用之前版本的线性模型。1个桶使用Wide &  Deep模型,另外一个桶只使用Deep模型,去除了linear的部分。这三个桶各自占据了1%的流量,最后得到的结果如下:

如何理解系统经典模型Wide与Deep

Wide & Deep模型不仅AUC更高,并且线上APP的获取量也提升了3.9%。

服务性能

对于推荐系统来说,服务端的性能一直是一个很大的问题,因为既需要承载大量的流量,也需要保证延迟非常短。而使用机器学习或者是深度学习模型来进行CTR的预测,本身的复杂度是非常高的。根据paper当中的说法,高峰时期,他们的服务器会承载1千万的qps。

如果使用单线程来处理一个batch的数据需要31毫秒,为了提升速度,他们开发了多线程打分的机制,并且将一个batch拆分成了几个部分进行并发计算。通过这样的方式,将客户端的延迟降低到了14毫秒。

如何理解系统经典模型Wide与Deep

代码实现

光说不练假把式,Wide &  Deep在推荐领域一度表现不俗,并且模型的实现也不复杂。我曾经使用PyTorch实现过一个简易版本,贴出来抛砖引玉给大家做一个参考。

import torch  from torch import nn  class WideandDeep(nn.Module):     def __init__(self, dense_dim=13, site_category_dim=24, app_category_dim=32):         super(WideAndDeep, self).__init__()         # 线性部分         self.loGIStic = nn.Linear(19, 1, bias=True)         # embedding部分         self.site_emb = nn.Embedding(site_category_dim, 6)         self.app_emb = nn.Embedding(app_category_dim, 6)         # 融合部分         self.fusion_layer = nn.Linear(12, 6)          def forward(self, x):         site = self.site_emb(x[:, -2].long())         app = self.app_emb(x[:, -1].long())         emb = self.fusion_layer(torch.cat((site, app), dim=1))         return torch.sigmoid(self.logistic(torch.cat((emb, x[:, :-2]), dim=1)))

由于我当时的应用场景比较简单,所以网络结构只有三层,但是原理是一样的,如果要应用在复杂的场景当中,只需要增加特征以及网络层次即可。

到此,关于“如何理解系统经典模型Wide与Deep”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何理解系统经典模型Wide与Deep

本文链接: https://lsjlt.com/news/84407.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解系统经典模型Wide与Deep
    这篇文章主要介绍“如何理解系统经典模型Wide与Deep”,在日常操作中,相信很多人在如何理解系统经典模型Wide与Deep问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2024-04-02
  • Java经典设计模式之责任链模式原理与用法详解
    本文实例讲述了Java经典设计模式之责任链模式。分享给大家供大家参考,具体如下:责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求。因为请求的客户端并不知道链上最终是谁来处理这个请求...
    99+
    2023-05-31
    java 设计模式 责任链模式
  • Win8系统开始菜单如何设置成经典样式
    这篇文章主要介绍“Win8系统开始菜单如何设置成经典样式”,在日常操作中,相信很多人在Win8系统开始菜单如何设置成经典样式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Win8系统开始菜单如何设置成经典样式...
    99+
    2023-07-02
  • 如何理解LR模型
    本篇文章给大家分享的是有关如何理解LR模型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。为什么是LR什么是LR大家已经知道了,但还有一个问题却...
    99+
    2024-04-02
  • 笔记本电脑主题变成经典模式如何解决
    这篇文章主要讲解了“笔记本电脑主题变成经典模式如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“笔记本电脑主题变成经典模式如何解决”吧!一、右击“计算机”---“管理”。二、选择“服务和...
    99+
    2023-06-28
  • 如何理解Linux操作系统 IO 模式
    这期内容当中小编将会给大家带来有关如何理解Linux操作系统 IO 模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 IOIO  (Input/Output,输入/输出)即数据的读取...
    99+
    2023-06-16
  • 如何解析Apache Spark 统一内存管理模型
    今天就跟大家聊聊有关如何解析Apache Spark 统一内存管理模型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Apache Spark 统一内存管理模型详解下面将对 Spark...
    99+
    2023-06-02
  • 如何理解css3弹性盒模型
    本篇内容介绍了“如何理解css3弹性盒模型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flexbox是布...
    99+
    2024-04-02
  • 如何理解W3C DOM模型用法
    这篇文章将为大家详细讲解有关如何理解W3C DOM模型用法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。这里和大家重点讨论一下DOM模型,DOM模型实际上是...
    99+
    2024-04-02
  • Node.js V8 引擎与模块系统:理解 RequireJS 和 CommonJS
    RequireJS RequireJS 是一个异步模块加载器,主要用于浏览器环境中。它使用依赖关系图来确定模块的依赖项,并按顺序加载它们。RequireJS 提供了一个 require() 方法,用于加载和执行模块。它还提供了命名空间和模...
    99+
    2024-04-02
  • 如何理解DOM文档对象模型
    如何理解DOM文档对象模型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。向大家描述一下DOM文档对象模型,文档对象模型(DocumentO...
    99+
    2024-04-02
  • 如何理解Kubernetes 网络模型进阶
    本篇文章为大家展示了如何理解Kubernetes 网络模型进阶,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Kubernetes 网络模型来龙去脉容器网络发端于 Docker 的网络。Docker ...
    99+
    2023-06-04
  • 阿里云服务器如何搭建php环境管理系统模型
    阿里云服务器搭建php环境管理系统模型需要采用一些常用的工具和技术,以下是一些建议: PHP环境搭建系统模型:选择适合php环境管理器的php版本,以及开发语言和服务器端语言的组合。 Git环境搭建系统模型:使用PHP环境管理器搭建系统...
    99+
    2023-10-26
    管理系统 阿里 模型
  • 如何理解JavaScript中的原型与原型链
    本篇文章给大家分享的是有关如何理解JavaScript中的原型与原型链,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原型和原型链关系贯穿Jav...
    99+
    2024-04-02
  • 如何用XP系统的启动管理来解决Vista与XP双系统
    如何用XP系统的启动管理来解决Vista与XP双系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、双系统的介绍 1、特性 本双系统XP,Vista都是独立的,互不影响,各安...
    99+
    2023-06-14
  • win10系统字体模糊如何解决
    Win10系统字体模糊可能是由于显示设置不正确或者显示驱动不兼容等原因造成的。以下是解决方法:1. 调整显示设置:右键点击桌面空白处...
    99+
    2023-09-28
    win10
  • win10系统显示模糊如何解决
    本篇内容主要讲解“win10系统显示模糊如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win10系统显示模糊如何解决”吧!win10系统显示模糊的处理办法:操作步骤:在桌面任意空白处鼠标...
    99+
    2023-07-01
  • python神经网络VGG16模型复现及其如何预测详解
    目录什么是VGG16模型VGG网络部分实现代码图片预测学一些比较知名的模型对身体有好处噢! 什么是VGG16模型 VGG是由Simonyan 和Zisserman在文献《Very D...
    99+
    2024-04-02
  • win7换win10系统一直经常断网如何解决
    今天小编给大家分享一下win7换win10系统一直经常断网如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。win7换w...
    99+
    2023-07-01
  • 如何深入理解Pytorch微调torchvision模型
    如何深入理解Pytorch微调torchvision模型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、简介在本小节,深入探讨如何对torchvision进行微调和特征提...
    99+
    2023-06-25
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作