提示

返回博客列表

抖音为什么总知道你爱看什么?短视频推荐算法的技术内幕

抖音为什么总知道你爱看什么?短视频推荐算法的技术内幕

你刚在抖音上搜了一下"露营装备",接下来三天你的推荐页全是帐篷、睡袋、户外炉具。你不禁想:它怎么知道我在想什么?其实推荐系统不是什么读心术,而是一套数学驱动的工业流水线——召回、排序、重排,三大环节环环相扣。这篇文章把短视频平台的推荐算法从原理到工程实现拆开来讲:协同过滤怎么找"和你相似的人",深度学习怎么预测你会不会看完这个视频,以及为什么你越刷越停不下来。

TL;DR:推荐系统 = 召回(从海量视频中筛出几百个候选)+ 排序(用深度学习模型预估你对每个候选的点击率/完播率)+ 重排(打散同类内容、插入广告、去重)。核心数据不是你的搜索记录,而是你的"行为序列"——看了哪些视频、看了多久、点赞了谁、划过什么。这些数据构成了你的用户向量,和视频向量做相似度计算,就是你看到的内容。

目录

一、推荐系统的三阶段架构

当你打开抖音,服务器要在毫秒级时间内,从几十亿个视频中选出最可能让你停留的几个。这个量级下,不可能对每个视频都跑一遍深度学习模型——太慢了。

所以推荐系统采用漏斗架构:

                    几十亿个视频
                         │
         ┌───────────────▼───────────────┐
         │        召回(Recall)          │
         │  多路召回策略,粗筛           │
         │  从 10 亿 → 几千个候选        │
         └───────────────┬───────────────┘
                         │
         ┌───────────────▼───────────────┐
         │        排序(Ranking)         │
         │  深度学习模型,精排打分       │
         │  从几千个 → 几百个候选        │
         └───────────────┬───────────────┘
                         │
         ┌───────────────▼───────────────┐
         │        重排(Re-ranking)      │
         │  打散、去重、插入广告         │
         │  最终呈现 10-20 个结果        │
         └───────────────────────────────┘

每个阶段追求的目标不同:

阶段 核心目标 模型复杂度 候选数量级
召回 快,宁可多召回不能漏掉 简单(向量内积) 10亿 → 5000
排序 准,精准预估用户行为 复杂(深度神经网络) 5000 → 500
重排 多样性,避免内容疲劳 规则+轻量模型 500 → 20

二、召回:从亿万视频中找到几百个候选

召回的核心思想是"用简单的模型快速过滤"。一个视频能被你看到,通常经过了多路召回策略的共同作用:

2.1 协同过滤(Collaborative Filtering)

思路:找到和你行为相似的用户,把他们喜欢的内容推荐给你

用户A:看了视频1、2、3,点赞了视频4
用户B:看了视频1、2、3,点赞了视频5
→ A和B的行为模式相似
→ 把视频5推荐给A,把视频4推荐给B

实现上,所有用户和视频被表示成向量(Embedding)。向量的训练目标很简单:如果一个用户看了某个视频,它们的向量就应该在空间里挨得近。

# 简化的 Embedding 训练逻辑
# 实际工业实现用 TensorFlow/PyTorch + 分布式训练

import torch
import torch.nn as nn

class RecallModel(nn.Module):
    """双塔召回模型——用户塔 + 视频塔"""
    def __init__(self, user_feature_dim, item_feature_dim, embedding_dim=128):
        super().__init__()
        self.user_tower = nn.Sequential(
            nn.Linear(user_feature_dim, 256),
            nn.ReLU(),
            nn.Linear(256, embedding_dim),
        )
        self.item_tower = nn.Sequential(
            nn.Linear(item_feature_dim, 256),
            nn.ReLU(),
            nn.Linear(256, embedding_dim),
        )

    def forward(self, user_features, item_features):
        # 用户向量和视频向量做内积 = 相似度分数
        user_vec = self.user_tower(user_features)
        item_vec = self.item_tower(item_features)
        return (user_vec * item_vec).sum(dim=1)

实际线上召回时,把用户向量和几亿个视频向量做最近邻搜索。ANN(近似最近邻)库如 Faiss 可以在毫秒级完成这个操作。

2.2 多路召回策略

单一召回策略不够,实际系统会并行跑多路:

召回通道 1:协同过滤   → "和你相似的人也喜欢"
召回通道 2:内容标签   → "都是露营类视频"
召回通道 3:热门视频   → "全网都在看"
召回通道 4:关注作者   → "你关注的 up 主更新了"
召回通道 5:地理位置   → "同城的视频"
召回通道 6:实时热点   → "现在最火的挑战/话题"
召回通道 7:探索兴趣   → "你没看过但可能感兴趣的新领域"

每条通道召回几百个候选,合并后去重,进入排序阶段。

三、排序:深度学习模型在打分什么

3.1 多目标优化

排序模型不是简单地预测"你会不会点击"。它同时优化多个目标:

目标 1:点击率(CTR)       → 你会不会点进来看?
目标 2:完播率               → 你会不会看完?
目标 3:点赞率               → 你会不会点赞?
目标 4:评论率               → 你会不会评论?
目标 5:转发率               → 你会不会分享?
目标 6:关注率               → 你会不会关注这个作者?
目标 7:停留时长             → 你会在这个视频上停留多久?

最终分数是这些目标的加权组合。不同的平台有不同的侧重点

抖音:停留时长权重最高(让你刷得停不下来)
B 站:完播率 + 点赞率(鼓励高质量内容)
YouTube:观看时长 + 点击率(长视频生态)
快手:互动率(评论 + 分享,社交属性强)

3.2 模型输入的特征

排序模型吃进去的特征远比你想的多:

用户侧特征:
  - 年龄、性别、地域
  - 近 30 天的观看历史(视频 ID 序列)
  - 近 7 天的互动行为(点赞/评论/分享序列)
  - 活跃时段(你是夜猫子还是早起党)
  - 设备型号、网络环境(WiFi/4G/5G)

视频侧特征:
  - 视频时长、分辨率、码率
  - 作者的历史表现(粉丝数、平均完播率)
  - 视频的标签和分类
  - 标题和封面的文本特征
  - 发布时间(新鲜度)

上下文特征:
  - 当前时间(工作日晚上 vs 周末早上)
  - 你刷了多少个视频了(session 内的位置)
  - 上一个视频的类型(避免连续推荐同类)

3.3 模型架构演进

第一代:逻辑回归(LR)
  → 简单线性组合,可解释性强,但表达能力有限

第二代:FM/FFM(因子分解机)
  → 引入特征交叉,比 LR 效果好很多

第三代:Wide & Deep
  → Wide 部分记忆历史,Deep 部分泛化新内容
  → Google Play 2016 年提出,工业界广泛使用

第四代:DIN/DIEN(深度兴趣网络)
  → 引入 Attention 机制,关注用户行为序列中"相关"的部分
  → 阿里 2018 年提出,抖音/快手的核心模型

第五代:多任务学习(MMOE/PLE)
  → 同时优化多个目标,不同目标共享底层特征
  → 当前主流方案

四、重排:为什么刷不到同一类视频

排序模型打分后,直接按分数排列会导致一个问题:你可能连续刷到 5 个露营视频——虽然每个分数都很高,但你会觉得内容单一、无聊。

重排阶段解决这个问题:

4.1 打散(Diversification)

排序前:[露营视频1, 露营视频2, 露营视频3, 美食视频1, 旅游视频1]

打散后:[露营视频1, 美食视频1, 露营视频2, 旅游视频1, 露营视频3]

打散策略保证同类内容不会连续出现超过 N 条(通常 N=2)。

4.2 广告插入

在重排阶段,广告系统会竞争推荐位。广告的出价(CPM)× 预估点击率 = eCPM,和自然内容的推荐分数比较,高的排前面。

4.3 冷启动扶持

新发布的视频、新注册的作者,排序分数天然低(没有历史数据)。重排阶段会给予一定的流量扶持——随机插入到推荐流中,收集初始数据。

五、冷启动:新视频和新用户怎么破局

5.1 新视频的冷启动

一个新视频发布后,平台会把它推给一个小的"种子用户群"(通常几百到几千人)。根据这些用户的行为反馈(完播率、点赞率、互动率),决定是否扩大推荐范围。

第一轮:推给 500 人 → 完播率 40% → 数据一般
第二轮:推给 2000 人 → 完播率 35% → 数据下降
→ 停止推荐,视频进入"长尾"

或者:
第一轮:推给 500 人 → 完播率 65% → 数据不错
第二轮:推给 5000 人 → 完播率 60% → 持续优秀
第三轮:推给 5 万人 → ... → 成为爆款

这就是为什么你偶尔会刷到"0 赞 0 评论"的视频——平台在给它机会。

5.2 新用户的冷启动

新用户没有历史行为数据,推荐系统无从下手。所以抖音首次打开会让你选兴趣标签。之后的前 20-30 次滑动,系统在快速试探——给你推送各种不同类型的内容,观察你的反应。

前 10 条:随机热门内容(建立基线)
第 10-30 条:探索性推荐(测试你对各类型的兴趣)
第 30 条后:个性化推荐(基于前 30 条的反馈)

六、推荐系统对视频下载的影响

推荐系统直接影响你"能下载到什么":

第一,去水印下载被限制。 推荐算法喜欢"新鲜内容",所以平台会鼓励原创。而下载工具获取的水印版/无水印版视频,很多时候是同一个 CDN 文件的不同 URL 参数。平台通过推荐系统引导用户消费内容,同时通过 DRM/水印机制保护内容不被批量下载。

第二,热门视频更容易被下载工具收录。 下载工具通常从热门推荐流中抓取视频 ID。推荐系统决定了哪些视频"热门",间接决定了你能下载到的内容范围。

第三,长尾视频难以下载。 推荐系统不给流量的视频,下载工具也很难发现。这就是为什么你能轻易下载到百万播放的爆款视频,却很难找到某个小众 up 主的冷门作品。

七、合规与温馨提示

  • 推荐算法是各平台的核心商业机密,本文内容基于公开论文和行业通用实践,不代表任何特定平台的实现
  • 理解推荐算法有助于你更好地使用平台,但不应被用于操纵推荐结果(刷量、刷赞等)
  • 更多讨论见 下载视频算侵权吗?聊聊个人备份与版权的那条线

推荐系统的本质,就是把"你可能想看什么"这个模糊的问题,变成了一个可以优化的数学函数。每一次滑动、每一次停留、每一次点赞,都在为这个函数提供新的训练数据。你刷得越多,它越懂你——这不一定是坏事,但值得你知道背后的原理。

本文由 VidDown 技术博客原创发布。VidDown 支持 30+ 平台的视频下载,不管推荐算法怎么推,你都能把喜欢的视频保存到本地。访问 VidDown 了解更多。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部