你以为你在刷抖音?其实是抖音在"刷"你。
每一秒的滑动、每一次的停留,都被折叠成高维空间里的一个数字,然后被疯狂计算。
今天,我们从算法工程师的视角,拆解一个视频是如何跨越千万级候选池,最终精准地出现在你眼前的。
一、全景图:从 1000 万到 1 的淘汰赛
抖音推荐系统本质上是一个超大规模的个性化匹配引擎。它的核心思想可以概括为一句话:
把用户和视频都映射到同一个高维语义空间,然后用向量夹角衡量"缘分"。
整个流程是一个四层漏斗的精密筛选机制:
| 层级 | 名称 | 输入量 | 输出量 | 核心任务 |
|---|---|---|---|---|
| 第一层 | 召回 | 1000 万条视频 | 1000 条 | 双塔模型 + ANN 快速匹配 |
| 第二层 | 粗排 | 1000 条 | 300 条 | 轻量模型初筛 |
| 第三层 | 精排 | 300 条 | 几十条 | 多目标深度网络预测 |
| 第四层 | 重排 | 几十条 | 10~20 条 | 多样性打散 + Explore 插队 |
从千万级到个位数,整个过程在毫秒级完成。这就是"千人千面"的技术底气。
二、多模态解构:视频如何变成 512 维向量
视频不是结构化数据,它是一堆像素、声音和文字的混合体。要让计算机"理解"视频,首先要把它向量化——变成一组固定长度的浮点数数组。
抖音采用的是 512 维向量(实际生产中可能更高或灵活,但 512 是经典维度)。这个向量不是凭空来的,而是通过多模态大模型从三个维度提取语义:
2.1 视觉特征:Vision Transformer 逐帧"看"视频
抖音使用 Vision Transformer (ViT) 作为骨干网络,对视频的关键帧进行编码:
- 画面内容识别:能认出是一只猫、一个程序员在写代码、一个寝室围着看世界杯
- 场景语义理解:识别办公室、宿舍、球场等场景
- 动作动态捕捉:通过帧间时序建模,捕捉跳舞的节奏、运动的激烈程度
- 情绪基调推断:通过色彩分布、光影对比,判断温暖治愈还是冷酷硬核
ViT 将每帧图像切割成小块(patch),通过自注意力机制捕捉全局关系,最终输出高维视觉特征向量。
举个例子:一个视频里,程序员在深夜敲代码,屏幕反光映在眼镜上。视觉模型会提取到"人""电脑""深夜""眼镜反光"等特征,映射到向量中某些维度的激活值。
2.2 音频特征:从声音中提取"潜台词"
抖音的音频处理链路同样精密:
- ASR(自动语音识别):把配音、对话转成文本
- NLP 语义分析:理解文本的情感倾向、主题分类
- 音频特征提取:分析 BGM 节奏、音高、声音大小、情绪起伏
值得一提的是,抖音的音频理解能力部分源自 Musical.ly 时期积累的音乐推荐技术。当一段视频配上特定的 BGM,算法不仅"听"到了音乐,还"懂"到了视频的氛围。
2.3 文本特征:NLP 语义理解
从 ASR 得到的文本,以及视频标题、话题标签、评论区高频词,都会被输入到 BERT 类语言模型中,提取出主题、情感极性、实体词(如"世界杯""梅西""露营")。
2.4 向量化:视频的"数字身份证"
最终,以上三个模态的特征经过跨模态融合层(交叉注意力机制),压缩成一个 512 维的稠密向量:
[
0.85, // 科技
0.72, // 极客
0.05, // 幽默
0.03, // 西语
... // 共 512 个维度
]
这个向量就是视频的"数字身份证"——它不再是像素或音频,而是语义空间中的一个点。
三、双塔模型:千人千面的数学本质
3.1 双塔架构:两座塔,一座理解你,一座理解内容
用户塔 视频塔
↑ ↑
┌─────────┐ ┌─────────┐
│ 用户行为 │ │ 视频内容 │
│ 历史偏好 │ ── 点积运算 ──→ │ 512维向量│
│ 实时交互 │ Cosine │ 多模态特征│
└─────────┘ 相似度 └─────────┘
↓ ↓
用户向量 · 视频向量 = 相似度分数
- 用户塔:输入你的用户画像(年龄、性别、历史观看序列、长期兴趣标签),输出一个 512 维的用户向量
- 视频塔:输入视频的 512 维特征向量(多模态模型产出)
- 点积运算 / Cosine 相似度:计算两个向量的匹配程度
Cosine 相似度的公式:
cos(θ) = (A · B) / (||A|| × ||B||)
当夹角越小时,Cosine 值越接近 1,表示用户和视频越匹配。
数学直觉:两个向量的夹角余弦值越接近 1(即夹角接近 0°),说明它们在语义空间中的方向一致。比如,喜欢"科技+幽默"的用户向量,会与同样富含"科技+幽默"语义的视频向量产生高内积。
3.2 召回:从 1000 万到 1000 的闪电战
双塔模型的核心优势是计算效率。用户向量只需计算一次,然后与数百万视频向量进行批量点积运算。
通过 ANN(近似最近邻)索引(如 Faiss),可以在毫秒级完成千万级视频的筛选,快速检索出相似度最高的前 1000 条。
3.3 为什么是 512 维?点积为什么能代表"喜好"?
- 维度选择:512 是工程与效果的平衡点。维度太低,语义表达能力不够;维度太高,存储和计算成本剧增。实际中,YouTube、TikTok 等都会采用 256~1024 之间的维度。
- 点积的物理意义:点积可以看作两个向量在方向上的"一致性"度量。训练时,通过对比学习(如 InfoNCE Loss)让匹配的用户-视频对点积尽可能大,不匹配的对尽可能小。
- 为什么能泛化:因为向量是语义的压缩表示,即使你从没看过某个视频,只要它的向量与你的用户向量相似度高,系统就会认为你很可能喜欢。这解决了冷启动和长尾内容的推荐难题。
四、推荐漏斗的后三层:粗排、精排、重排
4.1 粗排:轻量级模型的快速过滤
从 1000 条筛选到 300 条,使用相对轻量的机器学习模型(如简单的 DNN 或 GBDT),计算一些粗粒度的内部特征。
这个阶段会引入一些基础业务指标的预估:点击率(CTR)的粗略估计、完播率的粗略估计。粗排不用太精确,只要能把明显不相关的再筛掉一波即可。
4.2 精排:多目标预测的"决策层"
这是整个漏斗中最关键的一环。精排模型是一个多任务学习网络(MMoE 或 PLE),它会同时预测多个用户行为概率:
Score = w1×点击率 × w2×完播率 × w3×点赞率 × w4×评论率 × w5×分享率
每个权重 w 都是经过大量 A/B 测试调优的,不同阶段可能动态调整:
- 抖音:完播率权重极高,因为短视频的核心是"看完"
- B 站:三连(点赞、投币、收藏)权重更高,强调社区互动
- YouTube:观看时长权重最高,因为长视频平台追求总时长
精排模型会从 300 条中选出最有可能让你产生互动的 Top 50,送进最后一层。
4.3 重排:Explore vs Exploit 的艺术
即使精排选出了 50 个"最高分"视频,直接按分数降序推给你也未必是最佳体验。重排阶段会做两件事:
多样性打散
利用视频的类别标签、作者 ID、内容风格,确保推送序列中不会连续出现过于相似的内容。比如每两个科技视频之间,强制插入一个娱乐或生活类视频。这背后通常用 MMR(最大边际相关性) 或 DPP(行列式点过程) 算法,在分数和多样性之间做平衡。
Explore vs Exploit
- Exploit(利用):80% 推送已知爱好,让你爽
- Explore(探索):20% 试探潜在兴趣,防止信息茧房
这个 8:2 的比例不是固定的,而是根据你的"新鲜感需求"动态调整。新用户 Explore 比例更高,老用户 Exploit 比例更高。
你多看了 3 秒野外求生?一个全新的兴趣标签被默默记录。这就是"刷着刷着就停不下来"的秘密。
五、用户画像:不只是"标签",更是动态向量
传统推荐系统用离散标签(唱跳、NBA、新闻)描述用户。但在现代推荐系统中,用户画像早已升级为动态向量(即用户塔的输出)。
这个向量会随着你每一次的观看、点赞、评论而实时更新(在线学习):
| 行为 | 信号强度 | 影响 | 响应速度 |
|---|---|---|---|
| 快速滑过(<1秒) | 弱 | 降低该类型权重 | 实时 |
| 完播 | 中 | 提升该类型权重 | 实时 |
| 点赞 | 强 | 大幅提升权重 | 实时 |
| 评论/分享 | 极强 | 该类型进入核心画像 | 实时 |
| 关注 | 最强 | 长期锁定该类型 | 分钟级 |
比如你刚看完一个"梅西世界杯集锦",用户向量会短暂地向"足球""高光时刻"方向偏移。第二天你又刷了很多"编程教学",向量又会向"科技""代码"方向移动。
所以,抖音推荐不是一成不变的,它每时每刻都在追踪你的兴趣漂移。
六、端到端案例:一个视频的"推荐之旅"
假设你是一个 25 岁的男性,平时喜欢看篮球、科技测评、搞笑段子。现在有一个新视频上传,内容是一个程序员用 Python 爬取 NBA 数据并做可视化分析。
第一步:多模态解构
- 视觉:识别到电脑屏幕、代码、篮球图表
- 音频:ASR 识别出"爬虫""Matplotlib""詹姆斯"等词
- 融合后生成 512 维向量,其中"科技"维度激活 0.9,"篮球"维度激活 0.7
第二步:召回 你的用户向量在"科技"和"篮球"维度也有高激活。点积计算后,这个视频进入你的候选池(1000 条内)。
第三步:粗排 + 精排 模型预测你对它的点击概率很高,完播概率也不错(因为契合双重兴趣),加权得分进入 Top 50。
第四步:重排 你刚看过一个纯篮球集锦,为了避免重复,系统把这个"科技+篮球"混搭视频插入到两个搞笑视频之间,最终出现在你第 7 个位置。
第五步:你刷到了它 停留了 15 秒,点了赞,还评论了一句"代码能分享吗?"这个行为立即反馈回系统,你的用户向量被更新,未来类似的"交叉领域"内容会获得更高权重。
七、反向利用算法:三招夺回主动权
7.1 主动训练:"投喂"正确信号
搜索并完播你想看的内容,主动"投喂"正确信号。算法会迅速调整你的画像。
实操技巧:
- 搜索关键词后,完播前 3 个视频
- 给目标类型的视频点赞+评论
- 关注该领域的优质创作者
7.2 清理负向信号:打破"误推荐"
长按视频选"不感兴趣",比单纯滑走更有力。这个按钮绝对有用,它更像"减分项"而不是"屏蔽词"——只要同一个类目下你连续点过 3~5 次"不感兴趣",系统就会把这个大类标签从你的候选池里彻底拉黑。
实操技巧:
- 对误推荐视频,长按→"不感兴趣"→选择原因(如"内容重复""不喜欢此类")
- 每季度清理一次关注列表
7.3 利用 Explore 机制:主动探索新领域
刻意停留在新领域视频上,触发 20% 的探索配额。这是打破信息茧房最有效的办法。
实操技巧:
- 每天刻意看 2-3 个新领域视频(如科技博主看美食、游戏博主看历史)
- 完播+点赞新领域视频,加速画像更新
- 使用搜索功能主动探索,而非被动等待推荐
八、写在最后:算法的最终解释权
抖音推荐系统的本质,是高维空间中的最近邻搜索。
每个用户是一个点,每个视频是一个点,推荐就是找离你最近的那些点。Cosine 相似度是距离,双塔模型是加速器,Explore-Exploit 是平衡艺术。
但别忘了:
算法的最终解释权,在你每一次的指尖滑动里。
因为向量不是冷冰冰的数字,它是人类兴趣的数学投影;而推荐漏斗,则是效率与体验的优雅博弈。
理解这套逻辑,你不仅能看懂抖音,更能理解今天所有内容平台的推荐引擎——从 B 站到小红书,从 YouTube 到 TikTok,底层都是同一套数学。
下次刷抖音时,不妨想一想:此刻,又有一个 512 维的向量,正在为你而跳动。
本文基于公开资料整理,核心算法原理参考 Google 双塔模型、Meta 推荐系统论文及行业技术分享。