6

深入理解DNN模型在CTR预估中的泛化能力

 2 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA4OTk5OTQzMg%3D%3D&%3Bmid=2449231622&%3Bidx=1&%3Bsn=5d24465f741380697be55b773285baf6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

深入理解DNN模型在CTR预估中的泛化能力

Original 张相於 Beyond Search 2020-10-10 07:27

DNN模型这几年在推荐领域已经逐渐成为新的事实标准模型了,相比传统的线性模型和树模型,它在各项指标上都有显著提升。关于DNN效果好的原因,通常认为是两个主要原因,即特征泛化能力强和特征组合表达能力强,在这两者中,后者又是依赖前者的,也就是说正是因为DNN对于特征具有的泛化能力才使其具有了进一步的特征表达能力。更具体地说,是因为DNN引入了embedding的特征泛化方式,以这种新式的特征单元结合MLP、RNN等模型结构,使得模型有了千变万化的能力。

相比各种DNN模型炫酷的结构,有一个更加本质的问题得到的关注却一直比较少,那就是为什么DNN能够提供更好的泛化能力,在这篇文章中我们就来对这个问题一探究竟。

本文分为四个部分,首先来回顾和明确一下泛化能力的定义,之后在此基础上讨论CTR预估场景下泛化的难点在哪里,然后讨论DNN模型如何缓解这些难点,最后来讨论DNN对于泛化问题的解决能力是否已经完美。

泛化能力是什么

要讨论泛化能力的好坏,先得知道究竟什么叫泛化能力,以及泛化能力与什么有关。机器学习系统的开发都可分为两个步骤,先是训练,再是预测,如果把训练比作平时的小测验,预测比作期末考试,泛化能力通俗一点说就是看期末考试的水平和小测验的水平差距大不大,如果差距不大,那么泛化能力就比较好,如果差距比较大,泛化能力就比较弱。这个道理相信大家都懂,而这里面有趣的问题在于,为什么会出现预测效果显著差于训练效果这种问题?又或者说,在什么情况下会出现这种问题?

这个问题可以运用反向思维和极限思维来思考,先看这个问题的反向问题:什么情况下预测效果和训练效果完全一致?这个答案就很简单了:当预测集合是训练集合的子集时,也就是预测集合中的每一条样本都在测试集中出现过,这里的样本指的是不带样本ID的、用特征表示的样本。这就好像期末考试考的全是平时测验的题目,而且平时测验的题目答案你还都知道,那么你一定会拿最高分,虽然这个最高分可能并不是满分。但在现实情况中这是不可能出现的场景,否则也用不着训练模型了,因为训练模型的作用就是预测没有见到过的状况。那么问题就变成了,在“预测集中一定会出现训练集中没有的样本”这样一个前提下,什么情况下预测集合上的预测效果是最好的?

这其中起到决定性作用的就是训练集中的特征分布与预测集中的特征分布是否一致。具体来说,对于一个数据集合,可将标签和展开后的特征放在一起看做一个多变量联合分布,即 , 分从某分布  ,如果训练集对应的分布  和预测集对应的分布  足够相似,或者说预测集的样本都近似服从于  ,那么在  上训练出来的模型到了  上就会有比较好的效果,而如果两个分布差异较大,那么模型的预测效果就会受比较大的影响。这就如同平时测验考的都是四则运算,期末考试也考四则运算,虽然具体数字不一样,但是也能考个好成绩,但如果平时测验的是四则运算,但期末考试题目中混入了部分开根号、幂运算、阶乘这些高阶运算,那么成绩自然好不了。

CTR预估场景下的泛化难点

要做到训练集合预测集的特征同分布,对于不同类型的特征来说是具有不同等级的难度的。推荐和广告系统中的特征通常可分为三大类:

  1. 数值型。指的是原始取值就是连续数值型的特征,例如年龄、点击率、价格等连续数值类特征
  2. 低维离散型。指的是有少量可穷举取值的离散型特征,例如性别、职业、类目等
  3. 高维离散型。指的是有大量几乎不可穷举取值的离散型特征,主要是ID类特征,主要包括用户ID和物品ID

对于数值型和低维离散型特征,做到同分布是相对比较容易的,这是因为CTR预估场景下训练和预测主要是通过时间进行划分的,而这些特征和用户、物品之间的关系在时间维度上是较为稳定持久的,通过几个例子便可以看出:

  • 今天购买某偶像周边产品的用户的年龄分布和明天购买它的用户的年龄分布是基本相同的,不太可能出现今天都是90后买,明天却变成了都是70后来买的情况
  • 今天购买《从零开始构建企业级推荐系统》这本书的用户,和明天购买它的用户,都是以程序员和产品经理为主,不会发生太大变化
  • 一个用户的性别、职业、消费档次这些属性都是相对稳定持久的,随着时间变化的速度会非常小或基本不变
  • 在阅读新闻资讯时,一个用户感兴趣的类别是相对稳定的,会有一个范围,但不会无限制扩张

正是由于它们在时间维度上的稳定性,我们常说这些特征具有比较好的泛化能力。但这些特征泛化能力好的另一面就是预测精度不足,原因在于这些偏稳定的特征在推荐广告的场景下不足以完整精准刻画一个用户和物品的状态,对用户与物品之间交互行为的预测也就不够精准。例如在性别、年龄、职业等等泛化能力好的特征上取值都相等的用户有很多,他们的行为模式显然还是不尽相同的,把在这些特征上取值完全相同的用户放在一个桶里,会发现他们对于是否点击某一个物品的行为差异还是会很大,不足以对点击或转化行为做出准确预测。只有得到更细致的特征才能将他们进行进一步区分,也只有在完成了用户足够细粒度的区分后,预测结果才可能足够精准。那什么样的特征才是对用户和行为状态最精准的刻画呢?在目前的数据获取能力范围内,对预测精度价值最大的就是用户和物品的ID级特征,以及两种ID特征之间的共现关系特征。这一类特征一般被统称为ID级特征,因为它们都是通过用户ID或物品ID组合而成的。

相比连续特征和低维离散特征,ID类特征能够提供更高的预测精度,核心在于两个方面:

  1. 提供了更高维的特征空间,可容纳更多信息,给了模型更大的优化空间。模型的学习能力和特征维数是有着直接相关性的,在CTR预估这样一个个性化极高的场景下,维度高了不一定能学好,但维度不足一定学不好,所以以合理的方式加入大量的特征,对于模型本身来讲就是一种有利的做法
  2. 提供了手动特征工程无法触及的最细粒度特征。由于精力和人的思维所限,特征工程可以提炼的特征维度是有限的,无论已经提炼了多少特征,总还有没有提炼出来的部分,对于这些没有手动提炼出来的特征,用户/物品ID提供了一种最细粒度的刻画方式,相当于在说:“这个ID就是这个用户/物品最独特的代表,最能够代表它的独特性,模型你就照着这个特征去学吧”,这种特征刻画方式也是后面各种端到端模型的基础

但也正是这类特征,给模型的泛化带来了困难,其泛化难点主要来自以下几点:

  1. ID类特征稀疏性严重,导致训练不充分。 就像硬币的正反面,高维度的另一面就是稀疏性,具体来说指的是一个ID类特征可能只在少数样本上出现,这使得它可能无法得到充分训练,尤其是对于长尾部分的ID特征更是如此
  2. ID类特征新增频率高,导致模型特征命中率偏低。 由于ID类特征和用户和/物品直接相关,所以如果有新增用户或新增物品,就会出现新的ID特征,而这些ID特征在之前训练模型时并没有出现,因此模型中是没有的,导致这些新增特征在模型中无法命中,因而影响预测效果
  3. ID类特征失效频率高, 导致模型部分失效。 这个问题是上面一个问题的反面,即一个物品的生命周期可能会比较短,可能在训练时是有效的,但在线上预测时已经失效了,那么模型归因到这部分ID特征上的信息就损失掉了,预测时就会出现偏差
  4. ID组合类特征在训练时无法穷举,导致部分组合在预测时无法覆盖。 如果物品侧有  个ID,考虑“用户看过的物品ID×当前待推荐物品ID”的ID组合特征,那么一共有  种组合方式,也就是有这么多个ID组合特征。理论上有这么多种组合,但实际中并不是每种组合在训练数据中都会出现,所以在训练时只能够造出在训练样本中出现过的ID组合特征,这就会导致一些在预测时出现的ID组合没有出现在模型中,从而导致在这些样本上只能根据泛化特征做出预测,导致结果精度不高

上面几个问题是两个原因叠加导致的:首先是维数灾难,即极高的特征维度导致每个邻域内可用的数据量极少,任意两条样本在ID特征上的相似度均为零;其次是数据不同分布,即除了第一个问题以外,其余三个本质上都是预测空间和训练空间的ID特征分布不一致导致的,而且分布的差异都是“非黑即白”类型的,即某特征只在训练集或预测集中出现,在另一个集合中完全不出现,这属于分布不一致中最为极端最为困难的情况,因为这种类型的分布不一致会导致预测时的某些特征完全没被训练过,而不仅仅是普通的特征权重发生变化,因此影响也是最大的。对于ID新增和ID失效的问题,可以通过提高模型更新频率来适当缓解,而最后的ID组合特征的泛化问题,是ID特征泛化问题中最具有挑战的点,通过简单的提高更新频率是无法解决的。

针对ID特征的这个问题,为了让ID具有好的泛化能力,我们希望在训练集中出现过的ID特征能向未出现过的ID特征传递复用一定的信息。直观地,对于在训练集中未出现过的特征  ,我们希望能够用以下思路来帮助估计  的参数权重:

  • 找到在训练集中出现过的,且和  相似度较高的特征 
  • 如果  是比较重要的特征,那么  应该也是比较重要的特征
  • 如果交叉特征  是比较重要的特征,那么  也是比较重要的特征

如果能够通过上面方法得到  的权重,可称特征集合  具有“局部平滑性”,表达的是一种相近特征之间信息的传递复用能力。如果能够做到这一点,说明对于训练集中未出现的ID类特征,可通过与之相似的、在训练集中出现过的ID特征来向其传递部分权重信息,这样便可以缓解上面提到的ID特征分布变化剧烈带来的泛化问题,而具体能够缓解多少,还要看这种局部平滑性能够做到多好。

可以看出原始的ID特征是不具有局部平滑性的,原因在于原始的ID类特征用one-hot的形式来表示,而在one-hot表示下,任意两个不相同的ID特征相似度都是0,在这样一个相似度极度贫乏的空间中,是找不到满足条件的  的,那么后面的操作自然也就无从完成,而这也正是ID类特征泛化难的最本质原因。

DNN模型如何提升泛化能力

通过上面的讨论,我们知道要解决ID类特征泛化难的问题,核心在于将ID类特征转换为一组具有局部平滑性的特征,而要想实现特征空间的局部平滑性,先决条件是要有一个比较丰富的相似度空间,因为只有这样才能为新特征  找到足够相似的  。那么如何来定义一组特征对应的相似度空间的丰富度呢?可以考虑如下的一个粗略衡量标准:

对于特征空间中任意三个特征向量 ,若  越高,则认为该特征空间对应的相似度空间越丰富。

可以看出在这个定义下,相似度空间越丰富的特征空间,越能够将不同特征对之间的差异进行区分,对于one-hot表示的的ID特征空间,任意两个特征的相似度都是0,因为对于任意不同的  来说,  都是0,这显然是非常贫乏的相似度空间。

这其中的根本症结在于one-hot这种特征表征方法,这种特征表征方法的设计理念就是给每个ID一个单独取值,目标就是要任意两个ID取值都不相同,因此其相似度空间天然就是贫乏的,甚至可以说这种特征的设计目标就是要“反相似度”。要想突破这种天然限制,最直接的一种方法是变one-hot为multi-hot,也就是对于一个ID,用特征向量中的k个位置来表示它,当这些位置均为1时,等价于one-hot体系中这个ID为1。这种方法比one-hot确实要好一些了,因为如果两个特征共享至少一个位置的话,那么他们的相似度起码是非零了,但这种进步是有限的,因为这种multi-hot中的k相比ID数量仍然是非常小的,例如典型的ID数量是百万级别,而典型的k一般是个位数,这就意味着绝大多数的特征之间的相似度仍然是零,因此multi-hot方法对于这个问题来说可以说是杯水车薪。

怎么能更加彻底地解决这个问题呢?运用极限化思维,先来想想multi-hot中的k最大能取多大,答案显然是特征向量有多长,k就取多大,如果直接这样把multi-hot扩展到所谓的full-hot——也就是每个ID在每一位上都是hot的,是不是可以呢?显然是不行的,因为这会让每个ID的向量表示都一样,不具区分性了,那么有没有方法来解决这个新问题呢?方法也是有的,目前为止,无论是one-hot还是multi-hot,在hot的那一位或几位上取值都只有1,因为其本意是代表是否存在的布尔变量,没有其他值,这显然极大限制了特征取值的丰富度,如果把这一点放开,让这一位可以取任意值,再结合上full-hot的形式,就可以构造出一个足够丰富的相似度空间,在这个空间下,每个ID用一个k维向量表示,并且每个ID在每一维上取值都可以是任意实数。容易验证,这种特征表征方式的相似度空间丰富度是很高的,因为对于三个稠密的实数向量,其两两之间的相似度取值相等的概率是很高的,即  会非常高,由于实数集的势是 ,因此这个概率几乎是无限趋近于1的。

这个样子的ID特征表示是不是看起来非常熟悉?没错,这就是DNN模型中对ID特征的处理方法,也就是俗称的embedding表示,惊不惊喜?意不意外?由于这种表示方法将每一位上只有0和1的取值扩展到可以任意取值,所以极大增加了特征取值的丰富度,因此特征维数也不再需要是ID数量那么多,一般k取即使到几百就足够用了。

经过这样的变化,特征表示就从原始的one-hot升级到了embedding的形式,embedding的特征表征形式最大的优势就在于它构造了一个极为丰富的相似度空间,为特征的局部平滑性提供了先决条件。但是对于提高ID特征泛化能力来说,有了embedding的表征方法还不够,因为这只是允许了和  足够相似的  的存在,但这个  是不是我们想要的那一个目前还没有保证。换句话说,在这个特征空间内,只能保证对于任意  都会存在一批和它足够相似的  ,但还不能保证这批  是我们希望和  相似的那一批。例如,我们希望和一个手机足够相似的商品也是手机,而不是一双袜子,这一点又如何来保证呢?

要解决这个问题,需要先想清楚一个问题:对于推荐系统来讲,为什么和一个手机相似的应该也是个手机,而不是袜子呢?究其根本,是因为看了手机A和手机B的人后来有较大概率后面看到的物品是相同的,但看了手机的人和看了袜子的人接下来看的东西却只有极小概率是相同的。进一步抽象,假设在某高维空间中有若干点,现在要求  和  距离这些点的距离都足够接近——这代表这两个物品和另外一组物品的相似度都足够接近,那么  和  之间位置关系应该是什么样的呢?显然,最简单的做法就是让  和  紧紧挨在一起,而这也就对应着  和  的距离小,相似度高。这样的排列方式不一定是唯一解,但一定是可行解,其过程是由最优化算法来实现的,在这里不做过多讨论。

Wide&Deep模型本质上就是上面思路的典型实践,即用ID特征embedding化来提升ID交叉特征的泛化能力,而后面一些其他模型在embedding化表示的基础上对于embedding向量的操作又进行了升级,而这又是DNN模型引入的又一个新的发展空间:对于embedding向量操作的无限可能,但这是后话了,以后有机会我们再单独聊聊。

DNN的泛化能力是否已经完美

上面我们讨论了DNN模型中embedding对于推荐系统泛化能力的提升,主要针对的是对于ID交叉特征的泛化问题,那么推荐系统的泛化问题到此为止算是彻底解决了吗?其实还没有,上面只讨论了ID特征的二阶交叉特征,即形如“过去看了A对于现在看不看B的影响”这类特征,但事实上用户的当前的物品有没有兴趣,是过去所有行为序列整体作用的效果,只使用DNN的ID embedding化和深度结构还不足以解决这个问题,因此才产生了DIN、DIEN等对序列行为做深度化处理的模型,那么这些模型和行为ID序列之间又有着什么样的关系?是否遵循着和二阶ID交叉特征一样的内在逻辑?且听下回分解。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK