搜广推[排序]

Created by: Yuanpeng QU
Created time: 2025年8月9日 14:29

推荐系统排序模型知识体系总结(大纲)

第一章:排序模型的基础 (Foundations of Ranking Models)

在深入探讨各种复杂精妙的模型之前,我们必须先理解所有排序模型所立足的共同基础。这个基础包含两个层面:一是我们如何从业务逻辑上将“排序”这个抽象任务,转化为一个可以用数学模型解决的问题;二是在这个问题的解决方案中,那个最简单、最核心的基石模型——逻辑回归(LR)——是如何工作的。

1.1 排序的核心任务:从“排序列表”到“点击率预估”的思维转变

一个推荐系统或搜索引擎,其最终呈现给用户的,是一个有序的物品列表。系统的终极目标是让这个列表的排序方式,能够最大化某个商业指标(如用户满意度、平台收入、用户总停留时长等)。

直接去优化一个列表的“顺序”本身,在数学上是一件非常困难的事情。我们很难定义一个平滑、可导的损失函数来衡量一个列表“排得有多好”。因此,工业界和学术界普遍采用了一种非常关键的思维转变,将这个复杂的“列表排序问题”进行降维和简化。这种转变的核心是:不再直接比较物品与物品之间的相对顺序,而是为每一个独立的物品进行“打分”。

我们只需要找到一个能够精准衡量“物品对特定用户的吸引力”的分数。分数越高的物品,就理应排在越靠前的位置。在互联网广告、电商推荐、信息流等场景下,点击率(Click-Through Rate, CTR) 被证明是这个“分数”的最佳选择之一:

  1. 可衡量性:用户的点击行为可以被大规模、精确地记录下来,为模型训练提供了海量的、真实的标注数据(曝光但未点击为负样本,点击为正样本)。
  2. 与兴趣的强关联性:用户的一次点击,是其对某个内容感兴趣的、最直接、最明确的信号。一个物品的预估点击率越高,通常意味着它更能吸引该用户。
  3. 概率的天然契合:CTR 本身是一个概率值(点击的概率),这与许多机器学习分类模型的输出形式(如逻辑回归通过Sigmoid函数输出一个0到1的概率)完美契合。

通过这个思维转变,我们成功地将一个模糊的“排序问题”,转换成了一个定义清晰的、标准的二元分类问题

对于任意一个给定的(用户,物品,上下文)组合,预测该用户点击该物品的概率是多少?

一旦我们训练好一个能精准预测CTR的模型,排序过程就变得非常简单:

  1. 对所有候选物品,逐一调用模型,预测出它们各自的pCTR(predicted CTR)分数。
  2. 将所有物品按照pCTR分数从高到低进行排序。
  3. 将排序后的列表呈现给用户。

这个从“优化顺序”到“预测分数”的转变,是整个现代推荐排序系统的基石,它为我们后续讨论的所有复杂模型的应用铺平了道路。

1.2 万变不离其宗的基石:逻辑回归 (LR) 的原理与局限性

逻辑回归(Logistic Regression, LR)是解决CTR预估问题最基础、最经典的“Hello, World”级别的模型。尽管它很简单,但其核心思想贯穿了后续许多复杂模型的始终。

模型原理

LR模型通过两步来完成从输入特征到最终概率的预测:

**1. 线性求和 (Linear Combination):**首先,模型接收一组输入特征(如年龄、性别、物品品类等),并为每个特征分配一个权重 wi。然后将所有特征进行加权求和,得到一个原始的预测分数 z。

image.png

这里的权重 wi是模型需要从数据中学习的参数,它代表了每个特征对最终结果的影响方向(正或负)和大小。

2. Sigmoid函数:上述的线性分数 z 是一个没有边界的实数。为了将其转换为一个0到1之间的概率值,LR使用了一个关键的非线性函数——Sigmoid函数

image.png

无论输入的 z 多大或多小,经过Sigmoid函数处理后的输出y_hat都会被“压扁”到(0, 1)区间内,这个值就是模型预测的点击率(pCTR)。

LR的优点

  • 简单高效:模型原理简单,计算量小,无论训练还是在线预测,速度都非常快,非常适合大规模工业应用。
  • 可解释性强:每个特征的权重 wi 都清晰地反映了该特征对结果的影响。例如,一个较大的正权重意味着这个特征是点击行为的强预测因子。这使得模型非常便于理解和调试。

LR的局限性 (也是后续模型演进的动力)

LR最大的局限性在于它的线性假设

  1. 无法学习非线性关系:模型假设最终的决策边界是线性的,无法捕捉现实世界中普遍存在的非线性模式。
  2. 无法自动学习特征交叉:这是线性假设最直接的后果。LR无法自动学习到“20岁的男性”对“游戏机”这个组合的特殊偏好。它只能学习到“20岁”的独立影响和“男性”的独立影响,然后将它们简单相加。
  3. 依赖大量人工特征工程:为了克服上述缺点,算法工程师必须手动地、基于业务经验地去创造交叉特征(例如,创建一个新的特征叫 is_male_and_age_20),然后再喂给LR模型。这个过程极其耗费人力、难以穷举,且效果高度依赖工程师的经验。

总结:逻辑回归是排序模型的起点。它的简单和高效使其成为一个强大的基准,但其无法自动学习特征交叉的根本性缺陷,是催生后续 GBDT+LR、FM 以及所有深度学习排序模型不断演进的核心驱动力。

1.3 数据的预处理:特征工程的核心概念

在我们讨论的所有模型中,都有一个共同的前提:模型本身只能处理数值。然而,我们拥有的原始数据是各式各样的,有类别、有数字、有文本。特征工程 (Feature Engineering) 的核心任务,就是将这些原始数据转换成模型能够理解和利用的、高质量的数值化特征。这是决定模型性能上限的关键一步。

  • 1.3.1 类别特征与独热编码 (One-Hot Encoding)

类别特征 (Categorical Features) 是指那些取值为离散标签或符号的特征。这些值之间没有大小、顺序之分。在推荐系统中,这类特征无处不在,例如:

  • user_id
  • item_id
  • city (如:’北京’, ‘上海’, ‘广州’)
  • gender (如:’男性’, ‘女性’)

面临的问题
模型无法直接理解 '北京' 这样的文本。一个最朴素的想法可能是给它们编号,比如 '北京'=1, '上海'=2, '广州'=3。但这样做是完全错误的,因为它凭空引入了一种不存在的数学关系,即 广州 > 上海 > 北京。模型会基于这个错误的大小关系去学习,导致结果荒谬。

解决方案:独热编码 (One-Hot Encoding)
独热编码是处理类别特征最标准、最有效的方法。它的核心思想是用一个向量来表示一个类别,且向量中只有一个位置是 1,其他所有位置都是 0
通过这种方式,我们成功地将类别特征转换成了一个高维度的稀疏向量(向量中绝大部分元素都是0)。这样做的好处是,它彻底消除了类别之间的伪序关系,并使得线性模型可以为每一个独立的类别(如 '北京' 这个城市)学习到一个专属的、不受其他城市干扰的权重 w_beijing

  • 1.3.2 连续特征与归一化、标准化

连续特征 (Continuous Features) 是指那些取值是连续数值的特征,这些数值有明确的大小和顺序关系。例如:

  • age (年龄)
  • price (商品价格)
  • item_historical_ctr (物品历史点击率)

面临的问题:
不同连续特征之间的**数值尺度(Scale)**可能差异巨大。例如,用户的年龄 age 可能在 1860 之间,而用户的年收入 income 可能在 500001000000 之间。如果直接将这些原始数值输入模型:

  • 大尺度特征会“支配”模型:在计算损失和梯度时,income 这个特征的数值会远远大于 age,导致模型对 income 的变化极其敏感,而几乎忽略 age 的影响。
  • 训练过程不稳定:巨大的数值差异会导致损失函数的“等高线”变成一个又扁又窄的“峡谷”,使得梯度下降法很难稳定、高效地找到最优点。

解决方案:特征缩放 (Feature Scaling)
为了消除不同特征间的尺度差异,我们需要对它们进行缩放处理,让所有特征都处于一个可比较的量级上。最常用的两种方法是归一化和标准化。

1. 归一化 (Normalization)

  • 别名:最小-最大缩放 (Min-Max Scaling)。
  • 目标:将数据线性地缩放到一个固定的区间,通常是 [0, 1]
  • 公式X_norm = (X - X_min) / (X_max - X_min)
  • 说明X 是原始值,X_minX_max 分别是该特征在整个数据集中的最小值和最大值。这种方法非常直观,但对**异常值(Outliers)**非常敏感。

2. 标准化 (Standardization)

  • 别名:Z-score 标准化。
  • 目标:将数据转换成一个均值为 0,标准差为 1 的标准正态分布。
  • 公式X_std = (X - μ) / σ
  • 说明μ 是该特征的均值,σ 是其标准差。这种方法比归一化更鲁棒,因为它不受异常值的影响。在大多数深度学习和线性模型中,标准化是更常用、更受推荐的选择

数据预处理是构建任何成功排序模型的必要前提。通过独热编码处理类别特征,以及通过归一化/标准化处理连续特征,我们能够为模型提供一份“干净”、“公平”且易于学习的数值化输入,这是保证模型训练稳定、高效并最终取得良好效果的基石。

第二章:特征交叉的“手动”与“自动”时代 (The Era of Manual vs. Automatic Feature Crossing)

在第一章我们认识到,逻辑回归(LR)最大的瓶颈在于其无法自动学习特征交叉 (Feature Crossing)。为了让模型捕捉到现实世界中普遍存在的非线性关系,工程师们开始了从“手动”到“自动”探索特征交叉的漫长而关键的旅程。

2.1 “半自动”的探索:GBDT+LR 组合模型

在深度学习模型全面流行之前,业界找到了一个极其巧妙的“半自动”解决方案,就是由 Facebook 在2014年提出的 GBDT+LR 模型。它不是一个端到端的模型,而是一个两阶段的流程,聪明地利用了两种模型的各自优势。

  • 核心思想:让强大的 GBDT (梯度提升决策树) 模型充当“特征工程大师”,自动完成最困难的特征交叉和特征离散化工作;然后让简单高效的 LR 模型充当“分类专家”,对这些加工好的高质量特征进行学习和打分。
  • 工作流程
    1. 训练 GBDT:首先,在数据集上训练一个 GBDT 模型。GBDT由多棵决策树组成。
    2. 特征变换:对于每一个输入样本,让它穿过 GBDT 模型中已经训练好的每一棵树。样本在每棵树中都会从根节点走到一个特定的叶子节点。
      • 自动特征交叉:从根节点到叶子节点的这条路径,其本身就是一系列特征判断规则的组合(例如,IF age > 30 AND city = '北京'),这构成了一个高阶的、非线性的组合特征。
    3. One-Hot 编码:模型将样本在每一棵树上最终落到的那个叶子节点的编号 (index) 收集起来。然后,将这些叶子节点编号进行 One-Hot 编码,形成一个维度很高、但极其稀疏的新特征向量。
    4. 训练 LR:最后,将这个由 GBDT 生成的、包含了丰富交叉信息的新特征向量,作为输入来训练一个 LR 模型,由它做出最终的 CTR 预估。
  • 总结:GBDT+LR 是一个里程碑式的组合模型。它 brilliantly地利用了 GBDT 这种树模型的结构特性,来自动化地完成特征交叉这个曾经极度依赖人工经验的脏活累活。它虽然不是一个端到端的优雅模型,但其思想为后续的自动化建模探索铺平了道路,是“半自动”时代最耀眼的明星。

2.2 “自动交叉”的基石:因子分解机 (FM) 的原理与突破

如果说 GBDT+LR 是用工程组合的方式解决了问题,那么因子分解机 (Factorization Machine, FM) 则是从模型结构层面,为“自动特征交叉”提供了一个优雅、高效且影响深远的数学方案。

  • 核心动机:FM 的设计直指传统模型在处理数据稀疏性 (Data Sparsity) 时的最大痛点。在推荐场景中,绝大多数的 (用户, 物品) 对在训练数据中从未出现过。对于一个从未见过的特征组合 (x_i, x_j),模型是无法学习出其交叉权重 w_ij 的。
  • FM 的突破性思想:因子分解 (Factorization)
    FM 不再直接学习每一个交叉项的独立权重 w_ij,而是做了一个巧妙的假设:这个交叉权重 w_ij 可以被“分解”为两个低维隐向量 (Latent Vector)内积 (Dot Product)

image.png

这里,模型为每一个原始特征 i,都学习一个低维(例如,维度为 k=16)的稠密向量 v_i。这个 v_i 就是我们现在所熟知的**“Embedding”**。

1. 起点:FM二阶项的暴力计算公式

我们从 FM 模型中负责特征交叉的二阶项的原始定义出发:

image.png

其中,n 是特征数量,vi是第 i 个特征的 k 维隐向量。

复杂度分析:这个公式的计算需要遍历所有不重复的特征对 (i,j),约有 2n(n−1) 对,复杂度为 O(n2)。对于每一对,都需要计算一次 k 维向量的内积,复杂度为 O(k)。因此,总的计算复杂度为 O(kn2)。对于百万级的特征量,这个计算量是无法接受的。

核心推导:从 O(kn2) 到 O(kn)

我们的目标是对上述公式进行化简。

第一步:展开内积

首先,我们将内积 ⟨vi,vj⟩ 展开为其定义形式,即对应元素乘积的和:

image.png

其中 vif是向量 vi的第 f 个元素。将此代入原公式,得到:

image.png

第二步:利用对称性,变换求和范围(关键步骤)

直接处理 ∑j=i+1n 这个求和上下限不固定的部分比较困难。我们观察所有 vif vjf 项构成的矩阵,可以发现以下关系:

image.png

由此,我们可以得到我们想要的求和部分:

image.png

我们将这个恒等式应用到我们的问题上。

第三步:交换求和顺序,提取公因式

让我们先只关注一个特定的维度 f。将公式中的 vifxi 看作上面恒等式中的 ai,我们可以得到:

image.png

现在,我们把对所有维度 f (从1到k) 的求和重新引入。将 ∑f=1~k应用到整个表达式中:

image.png

最后,我们将常数1/2提到最外面,就得到了最终的化简公式。经过上述推导,FM二阶项的计算可以表示为:

image.png

  • ŷ = w_0 + Σ(w_i * x_i) + ΣΣ(<v_i, v_j> * x_i * x_j)
  • 这个公式清晰地展示了 FM 的两大部分:
    1. 一阶部分 Σ(w_i * x_i):与 LR 完全一样,负责建模每个特征的独立线性效应。
    2. 二阶部分 ΣΣ(<v_i, v_j> * x_i * x_j):这是 FM 的核心创新,负责自动建模所有特征之间的两两交叉效应。
  • FM 如何解决稀疏问题?
    这正是因子分解的魔力所在。即使特征 i 和特征 j 在训练数据中从未同时出现过,模型也依然可以估算出它们的交叉强度。只要特征 i 与其他特征(如 a, b, c)有过共现,模型就能学出它的隐向量 v_i;同理也能学出 v_j。最终,对于未见过的组合 (i, j),模型可以通过计算它们各自学到的隐向量的内积 <v_i, v_j>泛化和预测其交叉强度。
  • 总结:FM 通过引入隐向量因子分解,从根本上解决了稀疏场景下的二阶特征交叉问题。它不仅能自动学习所有特征的两两组合,还能泛化到从未见过的组合上。这个“为每个特征学习一个低维稠密向量来表达其潜在特性”的思想,成为了后续所有深度学习推荐模型的基石。

复杂度分析

  1. 我们来看括号内的计算。对于每一个维度 f,我们需要先计算 ∑i=1nvifxi。这个求和需要遍历 n 个特征,其复杂度为 O(n)。(对于稀疏特征,只需遍历非零项,复杂度更低)。
  2. 这个计算需要对 f 从 1 到 k 循环 k 次。
  3. 在循环的每一步中,计算平方、减法等都是常数时间操作。

2.3 核心概念:理解“阶”的含义(一阶与二阶)

在特征交叉的讨论中,“阶” (Order) 是一个核心术语,它精确地定义了特征之间交互的复杂度。我们可以将排序模型的预测公式类比为一个大的多项式方程,其中的变量就是模型的输入特征 xi。

  • 一阶 (First-Order)
    • 数学形式: wixi
    • 定义: 一个特征项中,只包含一个独立的原始特征变量。
    • 意义: 建模单个特征的独立、线性效应。它反映了该特征本身对最终结果的贡献大小,而不考虑它与其他特征的任何组合。例如,在预测商品购买概率时,价格 xprice 越高,购买概率可能越低,一阶项 wpricexprice 就负责捕捉这种直接的、线性的关系。逻辑回归以及FM的线性部分,都是由一阶项构成的。
  • 二阶 (Second-Order)
    • 数学形式: wij xi xj
    • 定义: 一个特征项中,包含两个独立的原始特征变量的乘积。
    • 意义: 建模两个特征之间的交互效应 (Interaction Effect)交叉效应 (Crossing Effect)。它捕捉的是当两个特征同时出现时,所产生的 1+1 ≠ 2 的特殊效果。例如,特征 user_gender=女性 (xi) 和特征 item_category=美妆 (xj),它们各自的一阶效应可能并不突出,但当它们同时出现时(即 xixj=1),会产生一个非常强烈的正向购买信号。这个强烈的信号就是由二阶项捕捉的。FM模型的核心创新,就是高效地对所有特征进行二阶交叉建模。

2.4 核心概念:Embedding —— 将万物向量化

如果说特征交叉是排序模型的核心“战术”,那么 Embedding 则是驱动这一切的、最核心的“技术引擎”。它是连接现实世界中离散符号(如ID)与神经网络数学世界的桥梁。

1. 为什么需要 Embedding?—— One-Hot编码的局限

我们之前提到,处理 user_id, item_id 这类类别特征的标准方法是独热编码 (One-Hot Encoding)。这种方法虽然解决了类别间无序性的问题,但它有两个致命缺陷:

  • 维度灾难与稀疏性:当类别数量巨大时(如上亿的物品ID),独热编码会产生一个维度高达上亿的、并且只有一个位置是1的极其稀疏的向量。这在计算和存储上都是巨大的挑战。
  • 无法表达语义相似性:更重要的是,任意两个不同类别的独热向量都是正交的,它们的内积为0。这意味着模型无法从向量层面得知 iPhone 17iPhone 17 Pro 是相似的,也无法知道 iPhone 17牛肉干 是不相似的。这严重限制了模型的泛化能力。

2. Embedding 的解决方案:从稀疏到稠密

Embedding 技术通过一个“查询表 (Lookup Table)”的思路,将高维稀疏的独热向量,映射成一个低维稠密的浮点数向量。

  • 定义:一个 Embedding 是一个可学习的低维的稠密的向量表示。
  • 工作原理
    1. 我们可以想象有一个巨大的查询矩阵,我们称之为 Embedding 矩阵。这个矩阵的行数等于该特征的词汇表大小(如总物品数),列数等于我们设定的 Embedding 维度 k(如 k=64)。
    2. 每一个物品ID,都对应这个矩阵中的一行。这一行就是一个 k 维的稠密向量。
    3. 在模型训练开始时,这个矩阵的数值是随机初始化的。在训练过程中,模型通过反向传播算法,不断地学习和调整矩阵中的数值。

3. Embedding 的核心价值

  • 降维与信息压缩:将千万甚至亿级别的稀疏维度,压缩到几十或几百维的稠密向量中,极大地提升了计算和存储效率。
  • 捕捉语义相似性(最关键):在训练过程中,那些经常被相似用户群体互动、或者本身属性相似的物品,它们的 Embedding 向量在向量空间中的位置会变得越来越接近。最终,“iPhone 17”和“iPhone 17 Pro”的向量会很相似,而它们与“牛肉干”的向量会相距很远。Embedding 成功地将行为和内容上的相似性,转化为了空间几何上的相近性
  • 赋能泛化:正是因为捕捉到了语义相似性,模型才能实现泛化。模型从“iPhone 17”上学到的知识(比如购买它的用户画像),可以很自然地迁移应用到“iPhone 17 Pro”上,因为它俩的向量表示很接近。这是独热编码完全无法做到的。

2.5 核心概念:防止过拟合的利器 —— 正则化 (L1 vs L2)

在模型训练中,我们经常会遇到一个棘手的问题,叫做过拟合 (Overfitting)

  • 什么是过拟合?
    简单来说,就是模型“太努力”了,它在训练数据上表现得近乎完美,但对于从未见过的新数据(测试数据),表现却一塌糊涂。这就像一个只会“死记硬背”的学生,他能完美回答所有练习册上的原题,但一到真正的考试,遇到新题型就完全不会了。
  • 为什么会过拟合?
    通常是因为模型过于复杂,而训练数据又不足以支撑这种复杂性。模型不仅学习到了数据中普适的“规律”,还把训练数据特有的“噪声”和“偶然性”也当作规律记了下来。这在模型参数上的体现,往往是某些特征的权重(wi)变得异常巨大

正则化 (Regularization) 就是一类专门用来对抗过拟合、提升模型泛化能力的技术。其核心思想是在模型的原始损失函数(如对数损失)的基础上,增加一个惩罚项 (Penalty Term),以此来“惩罚”或“约束”模型的权重,不让它们变得过大。

*新的损失函数=原始损失函数+惩罚项*

模型在优化时,就必须在“降低原始损失(拟合数据)”和“降低惩罚项(保持权重简单)”之间做出权衡。最常见的两种正则化方法就是 L1 和 L2 正则化。

1. L1 正则化 (Lasso Regression)

  • 惩罚项公式:L1 正则化的惩罚项是所有模型权重 wi 的绝对值之和,再乘以一个超参数 λ。

    image.png

    这里的 λ 控制着正则化的强度,λ 越大,惩罚越重。

  • 核心效果:稀疏性 (Sparsity)
    L1 正则化最显著的特点是它能够产生稀疏解,也就是说,它会倾向于将许多不那么重要的特征的权重直接置为精准的 0

  • 为什么能产生稀疏解?
    从优化的角度看,L1 惩罚项的“菱形”约束边界使得损失函数在优化时,最优解更容易出现在坐标轴的顶点上,而顶点处恰好意味着某些特征的权重为0。

  • 主要作用:由于 L1 正则化能将权重归零,它也常被用作一种自动的特征选择 (Feature Selection) 方法。在拥有海量特征,但怀疑其中很多特征是无关紧要的场景下,L1 正则化非常有用。

2. L2 正则化 (Ridge Regression)

  • 惩罚项公式:L2 正则化的惩罚项是所有模型权重 wi 的平方和,再乘以超参数 λ。

    image.png

  • 核心效果:权重衰减 (Weight Decay)
    L2 正则化最显著的特点是它会使得模型的权重整体上都变得比较小,趋近于0,但很难精确等于0

  • 为什么不会归零?
    L2 惩罚项的“圆形”约束边界比较平滑,最优解很难恰好落在坐标轴上。从梯度上看,L2 惩罚项的梯度与权重大小成正比,当权重越接近0时,它产生的惩罚梯度也越小,因此很难将权重“推到”绝对的0点。

  • 主要作用:L2 正则化是应用最广泛的正则化方法。它通过惩罚较大的权重,使得模型的决策不再过分依赖于少数几个特征,而是让所有特征都贡献一点力量,从而使得模型更加平滑鲁棒,拥有更好的泛化能力。在深度学习中,它几乎是默认的正则化选项。

总结对比

对比维度 L1 正则化 (Lasso) L2 正则化 (Ridge)
惩罚公式 λsum(w_i) λsum(w_i^2)
对权重的影响 倾向于将部分权重精确地置为 0 倾向于让所有权重都变得很小,趋近于 0
核心特性 稀疏性 (Sparsity) 权重衰减 (Weight Decay)
主要应用场景 特征选择,创造稀疏模型 通用的过拟合防治,提升模型泛化能力
几何约束 菱形或更高维度的多面体 圆形或更高维度的超球面

第三章:深度学习排序模型的“三驾马车” (The “Big Three” of Deep Ranking Models)

3.1 Wide & Deep: “记忆”与“泛化”的首次结合

由 Google 在2016年提出的 Wide & Deep 模型,是深度学习在推荐系统领域应用的开创性工作。它并未盲目地用一个“大而全”的深度网络去解决所有问题,而是深刻地洞察到推荐系统需要同时具备两种看似矛盾的能力:记忆(Memorization)和泛化(Generalization)

  • 记忆能力 (Memorization)
    • 定义:指模型学习并利用历史数据中频繁共现的、非常具体和直接的规则的能力。它善于“记住”那些显而易见的、强相关的模式。
    • 例子:模型能够牢牢记住“用户下载过A应用,又看到了A应用的辅助工具B,那么该用户点击B的概率极高”这样的强关联规则。
    • 实现:线性模型(如逻辑回归)是实现“记忆”的绝佳工具,因为它能为每一个具体的特征组合学习一个独立的权重。
  • 泛化能力 (Generalization)
    • 定义:指模型探索和发现数据中稀疏的、从未见过的、更“抽象”的模式的能力。它善于“泛化”知识,从而提高推荐的多样性和惊喜度。
    • 例子:模型通过学习大量的用户行为,可能会发现“喜欢看科幻电影的用户”和“喜欢购买硬核科技产品的用户”在底层兴趣上存在关联,从而为一个科幻迷推荐一款他从未见过的新款无人机。
    • 实现:深度神经网络(DNN)通过将高维稀疏特征映射到低维稠密的 Embedding 向量中,非常擅长发现这种潜在的、语义层面的关联。

Wide & Deep 的核心架构

为了将这两种能力有机地结合起来,Wide & Deep 设计了一种优雅的并行结构,由 WideDeep 两个部分组成,并进行联合训练 (Joint Training)

  1. Wide 部分 (负责记忆)
    • 结构:一个简单的广义线性模型,等价于一个逻辑回归。
    • 输入人工设计的、高维稀疏的交叉特征。这是 Wide 部分的关键,其效果高度依赖算法工程师的经验来手动创造出有意义的特征组合,例如 AND(gender='female', item_category='makeup')
  2. Deep 部分 (负责泛化)
    • 结构:一个标准的前馈神经网络 (DNN/MLP)。
    • 输入:原始的连续特征,以及被转换成低维稠密 Embedding 向量的类别特征(如 user_id, item_id)。
  3. 输出与联合训练
    • 模型的最终输出由 Wide 部分的输出与 Deep 部分的输出相加,然后共同经过一个 Sigmoid 函数得到。其简化后的公式可以理解为:

      image.png

    • 整个模型是端到端 (End-to-End) 训练的。最终的损失梯度会同时反向传播到 Wide 和 Deep 两个部分,并同时更新两边的参数。这比 GBDT+LR 的两阶段训练模式更为先进和统一。

损失函数:BCELOSS

image.png

  • N 是批次大小 (batch size)。
  • yi 是第 i 个样本的真实标签(点击为1,未点击为0)。
  • y^i 是模型对第 i 个样本最终预测的点击概率。

y_hat = sigmoid(z_deep+z_DNN+b), z_wide=w_wide x_wide (LR的线性部分), z_deep=DNN(x_deep), x_deep是经过embedding的稠密向量。得到预测的y_hat后在BCE中和gt作比较。

打个比方
整个训练过程就像一个联合项目

  1. 项目交付 (前向传播):Wide团队和Deep团队各自完成自己的部分,最后将成果汇总,交付一个最终产品(预测值 y^)。
  2. 客户反馈 (计算损失):根据产品的好坏(与真实标签 y 的差距),得到一个总的项目评分(损失 L)。
  3. 责任分配 (反向传播):项目经理(反向传播算法)根据总评分,分析出两个团队各自的贡献和不足,并给出具体的改进意见(梯度)。
  4. 内部优化 (权重更新)
    • Wide团队的经理(FTRL优化器)拿到意见后,采用“末位淘汰”式的管理方法,将表现差的员工(权重)直接“开除”(置为0)。
    • Deep团队的经理(Adam优化器)拿到意见后,采用“个性化辅导”的管理方法,根据每个员工的历史表现,动态调整对他的培养力度(自适应学习率)。

3.2 DeepFM: FM与DNN的无缝集成

DeepFM (2017) 的诞生,旨在解决其两大“前辈”——Wide & DeepFNN——各自的核心缺陷,从而打造一个既不需要人工特征工程,又能端到端训练,同时高效学习所有阶特征交叉的强大模型。

1. DeepFM 的动机:站在巨人的肩膀上解决问题

为了理解 DeepFM 的精妙之处,我们必须先看清它要解决的问题:

  • Wide & Deep 的痛点:其 Wide 部分虽然能够很好地“记忆”低阶交叉特征,但这些交叉特征需要依赖算法工程师手动设计。这是一个巨大的瓶颈,费时费力且高度依赖经验,无法穷举所有有用的组合。
  • FNN 的痛点:FNN (Factorization-machine supported Neural Network) 尝试用预训练的 FM 模型来初始化 DNN 的 Embedding,以期引入低阶交叉信息。但它的训练是两阶段的、非端到端的,这意味着 FM 学到的 Embedding 无法在 DNN 的训练中得到微调。同时,低阶特征信息在送入深层网络后,很容易被复杂的非线性变换所“稀释”,导致学习效率不高。

DeepFM 的核心目标:设计一个端到端的统一模型,它既能像 FM 一样自动学习低阶特征交叉,又能像 DNN 一样自动学习高阶特征交叉,并且完全不需要任何人工特征工程

2. DeepFM 的核心架构:“共享”与“并行”的艺术

DeepFM 的结构设计堪称典范,它由并行的 FM 组件DNN 组件组成,而这两大组件的“无缝集成”,依赖于一个核心设计——共享 Embedding 层

DeepFM 简化架构图

a) 共享的基石:唯一的 Embedding 层
这是 DeepFM 相对于 FNN 最关键的改进。模型中只有一个全局的 Embedding 矩阵。所有输入的稀疏类别特征(如 user_id, item_id)都会被映射到这个共享的 Embedding 空间中,得到各自的低维稠密向量。

这个共享的 Embedding 层,是连接 FM 和 DNN 两大组件的唯一纽带

b) FM 组件:低阶特征交叉的“自动”专家
这个部分的作用等同于 Wide & Deep 中的 “Wide” 部分,但它实现了完全的自动化。它直接在共享的 Embedding 向量上进行运算,同时负责两部分计算:

  • 一阶特征 (1st-order Interactions):对所有原始特征的线性加权求和,与逻辑回归完全相同。

image.png

二阶特征 (2nd-order Interactions):对每一对特征的 Embedding 向量进行内积 (Dot Product) 运算,以此来建模所有特征的两两交叉。

image.png

这里的v_i 和v_j 正是从共享 Embedding 层中查询得到的向量。

c) DNN 组件:高阶特征交叉的“黑盒”大师
这个部分负责探索那些更复杂、更抽象的高阶非线性关系。

  • 输入:将所有稀疏特征从共享 Embedding 层中查到的 Embedding 向量,与原始的稠密特征(如有)进行拼接 (Concatenate),形成一个长长的、稠密的向量。
  • 结构:一个标准的多层感知机 (MLP),包含若干个全连接层和非线性激活函数(如 ReLU)。

image.png

  • 输出:经过多层变换后,最终输出一个代表了所有高阶交叉信息的 Logit。

d) 最终的“无缝”集成

DeepFM 的集成方式极其简单和高效:将 FM 组件的输出(包含一阶和二阶)和 DNN 组件的输出

直接相加,然后将总和送入一个 Sigmoid 函数,得到最终的 CTR 预测值。

image.png

这种简单的相加操作,意味着两个组件在以一种并行、互补的方式工作,共同对最终的预测结果做出贡献。

3. DeepFM 的突破性优势

  • 真正的端到端学习:得益于共享 Embedding,梯度可以从最终的损失函数,无阻碍地同时反向传播到 FM 和 DNN 两个部分,并最终共同更新同一份 Embedding 参数。这意味着 Embedding 的学习同时受到了来自“低阶交叉任务”和“高阶交叉任务”的双重指导,使其表示能力更强、学习更充分。
  • 完全无需人工特征工程:FM 组件完美地替代了 Wide & Deep 中需要手动设计的 Wide 部分,实现了所有低阶交叉的自动化。
  • 兼具效率与性能:模型中不包含任何复杂的特殊结构,FM 部分有线性时间复杂度的解法,DNN 部分也是标准的 MLP,整个模型的训练和预测效率都非常高,非常适合工业界大规模部署。

总结:
DeepFM 之所以是“重中之重”,因为它用最简洁、最优雅的工程设计,完美地解决了前代模型的关键痛点。它通过“共享 Embedding + 并行结构”这一核心思想,将 FM 对低阶特征交叉的精准刻画能力,与 DNN 对高阶特征交叉的强大泛化能力无缝地结合在了一个可以端到端训练的统一框架下,并且完全实现了自动化。这使其成为了后续非序列深度学习排序模型的一个黄金标准和核心范式

3.3 DCN & xDeepFM: 对“显式特征交叉”的极致探索

1. 动机:打开 DNN 的“黑箱”

DeepFM 的 DNN 部分虽然强大,但它学习高阶特征交叉的过程是**“隐式”的 (Implicit)**。也就是说,特征交叉是通过多层复杂的、不可控的非线性变换自动发生的,我们很难知道模型具体学习到了哪些阶数的、哪些有效的交叉组合。这种“黑箱”式的学习可能有以下缺点:

  • 效率不高:可能需要大量的数据和参数才能学习到一些相对简单的交叉关系。
  • 不可控:我们无法控制模型学习交叉的阶数。

因此,一个新的研究方向应运而生:我们能否设计一种全新的网络结构,它既能自动学习高阶交叉,又能让这个过程变得显式 (Explicit)高效可控?DCN 和 xDeepFM 就是这个方向上最重要的两个探索者。


2. DCN (Deep & Cross Network, 2017): 显式交叉的开创者

DCN 的架构直接脱胎于 Wide & Deep,它保留了并行的 Deep 部分,但用一个创新设计的 Cross Network 替换了需要人工特征工程的 Wide 部分。

  • 核心组件:Cross Network

    • 目标:以一种高效、可控的方式,让特征交叉的阶数随着网络层数的增加而自动增加。
    • 核心公式:Cross Network 的每一层都遵循一个独特的更新规则:

    image.png

我们来拆解这个公式:

  • xl 是第 l 层的输出向量。
  • x0 是整个网络最开始的原始输入向量(通常是所有特征 Embedding 的拼接)。
  • x0xlTwl 是最关键的交叉操作。它将上一层的输出 xl 与原始输入 x0 进行了一次显式的交叉,并由一个可学习的权重向量 wl 来控制交叉的模式。
  • +xl 是一个残差连接 (Residual Connection)。这是一个点睛之笔,它保证了在学习更高阶交叉的同时,所有在前面层已经学到的低阶交叉信息都能被完整地保留下来,极大地稳定了训练过程。

工作原理

  • 第1层:x0 与自身进行交叉,产出所有特征的二阶交叉信息。
  • 第2层:x0 与包含了二阶信息的 x1 进行交叉,产出三阶交叉信息。
  • 以此类推,一个深度为 L 的 Cross Network 能够显式地建模所有从一阶到 L+1 阶的特征交叉。

DCN 的局限
DCN 的交叉是所谓的 bit-wise (比特级/元素级)。交叉项 x_l^T w_l 的结果是一个标量(单个数值),这个标量再去乘以整个原始输入向量 x0。这种方式虽然实现了交叉,但表达能力有限,不够灵活。

3. xDeepFM (eXtreme DeepFM, 2018): 从 bit-wise 到 vector-wise 的进化

xDeepFM 在 DCN 的思想上更进一步,它认为特征交叉应该发生在更有意义的向量级别 (vector-wise),而不是比特级别。为此,它设计了一个全新的核心组件——CIN (Compressed Interaction Network)

  • 核心组件:CIN (压缩交互网络)
    • 目标:在 Embedding 向量的粒度上,显式地、逐层地构建高阶特征交叉。
    • 工作原理 (概念)
      1. 输入:CIN 的输入不再是一个拍平的长向量,而是一个矩阵 X0,其每一行都是一个特征的 Embedding 向量。
      2. 逐层交叉:CIN 的第 k 层,会计算第 k−1 层的输出矩阵 Xk−1 与原始输入矩阵 X0 之间,每一对 Embedding 向量哈达玛积 (Element-wise Product, ⊙)。这就在向量层面生成了更高一阶的交叉特征。
      3. 压缩:由于上述操作会产生巨量的交叉向量,CIN 会通过类似卷积的操作(使用一组可学习的滤波器)对这些交叉向量进行加权求和,将其“压缩”成一个更紧凑的矩阵 Xk,作为下一层的输入。
    • 最终输出:xDeepFM 的完整架构通常包含三部分:传统的线性部分(负责一阶)、CIN 部分(负责显式的、vector-wise 的高阶交叉)和传统的 DNN 部分(负责隐式的、bit-wise 的高阶交叉),将三部分的输出融合后进行最终预测。

总结与对比

模型 高阶交叉方式 显式/隐式 交叉粒度 核心思想
DeepFM 标准 DNN (MLP) 隐式 Bit-wise 通过多层非线性变换“黑箱”学习高阶关系。
DCN Cross Network 显式 Bit-wise 通过独特的残差交叉结构,逐层、可控地增加交叉阶数。
xDeepFM CIN (压缩交互网络) 显式 Vector-wise 在更有意义的 Embedding 向量粒度上,进行显式交叉。

3.4 核心概念:共享 Embedding (Shared Embedding) 的原理与作用

1. 原理:一份输入,多路更新

共享 Embedding 指的是,模型中不同的部分(例如 DeepFM 中的 FM 组件和 DNN 组件)在处理同一个类别特征时,会查询和使用同一个、全局唯一的 Embedding 矩阵

  • 前向传播:当一个类别特征(如 item_id=123)输入时,模型从共享的 Embedding 矩阵中查出其对应的向量 v123。接着,这个向量的副本会同时被送往 FM 部分和 DNN 部分,参与各自的计算。

  • 反向传播(核心):在计算完最终的损失后,梯度会从损失函数反向传播。FM 部分和 DNN 部分会各自计算出它们对向量 v123 的梯度贡献,我们称之为 ∇FM 和 ∇DNN。最终,作用于共享 Embedding 矩阵中那个唯一的 v123 向量的更新梯度,是所有部分梯度贡献的总和

    ∇total=∇FM+∇DNN

    这意味着,Embedding 向量的学习同时受到了“低阶交叉任务(来自FM)”和“高阶交叉任务(来自DNN)”的双重指导。

2. 作用:为何共享如此强大?

  • 参数高效:这是最直接的优势。模型只需要维护一份 Embedding 矩阵,而不是每个组件都维护一份,极大地减少了模型的总参数量,节省了内存,并加快了训练速度。
  • 学习更丰富的表示(最重要的优势):这是共享 Embedding 的精髓所在。由于 Embedding 的更新同时接收来自不同模型组件的信号,它被迫学习一种能够同时满足多种需求的表示。FM 部分会“教”它学习显式的、低阶的共现关系;而 DNN 部分则会“教”它学习抽象的、高阶的非线性关系。最终学到的 Embedding 表示会比单一任务学到的更丰富、更鲁棒。
  • 加速收敛与提升泛化:更丰富的梯度信号有助于 Embedding 更快地学习到有意义的表示。同时,对于长尾的、交互稀疏的特征,即使 DNN 很难有效学习,FM 部分简单的共现信号依然可以对其进行有效的更新,从而提升了模型的泛化能力。
  • 实现端到端训练:共享 Embedding 是将多个独立模型组件“粘合”在一起,实现真正端到端联合训练的关键纽带。

3.5 核心概念:激活函数的作用与演进 (ReLU, PReLU, Dice)

1. 激活函数的核心作用:引入非线性

激活函数是神经网络的“灵魂”所在。如果没有激活函数,一个无论多深的神经网络,本质上都只是一系列线性变换的叠加,其最终效果等价于一个简单的线性模型。激活函数的核心作用就是引入非线性,它对每一层线性变换后的结果进行“弯曲”或“折叠”,从而赋予了网络拟合任意复杂函数的能力。

2. 激活函数的演进之路

在排序模型中,激活函数的演进主要围绕着如何让训练更稳定、更高效展开。

  • ReLU (Rectified Linear Unit)

    • 公式f(x)=max(0,x)
    • 地位:现代神经网络的默认标准激活函数。它计算极其简单,并且在输入为正数时梯度恒为1,极大地缓解了深度网络中的“梯度消失”问题。
    • 缺陷:存在**“死亡ReLU问题” (Dying ReLU Problem)**。如果一个神经元的输入在训练中持续为负,那么它的输出和梯度将永远是0,导致该神经元无法再进行学习。
  • PReLU (Parametric ReLU)

    • 公式f(s)=max(αs,s),其中 α 是一个可学习的参数。
    • 改进:PReLU 是对 ReLU 的直接改进。它通过引入一个可学习的、微小的负半轴斜率 α,实现了“泄漏 (Leaky)”。当输入为负时,梯度不再是0而是 α,从而解决了“神经元死亡”的问题。因为它比固定的 Leaky ReLU 更灵活,所以通常效果更好。
  • Dice (Data Adaptive Activation Function)

    • 动机:PReLU 解决了神经元死亡问题,但它的状态切换点依然是固定在0。在数据分布剧烈变化的工业级场景中(即“内部协变量偏移”问题),一个固定的切换点并非最优。
    • 核心思想:让激活函数的行为能够自适应数据的分布

    image.png

    • 实现方式:Dice 可以被看作一个在 f(s)=sf(s)=αs 之间的“软开关”。这个开关的位置,不再是固定的0点,而是通过一个基于批归一化 (Batch Normalization) 思想的门控函数,动态地调整到了当前这批 (mini-batch) 数据的均值 E[s] 处,而不是ReLU和PReLU的0处

    image.png

    • 意义:Dice 通过让激活函数的“激活点”主动去追随数据的分布中心,极大地提升了模型在非平稳数据分布下的训练稳定性和效率。它是为大规模、动态变化的推荐场景量身定制的、更“智能”的激活函数。

第四章:用户行为序列建模时代 (The Era of User Behavior Sequence Modeling)

4.1 DIN (Deep Interest Network): 开启注意力机制的应用

在 DIN (2018) 诞生之前,深度学习排序模型(如 Wide & Deep, DeepFM)在处理用户历史行为序列时,普遍采用一种简单粗暴的方式:简单池化 (Pooling)

1. DIN 的动机:挑战“兴趣大杂烩”

  • 当时的主流做法:将用户历史上交互过的所有物品(比如点击过的50个商品)的 Embedding 向量取出来,然后通过一个池化操作(如 Average PoolingMax Pooling),将它们压缩成一个固定长度的向量,以此作为代表该用户“兴趣”的唯一输入。
  • 这种做法的致命缺陷:它将用户丰富、多样、且在不同场景下关注点不同的兴趣,粗暴地“平均”成了一个大杂烩。
  • 一个经典的例子:一位年轻的母亲,她的购物历史里既有大量的“连衣裙”、“高跟鞋”、“手提包”,也有“婴儿纸尿裤”和“奶粉”。
    • 当系统要向她推荐一款新的**“手提包”时,一个经过平均池化的兴趣向量,会因为包含了大量的母婴用品信息而变得“面目模糊”。“母婴”兴趣的信号会严重稀释和干扰**她此刻对“时尚”的兴趣表达。
  • DIN 的核心洞察:用户的兴趣表示,不应该是一个一成不变的静态向量,而应该是动态的、自适应的。它应该根据当前要预测的候选商品(Target Item)的不同而变化

2. DIN 的核心架构:目标感知的注意力机制

为了实现上述目标,DIN 首次将注意力机制 (Attention Mechanism) 引入了 CTR 预估领域,设计了一套全新的用户兴趣表示方法。

a) 激活单元 (Activation Unit) - 注意力网络
DIN 的核心是一个小型的神经网络,即“激活单元”,它负责计算每一个历史行为当前候选商品之间的“相关性得分”,也就是注意力权重

  • 输入:对于用户历史中的第 i 个商品,激活单元的输入包括:
    1. 历史商品 i 的 Embedding 向量 ei。
    2. 候选商品(广告) a 的 Embedding 向量 ea。
    3. 两者的交互特征:为了让模型更好地学习它们的关联性,通常还会把它们的差值 (ea−ei)元素积 (ea⊙ei) 也作为输入。
  • 结构:将上述所有向量拼接起来,送入一个浅层的 MLP (多层感知机)。
  • 输出:MLP 最终输出一个标量(单个数值)wi,这个值就代表了历史行为 i 在当前候选商品 a “在场”的情况下的注意力得分。

b) 加权求和:构建动态兴趣向量
在为所有 N 个历史行为都计算出对应的注意力得分 w1,w2,…,wN 之后,模型通过加权求和的方式,来构建最终的用户兴趣向量 vU:

image.png

这个最终的兴趣向量 vU 是动态的。当候选商品变化时,注意力得分会重新计算,vU 也会随之改变,从而精准地反映出用户在此情此景下的特定兴趣。

c) 关键创新:摒弃 Softmax
传统的注意力机制通常会在最后使用 Softmax 函数将所有权重归一化,使其和为1。DIN 创新地摒弃了 Softmax

  • 原因:Softmax 会“拉平”兴趣的强度。一个在某个领域有100次点击的用户和一个只有10次点击的用户,他们的兴趣强度是截然不同的。Softmax 会将这种绝对强度的信息抹去,只保留相对大小。
  • 好处:不使用 Softmax,直接使用注意力得分进行加权,可以保留用户兴趣的绝对强度。如果用户是某领域的狂热粉丝,其加权后的兴趣向量模长就会更大,这本身就是一个非常强的信号,可以被后续的 DNN 有效捕捉。

3. DIN 的其他重要贡献

除了注意力机制,DIN 论文还贡献了两个非常实用的工程技术,以保证模型在工业级海量数据下的训练效果和效率:

  • Dice 激活函数:一种数据自适应的激活函数,能够根据每个 mini-batch 的数据分布动态调整其激活点,以应对工业数据分布剧烈变化的挑战,使训练更稳定。
  • 小批量感知正则化 (Mini-batch Aware Regularization):一种针对海量稀疏特征(如 item_id)的正则化优化方法。它只在每个批次中,对当次出现的特征的 Embedding 进行正则化计算,极大地降低了计算开销。

总结:
DIN 是深度学习推荐系统发展史上的一个分水岭。它通过引入目标感知的注意力机制,将用户兴趣的建模方式从“静态的、无差别的兴趣平均”,带入了**“动态的、上下文相关的兴趣聚焦”的新时代。DIN 不仅是一个具体的模型,它所开创的“根据目标物品来动态计算用户兴趣”这一范式**,被后续几乎所有的序列推荐模型(如 DIEN, SIM)所继承和发展,影响至今。

4.2 DIEN (Deep Interest Evolution Network): 捕捉兴趣的“进化”轨迹

1. 动机:从“兴趣是什么”到“兴趣将去向何方”

  • DIN 的成就:DIN brilliantly地回答了这个问题:“考虑到用户要看的是这个商品,他过去的哪些兴趣是相关的?” 它捕捉了兴趣的多样性
  • DIN 的局限:DIN 将用户的历史行为视为一个无序的集合,完全忽略了时间顺序。它无法区分一个兴趣是正在快速增长,还是早已衰退。例如,一个用户上周买了相机、昨天买了镜头,和一个用户一年前买了相机、此后再无动作,DIN 对这两种情况的理解是相似的。但前者明显表现出对“摄影”这个兴趣的演进和增强
  • DIEN 的目标:DIEN 的核心目标,就是要显式地对用户兴趣的演进轨迹进行建模。它不仅要捕捉兴趣的相关性,更要捕捉兴趣的动态变化过程,从而预测兴趣的“最终状态”,用这个“最终状态”来进行更精准的推荐。

2. DIEN 的核心架构:两阶段 RNN

为了对“进化”这一时序过程进行建模,DIEN 创新地设计了一个两阶段的循环神经网络 (RNN) 架构。

第一阶段:兴趣提取层 (Interest Extractor Layer)

  • 目标:从用户原始的行为序列(一串物品ID)中,学习并提取出抽象的、潜在的“兴趣状态”序列。
  • 实现:使用一个 GRU (Gated Recurrent Unit) 网络。
    • 将用户的历史行为 Embedding 按照时间顺序,依次输入到 GRU 中。
    • GRU 在每个时间步 t 都会输出一个隐藏状态 h_t。这个 h_t 融合了 t 时刻及之前所有的行为信息,可以被看作是用户在该时刻的“潜在兴趣状态”向量。

第二阶段:兴趣进化层 (Interest Evolving Layer) - [DIEN 的核心创新]

  • 目标:在第一阶段生成的“兴趣状态”序列 h_1, h_2, ..., h_T 的基础上,根据当前候选商品(Target Item),抽取出最相关的一条兴趣进化链,并模拟其演进过程。
  • 关键设计:AUGRU (GRU with Attention Update Gate)
    DIEN 的作者认为,并非所有的兴趣进化都与当前推荐任务相关。因此,他们设计了一种由注意力机制引导的、全新的 GRU 单元——AUGRU。
    1. 计算注意力:首先,模型会计算候选商品的 Embedding e_a每一个历史兴趣状态 h_t 之间的相关性,得到一个注意力得分 a_t。这个得分衡量了历史上的某个兴趣状态与当前目标的关联程度。
    2. 改造更新门:GRU 有一个关键的“更新门” u_t,它决定了当前时刻的信息在多大程度上被用来更新 GRU 的记忆。AUGRU 对这个更新门做了巧妙的改造,将原始更新门与注意力得分相乘:u'_t = a_t * u_t
    3. 核心作用
      • 如果某个历史兴趣 h_t 与当前候选商品高度相关,其注意力得分 a_t 就很高,这会“放大”更新门的作用,使得这个兴趣状态在进化网络中产生更强的影响力
      • 反之,如果 h_t 与候选商品无关,其注意力得分 a_t 很低,这会“抑制”更新门,使得这条无关的兴趣信息在进化网络中被有效削弱
    4. 最终输出:AUGRU 网络的最终一个隐藏状态,就代表了这条“与目标相关的兴趣进化轨迹”的最终结果。这个向量被认为是用户兴趣的“进化终点”,并被用于最终的 CTR 预测。

3. 锦上添花:辅助损失 (Auxiliary Loss)

为了让第一阶段的 GRU 能够学习到更有意义的兴趣状态表示,DIEN 还引入了一个辅助损失函数

  • 动机:只靠最终的 CTR 预测任务来监督整个长序列的学习,梯度信号会非常稀疏和微弱。
  • 做法:在兴趣提取层,额外增加一个“用前一个行为预测后一个行为”的学习任务。即用 h_t 去预测真实的用户下一个行为 e_{t+1}
  • 好处:这个辅助任务为兴趣提取层的每一步都提供了直接的监督信号,迫使 GRU 学会如何从行为序列中提取出真正有预测性的“兴趣状态”。

总结:
DIEN 是对 DIN 的一次深刻升华。它成功地将推荐系统从对用户静态、多样兴趣的捕捉,推进到了对动态、时序兴趣的建模。其核心贡献可以概括为:

  1. 首次使用 RNN 结构来显式地捕捉用户行为的序列性
  2. 创新地设计了 AUGRU 单元,巧妙地将注意力机制RNN 的门控机制相结合,实现了对“与目标相关的兴趣进化”的精准模拟。
  3. 引入辅助损失,有效提升了底层序列表示的学习效果。

4.3 SIM (Search-based Interest Model): 攻克工业级“超长序列”难题

1. 动机:当序列长度成为瓶颈

  • 现实的挑战:一个活跃用户的历史行为记录,可以轻易达到数千、数万甚至更长。
  • 现有模型的困境
    • DIEN (RNN-based):RNN 的计算是串行的,序列越长,计算耗时越长。处理上万长度的序列,对于要求在几十毫秒内返回结果的在线推荐服务来说,是完全不可接受的。
    • Transformer-based:标准 Transformer 的自注意力机制,其计算复杂度是序列长度的平方,即 O(n^2)。这使得它在处理长序列时比 RNN 的情况更糟。
    • DIN (Attention-based):虽然 DIN 的注意力计算是并行的,但对上万个历史行为逐一计算与候选商品的注意力得分,依然是一笔巨大的计算开销。

SIM (Search-based Interest Model, 2020) 的提出,不是对模型结构进行小修小补,而是从根本上改变了处理超长序列的思想范式

2. SIM 的核心思想:从“一次性建模”到“两阶段检索”

SIM 的核心洞察是:我们不必,也不能在一次在线预测中,对用户的全部上万条历史记录进行复杂建模。对于一个特定的候选商品,用户的历史行为中,真正能提供决策信息的,往往只是其中一小部分最相关的行为。

因此,SIM 将用户兴趣建模的过程,巧妙地重构成了一个**“在用户历史中进行搜索”**的任务。它将推荐系统中经典的“召回-排序”两阶段漏斗思想,“微缩”并应用到了用户兴趣建模的内部。

3. SIM 的核心架构:GSU + ESU 两阶段搜索

第一阶段:通用兴趣检索 (General Search Unit, GSU) - “硬搜索”

  • 目标:从用户上万条的完整历史中,快速、低成本地“召回”出一个几百条的、高度相关的历史行为候选子集。
  • 实现方式
    1. 离线建索引:对于每个用户,系统会离线地将他的全部历史行为物品的 Embedding 向量,存入一个高效的近似最近邻(ANN)检索引擎(例如 Faiss)。这相当于为每个用户都建立了一个私有的、可被高速检索的“行为数据库”。
    2. 在线检索:当一次推荐请求到来时,模型会先构建一个查询向量 (Query Vector)。这个查询向量代表了用户当前的“大致兴趣方向”,通常由用户最近的少数几个行为(如最近点击的5个商品)的 Embedding 平均池化得到。
    3. 模型用这个查询向量,去用户的“行为数据库”(ANN索引)中进行一次极速的向量检索,找出与当前兴趣方向最相似的 Top-K(比如200)个历史行为。这个过程因为是硬性地筛选出一部分,所以被称为“硬搜索”。

第二阶段:精准兴趣检索 (Exact Search Unit, ESU) - “软搜索”

  • 目标:在 GSU 阶段筛选出的那 200 条相关历史中,根据当前候选商品(Target Item),进行更精细的兴趣匹配和建模。

  • 实现方式这一阶段的实现,几乎就是 DIN 的一个翻版!

    1. 输入:当前候选商品的 Embedding e_a,以及 GSU 筛选出的 200 个历史行为的 Embedding。
    2. 注意力计算:使用与 DIN 相同的目标感知注意力网络,计算 e_a 与这 200 个历史行为中每一个的相关性(注意力得分)。因为是计算连续的权重,所以被称为“软搜索”。
    3. 加权求和:将这 200 个历史行为的 Embedding,根据其注意力得分进行加权求和,得到最终的、动态的、与当前候选商品强相关的用户兴趣向量。

    image.png

总结:
SIM 是一个算法与工程完美结合的典范。它没有试图用一个单一的、复杂的模型去硬“啃”超长序列,而是创造性地提出了**“先捞后筛”**的两阶段兴趣建模范式。

  • GSU 负责从汪洋大海般的历史中,高效地“捞”出最可能相关的几百条数据。
  • ESU 则负责在这几百条数据中,用 DIN 的思想进行精细化的“筛选”和“整合”。

第五章:生成式与大语言模型的前沿探索 (The Frontier: Generative & LLM-based Models)

5.1 范式转移:从“判别式”到“生成式”推荐

到目前为止,我们讨论的所有模型,从 LR 到 DIEN,都属于判别式模型 (Discriminative Models)。而最新的研究浪潮,正推动着我们走向生成式模型 (Generative Models)

1. 判别式推荐 (我们一直在做的事)

  • 核心目标:学习一个条件概率 P(y|x)
  • 翻译成大白话:给定一个“输入” x(即一个(用户, 物品)对),模型需要“判别”出对应的“标签” y(即用户是否会点击)的概率。
  • 模型角色:像一个“裁判”或“打分器”。它的任务是,对于每一个候选物品,都给出一个“好”或“不好”的概率分数。它回答的问题是:“这个物品,给这个用户,匹配度有多高?”

2. 生成式推荐 (未来的方向)

  • 核心目标:学习输入数据 x 本身的联合概率分布 P(x)
  • 翻译成大白话:模型不再是去“判断”一个已有的组合,而是去学习用户行为序列本身是如何“生成”的。它试图理解用户行为的内在逻辑和模式。
  • 模型角色:像一个“故事续写者”或“语言模型”。它的任务是,在看到用户过去的一系列行为后,去“生成”或“预测”他下一步最有可能产生的行为。它回答的问题是:“根据这个用户的历史,他下一步会做什么?”

为什么会发生这种转变?
生成式范式借鉴了 GPT 等大语言模型的成功,它为推荐系统带来了几个潜在的巨大优势:

  1. 更全面的行为建模:它不再孤立地看待每一次推荐,而是将用户的整个行为序列视为一个连贯的整体来学习,能更好地捕捉用户的长期动态意图。
  2. 更高的灵活性:一个训练好的生成式模型,不仅能用于预测下一个物品(排序),还能用于生成整个会话(session)、生成推荐理由等更多元的任务。
  3. 与LLM的天然结合:将物品视为“词汇”,将用户行为视为“句子”,这使得推荐系统可以直接利用在海量文本上预训练好的、拥有强大语义理解能力的 Transformer 架构。

5.2 Kuaiformer (LLM4Rec): 借鉴LLM架构解决推荐三大挑战

Kuaiformer 是快手团队提出的一个典型的生成式推荐模型,它展示了如何在工业级的超大规模场景下,借鉴并改造 LLM 架构来解决推荐的核心难题。

面临的三大挑战:

  1. 超大候选集:推荐系统的物品“词汇表”是十亿甚至百亿级别,远超LLM的几十万词汇表,无法直接使用 Softmax
  2. 用户兴趣多样性:用户的兴趣是发散且多样的,需要模型能同时捕捉多个兴趣点。
  3. 超长用户序列:用户的历史行为序列可达上万,标准 Transformer 的 O(n^2) 复杂度无法承受。

Kuaiformer 的解决方案:

1. 应对超长序列 → 分段建模 (Sequence Segmentation)
为了破解 O(n^2) 的魔咒,Kuaiformer 采用“分而治之”的策略:

  • 将用户的超长历史行为序列,按时间顺序切分成若干个段落 (Segment)
  • 对每个段落并行地使用一个 Bi-Transformer (双向Transformer) 进行内部信息编码,然后通过平均池化将每个段落压缩成一个代表性向量。
  • 最后将所有段落的代表性向量拼接起来,形成一个对原始长序列的浓缩摘要

2. 应对多重兴趣 → 查询式注意力 (Query-based Attention)
在得到浓缩的历史摘要后,模型通过一个 Causal Transformer 来提取用户的多个兴趣:

  • 模型引入 k 个可学习的查询向量 (Query Vector),并将它们与历史摘要一同输入到 Transformer 中。
  • 在 Transformer 内部,每个 Query 向量会通过自注意力机制,像“探针”一样去扫描和聚合历史摘要中与自己相关的部分。
  • 最终,k 个 Query 向量在 Transformer 输出层的位置上,就形成了代表用户 k 个不同兴趣中心的多兴趣向量 {u_1, u_2, ..., u_k}

3. 应对超大候选集 → 双塔预测 与 In-batch 训练

  • 预测方式:最终的预测是一个双塔问题。Kuaiformer 本身构成了复杂的 User Tower(输出 k 个兴趣向量),而物品侧则是一个简单的 Item Tower(输出物品 Embedding)。用户对一个物品的最终得分为:

    image.png

    即物品 Embedding 与用户所有兴趣向量相似度的最大值

  • 训练方式:由于无法对全量物品计算 Softmax,模型采用 In-batch Softmax 的方式进行训练,即只在当前一个批次 (mini-batch) 内的样本中进行 Softmax 计算。

  • 偏差修正:为了解决 In-batch 采样带来的流行度偏差标签噪声问题,Kuaiformer 在训练时采用了我们之前讨论过的 LogQ修正标签平滑 等高级技巧,以保证训练的稳定和无偏。

5.3 核心概念:高级训练技巧 —— 偏差修正与标签平滑

当我们使用像 Kuaiformer 这样的大模型,并采用 In-batch Softmax 策略进行训练时,会遇到两个普遍存在且严重影响模型性能的问题:流行度偏差标签噪声。为了解决这两个问题,研究者们引入了两种极其重要的高级训练技巧。

1. 偏差修正:对抗“流行即原罪”的 LogQ 修正

  • 问题背景:In-batch Softmax 带来的流行度偏差

    • 在拥有亿级物品池的推荐系统中,我们无法在每次训练时对所有物品计算 Softmax。因此,我们采用 In-batch Softmax,即对于一个正样本,只把它和当前批次 (mini-batch) 内的其他样本作为负样本来计算损失。
    • 这样做的问题在于,一个 mini-batch 内的样本并非对全体物品的均匀随机采样热门物品因为本身与用户交互多,所以它们出现在任意一个 batch 中的概率天然就更高。
    • 后果:模型在训练时,看到的负样本大多是“热门选手”。为了在竞争中胜出,模型可能会学到一种错误的偏见:“热门的物品通常不是好的推荐”,从而系统性地压低对所有热门物品的预测分数。这与“热门物品之所以热门,是因为它们质量高、受欢迎”的常识相悖,会导致模型性能严重退化。这与我们在召回阶段讨论的 SSB (Sampling-Bias-Corrected) 问题根源完全相同。
  • 解决方案:LogQ 修正 (LogQ Correction)

    • 核心思想:在计算损失前,对每个物品的原始预测分数(logit)进行一次“纠偏”,以抵消其因流行度带来的采样概率不均。
    • 实现方式:将每个物品的原始分数 s_i 调整为 s'_i
      s'_i = s_i - log(Q_i)
      其中:
      • s_i 是模型对物品 i 输出的原始分数。
      • Q_i 是物品 i 被采样到 batch 中的概率,通常用它的全局流行度来近似。
    • 损失函数:使用修正后的分数 s'_i 来计算 In-batch Softmax 损失:

    image.png

    • 作用效果
      • 对于热门物品,其 Q_j 很大,log(Q_j) 也很大。从它的分数中减去一个大数,相当于降低了它作为负样本时的“惩罚”力度,给了它一个公平竞争的机会。
      • 对于冷门物品,其 Q_j 很小,log(Q_j) 是一个较大的负数。从分数中减去一个负数,等于增加了它的分数,给了它一个“补偿”,让它不至于被热门物品淹没。
    • 最终目的:通过 LogQ 修正,使得 In-batch Softmax 损失在数学上成为对全局 Softmax 损失的一个无偏估计,从而让模型学习到物品的真实匹配度,而非被流行度所误导。

2. 标签平滑:接受“不完美”的用户行为

  • 问题背景:过分自信与标签噪声
    • 标签非完美:用户的行为数据是有噪声的。一次点击(标签为1)不代表用户100%满意,可能只是“手滑”或“好奇”;一次未点击(标签为0)更不代表用户100%讨厌。
    • 模型过分自信 (Overconfidence):标准的交叉熵损失函数会驱使模型将对正样本的预测概率无限推向 1.0。为了达到这个“绝对正确”的目标,模型可能会学得过于极端,对训练数据中的噪声也进行了过度拟合,从而导致泛化能力下降
  • 解决方案:标签平滑 (Label Smoothing)
    • 核心思想:对模型“温柔”一点,不要强求它做出“非黑即白”的判断。我们主动地给标签增加一点“不确定性”。

    • 实现方式:我们不再使用 [0, 1] 这样的硬标签,而是使用“软标签”。

      • 选定一个很小的平滑值 ε(例如 0.1)。
      • 对于正样本,我们将其目标标签从 1.0 修改为 1.0 - ε(即 0.9)。
      • 对于负样本,我们不再要求其目标为 0,而是将剩余的概率 ε 平均分配给所有 K-1 个负样本,每个负样本的目标变为 ε / (K-1)
    • 损失函数:相应的,损失函数也从只惩罚正样本,变为同时考虑所有样本:

      image.png

      (注:这里的 pj 是对负样本的预测概率,为了简化,有时会写成 log(1−pj) 的形式,但核心思想是让模型不要把负样本的概率压到绝对的0)

    • 作用效果

      • 防止过分自信:由于目标不再是绝对的1,模型不会把正样本的logit无限推高,使其权重分布更合理。
      • 提升泛化能力:强迫模型为负样本也保留一点点概率,这鼓励了不同类别之间的Embedding在向量空间中形成一个更合理的、有间隔的分布,而不是把所有正样本都挤在一个点上。
      • 作为一种正则化:标签平滑是一种简单而高效的正则化技术,能有效防止模型过拟合,使训练过程更稳定。

第六章:工业界全景与总结 (The Industrial Landscape & Summary)

6.1 工业界的标准流程:多阶段排序漏斗(召回、粗排、精排)

现代大规模推荐系统面临着一个核心的工程矛盾:一方面,候选的物品池是海量的(通常是十亿甚至百亿级别);另一方面,对用户的每一次推荐请求,系统必须在极短的时间内(通常在 50-100毫秒)返回一个高质量的、个性化的排序列表。

在一个单一阶段内,用一个复杂的模型(如DeepFM)去处理十亿级的物品,是绝对不可能的。 这种矛盾催生了工业界标准的多阶段排序漏斗 (Multi-stage Ranking Funnel) 架构。

这个架构的核心思想是**“层层筛选,逐步聚焦”,通过多个阶段,不断地在计算成本排序精度**之间做出权衡,将海量的物品集一步步精炼成最终呈现给用户的几十个物品。

第一阶段:召回 (Recall)

  • 目标“大海捞针”。从全量的、百亿级的物料库中,快速、低成本地找出几千个用户可能感兴趣的候选物品。
  • 核心指标召回率 (Recall)。这一阶段的使命是“宁可错杀一千,不可放过一个”,要尽可能地保证用户未来真正会喜欢的物品,能够出现在这个候选池中。如果召回阶段就漏掉了,后续阶段再强大也无力回天。
  • 候选集规模:从 百亿级 筛选到 千级
  • 技术与模型:追求极致的速度。
    • 多路召回:最常见的策略,并行使用多种不同的简单召回方法,并将结果合并,以保证结果的多样性。例如:
      • 热门召回:返回全局热门的物品,作为基础流量保障。
      • 协同过滤:经典的 User-CF, Item-CF,找到相似用户喜欢的,或相似物品。
      • 向量检索召回:目前最主流的方法。利用双塔模型等提前计算好所有用户和物品的 Embedding 向量,将物品向量存入高效的近似最近邻(ANN)索引(如 Faiss)。在线上,根据用户的 Embedding 向量,进行一次极速的向量检索,找出最相似的 Top-K 物品。

第二阶段:粗排 (Pre-ranking / Coarse Ranking)

  • 目标“精挑细选”。对召回层送来的几千个候选物品,进行一次初步的、计算量适中的排序,淘汰掉其中大量“明显不靠谱”的物品,将候选集进一步压缩。
  • 核心指标:在极低延迟较高精度之间做权衡。它需要比精排快得多,但比召回准得多。
  • 候选集规模:从 千级 筛选到 百级
  • 技术与模型:使用相对简单的模型和少量核心特征。
    • 逻辑回归 (LR)浅层的 MLP
    • 简化的深度模型:比如一个“青春版”的 DeepFM,网络层数更少、宽度更窄,使用的特征也更少。
    • 知识蒸馏:这是保证粗排效果的关键技术。让复杂的**精排模型(老师)来指导简单的粗排模型(学生)**进行学习,让学生模型能够模仿老师模型的打分行为,从而保证两个阶段的排序偏好尽可能一致,避免错杀“潜力股”。

第三阶段:精排 (Fine-ranking)

  • 目标“精雕细琢”。对粗排层送来的几百个高质量候选物品,不计成本地使用最强大、最复杂的模型,进行最精准的个性化打分和排序。
  • 核心指标精准率 (Precision)。这一阶段的目标是追求排序结果的极致准确,尤其是列表顶部的准确性。
  • 候选集规模:从 百级 筛选到最终呈现给用户的 几十个
  • 技术与模型:所有我们之前详细讨论过的**“重武器”模型**都在这一层大展身手。
    • 特征交互模型DeepFM, DCN, xDeepFM 等。
    • 序列建模DIN, DIEN, SIM 等。
    • 多任务与多场景MMoE, CAN 等。
    • 前沿模型LLM-based 模型。
    • 在这一层,模型会使用上千维的、包含大量实时特征的、最全面的特征信息来进行预测。

6.2 当前工业界的主力模型:为何DeepFM架构是“万能骨架”?

6.3 技术演进路线图:从LR到LLM的回顾与展望