TECH ARTICLES
搜索排序 推荐系统 CTR 预估

搜索排序的七种武器:粗排到精排,从 LightGBM 到 MMOE 一篇讲透

Jackie Zhan 2026-06-27
目录
一、为什么排序要分粗排和精排两段? 二、粗排的进化:LightGBM → COLD → 蒸馏 三、精排的特征交叉之争:DeepFM 与 DCN 四、DIN:让模型学会"看人下菜碟" 五、MMOE:同时优化点击、转化、时长 六、总结:排序是一场"精度与算力"的永恒谈判

上周有个做后端的朋友问我:"召回我懂了,不就是从一亿个商品里捞出几千个候选嘛。那后面的排序,不就是按分数从高到低排个序?这有啥好讲的,ORDER BY score DESC 不就完了?"

我反问他:"那这个 score,是谁算出来的?"

他愣住了。

对,问题就藏在这个 score 里。排序阶段的全部学问,不是"怎么排",而是"怎么给每个候选打出那个分"。而这件事难就难在——你有几千个候选要打分,但留给你的时间只有几十毫秒。打分打得准,用户才点得爽;打分打得快,机器才扛得住。这两件事天生矛盾。

于是工业界想出了一个特别"狡猾"的办法:把排序拆成两段。先用一个又快又糙的模型(粗排)把几千个砍到几百个,再用一个又慢又精的模型(精排)把这几百个排得明明白白。这就是我们上一篇聊过的"三级火箭"里的后两级。

这篇文章,我们就钻进这两级火箭的引擎舱,看看里面到底装了哪些算法:粗排的 LightGBM、COLD、蒸馏,精排的 DeepFM、DCN、DIN、MMOE。它们不是孤立的七个名词,而是一条清晰的进化链——每一个的出现,都是为了补上一个的窟窿。读完你会明白,所谓排序算法的演进史,本质上是一部"在算力的镣铐下,把精度一点点榨出来"的历史。


一、为什么排序要分粗排和精排两段?

先想一个最朴素的问题:既然精排最准,为什么不直接拿精排模型给所有候选打分,一步到位?

答案就两个字:算不过来

打个比方。召回交给排序的,是一个几千人的"海选名单"。精排模型是一位极其挑剔的评委,他看一个人要看简历、看作品、看过往表现、还要看这个人和当前观众的匹配度——一套流程下来要好几毫秒。几千人挨个看完,黄花菜都凉了。用户在手机前等超过 300 毫秒,就开始烦躁了。

所以聪明的做法是加一道"初筛"。初筛的评委(粗排)水平差一点没关系,但他得快——几千人扫一眼,几十毫秒内刷掉八九成,只把最有戏的几百人递给精排。精排评委于是能心无旁骛地精挑细选。

召回 数万 → 数千 粗排 数千 → 数百 精排 数百 → 数十 快 · 糙 较快 · 较糙 慢 · 精 特征少 / 算力省 特征中 / 算力受限 特征多 / 算力管够 耗时 ~ ms 级 耗时 ~ 十 ms 耗时 ~ 数十 ms 候选越往后越少,单个打分越往后越贵 —— 用"逐级收窄"换"总算力可控"
排序漏斗:粗排和精排是同一个目标下的两次取舍

这里有个特别关键、却经常被搞错的点:粗排和精排,不是两个不相关的模型,而是同一件事的两种精度。它们追求的目标完全一致——都是预测"用户会不会喜欢这个候选"。区别只在于,一个为了快牺牲了精度,一个为了精牺牲了速度。

关键区别
很多人以为粗排是在做"召回的补充",其实不是。粗排是精排的"穷人版"——它和精排的 KPI 是同一个,只是预算少得可怜。这个定位决定了后面所有粗排算法的设计哲学:不是去发明新东西,而是想方设法用更少的算力,逼近精排的判断。

理解了这个定位,你就能看懂粗排算法这十年的整条演进主线了。它本质上在回答一个问题:预算这么紧,我怎么才能算得又快、又尽量像精排?

这条路,工业界走了三步。


二、粗排的进化:LightGBM → COLD → 蒸馏

第一步:LightGBM——用一棵棵树搭起的"快枪手"

早期的粗排,主力是 GBDT(梯度提升决策树),而 GBDT 阵营里最能打的,是微软在 2017 年开源的 LightGBM。

GBDT 的思路特别符合直觉。它不追求一个模型一次到位,而是种一棵又一棵的决策树,每棵新树都专门去纠正前面所有树犯的错。第一棵树预测得粗糙,差了多少?第二棵树就专门去拟合这个差值(残差)。一棵棵叠加下来,误差越摊越薄。

insider 视角
Boosting 这套"知错就改、专补窟窿"的打法,像极了一个团队复盘:第一个人给出初稿,第二个人专挑初稿的毛病来补,第三个人再补前两人合起来还没补上的……每个人都不全能,但叠在一起就很强。这也是为什么 GBDT 在结构化特征(年龄、价格、点击率这类表格数据)上,至今依然是难以撼动的强基线。

那 LightGBM 凭什么从一堆 GBDT 实现里杀出来?就凭一个字:。它干了两件聪明事。

一是直方图算法。传统的树要找最佳分裂点,得把每个特征的所有取值排序、逐个试,贵得要命。LightGBM 干脆把连续特征切成几十个"桶"(比如把价格分成 0–10、10–20……),只在桶的边界上找分裂点。精度损失微乎其微,速度却快了一个数量级。

二是Leaf-wise 生长。别的树是"每层一起长"(level-wise),雨露均沾;LightGBM 是"哪片叶子分裂后收益最大就先长哪片"(leaf-wise),把算力集中在刀刃上。

所以在很长一段时间里,粗排的标配就是:人工设计一堆特征,喂给 LightGBM,输出一个分数。简单、稳定、快。但它有个天花板——它吃不动那些高维稀疏的 ID 类特征(比如几亿个商品 ID、用户 ID)。而恰恰是这些 ID 特征里,藏着推荐最值钱的个性化信号。树模型对此无能为力。

精排那边早就用深度模型把 ID 特征玩出花了,粗排却还在用树模型啃结构化特征。这道精度鸿沟,迟早要填。问题是——深度模型那么贵,粗排的预算根本养不起。怎么办?

第二步:COLD——把"算力预算"直接写进模型设计

2020 年,阿里在 KDD 上甩出了 COLD,全称很长:Computing power cost-aware Online and Lightweight Deep pre-ranking system(算力成本感知的在线轻量级深度粗排系统)。光这个名字,就把它的野心说清楚了。

在 COLD 之前,粗排升级深度模型有两条老路,都不太行。一条是向量内积模型(双塔):用户一个向量、商品一个向量,点积出分数。够快,但用户和商品在打分前"老死不相往来",学不到交叉特征,精度有上限。另一条是直接把精排模型砍小:砍特征、砍网络层。砍轻了不够快,砍狠了精度崩。两头不讨好。

COLD 的破局点,是换了个思路:别再纠结"模型该多大",而是把算力当成一个可以协同优化的变量。

全部特征 含交叉特征 SE Block 筛选 给特征打重要性分 保留高价值特征 喂给深度网络 砍掉低价值特征 省下算力 算法-系统协同设计 精度由"留下的特征"保证,速度由"砍掉的特征 + 推理加速"保证
COLD 的核心:用 SE Block 做特征筛选,在算力预算内塞进尽可能强的深度模型

具体怎么做的?COLD 允许你用任意复杂的深度模型,包括交叉特征——这是双塔做不到的。但它在模型里加了一个叫 SE Block 的模块,专门给每个特征打一个"重要性分数"。然后做一件很狠的事:只保留得分最高的那批特征,剩下的直接砍掉。

这就把"特征选择"从一门玄学,变成了模型自己学出来的结果。你想让模型快一点?把保留的特征数调小,算力立刻降下来,而且砍掉的都是模型认为最不重要的,精度损失最小。再配上一堆工程上的推理加速(混合精度、算子融合、列式计算),COLD 硬是在粗排那点可怜的预算里,跑起了一个带交叉特征的深度模型。

更妙的是,COLD 是在线学习的,能跟着数据分布的变化实时更新——大促期间用户行为剧变,它扛得住。这一下,粗排和精排的精度鸿沟,被填平了一大截。

但 COLD 再轻量,它终究是个独立训练的模型。它和精排,是"两个各自努力、目标相同的人"。可既然目标相同,精排又比它强,粗排为什么不干脆直接拜精排为师呢?

第三步:蒸馏——让粗排"抄"精排的答案

这就是蒸馏(Knowledge Distillation)的思路,也是当下粗排最主流的范式。

一句话说清蒸馏:让又大又准的精排模型当"老师",又小又快的粗排模型当"学生",学生不光学真实的点击标签,还要学着模仿老师的输出。

insider 视角
为什么"学老师的输出"比"学真实标签"更有营养?因为真实标签太"硬"了——用户点了就是 1,没点就是 0,信息量只有一个比特。而老师模型的输出是个概率,比如"0.92""0.88""0.03",这里面藏着老师对样本之间细微差别的判断:同样是没点击的两个商品,老师能告诉你哪个"差一点点就点了"。这种软标签携带的"暗知识",才是学生真正该偷师的东西。

蒸馏在粗排里主要有两种用法。一种是Logits 蒸馏:让粗排去拟合精排打出的分数,等于直接对齐两者的判断。另一种是特征蒸馏:让粗排去模仿精排中间层学到的表示。两者常常一起上。

蒸馏顺手解决了一个长期让工程师头疼的毛病——粗排精排不一致。想象一下:粗排觉得 A 比 B 好,把 A 送进精排;精排却觉得 B 比 A 好。可 B 早被粗排刷掉了,精排根本没机会见到它。这种"上下游打架"会让整个链路的效果打折。而蒸馏让粗排直接学精排的偏好,两者口径自然就一致了,送上去的候选,正是精排想要的。

踩坑记录
蒸馏不是"无脑让学生抄老师"就完事。有两个坑:一是老师自己也会错,如果精排模型本身有偏差(比如热门商品打分虚高),蒸馏会把这种偏差原封不动传给粗排,甚至放大。二是师生差距过大会"教不会"——精排几百维交叉特征,粗排可能只有几十维,强行对齐反而让学生学崩。实践中要给蒸馏 loss 配一个合适的权重,让学生"既听老师的,也信自己看到的标签"。

从 LightGBM 到 COLD 再到蒸馏,你看出这条线的逻辑了吗?它一直在回答同一个问题——怎么用更少的算力,逼近精排。树模型靠快,COLD 靠"算力可控的深度模型",蒸馏靠"直接拜师"。手段在变,目标始终如一。

粗排的进化史,就是一部"穷人怎么把日子过出富人质感"的奋斗史。


三、精排的特征交叉之争:DeepFM 与 DCN

现在轮到精排了。预算管够,该比拼真功夫了。精排的核心任务是 CTR 预估——预测用户点击这个候选的概率。而 CTR 预估这门手艺的胜负手,几十年都绕不开一个词:特征交叉

什么叫特征交叉?举个例子。"用户是女性"是一个特征,"商品是口红"是一个特征。单看这两个,信息有限。但"女性 × 口红"这个组合,点击率立刻飙升——这就是交叉特征的威力。真正决定点击的,往往不是单个特征,而是特征之间的组合

早年这些组合靠工程师手工设计,费时费力还容易漏。于是深度学习时代的精排模型,都在卷同一件事:怎么让模型自动、高效地学出有用的特征交叉。DeepFM 和 DCN,是这条路上两个最经典的答案。

DeepFM:低阶交叉和高阶交叉,我全都要

DeepFM 是华为 2017 年提出的,它的设计哲学是"既要又要"。

它把模型劈成两半,共享同一套特征 embedding:

稀疏特征输入 共享 Embedding 层 两边共用一套向量 FM 部分 二阶显式交叉 Deep 部分 高阶隐式交叉 加权求和 → CTR
DeepFM:FM 管低阶、Deep 管高阶,共享 embedding 一次训练两边受益

DeepFM 最聪明的地方,是这两部分共享 embedding。FM 学到的特征向量,Deep 直接拿来用,一次训练,两边都受益,还省掉了前辈 Wide&Deep 里"Wide 部分仍需人工设计特征"的麻烦。从此,CTR 预估真正进入了"端到端、免特征工程"的时代。

但 DeepFM 也留了个尾巴:它的显式交叉只到二阶就停了。三阶、四阶的显式交叉,全靠 Deep 部分那个"黑箱"去隐式地碰运气。能不能让显式的、可控的高阶交叉,也成为模型的一等公民?

DCN:让特征交叉像搭积木一样层层叠加

谷歌的 DCN(Deep & Cross Network)接住了这个问题。它保留了 Deep 部分,但把 DeepFM 的 FM 换成了一个更妙的设计——Cross Network(交叉网络)

Cross Network 的精髓在于:每加一层,特征交叉的阶数就自动加一。第一层学二阶交叉,第二层在第一层基础上再交叉一次变三阶,第三层变四阶……你想要几阶交叉,就叠几层,清清楚楚、明明白白。而且它用了一个巧妙的公式,让这种逐层交叉的参数量极小、计算极省。

关键区别
DeepFM 和 DCN 的分野,一句话:DeepFM 的显式交叉"封顶二阶",DCN 的显式交叉"层数即阶数,要多高有多高"。 打个比方:DeepFM 像一个只会算两数相乘的计算器,再复杂的组合就丢给旁边的"黑箱"去猜;DCN 则像一台能层层嵌套的运算器,每多按一次,就多算一层组合,而且每一步你都看得见。2020 年的升级版 DCN-V2 进一步增强了交叉网络的表达能力,成了很多大厂精排的主力骨架。

讲到这里,你可能发现 DeepFM 和 DCN 有个共同的隐含假设:它们都把用户当成一个"静态的特征集合"——性别、年龄、历史偏好,打包成一堆向量。可真实的用户,是有历史、有当下、会变心的

同一个用户,你给他推一台相机。如果他过去一周浏览的全是镜头、三脚架,这台相机的点击率应该很高;如果他最近全在看婴儿用品,这台相机大概率划走。同样的用户特征,面对不同的商品,该激活的兴趣完全不同。这件事,DeepFM 和 DCN 都没专门处理。

谁来补这个窟窿?DIN。


四、DIN:让模型学会"看人下菜碟"

DIN(Deep Interest Network,深度兴趣网络)是阿里 2018 年的作品,它解决的,正是上面那个"用户兴趣是动态的"问题。

在 DIN 之前,模型处理用户的历史行为(浏览过的、买过的商品),通常是简单粗暴地取个平均:把用户看过的 100 个商品的向量加起来除以 100,得到一个"用户兴趣向量"。这么做有个致命问题——它把用户压成了一个固定的画像。无论你给他推相机还是推奶粉,那个兴趣向量都一模一样。

DIN 说:这不对。用户的兴趣不是一个点,而是一片多元的兴趣分布。该激活哪一块,得看你要给他推什么。

它的做法,借用了 注意力机制(Attention)。当要预测用户对"相机"的点击率时,DIN 会拿"相机"这个目标,去和用户历史行为里的每一个商品做匹配:看过镜头?高度相关,权重拉满;看过奶粉?毫不相关,权重压到接近零。然后按这个权重,把历史行为加权求和。

目标商品:相机 镜头 权重 0.9 三脚架 权重 0.8 奶粉 权重 0.05 童装 权重 0.03 Attention 算相关性 动态兴趣向量 为"相机"量身定制
DIN:同一份历史行为,面对不同目标商品,激活出不同的兴趣表示

这一下,用户的兴趣向量就了。给他推相机时,镜头、三脚架的权重高,算出来的兴趣向量偏"摄影";给他推奶粉时,奶粉、童装的权重高,兴趣向量偏"育儿"。同一个用户,同一份历史,模型却能根据当前商品,看人下菜碟。

insider 视角
DIN 的意义远不止"涨了几个点的 AUC"。它把"用户表示应该随上下文动态变化"这个理念,第一次扎扎实实落进了工业级 CTR 模型。后面的 DIEN(加入兴趣的时间演化)、SIM(超长行为序列建模),乃至今天动辄建模上千条行为的序列模型,都是顺着 DIN 这条路走下去的。可以说,DIN 是"用户行为序列建模"这整个大流派的开山之作。

到这里,精排已经会做复杂的特征交叉(DeepFM/DCN),也会动态捕捉用户兴趣(DIN)了。看起来很完美?但还有最后一个,也是最贴近业务现实的难题没解决——

到现在为止,我们聊的所有模型,都只预测一件事:点击率。可一个真实的业务,真的只关心点击吗?


五、MMOE:同时优化点击、转化、时长

想象你是电商平台的算法负责人。老板说:我要 GMV(成交额)。可成交,是用户点击 → 浏览详情 → 加购 → 下单一连串行为的终点。你只优化点击率,会发生什么?

模型学精了,专门给你推"标题党"——点击率爆高,但点进去全是劣质商品,没人买。点击率涨了,成交反而跌了。这就是只优化单一目标的陷阱。

真实业务要的,是同时优化一堆目标:点击率(CTR)、转化率(CVR)、停留时长、收藏、分享……这些目标之间,有的正相关,有的甚至打架。怎么用一个模型,同时把它们都照顾好?这就是多任务学习要解决的问题,而 MMOE 是其中的里程碑。

最朴素的多任务做法,叫 Shared-Bottom:底层网络共享,上面给每个任务接一个"塔"。这有个老大难问题——跷跷板效应。底层被所有任务共用,当两个任务的诉求冲突时(比如"提升点击"和"提升转化"拉扯方向不一致),共享底层就会左右为难,顾此失彼,按下葫芦浮起瓢。

谷歌 2018 年的 MMOE(Multi-gate Mixture-of-Experts,多门控混合专家)给出了一个优雅的解法。它干了两件事:

共享输入 专家 1 专家 2 专家 3 任务塔 A:CTR Gate A 决定听谁 任务塔 B:CVR Gate B 决定听谁
MMOE:多个专家共享,每个任务用自己的门控,按需挑选专家组合

这个"多门控"的设计是点睛之笔。它让任务之间既能共享(都用同一批专家,知识互通),又能解耦(每个任务用自己的门控,挑出最适合自己的专家组合,不再被冲突的任务硬拽)。跷跷板效应大大缓解。

踩坑记录
MMOE 不是万能药。当任务之间相关性很低、甚至强冲突时,共享专家依然会力不从心——后来的 PLE(Progressive Layered Extraction)就是专门给每个任务再配上"私有专家"来进一步解耦的。另外,多目标的分数最终要融合成一个排序分(常用形如 CTR^α × CVR^β × 时长^γ 的加权乘式),这几个权重怎么调,是门玄学,直接影响线上是冲 GMV 还是冲活跃,往往比模型结构本身更影响业务结果。

从 DeepFM 到 MMOE,精排走完了一条很完整的路:先解决"怎么把特征学透"(交叉),再解决"怎么把用户看准"(兴趣),最后解决"怎么把业务目标对齐"(多任务)。每一步,都是往"更懂业务"的方向上迈。

精排的终局,从来不是预测得多准,而是和业务的真实目标对得多齐。


六、总结:排序是一场"精度与算力"的永恒谈判

我们从一个"ORDER BY score DESC"的天真问题出发,钻进了排序阶段的引擎舱。现在把这七种武器串起来,你会看到两条清晰的进化线:

我的判断:这两条线的底层,其实是同一场谈判——精度和算力的谈判。粗排是"算力出价低,精度尽量谈高";精排是"算力管够,精度往死里榨"。理解了这场谈判,你就不会再把这七个模型当七个孤立的名词背,而是能看懂每一个新模型出现时,它到底在这张谈判桌上,为哪一方多争取了一点筹码。

大胆预测两件事,给自己立个 flag:

第一,到 2027 年,粗排和精排的边界会进一步模糊。随着推理加速和模型轻量化技术成熟,"一个统一的大模型 + 不同精度的推理路径"会越来越多地取代"两个独立训练的模型"。蒸馏只是个开始,终点是粗精排共享同一套底座。

第二,生成式推荐(Generative Recommendation)会从精排往整条链路渗透。今天我们还在用 DeepFM、DIN 这套"判别式打分"的范式,但把用户历史当成序列、用类 LLM 的方式直接"生成"下一个该推什么的思路,已经在头部公司跑出了效果。两三年后回来看,今天这七种武器,可能会被重新洗一遍牌。

半年到一年后,回来看看我这两个预测,对不对。

但无论范式怎么变,有一件事不会变:排序的本质,永远是在算力的镣铐下跳舞——谁能用同样的算力榨出更高的精度,谁就赢。