推荐算法Chapter3.1 多阶段级联架构(漏斗模型)


1.主要结构

整个工业界标准的搜索/推荐管道通常分为以下四个核心阶段:

Step1: 召回阶段 (Recall / Retrieval):

  • 任务:从 1 亿个商品(或视频、文档)中,快速捞出 1000 个用户可能感兴趣的候选物。
  • 模型:双塔模型 (Two-Tower) 及其它轻量级算法(如协同过滤、倒排索引)。
  • 理念:在这个阶段,速度和高覆盖率是第一位的。模型宁捞上来一些用户不那么喜欢的,也绝不能漏掉(把用户最喜欢的遗漏在 1 亿的底层库里)。

Step2: 粗排阶段 (Pre-Ranking):

  • 任务:把召回阶段捞上来的 1000 个候选物,进一步精简到 200 个。
  • 原因: 为什么需要粗排: 因为 1000 个物品直接送给后面极其庞大的精排模型,服务器算力依然撑不住。
  • 算法: 这里会使用比普通双塔稍微复杂一点,但又不像完全交叉那样沉重的模型。比如引入一些简单的特征交叉,或者使用浅层的神经网络。它的作用是一个承上启下的“缓冲带”。

Step3: 精排阶段 (Ranking):

  • 任务: 剩下的 200 个候选物进行极其极其精确的打分,并排定最终的座次(1 到 200 名)。
  • 模型: 交叉编码器 (Cross-Encoder)、深度交叉网络(DCN)、带注意力机制的序列模型(DIN、DIEN)以及深层 Transformer。
  • 特征选择:
    在这里,模型不仅会看商品和用户的向量,还会引入海量的实时上下文特征:
    • 用户刚刚点击了什么(短期兴趣序列)。
    • 用户当前所处的地理位置、时间、甚至手机电量。
    • 极其复杂的交叉特征(例如:“用户是20岁男性” 且 “当前时间是深夜” 且 “商品是烧烤外卖”)。
  • 在这个阶段,模型会进行极其深入的“自由恋爱”式互动,精确预估用户的点击率(CTR)、转化率(CVR)、甚至视频的完播率。

Step4: 重排/混排阶段 (Re-Ranking)

  • 任务: 把精排输出的 Top 10 或 Top 20 列表,做最后的业务逻辑干预,然后展现给用户。
  • 操作:
    • 打散去重(Diversity): 精排算出来最高分的 10 个视频可能全是“美女跳舞”。重排阶段会强行把它们打散,插几个“搞笑视频”或“新闻”,防止用户审美疲劳。
    • 商业化强插: 在第 3 个位置强行插入一条广告(这也是平台赚钱的核心)。
    • 提权与打压: 给新发布的商品/视频一些流量倾斜(冷启动保量),或者打压已经被用户点过“不感兴趣”的内容。

2.阶段一:召回阶段-双塔模型

1.模型结构

Part1:输入特征

在双塔模型中,左塔代表“用户(User/Query)”,右塔代表“物品(Item/Document)”。

1.左侧:用户塔(Query Tower)的输入

左塔需要知道“这个人是谁,他喜欢什么”。它的输入特征通常分为三类:

  • 画像特征(Profile): 比如用户的 ID、年龄、性别、注册城市等。

  • 上下文特征(Context): 比如当前的设备型号、时间是早晨还是深夜、网络是 5G 还是 WiFi。

  • 行为序列特征(Behavior Sequence: 用户过去 7 天点击过的商品 ID 列表、搜索过的关键词列表。这是刻画用户动态兴趣的灵魂。(极度重要

2. 右侧:物品塔(Item Tower)的输入

右塔需要知道“这个东西是什么,有什么卖点”。它的输入特征通常包括:

  • 物品固有属性: 商品 ID、类目(比如“数码-手机-配件”)、品牌、价格区间。

  • 内容特征: 提取出的文本 Tag、标题的 Embedding、甚至是商品主图经过 ResNet 提取出来的图像向量。

  • 统计特征: 这个商品过去 24 小时的全网点击率、销量等。

Part2:模型内部结构

怎么把这些五花八门的信息(文字、数字、ID)变成机器能懂的数学表达?这就是“塔”内部要做的事。不管左塔还是右塔,内部的结构几乎是镜像对称的,分为极其标准的三步:

第一层:输入与特征预处理层 (Input Layer)

由于工业界的数据五花八门,模型在最底层必须把这些数据分成两路处理:

  • 稠密特征 (Dense Features): 例如用户的年龄(25)、过去一周的活跃天数(5)、物品的价格(199.9)。
    • 处理方式: 绝对不能直接把原始数字丢进网络!必须做归一化 (Normalization) 或分桶 (Bucketing)。比如把价格用对数处理 $\log(1 + x)$,或者把年龄划分为“20-30岁”变成类别特征。
  • 稀疏特征 (Sparse Features): 这是大头。例如用户 ID、商品类目 ID、所在城市。这些特征通常是离散的文本或哈希值。
第二层:Embedding 查表层 (The Translator)

这一层是整个推荐系统中最占内存的地方(几百 GB 甚至上 TB 的参数全在这里)。

  • 操作: 针对稀疏特征,为其建立一个由神经网络联合训练的字典(Embedding Table)。通过查表(Lookup),将极其庞大的离散 ID 映射为低维稠密向量。
  • 示例: 城市:北京 $\rightarrow [0.12, -0.45, \dots, 0.89]$(比如 16 维)。
  • 本质: 这是一个单层且没有偏置的线性网络,相当于把 One-hot 向量乘以一个巨大的权重矩阵 $W$。
第三层:序列池化/聚合层 (Pooling/Sequence Layer)

这是用户塔(左塔)独有且极其重要的一层。用户的历史点击行为是一个长度不定的序列(比如看了 5 个商品,或者看了 50 个商品),但深度神经网络通常需要固定长度的输入。

  • 初级做法 (Mean/Sum Pooling): 把序列里所有商品的 Embedding 向量直接按位相加或求平均。这很简单,但会把用户的兴趣糊成一团。

  • 高级做法 (Target Attention): 引入经典的 DIN (Deep Interest Network) 机制。用当前正在评估的候选商品,去和用户历史看过的每一个商品算一次 Attention 权重。用户之前看过的与当前候选品越相似的东西,权重就越高。

第四层:拼接融合层 (Concatenation Layer)
  • 操作: 当稠密特征归一化完毕,各个稀疏特征变成了 Embedding,序列也压缩成了定长向量后,这一层就是极其暴力的“物理拼接”。

  • 结果: 将所有维度的向量首尾相连(torch.cat),形成一个超长的特征向量,通常被称为宽层表示 (Wide Representation)。此时它的维度可能是几百甚至上千维。

第五层:多层感知机与特征交叉层 (MLP & Feature Crossing)

这里是塔的“大脑”,负责让刚才拼接在一起的独立特征发生复杂的化学反应。

  • 标准操作: 经过 3 到 4 层的全连接网络(Fully Connected Layers)。数学表达为:
  • 工程细节: 为了防止过拟合和梯度问题,工业界通常会在每一层 MLP 之间穿插 Batch Normalization (BN) 和 Dropout。维度会像漏斗一样逐层递减,比如 $1024 \rightarrow 512 \rightarrow 256 \rightarrow 128$。
  • 前沿进阶: 纯粹的 MLP 对特征的显式交叉能力较弱。现在很多塔内部会替换成 DCN (Deep & Cross Network) 的 Cross Layer,或者加入 SENet 机制来对不同特征通道进行动态加权,以此代替枯燥的 MLP。

经过 MLP 后,我们得到了一个 128 维的输出向量 $v$。在把它送出塔顶去和另一个塔计算内积之前,有一步绝不能漏掉的操作——L2 归一化:

如果不做归一化,向量的“长度(模长)”和“方向”都会影响最终的内积得分。那些极其活跃的“土豪用户”或者极其热门的“爆款商品”,它们的特征在网络中累积后,会导致输出向量的模长变得极大。

这样算内积时,即使它们的匹配方向完全不对,仅仅因为模长巨大,得分也会被强行拉高,导致严重的热门马太效应。强行施加 L2 归一化,就是把所有的向量拉到同一个高维单位超球面上,强迫模型只用“方向(余弦夹角)”来衡量相似度,而彻底摒弃模长带来的干扰。

Part3.计算得分

在塔顶输出 $U$ 和 $V$ 之后,我们如何判断这个用户喜不喜欢这个商品?

极其简单,只需计算这两个 128 维向量的内积(Dot Product)或余弦相似度(Cosine Similarity):

这个 $Score$ 就是模型预测出的“匹配度”。分数越高,代表用户越可能点击这个商品。

损失函数:

$U$: 左塔输出的用户向量。$V^+$: 右塔输出的正样本向量。$V_i^-$: 右塔输出的负样本向量。$\tau$ (Temperature / 温度超参): 面试高频考点!这是一个常数(比如 0.1)。$\tau$ 越小,模型就会越“斤斤计较”,越关注那些最难区分的困难负样本;$\tau$ 越大,模型对待所有负样本的态度就越平滑。

负样本怎么来的
批内负采样(In-batch Negatives)

这是目前各大厂(比如 Google 的 YouTube 推荐、百度的搜索)在双塔训练中最爱用的神技,因为它极度节省算力

  • 操作: 在深度学习中,数据是一批一批(Batch)送进显卡的。假设一个 Batch 里有 256 个用户,每个人对应 1 个他们喜欢的正样本商品。这 256 个正样本商品,彼此互为其他 255 个用户的负样本!
  • 优势: 本来算 256 个用户的正样本,右塔需要算 256 次。如果给每个人再配 10 个随机负样本,右塔就要算 2560 次。而使用 In-batch 技巧,右塔依然只需要算 256 次,就白嫖了 $256 \times 255$ 对负样本!效率直接起飞。

俩用户喜欢的一样怎么办

这个叫 假阴性(False Negatives) 或者 批内碰撞(In-batch Collision)。

1.对角线与碰撞掩码 (Masking)

这是目前最优雅、最底层的解决方式。在计算整个 Batch 的 $N \times N$ 相似度矩阵时,我们不仅要保留主对角线(正样本),还要把发生“碰撞”的非对角线元素给“屏蔽”掉。

  • 操作原理: 在计算完 $N \times N$ 的内积矩阵(Logits)后,过 Softmax 之前,系统会快速比对一遍当前 Batch 里的所有 Item ID。
  • 掩码处理: 如果发现 $Item_i$ 和 $Item_j$ 的 ID 完全相同,就会把矩阵中对应位置的数值强行替换为一个极小的负数(比如 $-1e9$)。
  • 数学效果: 经过 Softmax 后,$e^{-1e9}$ 会无限趋近于 0。这样在计算交叉熵损失(Cross Entropy Loss)时,这个“假负样本”的权重就变成了 0,彻底不参与梯度的反向传播,完美避免了误伤。
2.Batch 内强制去重 (Global Shuffle & Deduplication)

如果不方便在底层模型代码里改矩阵 Mask,很多大厂会在上游的数据加载器(DataLoader)里做手脚。

  • 操作原理: 在把数据切分成 Batch 喂给显卡之前,算法会保证同一个 Batch 内绝对不会出现两个相同的 Item ID。

  • 实现方式: 如果在构建 Batch 时抽到了用户 B,发现他的正样本“物品 X”已经被当前 Batch 里的用户 A 占用了,就会直接把用户 B 踢到下一个 Batch 去,换另一个购买了“物品 Y”的用户进来。从源头上掐断“碰撞”的可能性。

3.统计学

在某些极其庞大的系统中,工程师甚至什么都不做,直接容忍这种错误的发生。这听起来很不严谨,但背后有强大的统计学依据。

  • 大数定理: 假设淘宝有 10 亿个商品,你设置的 Batch Size 是 256。在一个 256 人的小群体里,两人刚好在同一秒钟买了同一个商品的概率,其实是非常低的(长尾商品几乎不可能碰撞)。

  • 梯度: 哪怕真的碰巧发生了碰撞,引入了一次错误的“推远”梯度。但只要这个商品真的是用户 A 喜欢的,在后续成千上万个 Epoch 的训练中,会有无数次正确的“拉近”梯度来纠正这一次的失误。在深度学习中,只要正确信号的期望值远大于噪声,模型最终依然能收敛到正确的方向。

困难负样本挖掘(Hard Negatives)

如果不做困难负样本,双塔模型就会变成一个“近视眼”。这一步是提分的关键。

  • 什么是困难负样本? 和正样本长得很像,或者用户看了却偏偏没点的东西。

  • 挖掘方法 1(业务逻辑): 用户搜了“iPhone 15”,点击了“iPhone 15 手机”,那我们就把“iPhone 15 手机壳”和“iPhone 14”作为困难负样本。它们文本高度重合,模型极容易搞混,必须强迫它学会在微小的特征中找不同。

  • 挖掘方法 2(曝光未点击): 昨天平台把这件衣服推到了用户的屏幕上,且停留了 3 秒以上,但用户就是没点。这就是极其强烈的“我不喜欢”的信号。

2.怎么召回

试想一下:你的右塔(物品塔)已经给全网的 1 亿个商品都打上了 128 维的向量标签。此时,用户打开了 App,左塔(用户塔)瞬间实时计算出了该用户此刻的 128 维兴趣向量 $U$。

按照数学逻辑,你需要让 $U$ 和这 1 亿个向量逐一做内积,排个名次,取出前 1000 名。这个过程的时间复杂度是 $O(N)$。在 1 亿的数据量下,哪怕是最顶级的 CPU,算完也得好几秒。而业务给你的时间预算是:10 毫秒。

怎么打破物理极限?这就是 ANN(Approximate Nearest Neighbor,近似最近邻) 大显身手的时候。

1. 索引,存储

ANN 的底层哲学是不追求 100% 绝对精确的“暴力穷举(Brute Force)”。它允许犯一点点错:假设真实的 Top 1 候选人没被捞出来,但捞出了 Top 2 到 Top 10,对于推荐系统来说,用户的体验几乎没有折损。

为了实现这种降维打击般的速度,工业界演化出了三大核心的 ANN 算法流派:

算法一:倒排聚类索引 (IVF - Inverted File Index)

这是最直观的“分区排查”法。

  • 物理直觉: 假设你要在全中国找一个和“张三”长得最像的人。暴力搜索是敲开 14 亿人的门。IVF 的做法是:提前把 14 亿人按长相分成 10000 个“聚类小区”。
  • 操作过程:
    1. 离线: 用 K-Means 算法把 1 亿个商品向量聚合成 1024 个簇(Cluster),算出每个簇的中心点(Centroid)。
    2. 在线: 当用户向量 $U$ 来了,先去和这 1024 个中心点算内积,找到最匹配的 3 个“小区”。然后只在这 3 个小区内(可能只有几十万个商品)做暴力遍历。
      *效果: 搜索范围瞬间缩小了 99%,速度成百倍提升。
算法二:乘积量化 (PQ - Product Quantization)

IVF 解决了“找得慢”的问题,PQ 解决的是“存不下”的问题。1 亿个 128 维的浮点数向量,放在内存里需要好几十 GB,极其昂贵。

步骤一:切块(Slicing)

面对一个 128 维的超长向量,PQ 的第一步是不把它当成一个整体,而是沿着维度把它切断

  • 操作: 我们把 128 维的向量切分成 $M$ 个子空间(Sub-spaces)。假设 $M=4$,那么原来的一个长向量,就被砍成了 4 段,每段是一个 32 维的短向量。
  • 物理意义: 就像把一个人的整体特征(128维)拆解成了“头部特征”、“躯干特征”、“上肢特征”、“下肢特征”四个独立的部分。
步骤二:建立密码本(Codebook / K-Means)—— 局部聚类

切完之后,我们对库里 1 亿个商品的“头部特征(第 1 段)”单独拿出来看。

  • 操作: 我们对着这 1 亿个 32 维的短向量跑一遍 K-Means 聚类。聚几类呢?这是极其精妙的设计:通常聚 256 类(或者 65536 类)。
  • 为什么是 256? 因为 $2^8 = 256$。这意味着,这 256 个聚类中心的编号(0 到 255),刚好可以完美地塞进一个 8-bit 的字节(1 Byte)里!
  • 结果: 我们针对 4 个子空间,分别聚类出了 4 本“密码本(Codebook)”。每本密码本里有 256 个标准的“特征模版”。
步骤三:极限压缩(Encoding)—— 浮点数变字节
  • 操作: 取出商品 A 的向量,切成 4 段。

    • 它的第 1 段去查第一本密码本,发现离第 12 号聚类中心最近,那就把这段丢掉,只记下 12。

    • 它的第 2 段去查第二本密码本,记下 205。

    • 依次类推,第 3 段记下 55,第 4 段记下 89。

  • 压缩率: 商品 A 原本是一个 128 维的浮点数(占据 512 Bytes),现在变成了一个极简的数组 [12, 205, 55, 89],每一位是一个 Byte,总共只占 4 Bytes!

  • 内存收益: 原本需要 51 GB 内存的底库,瞬间被压缩到了 400 MB!随便一台普通破笔记本都能轻松装下 1 亿个高维向量。

步骤四:在线神速计算(ADC - 非对称距离计算)

当用户实时拿着 128 维的浮点数 Query 向量 $Q$ 进来时:

  1. 切分 Query: 我们也把 $Q$ 切成 4 段($q_1, q_2, q_3, q_4$)。
  2. 构建距离表(Distance Table): 拿 $q_1$ 去和第一本密码本里的 256 个模版算出距离,填进表格;拿 $q_2$ 和第二本密码本算… 一共只需要计算 $4 \times 256 = \mathbf{1024}$ 次极其轻量的浮点内积。
  3. 极速查表(O(1) 复杂度): 现在要算 $Q$ 和商品 A(压缩码为 [12, 205, 55, 89])的距离。怎么算?
  • 直接去刚建好的距离表里查:$q_1$ 到 12 号的距离 + $q_2$ 到 205 号的距离 + $q_3$ 到 55 号的距离 + $q_4$ 到 89 号的距离。
  • 数学表达:
算法三:HNSW - 层次导航小世界

这是目前在线服务端的绝对霸主,精度极高,速度极快!

  • 物理直觉: 类似于现实世界中的“多层立体交通网”或“高铁+地铁+自行车”的找人逻辑。
  • 操作过程: 它构建了一个多层的图网络。
    • 顶层(高铁网): 只有极少数的几个核心节点,连接距离非常远。
    • 用户向量 $U$ 从这里空降,迅速定位到大方向。中间层(地铁网): 节点逐渐变密,沿着顶层找到的大方向继续精准逼近。
    • 底层(毛细血管/街道): 包含所有 1 亿个节点。当在上层找到大概位置后,落入底层进行极其精密的局部邻居搜索。
  • 效果: 它的搜索时间复杂度逼近 $O(\log N)$。不管底库是 1 千万还是 10 亿,查询速度几乎不受太大影响

2. 向量数据库 (Vector Database)

光有上述的纯算法(比如 Facebook 开源的 FAISS 库)还不够。在真实的工程中,商品是会随时上下架的,价格是会变的,我们还需要对数据进行管理。于是,Milvus、Qdrant、Pinecone 等“向量数据库”应运而生。

它们不仅仅封装了底层的 HNSW 或 IVF-PQ 算法,还提供了传统数据库极其需要的“混合查询(Hybrid Search)”功能。

标量过滤(Scalar Filtering)与向量检索的冲突。
  • 业务诉求: 用户搜了“手机”,但他在 App 里勾选了“仅看京东自营”且“价格在 5000-6000 元”。

  • 系统挑战: 如果先用向量 ANN 捞出 1000 个最相关的手机,再去过滤“价格和自营”,可能会发现 1000 个里面有 900 个不符合条件,最终只捞出了 100 个,导致召回数量严重不足。

  • 向量数据库的解法: 现代向量数据库支持在执行 HNSW 图搜索的同时,携带标量过滤条件(Pre-filtering)。在图上游走找邻居时,如果发现某个节点不仅距离近,而且满足“自营+价格”条件,才把它加入候选池。这就完美保证了业务侧的强规则诉求。

3.阶段二: 粗排阶段(Pre-Ranking)

在很多早期的推荐系统中,是没有“粗排”这个概念的。大家通常是做完召回(捞出 1000 个候选物),直接丢给精排大模型打分。但随着互联网数据量的爆炸,业务方变得非常贪婪:他们希望召回阶段能捞出 1 万个甚至 5 万个候选物,以保证极高的覆盖率。

这时候,精排大模型(那种带几十层网络、几百个交叉特征的算力怪兽)当场就罢工了——它根本算不过来。

于是,粗排(Pre-Ranking)应运而生。它的核心定位极其明确:作为一个“承上启下”的缓冲带,用极短的时间(通常 10-20 毫秒),把 10,000 个候选物精准地砍到 500 个。

它既不能像双塔那么“瞎”,又不能像精排那么“重”。为了达到这个极其苛刻的平衡,工业界演化出了三大核心杀手锏:

1. 架构改良:从“零交叉”到“轻量级交叉 (Lightweight Cross)”

我们在讲召回双塔时说过,双塔最大的缺陷是“特征交叉过晚”(只在最顶端做一次内积),导致它根本不知道“啤酒”和“尿布”组合在一起的威力。而精排的逻辑是“尽早交叉”(底层直接全部拼接)。

粗排则走了一条折中路线:晚期轻量交叉 (Late Cross)

  • 特征精简(掐头去尾): 精排模型会用到极其消耗算力的特征(比如用户过去一年的上万条长序列 Attention,或者超高维的图片 ResNet 向量)。粗排会把这些“重型武器”全部扔掉,只保留最核心的、极其容易获取的轻量特征(如用户年龄、商品 ID 历史点击率、类目 ID 等)。
  • 网络瘦身: 粗排抛弃了极其深度的多层感知机(MLP)或复杂的 Transformer 结构,转而使用极浅层的网络(比如只有 1 到 2 层的浅层 MLP,或者用简单的因子分解机 FM)。
  • 计算复用: 粗排依然会借用类似双塔的结构,但会在塔顶的 Embedding 输出后,引入一个小型的交叉网络,让特征在最后关头能发生一点“化学反应”,以此在速度和精度之间走钢丝。
怎么做晚期轻量交叉

纯双塔(完全不交叉,只算一次内积)太“瞎”,而精排(所有特征一上来就拼接,跑几十层网络)太“重”。

为了在 10 毫秒内搞定 10,000 个物品的打分,工程师必须精准地拿捏特征“见面”的时机和方式。这就是晚期轻量交叉(Late Lightweight Cross)的精髓。

我们可以把它拆解为两个词:“晚期(Late)”和“轻量(Lightweight)”。

1. 什么是“晚期 (Late)”?—— 把相亲时间推迟到最后一刻

  • 早期交叉(精排的做法): 男生和女生的资料一上来就混在一起。[男生年龄, 女生年龄, 男生城市, 女生城市, ...] 拼接成一个超长向量,然后经过一层层的复杂网络。这种方式里,任意两个极其细微的特征(比如男生的年龄和女生的家乡)在第一层就发生了“化学反应”。计算量呈指数级爆炸。
  • 晚期交叉(粗排的做法): 前面 90% 的网络依然保持“双塔”结构。男生塔自己算自己的,女生塔自己算自己的,分别把极其复杂的个人信息压缩成一个高度浓缩的 128 维代表向量 $U$(用户特征集)和 $V$(物品特征集)。
  • 见面的时机: 直到网络的极其靠后(甚至是倒数第二层),系统才把这两个高度浓缩的向量 $U$ 和 $V$ 拿出来,进行第一次也是唯一一次真实的“物理接触”。

为什么要“晚”?为了极致的在线提速! 在线上服务时,用户塔的向量 $U$ 只需要计算 1 次! 因为在同一次刷新中,不管给用户推一万个什么商品,用户本身的状态是不变的。所以前面极其沉重的用户侧特征提取工作被完美复用。只有最后一步的“交叉”操作,才需要针对那 10,000 个商品循环执行 10,000 次。


2. 什么是“轻量 (Lightweight)”?—— 工业界的四大低算力交叉套路

既然向量 $U$ 和 $V$ 终于在晚期见面了,怎么让它们“低成本”地碰撞出火花?工程师们发明了以下几种极其廉价的数学魔法:

玩法一:哈达玛积 (Hadamard Product) 配合极浅 MLP

纯双塔在塔顶是用“内积(Dot Product)”,即把对应位置的数相乘后全部加起来,变成一个孤零零的分数(标量)。这会瞬间丢失所有交叉细节。

  • 轻量交叉的做法: 使用哈达玛积(元素级相乘)。 这意味着 $U$ 的第 1 维乘以 $V$ 的第 1 维,$U$ 的第 2 维乘以 $V$ 的第 2 维…… 最终得到的是一个保留了 128 个维度的向量 $H$,而不是一个分数。这个向量 $H$ 就像一份“各项指标契合度体检报告”。
  • 打分: 把这个向量 $H$ 送入一个仅仅只有 1 层的极其简单的全连接网络(MLP),输出最终的点击率预测。
玩法二:双线性交叉 (Bilinear Interaction)

纯粹的哈达玛积有点死板(只能第 1 维和第 1 维碰)。如果用户的第 1 维特征(喜欢数码)想和物品的第 5 维特征(科技感外壳)发生反应怎么办?

  • 操作: 在 $U$ 和 $V$ 中间强行塞入一个可学习的权重矩阵 $W$。
  • 优势: 相当于引入了一个“翻译官”。计算量比普通的内积大了一点点,但允许不同维度之间产生极其丰富的非对称交叉,精度大幅提升。
玩法三:向量拼接 + 浅层 DCN (Deep & Cross Network)

如果你觉得乘法还是不够过瘾,想回归拼接(Concat)的暴力美学,那只能在深度上克制。

  • 操作: 把 $U$ 和 $V$ 拼接成一个 256 维的向量 $X = [U, V]$。
  • 极简交叉: 不用庞大的 MLP,而是用 1 到 2 层的 Cross Layer(来自 DCN 模型)。它的公式是 $X_{l+1} = X_0 X_l^T W_l + X_l$。
  • 优势: Cross Layer 的计算主要是向量外积,参数量极少(大概只有几百个参数),几乎不占内存,但能明确地算出“高阶交叉项”,是目前大厂粗排里性价比极高的选择。
玩法四:抽取核心特征的“特权交叉”

粗排系统会说:“算力太宝贵了,我只让VIP相亲!”

  • 操作: 绝大多数特征(城市、设备号、长尾特征)依然走死板的内积。只有最核心的少数特征(比如:用户刚刚点击的前 3 个商品 ID,以及当前候选的商品 ID),被允许绕过双塔的隔离,在晚期拿出来做一个显式的交叉。这在工程上被称为“特征直通车”。

总结一下: 粗排的“晚期轻量交叉”,就是尽可能地把沉重的特征处理推给前半段(且让用户侧只算一次),然后在最后关头,用极其廉价的数学运算(哈达玛积、双线性、单层网络),给浓缩后的用户意图和物品属性安排一次“闪电相亲”。

现在,粗排通过这种“走钢丝”般的精妙设计,成功护送着最优质的 500 个候选商品来到了全链路的终极战场。准备好进入推荐系统的最强大脑——精排阶段(Ranking),看看它是如何不惜一切算力,用复杂的注意力机制(如 DIN)精准刻画用户灵魂深处兴趣的吗?

2. 知识蒸馏 (Knowledge Distillation)

既然精排大模型极其聪明,而粗排小模型比较笨,那我们能不能让大模型去当“老师”,把它的智慧“传授”给小模型?这就是知识蒸馏。

  • 大模型的软标签(Soft Labels): 正常训练时,我们用的是用户的真实反馈(点击为 1,不点为 0),这叫硬标签(Hard Label)。但硬标签太绝对了,商品 B 和商品 C 用户都没点,但其实商品 B 比 C 稍微好那么一点点,硬标签却把它们都当成了 0。
  • 老师的教导: 我们先让精排大模型(Teacher)把所有样本打一次分。大模型可能会给真实点击的正样本打 0.9 分,给没点的 B 商品打 0.3 分,给没点的 C 商品打 0.01 分。这个极其细腻的打分,就是“软标签”。
  • 学生的模仿: 在训练粗排小模型(Student)时,我们不光让它去预测真实的 0 和 1,还强制让它输出的分数去逼近精排老师给出的软标签

数学推导(蒸馏损失函数):
粗排模型的总损失 $L$ 通常是真实损失(交叉熵)与蒸馏损失(KL 散度或均方误差)的加权和:

其中 $\alpha$ 是用来调节比重的超参数。
通过知识蒸馏,粗排模型仅仅用了 1/10 的参数量和极简单的结构,就能逼近精排模型 90% 以上的排序能力。这就是它能承担“10000 选 500”重任的底气。

3. 极致工程优化:算力感知与动态剪枝 (COLD 架构)

除了算法层面的优化,粗排阶段在工程上也是极其疯狂的。以阿里著名的 COLD (Computing power cOst-aware joint Leveling DCN) 架构为代表,粗排系统已经进化到了“看菜下饭”的地步。

  • 痛点: 服务器的压力是波动的。凌晨 3 点,服务器很闲,你让粗排多算一会儿也没事;但晚上 8 点(晚高峰),流量暴涨,如果粗排还按原来的复杂度算,整个系统就会超时崩溃。
  • 动态网络深度(Early Exit): 粗排模型在设计时,被做成了一个“多出口”的结构(比如有 3 层交叉网络)。
    • 在晚高峰算力紧张时,模型算完第 1 层,系统就强行掐断,拿着第 1 层的粗糙结果直接输出。
    • 在凌晨算力充足时,系统允许模型完整地跑完 3 层,输出极其精准的结果。
  • 灵活的特征通道: 系统会实时监控当前的服务器 CPU 负载。负载过高时,系统会瞬间“拉闸”,把一些耗时的特征(比如需要查大表的特征)直接 Mask(屏蔽)掉,只用最基本的特征强行推理。

4.阶段三:精排阶段

DIN(Deep Interest Network)

第一步:底层输入与 Embedding 映射 (Input & Embedding)

精排模型的输入极其繁杂,DIN 首先要把这些五花八门的数据变成深度学习能看懂的稠密向量。

  • 候选物品 (Target Item): 当前正在打分的商品,比如一件“优衣库羽绒服”。经过查表,变成一个稠密向量 $e_c$。
  • 用户画像与上下文 (User Profile & Context): 用户的性别、年龄、当前的地理位置、时间等。这些同样经过查表转成稠密向量。
  • 用户行为序列 (Behavior Sequence): 这是 DIN 的绝对主角!它是用户过去点击、购买过的历史商品列表。比如用户过去看了 $N$ 个商品,经过查表,变成了一个长度为 $N$ 的向量列表:$e_1, e_2, \dots, e_N$。

第二步:核心首创——局部激活单元 (Local Activation Unit)

在 DIN 之前,业界的主流做法是把历史序列 $e_1$ 到 $e_N$ 直接加起来求平均(Mean Pooling)。这会导致用户的兴趣变成一团糊涂账。DIN 在这里直接做了一场外科手术,引入了目标注意力机制 (Target Attention)

  • 注意力计算网络 (Activation Network): 对于历史序列中的每一个商品 $e_i$,DIN 都会把它和当前的候选商品 $e_c$ 强行拉到一起,算一个“相关性得分”。
  • 精妙的拼接方式: 怎么算得分?DIN 把 $e_i$(历史商品)和 $e_c$(候选商品)进行极其丰富的组合:它将原始向量 $e_i$、原始向量 $e_c$、两者的外积(元素级相乘)、两者的差值全部拼接在一起。
  • 输出权重: 把这个拼接好的庞大向量送入一个微型的全连接网络(MLP),最后输出一个单一的数字 $w_i$。这个 $w_i$ 就是历史商品 $i$ 相对候选商品 $c$ 的注意力权重

第三步:动态加权求和 (Weighted Sum Pooling)

拿到了所有历史商品的权重后,系统立刻开始“看菜下饭”。

  • 加权操作: 将历史商品向量 $e_i$ 乘以刚刚算出来的权重 $w_i$。
  • 序列聚合: 把所有加权后的历史向量全部加起来,得到最终代表该用户此刻兴趣的向量 $V_u$。数学公式表达极其简洁:

高阶面试考点(DIN 的反常识设计):
在标准的 Transformer 或传统的 Attention 机制中,权重 $w_i$ 算出来之后,必须要经过一层 Softmax 进行归一化,让所有权重加起来等于 1。
但是 DIN 的原论文明确指出:不要做 Softmax!
为什么?因为阿里的工程师发现,如果做了归一化,一个买了 100 件衣服的超级买家,和一个只买了 1 件衣服的偶然访客,他们最终算出来的兴趣向量长度是一样的,这抹杀了用户兴趣的绝对强度。保留原始的累加值,可以完美体现用户在这方面的消费狂热度。

第四步:顶层特征拼接与全连接网络 (Top MLP)

经历了前面极其复杂的动态注意力提取,现在该进行收尾打分了。

  • 物理大一统: 把第一步拿到的“用户画像向量”、“上下文向量”、“候选物品向量 $e_c$”,以及第三步刚刚算出来的、极其鲜活的“动态兴趣向量 $V_u$”,在特征维度上进行暴力的 Concat(首尾拼接)。
  • 非线性交叉: 把这个拼接后的超长向量,送入一个 3 到 4 层的多层感知机(MLP)中。这里的目的是让用户的静态特征(如年龄)和动态兴趣、候选商品之间发生充分的高阶非线性交叉。
  • 最终输出: 网络的最后一层经过 Sigmoid 激活函数,吐出一个 0 到 1 之间的实数。这就是预估点击率(pCTR)。

第五步:大厂落地的隐藏黑科技 (Dice 激活函数与 MBA 正则化)

如果你只讲前面四步,面试官会觉得你懂理论;如果你能讲出这一步,面试官会觉得你读过源码并且踩过坑。阿里在 DIN 中顺手提出了两个极其强悍的工程优化:

  • 自适应激活函数 Dice: 传统的 ReLU 函数在输入小于 0 时一刀切变成 0,这在数据分布极其不稳定的推荐系统中容易导致神经元“坏死”。DIN 提出了 Dice 激活函数,它能根据当前 Batch 数据的均值和方差,动态调整激活的阈值,让模型的收敛极其平滑。
  • 自适应正则化 MBA (Mini-Batch Aware Regularization): 推荐系统的稀疏特征(比如商品 ID)极其庞大,如果用传统的 L2 正则化去惩罚所有参数,计算量会爆炸。阿里提出只对当前 Batch 里出现过(非零)的稀疏特征参数计算正则化惩罚,且惩罚力度与该特征在全局出现的频率成反比。这直接救活了超大规模参数下的模型过拟合问题。

这就是 DIN 的全貌。它用巧妙的 Target Attention 解决了用户兴趣多峰发散的问题,又用 Dice 和 MBA 解决了工业界极度稀疏数据的训练难题,至今依然是推荐排序大模型里最坚固的基石。

Deep & Cross Network

在传统的精排大模型里,工程师们一直有一个痛点:大家都知道特征交叉(比如“25岁”+“男性”+“游戏本”)极其重要,但多层感知机(MLP)是个黑盒,它学习这种明确交叉特征的效率极低。如果用因子分解机(FM),又只能算到 2 阶交叉。

DCN 的横空出世,完美解决了这个问题:它用极低的计算代价,强行让网络进行显式的、任意高阶的特征交叉。

按照数据流动的顺序,我们把 DCN 的计算流程逐层扒开:


第一步:底层特征拼接 (Embedding and Stacking)

和所有的排序模型一样,第一步永远是把离散的 ID 变成向量,并和连续特征拼在一起。

  • 操作: 假设我们有稠密特征(如价格、点击率)和稀疏特征(如用户 ID、城市、商品类目)。稀疏特征经过查表变成 Embedding 向量。
  • 物理大一统: 将所有这些特征暴力拼接(Concat)在一起,形成一个维度为 $d$ 的超长一维向量,我们称之为 $x_0$
  • 核心意义: 这个 $x_0$ 就是整个 DCN 网络的地基。记住它,因为在接下来的 Cross 网络中,它会像幽灵一样在每一层反复出现。

第二步:核心科技——显式交叉网络 (Cross Network)

数据在生成 $x_0$ 之后,兵分两路。左边走的是 Cross 网络,右边走的是传统的 Deep 网络(这两路是并行的)。我们先看最惊艳的 Cross 网络。

Cross 网络由多个相同的 Cross Layer 堆叠而成。假设当前是第 $l$ 层,它的输入是 $x_l$,输出是 $x_{l+1}$。Google 给出了一个极其优美的公式:

面试官最爱考的就在这里!我们把这个公式切成三块来理解:

  1. 残差保留 ($+ x_l$): 借鉴了 ResNet 的思想。把上一层的输入直接加到输出里,保证在网络加深时,之前学到的底层信息绝不会丢失,也防止了梯度消失。
  2. 暴力升维交叉 ($x_0 x_l^T$): 这是一个向量的外积操作。$x_0$ 是一个 $d \times 1$ 的列向量,$x_l^T$ 是一个 $1 \times d$ 的行向量。它们相乘,会瞬间膨胀成一个 $d \times d$ 的巨大矩阵!这个矩阵里的每一个元素,都是基础特征 $x_0$ 里的某个维度,和上一层特征 $x_l$ 里的某个维度的两两相乘(显式交叉)
  3. 降维与工程奇迹 ($w_l$): 如果真的每次都算 $d \times d$ 的矩阵,内存和时间早就爆炸了。Google 的天才之处在于,利用了矩阵乘法的结合律!
    • 理论推导: 乘法 $x_0 (x_l^T w_l)$ 中,我们先算括号里的 $x_l^T w_l$
    • 魔法发生: $x_l$ 是长度为 $d$ 的向量,$w_l$ 也是长度为 $d$ 的可学习权重向量。这两个向量做内积($x_l^T w_l$),结果竟然是一个标量(一个具体的数字)
    • 结果: 整个极其复杂的公式,实际上变成了用一个数字去乘以原始特征向量 $x_0$。时间复杂度瞬间从 $O(d^2)$ 暴降到了线性的 $O(d)$

物理意义总结:
每一次经过 Cross Layer,网络都会强行把上一层的结果和最原始的输入 $x_0$ 再做一次交叉。

  • 第 1 层:产出了 $x_0$ 与 $x_0$ 的交叉(2 阶特征)。
  • 第 2 层:产出了 2 阶特征与 $x_0$ 的交叉(3 阶特征)。
    你有多少层,它就能极其明确地、显式地给你算出多少阶的特征组合!
为什么Cross Layer可以Work

这个问题问到了 DCN 论文的灵魂深处!

很多初学者看到公式 $x_{l+1} = x_0 x_l^T w_l + b_l + x_l$ 时,只会觉得“哦,数学上可以这么算”,但没有体会到 Google 工程师设计这个公式时的“物理直觉”“数学心机”

显式交叉网络(Cross Network)之所以在推荐系统里 work 得这么好,本质上是因为它极其优雅地解决了传统多层感知机(MLP)的三个致命缺陷。

我们来把它的“底牌”全部翻开:

1. 数学本质:强行构建“高阶多项式” (泰勒展开的暴力美学)

在 CTR(点击率)预估中,特征交叉的本质其实就是在做多项式乘法。比如我们要找“年龄 $\times$ 性别 $\times$ 城市”的关联,这就是一个 3 阶多项式。

传统的 MLP 是一个黑盒,它通过复杂的非线性激活函数(如 ReLU)去“猜”这些交叉规律,效率极低。而 Cross Network 是怎么做的?它是显式、强行地展开多项式

我们推导一下前两层(忽略偏置项 $b$):

  • 第 1 层 ($x_1$): $x_1 = x_0 x_0^T w_0 + x_0$
    • 这里面的 $x_0 x_0^T$ 产生了所有基础特征的两两相乘(比如 $x_{年龄} \times x_{性别}$)。这就完美捕获了二阶交叉。
  • 第 2 层 ($x_2$): $x_2 = x_0 x_1^T w_1 + x_1$
    • 把 $x_1$ 带入进去,相当于用 $x_0$ 去乘以($x_0$ 和 $x_0$ 的组合)。这瞬间就产生了诸如 $x_{年龄} \times x_{性别} \times x_{城市}$ 的三阶交叉

为什么 work? 因为推荐系统的核心就是要找这些高阶共现组合。Cross Network 就像一个极其听话的数学机器,你有 $L$ 层,它就老老实实地给你生成最高 $L+1$ 阶的所有多项式组合,毫不含糊,这比让 MLP 去“瞎猜”要直接且高效得多。

2. 泛化魔法:参数共享与“降维打击”

如果我们要真正算出一个 1000 维特征的 3 阶多项式组合,需要的参数量是 $1000 \times 1000 \times 1000 = 10$ 亿个!这在工程上是绝对不可接受的,而且会严重过拟合。

Cross Network 极其聪明地引入了 $w_l$ 这个权重向量。

  • 没有 $w_l$ 的世界: $x_0 x_l^T$ 会生成一个巨大的 $d \times d$ 矩阵,你要去学这个矩阵里的每一个交叉组合的权重。
  • 有了 $w_l$ 的世界: $x_l^T w_l$ 率先变成了一个标量(数字)。这在数学上等价于:把巨大的高阶交叉矩阵,强行投影到了一个低秩(Low-Rank)的空间里。
  • 为什么 work? 所有的交叉组合(比如 年龄$\times$性别、年龄$\times$城市)不是各自去学一个独立的权重,而是共享了 $w_l$ 里面的参数。这种参数共享极大地限制了模型的自由度,自带了极强的正则化(Regularization)效果,完美防止了过拟合,同时让内存占用变成了极小的 $O(d)$。
3. 架构心机:残差连接保障的“梯度高速公路”

公式最后的那个 $+ x_l$,也就是残差连接(Residual Connection),是让网络能深深叠下去的关键。

  • 为什么 work? 在深度学习里,网络越深,底层的信息在向前传播时就越容易变得面目全非(或者梯度在反向传播时消失)。加上 $+ x_l$ 之后,相当于告诉网络:“如果你在这一层找不到什么有用的交叉特征,你就干脆把权重 $w_l$ 设为 0,让 $x_{l+1}$ 直接等于 $x_l$(即保持原样)。”
  • 这给了模型极大的容错率,让它即使堆叠很多层,也能稳如泰山地收敛。
4. 不忘初心:始终保持与原始特征 $x_0$ 的对话

对比其他的交叉模型,DCN 的一个独特之处是:每一层的公式里,都有一个雷打不动的 $x_0$。

  • 一般的网络是:$x_0 \rightarrow x_1 \rightarrow x_2 \rightarrow x_3$。到了第 3 层,模型可能早就忘了最原始的 $x_0$ 长什么样了。
  • DCN 的网络是:每一层计算前,都要把当前的结果 $x_l$ 拉回来,和最原始的输入 $x_0$ 进行一次外积。
  • 为什么 work? 因为在推荐系统里,最原始的用户画像和物品属性是最核心、最纯粹的信息(Base Feature)。不断地强制与 $x_0$ 交叉,就是在不断强化这些核心特征的记忆,防止深层网络“走火入魔”提取出过度抽象的无效噪声。

总结一句话: 显式交叉网络之所以 work,是因为它披着神经网络的外衣,干的却是“带有低秩正则化的、高度可控的高阶多项式特征展开”的活儿。它既有数学定理般严谨的交叉表达力,又有极度克制的参数量,天生就是为 CTR 预估这种重度依赖“特征组合”的场景而生的。

第三步:常规后勤保障——隐式深度网络 (Deep Network)

在 Cross 网络大杀四方的同时,并行的右半边是一个极其普通的 MLP(多层感知机)。

  • 操作: 输入同样的 $x_0$,经过几层全连接层。公式为 $h_{l+1} = \text{ReLU}(W_l h_l + b_l)$。
  • 为什么还需要它? 因为 Cross 网络的交叉方式是高度结构化的(类似于多项式展开)。虽然它找显式特征很强,但对于一些极其隐晦的、非线性的复杂规律,依然需要 MLP 这种“万能函数拟合器”来兜底。两者是互补的关系。

第四步:顶层融合与输出 (Combination Layer)

现在,两路大军会师。

  • 操作: 把 Cross 网络的最终输出向量 $x_{L_{cross}}$,和 Deep 网络的最终输出向量 $h_{L_{deep}}$ 进行 Concat 拼接。
  • 打分: 将拼接后的超长向量送入最后一个线性层,再经过 Sigmoid 激活函数,压缩成 0 到 1 之间的概率值。

进阶加分项:DCN-V2 解决了什么致命缺陷?

如果在面试中讲完上面这些,你已经及格了。如果你能主动抛出 DCN-V2,那你就是高级工程师。

  • 原版 DCN 的致命伤: 虽然 $x_l^T w_l$ 变成标量让计算极快,但这导致它的权重矩阵秩为 1(Rank-1 限制)。这意味着 Cross 网络实际上表达能力严重不足,它只能学到一种非常死板的交叉模式。
  • DCN-V2 的解法: Google 在 2020 年推出了升级版。把原本的权重向量 $w_l$ 替换成了权重矩阵 $W_l$
    • 新公式:$x_{l+1} = x_0 \odot (W_l x_l + b_l) + x_l$ (这里 $\odot$ 是哈达玛积,即元素级相乘)。
    • 效果: 这样既保留了显式的高阶交叉,又打破了秩为 1 的限制,极大地释放了模型的表达能力,同时通过混合专家系统(MoE)或者低秩近似等手段,依然把计算复杂度控制在了工业界可接受的范围内。目前大厂在线上跑的,基本都是基于 DCN-V2 魔改的架构。

5.阶段四:重排与混排阶段(Re-ranking & Blending)

如果说精排(Ranking)是一个极其较真、拿着放大镜给每个商品打分的“阅卷老师”,那么重排与混排就是一个统揽大局、极其圆滑的“总编辑”

在精排阶段结束时,我们手里拿着的是经过 DIN 或 DCN 像素级计算后,得分最高的 50 个商品。但是,得分最高,就一定要按顺序排给用户看吗?绝对不行!

这就引出了精排模型(Point-wise 打分)的致命缺陷,也是重排阶段存在的根本原因:


1. 核心痛点:为什么精排满分,线上却“翻车”?(Point-wise 的盲区)

精排模型在打分时,商品和商品之间是互相看不见的。

假设一个用户刚搜索了“苹果手机”,精排模型一算,发现前 10 名全是不同店铺卖的 iPhone 15。如果把这 10 个一模一样的商品直接端给用户,离线计算的总预估点击率(pCTR)确实是全局最高的。
但真实的线上情况是:用户看了第一眼觉得不错,看到第三个就视觉疲劳了,看到第十个时已经想骂人退出了。

重排的哲学是:好的推荐列表,绝不是高分单品的简单堆砌,而是一个生态和谐的整体(List-wise)。


2. 算法视角的重排:从单兵作战到“群星闪耀” (Listwise Model)

为了让商品之间产生“化学反应”,重排模型(如阿里的 PRM,Personalized Re-ranking Model)引入了列表级打分的概念。

  • Self-Attention 显式交互: 重排模型把精排输出的 Top 50 商品作为一个完整的序列送入 Transformer 结构中。利用 Self-Attention 机制,让每一个商品都去“看看”自己周围站着的都是谁。
  • 相互压制与提携: 如果排在第 1 位的是 iPhone,第 2 位也是 iPhone,模型在做 Attention 交互时就会发现信息的严重冗余,从而强行把第 2 位 iPhone 的打分“踩”下去。反之,如果第 1 位是 iPhone,第 2 位是与之配套的 AirPods(手机壳),模型发现它们组合在一起有“连带购买”的奇效,就会把 AirPods 的分数“抬”上来。

3. 策略视角的重排:强制打散与 MMR 算法

除了深度学习模型,重排阶段还充斥着极其高效、可解释性极强的数学策略,用来保证列表的多样性(Diversity)。最经典的武器就是 MMR (Maximal Marginal Relevance, 最大边际相关性)

MMR 的核心思想是贪心算法:每次从候选池里挑商品时,既要保证它和用户的兴趣高度相关,又要保证它和已经挑出来的商品极其不相似。

数学公式非常直观:

  • $Relevance(i)$ 是精排给出的绝对高分。
  • $Similarity(i, j)$ 是当前商品 $i$ 和已经选入列表的商品 $j$ 之间的相似度。
  • $\lambda$ 是一个极其关键的调节阀门:如果业务需要保成交,就把 $\lambda$ 调大;如果业务需要促活和打破信息茧房,就把 $\lambda$ 调小,强行惩罚相似商品。

4. 商业视角的混排 (Blending):各部门的“抢地盘”大战

当排好了一个完美的自然商品列表后,残酷的商业现实来了。前端页面(Feed 流)只有那么几个坑位,但想往里塞东西的部门太多了:

  • 商业化部门: 必须插广告!不插广告公司怎么赚钱?
  • 内容部门: 必须插直播卡片和短视频!我们要抢占用户时长!
  • 电商部门: 必须插卖货图文!我们要冲 GMV!

这就是混排(Blending)要解决的终极博弈。不同的物品连评估标准都不一样(广告看 eCPM,视频看完播率,商品看转化率),怎么把它们揉到一个列表里?

  • 强化学习 (Reinforcement Learning) 的降维打击: 如今的大厂在混排阶段极其喜欢用 RL。把整个屏幕看作一个状态(State),把插入广告还是正常商品看作动作(Action),把用户的长期留存和总收益看作奖励(Reward)。模型会在不伤害用户体验的边缘疯狂试探,找出收益最大化的混排阵型。
  • PID 控制算法: 借用工业自动化的概念。比如公司规定“广告占比不能超过 10%”。如果上午广告出得太多,PID 控制器就会在下午强行压低广告队列的权重,实时动态调平。

5. 绝对霸权:规则引擎与 Hard Rules

所有花哨的模型,在重排的最后一步,都要给产品经理的“死规则”让路。这是推荐系统的最后一道防线。

  • 同类目打散:连续 3 个坑位,绝对不允许出现同一个类目的商品。
  • 保量强插:大促期间,某个品牌的会场入口必须锁定在第 3 坑位,无论模型算出它的分数有多低。
  • 合规屏蔽:根据实时舆情,瞬间将某个带有特定标签的内容从列表中硬核剔除。

一句话总结推荐大满贯:
召回(海选 10000 人)解决了“有没有”的问题;粗排(初试 500 人)解决了“快不快”的问题;精排(复试 50 人)解决了“准不准”的问题;而重排与混排(发 10 个 Offer)则是在残酷的商业现实下,兼顾体验、生态与收入的“端水大师”

至此,我们的推荐系统主链路已经完整闭环。不过,这套复杂的庞然大物在运转时,必然会遇到一个让所有算法工程师头疼的死穴——如果没有历史数据,你怎么给一个今天刚注册的新用户,或者一件今天刚上架的新商品做推荐?你想一起探讨一下推荐系统的“冷启动(Cold Start)”黑魔法吗?


Author: YANG
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source YANG !
  TOC