🗒️推荐算法分析1-双塔结构数据预处理
2024-9-15
| 2024-10-16
0  |  阅读时长 0 分钟
status
type
date
slug
summary
tags
category
icon
password
😀
推荐算法业界较为常见的方法是1)对于所有特征,通过hash把它转化成一个ID;(2)对于每个ID,都用embedding look-up table把特征映射成一段固定长度的embedding(如果是序列化的可以pooling,或者做其他操作,后几讲会详细讨论);(3)把所有需要用到的特征的embedding拼接起来,作为DNN(一般是MLP)的输入,得到结果。本文着重分析其优缺点并将它和特征工程处理分析比较
 
 

数据清洗和特征构建

 
 
 
1天学会开发工业级推荐系统的特征工程:保姆级教程
 
推荐算法】双塔模型介绍(如何选择样本)

工业界的推荐算法应用

可以多看看这个作者(DataFunTalk)的InfoQ的blog

https://mp.weixin.qq.com/s/ExM5lXBwfKHWbHBcaNq2mA全民K歌直播推荐算法实践
 
https://www.infoq.cn/article/s6leccmevfx8va9k0t00阿里深度树匹配召回体系演进
 
https://blog.csdn.net/qq_31878083/article/details/117668419谷歌双塔模型原理及简单实现
 

推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models)https://blog.csdn.net/u012328159/article/details/123782735

里面有很多业界算法实现包括阿里DINhttps://blog.csdn.net/u012328159/category_11303534.html

 
https://blog.csdn.net/xixiaoyaoww/article/details/121551233推荐中使用FNN/PNN/ONN/NFM优化特征交叉
 
[深度学习] Deep & Cross Network (DCN)https://blog.csdn.net/zwqjoy/article/details/109101126
 
 
(deepctr等推荐算法实现)
 
推荐系统-召回-概述(二):协同过滤【永恒的经典】
 
知识蒸馏在推荐系统的应用
 
https://zhuanlan.zhihu.com/p/358779957SENet双塔模型:在推荐领域召回粗排的应用及其它
 
 
 
DSSM双塔模型及pytorch实现 https://blog.csdn.net/olizxq/article/details/118068337很详细很不错
 
 
 
一文看懂系列:
GitHub资料连接:http://wangshusen.github.io/
notion image
 
https://qiankunli.github.io/(个人博客和技术文章)
 
从零单排推荐系统 :水哥 夕小瑶的卖萌屋
 
 

方法一

在工业界中,使用哈希(hashing)方法对类别特征和数值特征进行统一处理,确实是一种常见的标准操作,特别是在大规模推荐系统和广告系统中。例如,Facebook 的 Deep Learning Recommendation Model (DLRM) 和 Google 的 Wide & Deep 模型中都使用了类似的方法来处理类别和数值特征。

关于哈希方法忽略类别特征和数值特征之间的不同的讨论:

哈希方法的目标是将所有的特征(无论是类别特征还是数值特征)转化为统一的ID,这样它们都可以通过embedding lookup table映射到相同长度的向量空间中。通过这种方式,哈希方法可以忽略特征类型之间的显著差异,统一处理。但在实际应用中,这样的处理方式仍然会有一些需要注意的地方:

1. 哈希编码对类别特征的适用性

  • 类别特征(例如:性别、职业、电影类型等)非常适合哈希操作。类别特征是离散的,使用哈希编码将每个类别转化为唯一的ID,然后通过embedding lookup来获得对应的稠密向量。这是行业内的标准做法。
  • 例如,将“电影类型”哈希成一个ID,然后通过embedding lookup得到一个固定长度的稠密向量。

2. 数值特征的哈希编码处理

  • 对于数值特征(如年龄、收入、评分等),直接通过哈希编码并用embedding lookup来映射到向量空间并不是最佳选择,因为数值特征有内在的数值关系和顺序信息。
  • 例如,年龄的数值范围是连续的,直接哈希会丢失数值之间的距离信息。

3. 数值特征的处理改进

  • 在工业界,通常会对数值特征进行离散化(bucketing/binning),将数值特征划分为不同的区间,每个区间用一个唯一的ID表示,然后对这个ID进行哈希处理。这样可以将数值特征转化为类似类别特征的处理方式,并保留一定的数值关系信息。
  • 另一种方法是对数值特征进行归一化或标准化,然后直接将其作为模型的输入,而不进行哈希编码。这种方式可以保留数值特征的连续性信息。

4. 特征拼接后的处理

  • 在将类别特征和数值特征通过哈希方法转化为embedding向量后,通常会将所有特征的embedding进行拼接(concatenation),然后作为DNN的输入。这是将类别特征和数值特征统一处理的标准操作。
  • 对于序列化的类别特征(例如用户的历史点击记录),可以通过池化(pooling)或者注意力机制(attention)来对序列中的embedding进行聚合操作,从而生成一个固定长度的向量,作为模型输入的一部分。

5. 哈希方法的局限性

  • 碰撞问题:哈希操作会有碰撞的可能性,尤其是在特征空间非常大的情况下(如广告投放中的大量离散ID)。解决办法之一是增加哈希空间的维度,以减少碰撞的概率。
  • 特征的可解释性:哈希操作使得每个特征值都被映射到一个独立的ID,失去了原有的特征可解释性,尤其是数值特征。在一些需要特征解释的应用场景下(如医疗诊断、金融风控),这种处理方法可能会受到限制。

总结1

使用哈希方法将类别特征和数值特征统一处理为ID,并通过embedding lookup table映射到相同长度的向量空间,是工业界广泛使用的标准操作。这种方法能够简化特征处理,尤其是在大规模、高维度的场景中。但在处理数值特征时,仍需考虑数值信息的保留,通常通过离散化、标准化或归一化来处理数值特征,以保持数值之间的关系。
推荐算法

方法二

用embedding层处理物品ID和其他离散特征, 用归一化取对数或者分桶等方法处理物品的连续特征, 把得到的特征输入一个神经网络则是另外一种处理方式。
这种方式较前一种业界方式较为复杂,但是在推荐算法应用于几十万数量级的数据时较为有效。具体方式如下:

1. 用Embedding层处理物品ID和其他离散特征

  • 离散特征:通常指的是类别型的特征,比如物品ID、用户ID、类别等。
  • Embedding层:这是将离散的、类别型的特征映射到低维连续空间的常见方法。例如,假设你有物品ID,而每个物品都有唯一的ID号,直接将ID作为输入给模型并不合适,因为ID号的数值并不代表物品之间的实际距离关系。Embedding层通过训练,将每个离散的ID映射到一个实数向量(embedding),该向量捕捉到物品的某些特征并反映物品之间的潜在相似性。
理解:物品ID、用户ID、或者分类特征可以通过Embedding层处理,这个过程相当于将离散的ID转化为可被神经网络处理的连续向量。

2. 用归一化、取对数或者分桶处理物品的连续特征

  • 连续特征:指的是像评分、观看次数、价格等数值型的特征。
  • 归一化:通常用于将连续值映射到固定区间(比如[0,1]),以防止不同特征值的数量级差异对模型训练产生不利影响。归一化可以采用最小最大归一化或Z-score标准化。
  • 取对数:有些连续特征(比如观看次数、评论数等)数值范围变化较大,可以通过对数变换缩小值的范围,并且减小数据分布的不对称性。
  • 分桶:如果连续特征的值分布离散化,比如把观看次数分为不同的区间(低、中、高),这相当于将连续值转换为分类变量,类似于离散特征的处理。
理解:连续特征(如评分、观看次数)需要处理成适合模型输入的格式,通过归一化、取对数或分桶可以调整这些值,使其更容易被神经网络学习。

3. 将所有处理好的特征输入一个神经网络

  • 特征输入:Embedding层生成的离散特征表示和经过预处理的连续特征会拼接在一起,然后作为神经网络的输入。这个神经网络通常是深度学习中的多层感知器(MLP),用于学习这些特征之间的复杂关系,最终生成预测结果。
 
对于许多个离散特征,通常每一个离散特征都需要单独进行 Embedding 处理,而不是将它们一起嵌入。这是因为不同的离散特征通常表示不同的信息,它们的取值范围、类别数量和语义上是独立的,因此需要分别进行处理。以下是进一步的解释:

1. 为什么每个离散特征需要单独进行Embedding

  • 语义独立性:不同的离散特征在语义上代表不同的类别。例如,"用户ID"、"物品ID"、"物品类别"等离散特征代表的概念不同,因此它们的Embedding表示不能共享同一个向量空间。用户ID和物品ID、类别ID是不同的类别,它们的相似性和关系也不同。
  • 取值范围不同:每个离散特征的取值范围往往是独立的。例如,物品ID可能有几千个不同的ID,而物品类别只有十几种。如果用同一个Embedding表去处理这些特征,无法有效区分它们之间的差异。
  • 信息独立:每个离散特征都提供了独特的信息。将它们单独Embedding后,网络能够独立学习到这些特征的重要性和其与其他特征的关系。

2. 如何单独处理多个离散特征的Embedding

每个离散特征都需要对应一个独立的Embedding层来处理。具体来说:
  • 每个离散特征建立一个Embedding层:假设你有三个离散特征,"用户ID"、"物品ID" 和 "物品类别",你需要为这三个特征分别创建三个Embedding层,每个层的Embedding维度可以不同,取决于特征的类别数量和需要学习的潜在空间的维度。
  • Embedding维度的选择:通常,离散特征的Embedding维度根据类别数量的平方根或者经验选择。例如,如果物品ID有5000个类别,Embedding维度可能设置为32或者64。如果物品类别只有10种,Embedding维度可能只需要4到8。

3. Embedding后如何处理

  • 拼接/融合特征:当每个离散特征单独Embedding之后,生成的Embedding向量会被拼接(concatenate)在一起,形成一个大的输入向量。这个向量包含了所有离散特征的信息,接下来可以输入到后续的神经网络层中。
  • 并行处理:每个特征的Embedding层可以并行处理,在模型训练过程中,网络会同时更新每个Embedding层的权重。
示例代码:

方法优劣比较

对于双塔模型(如DSSM或DeepFM等)中的特征处理,选择直接为每个类别特征单独进行Embedding和通过hash将所有特征转换为一个ID来Embedding的两种方法各有优劣。下面我们来分析这两种方法在处理既有类别特征又有数值特征的双塔模型时的对比,并探讨哪种方法更友好。

1. 方法一:单独Embedding每个类别特征

这种方法是针对每个离散的类别特征(如用户ID、物品ID、类别等)分别进行Embedding,并将数值特征通过归一化等方法处理后输入模型。

优点:

  • 信息独立性强:每个离散特征都有独立的Embedding层,模型能够充分学习每个特征在不同维度的潜在表示。不同的特征捕捉不同的语义,Embedding处理可以更精准地学习特征的表示。
  • 更灵活:你可以根据每个类别特征的重要性和类别数量,设置不同的Embedding维度。例如,物品ID的Embedding维度可能更大,而物品类别的Embedding维度可以更小,适应模型的需求。
  • 可解释性强:这种方法可以很直观地解释每个类别特征的表示和它们之间的关系,易于进行特征工程调整。

缺点:

  • 维度较高:每个类别特征都有单独的Embedding层,拼接后的Embedding向量可能维度较高,增加了模型的复杂性和训练时间。
  • 对稀疏特征有挑战:如果类别非常多且稀疏,Embedding表可能非常大,会占用较多的内存资源,尤其是在大规模数据场景下。

2. 方法二:将所有特征通过hash转换成一个ID进行Embedding

在这种方法中,所有类别特征(甚至可以包括数值特征,离散化后)都通过hash编码成一个ID,将它们看作是统一的离散类别,然后对这些ID进行Embedding。

优点:

  • 低维度、模型简单:将所有特征转为hash值之后,只需要一个Embedding层,嵌入的向量维度相对较小,节省了计算和内存资源。
  • 稀疏特征处理方便:hashing方法可以将大量的类别特征映射到固定大小的Embedding表中,适合处理高稀疏、高维度的类别特征。
  • 特征组合潜力:hash编码可以自动捕捉到特征之间的交叉关系,能够隐式地形成特征组合,而不需要手动进行特征工程。

缺点:

  • 信息损失:hashing的方法可能会出现hash冲突,即不同的特征被映射到相同的hash值。这可能导致信息丢失或混淆特征的表示,尤其在类别数量较大时,模型的精度可能受影响。
  • 不灵活:所有类别特征的表示共享同一个Embedding空间,模型无法独立学习每个特征的个性化表示。如果特征在不同维度上有不同的重要性,难以通过单一的Embedding来捕捉。
  • 可解释性差:hash方法难以直观解释特征的相互关系,因为特征被隐式编码,特征重要性和表现不容易调整或理解。

3. 对于双塔模型的影响

双塔模型(如DSSM或双塔推荐模型)中,用户塔和物品塔分别生成用户和物品的Embedding表示,然后通过一些相似性计算(如点积、余弦相似度等)来进行匹配。对类别和数值特征的处理方法直接影响塔的表示质量。
  • 方法一(单独Embedding每个特征)更适合双塔模型的复杂性和灵活性
    • 双塔模型的核心是捕捉用户与物品之间的细腻互动。通过为每个类别特征单独Embedding,用户塔和物品塔可以分别学习到更细致的特征表示。
    • 数值特征(如用户年龄、评分、观看次数等)可以通过归一化处理后,直接拼接到Embedding向量中,为模型提供更丰富的信息。
    • 这种方法可以更好地捕捉不同特征的重要性,并独立调整Embedding的维度,提升模型性能和预测准确性。
  • 方法二(hash编码)的优势在于简单性和资源效率
    • 如果数据维度非常高、类别特征稀疏,hash方法可以减少模型的复杂性和内存占用。
    • 但对于需要高精度的任务,比如推荐系统,方法二的信息损失可能会降低模型的效果。双塔模型本质上需要高质量的Embedding,而hash编码可能会因为冲突和信息损失,影响Embedding表示的质量。

4. 综合对比

特点
方法一:单独Embedding特征
方法二:hash编码所有特征
信息表示
高度独立、精确
可能有hash冲突,信息丢失
特征组合灵活性
需要手动设计特征交叉
自动捕捉部分特征交叉
计算复杂度
高,需处理多个Embedding层
较低,计算简单
模型性能
较好,精细控制
较弱,hash冲突影响表现
可解释性
资源消耗
可能占用更多内存
低内存占用
适用场景
精确推荐、复杂模型
大规模稀疏数据、轻量级模型

5. 结论

如果你的双塔模型需要处理的是比较复杂的推荐任务,尤其是要高度精确捕捉用户与物品之间的互动,
方法一(单独Embedding每个特征)会更适合。这种方法能够为每个类别特征提供独立的学习能力,模型可以充分学习每个特征的个性化表示,从而提升推荐效果。
但如果你的应用场景中类别特征特别多且稀疏,计算资源有限,同时对推荐精度的要求不高,那么**方法二(hash编码所有特征)则可能是一个更简单和高效的选择。
  • machine learning
  • recommendation System
  • Kaggle don’t overfit itCareer Knowledge
    Loading...
    目录