ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TikTok推荐算法协议拆解:从多路召回到冷启动的核心机制

TikTok推荐算法协议拆解:从多路召回到冷启动的核心机制 先交代一个前提这篇文章只讨论推荐系统技术本身不涉及任何平台访问方式、内容获取渠道之类的事情。我研究推荐算法有些年头了这两年陆陆续续拆过不少短视频平台的推荐链路TikTok这套系统是绕不开的研究样本。它的算法不是秘密但整个系统设计思路非常值得学习。标题里的协议这两个字其实挺有意思——很多人一听协议就想到网络协议但放到算法语境里它更像是一套规则约定数据怎么组织、特征怎么传递、模型怎么配合这一整套协作机制才是真正值得研究的东西。1. 把协议从网络协议里拆出来算法研究到底在研究什么先说清楚一个容易混淆的点。你在网上搜TikTok算法协议能搜到两种东西一种是网络层的传输协议比如客户端和服务器之间怎么通信、用了什么加密方式另一种是推荐算法内部的约定规则——特征怎么定义、样本怎么构造、模型之间怎么衔接。我后面要讲的完全是第二种也就是推荐系统内部的这套协作机制。为什么要强调这个区分因为很多人一上来就扎进抓包、逆向、协议分析折腾半天拿到一堆加密字段最后还是看不懂推荐逻辑。原因很简单推荐系统的核心逻辑根本不在传输层而在特征和模型这一层。就算你把每个字节都解析清楚了看到的也只是视频ID、用户ID、行为类型这些原始数据这些数据怎么变成你刷到的内容是模型内部的事情。真正意义上的算法协议研究在我看来包含这么几个层次数据协议用户行为、视频内容、上下文环境这三类数据各自用什么结构组织哪些字段参与计算模型协议召回、粗排、精排、重排这几个模块之间的输入输出接口以及每个模块内部的模型结构目标协议平台优化什么指标、用什么公式计算收益、怎么平衡短期互动和长期留存反馈协议用户刷视频产生的行为如何回传、如何处理形成下一轮推荐的输入把这四层拆开看TikTok的推荐系统其实就是一台精密的行为预测机器。它的输入是你过去的每一次滑动、每一条观看时长、每一次点赞评论输出是你下一个5秒钟会不会停下来、会不会看完、会不会互动。我经常拿一个类比来解释这套系统它就像一个非常了解你的老友你们一起看了几百部电影他大概知道你喜欢什么类型、通常会在什么节点走神、对什么桥段没有抵抗力。推荐算法做的事和这个老友差不多只不过它用数学模型来刻画你的偏好而不是靠直觉。有了这个整体认知再往下拆细节就有章法了。2. 内容池的分层召回阶段的多路策略与数据组织推荐系统面对的第一个问题是内容太多了。每秒上传的新视频成千上万条总库存的视频数量是一个天文数字任何模型都没办法把全量视频都算一遍分数。所以第一步一定是召回——从海量内容里快速捞出一批候选集可能是几百到几千条然后再交给更精细的模型去排序。2.1 多路召回的设计逻辑为什么不靠单一策略召回阶段典型的做法是多路并行每一路用不同的策略从不同角度找你可能感兴趣的内容。TikTok的召回路数大致可以分为这几类兴趣召回根据你历史观看过的视频找到特征相似的其他视频。具体的实现方式包括向量召回把视频和用户都映射成向量找空间里距离近的、倒排索引通过标签、关键词等离散特征直接匹配社交召回你关注的账号、你互动过的用户这些人发布的新内容优先进入候选池热门召回全站播放量高、完播率好的头部内容给新用户和冷门兴趣用户保底地理位置召回同城、同语言、同文化背景的内容降低理解成本探索召回故意加入一些和你现有兴趣不完全匹配的内容用来试探你的兴趣边界每路召回的数量一般限制在几百条以内各路加起来形成候选集。这个设计背后有一个工程上的必然性任何一路策略单独拿出来都有明显的盲区。纯兴趣召回的问题在于信息茧房你只会看到越来越窄的内容纯热门召回的问题在于没有个性每个人的推荐结果都一样纯社交召回的问题在于覆盖面太小你关注的账号内容产量有限。多路召回本质上是一个风险对冲的工程思路——每路负责解决一个维度的问题再靠后面的排序模型统一打分权衡。2.2 向量召回的核心原理与工程细节多路召回里向量召回是目前信息密度最高的一路。它的核心思路是用模型把每个视频编码成一个高维向量embedding语义相近的内容在向量空间里距离也近。用户侧用历史行为向量做聚合得到用户向量然后在这个空间里做最近邻搜索。这里有一个特别关键的工程细节向量召回用的embedding必须是召回专用的不能直接拿精排模型的embedding来用。原因是两个阶段的目标不同精排模型优化的是点击率完播率这类具体指标的预测精度它需要的是尽量准确的数值预测召回模型优化的是候选集覆盖率它需要的是把相关内容定位到一个紧凑的空间里。你可以这样理解两者的区别精排模型像一个严格的面试官要精确判断每个候选人值多少分召回模型像一个海选HR要快速圈定一批值得进入下一轮面试的人。两者的筛选标准不同所以特征设计、损失函数、训练方式都不一样。具体到工程实现向量召回有一个痛点每天新增的视频要变成向量需要实时或准实时地过一遍编码模型用户的行为变了用户向量也要跟着变。这一整套流程做下来涉及特征平台、模型服务、向量检索引擎的协作复杂度相当高。这也是为什么很多中小平台做不好推荐——不是模型水平差而是工程链路跑不通。2.3 召回阶段的数据组织标签体系和内容理解召回能不能做好很大程度取决于内容理解层做得怎么样。TikTok在内容理解上投入非常大视频发布后会有多模态模型自动打标签画面里有什么物体、什么场景语音说的是什么内容字幕写了什么背景音乐是什么风格封面有没有套路感。这些标签构成视频的结构化描述是各路召回策略的燃料。我拆过一些公开的技术分享发现他们在标签体系上有一个设计值得借鉴标签是有层级的。一级标签是粗粒度品类搞笑、美食、健身、美妆、游戏……二级标签开始细分健身下面能分减脂、增肌、瑜伽、居家徒手……三级标签接近具体的概念或场景。召回阶段用粗粒度标签保证覆盖面排序阶段用细粒度特征做精准预测层级设计让同一个标签体系服务不同阶段的需求。这里其实藏着一个新人容易忽视的点推荐系统的质量天花板很多时候不是由模型决定的而是由内容理解的深度决定的。模型再厉害也只能在已有特征的基础上做预测。如果内容标签打得不准视频的语义信息没有提取出来那召回和排序都无从谈起。所以在做类似系统时内容理解层值得投入最多的资源。3. 精排模型的工作逻辑从特征到分数的完整计算链路召回圈定了候选集之后接下来是精排阶段。精排模型的任务是对候选集里的每一条视频预测你在看到它之后可能产生的行为概率点击概率、完播概率、点赞概率、评论概率、转发概率、关注概率……然后把这一堆概率按一定规则加权合并成一个综合分数按分数降序排列取前N个给到重排模块。3.1 特征体系的三个维度用户、视频、上下文精排模型的特征体系大致可以分为三个维度。理解这三个维度是理解为什么推荐结果看起来这么懂你的关键。第一个维度是用户特征。包括静态属性年龄、性别、地域、语言、长期兴趣历史行为的聚合向量、短期意图最近10分钟内的行为序列。短期意图这个特征特别值钱因为人的兴趣是流动的——你可能前半小时在刷美食教程后半小时想看看宠物视频。系统通过短期行为感知到你当前的兴奋点实时调整推荐方向。第二个维度是视频特征。包括内容标签、作者信息、视频的文本描述、音频特征、视觉特征、历史表现数据过去一段时间的完播率、互动率等。这里有一个细节视频的历史表现数据是动态更新的一个视频刚发布时的表现和发布24小时后的表现计算出来的特征值完全不同。模型需要对这个时间衰减做专门处理否则刚发布的高质量视频很容易被低估。第三个维度是上下文特征。包括当前时间晚上刷到的内容和上午刷到的内容倾向不一样、网络环境、设备类型、手机横竖屏状态等。这些特征看起来不起眼但对预测精度有实打实的提升。比如深夜时段用户对轻松的、解压的内容接受度更高竖屏视频在手机上天然比横屏视频获得的完播率高——这不是内容质量问题是物理形态决定了用户体验模型需要学会把这些因素剥离出去或利用起来。3.2 模型结构的演进从LR到多目标多任务精排模型的模型结构这几年走过了一条清晰的演进路线。早期业界普遍用的是LR逻辑回归特征是人工设计的大规模稀疏特征模型简单、可解释性强但表达能力有限。后来进化到GBDT、XGBoost这类树模型能自动发现特征之间的非线性交互关系。再往后深度学习成为主流——DNN、WideDeep、DeepFM、DIN、MMoE……一路迭代到今天。TikTok这类短视频平台的精排模型有一个特点它必须做多目标优化。原因很直接一个视频让人看了5秒钟就划走和一个视频让人看完30秒并且点赞这两者背后的用户满意度和平台收益完全不同。单目标模型只预测点击率或只预测完播率很难刻画这种差异。多目标模型的一个经典结构是MMoEMulti-gate Mixture-of-Experts底层用几个共享的专家网络提取通用特征上层每个目标各接一个门控网络通过门控权重控制不同目标各自侧重哪些专家输出。这样做的好处是不同任务既能共享底层信息又保留了各自任务的特殊性比完全共享参数的硬参数共享效果好很多。还有一个值得关注的设计模型的预测目标不是死亡率意义上的发生概率而是期望时长或期望互动价值。具体来说模型会预测这个视频能让你停留多少秒然后用预估时长乘上预估互动价值得到综合分。这种设计的巧妙之处在于它把吸引注意力这个指标直接量化为可优化的目标——你多看的每一秒都在给系统提供训练信号。3.3 损失函数与样本权重的细节设计精排模型的训练过程里有一个常常被忽略但非常重要的细节样本权重的设计。短视频场景下用户的每次曝光和每次行为都是训练样本但不同样本的价值完全不同。举个例子你完整看完了一个60秒的视频这个行为告诉你我非常喜欢这个内容是一个正样本你刷到一条视频0.3秒就划走了这个行为告诉你我对这个内容完全不感兴趣是一个负样本。如果把这两种样本等权对待模型会被海量负样本淹没对正反馈的捕捉不够灵敏。TikTok的解法是把持续观看时长作为样本权重。观看时长越长的样本在训练中占的权重越大。这样极短的划走行为在训练中被弱化因为占比太高全部强化反而让模型过于保守持续观看和主动互动的行为被强化模型的学习重心自然偏向用户真正喜欢什么而不是用户快速跳过了什么。另一个细节是正负样本的定义不能只用是否点击来划分。在短视频场景下曝光本身不等于负样本——一个视频出现在你的信息流里你看到了封面但没点进去这不代表你不喜欢它可能只是你当时没有耐心。真正有意义的负样本是曝光后极速划走和完播率极低。所以训练样本的构造本身就是一门学问样本洗得好不好直接决定模型上限。4. 重排阶段的隐性博弈多样性、新鲜度和体验护栏精排模型输出一个分数列表之后还不能直接推给你。如果完全按照精排分数排序你会看到一堆高度相似的内容——因为模型发现你对某类视频特别感兴趣就会倾向于把同类的视频都排在前面。这种推荐体验其实很糟糕连续5个视频都是同一个套路的话用户很快就会产生审美疲劳。所以精排和最终下发之间还有一道重排/调控环节。这个环节的目标函数和精排不一样它优化的不是一个视频的点击概率而是整页推荐结果的综合体验质量。4.1 多样性约束为什么要刻意牺牲一些精度重排环节最核心的操作是多样性约束。具体的实现方法有很多种MMR最大边际相关性算法在每一轮挑选时既考虑视频本身的质量分又考虑和已选视频的相似度让两者做一个权衡DPP行列式点过程则用矩阵运算的方式直接求解一组质量和多样性之间最优的内容组合效果更好但计算开销更大。用户能直观感受到的效果是连续刷10条视频通常不会出现5条以上同质化严重的内容。哪怕你最近特别爱看烘焙视频系统也会在中间穿插几条美食探店、厨房好物、宠物捣乱的内容——这些穿插内容的精排分数可能不如烘焙视频高但对整页体验的贡献更大。平台愿意牺牲精度来换多样性根本原因是理性计算的结果单条内容的精度最大化不等于用户长期留存最大化。内容太集中用户爽三天就会腻内容适度多元用户能一直刷下去。为了让用户一直刷下去平台宁可损失一部分点开率。4.2 已看去重与疲劳度控制为什么你不会刷到重复内容重排环节还承担一个容易被忽视的职责去重。这里的去重不只是简单去掉你看过的视频还包括去掉你看过类似内容的视频。你已经看过的视频当然不能再推但如果你在30分钟内连续看了5个减脂餐教程第6个该不该推系统会认为你可能对这个话题有点疲劳主动降低此类内容的排序位置。实现疲劳度控制的方式通常是对每个话题统计最近一段时间的曝光占比超过阈值就做降权。降权的幅度不是一刀切的——完全相同的视频直接过滤同一话题但不同角度的视频适当降权这样既避免了重复感又不至于让你完全失去感兴趣的内容。这块的工程实现其实很考验功底如果规则写得太硬容易误伤用户真正想要的内容如果规则太软又起不到调节体验的作用。据我的实践经验比较好的做法是把疲劳度作为精排模型的一个特征输入而不是在模型外硬编码规则。让模型自己学会展示过太多次的内容即使点击率高也要降低输出分数。4.3 新鲜度优先级给新内容一个起飞的机会短视频平台还有一个指标非常关键内容新鲜度。如果系统只按照历史数据预测分数老内容永远比新内容有优势——老内容积累了足够的完播和互动样本模型对它的预估更准而新内容缺乏数据预测分数天然偏低。如果模型不加任何干预信息流会被老内容垄断创作者的积极性会被严重打击。TikTok的应对策略是新内容冷启动机制。一条新视频发布后平台会先给一个小的初始流量池比如先推给几百个用户收集反馈数据——完播率多少、互动率多少、点赞比多少然后根据反馈决定是否扩大推荐范围。这条小规模试探——收集数据——决定是否放量的链路本质上是一种在线学习机制。这个机制里有一个很难的平衡点初始流量池给大了低质量内容会浪费用户的注意力给太小了高质量内容的数据收集太慢错过最佳发布时间窗口容易失去热度。实践中常见的做法是设置一个阶梯式流量池第一波几百人表现达标进第二波几千人再达标进几万人……每一级的门槛都基于前一级的完播率、互动率等指标计算。5. 冷启动的试探-反馈机制新内容和新用户的双向问题冷启动其实有两个完全不同的场景内容冷启动和用户冷启动。前者是新视频怎么被看见后者是新用户怎么被服务好。这两个问题在TikTok的算法体系里是分开设计的但底层逻辑相通都是用试探去换反馈用反馈去换精准。5.1 内容冷启动的阶梯式放量策略先说内容冷启动。新视频刚发布时没有行为数据模型无法判断它的质量。平台的做法是先把高质量可能性高的内容优先试探——通过内容理解模型对视频打的质量分来排序质量分高的新内容获得更大的初始流量池。这里的内容质量分怎么来的多模态模型对视频的画面清晰度、内容完整性、剪辑节奏、音频质量做综合评估加上标题和封面的信息量生成一个预估质量分。这个质量分和用户兴趣无关——它是这东西做得专业不专业的判断不是用户会不会喜欢的判断。第一波试探之后反馈数据就回来了。系统关注的核心指标是完播率和互动率而不是播放量本身。一条视频如果前3秒完播率特别高说明开头抓人如果整体完播率都高说明内容全程有吸引力如果播放量一般但点赞率很高说明内容有共鸣。不同的反馈信号组合对应不同的放量策略。阶梯放量的阈值设计是冷启动的一个关键参数。阈值设高了能进下一级的都是优秀内容用户看到的内容质量有保障但高风险的新锐内容容易被误杀阈值设低了一些平庸内容也能获得大量曝光用户体验下降但内容生态更加多元。据我了解行业里普遍会把门槛设置成一个动态值——根据最近一段时间平台上新内容的表现分布实时调整而不是固定死。5.2 用户冷启动的探测策略与信息茧房规避新用户的情况更特殊你在平台上还没有任何行为记录系统对你的兴趣一无所知。这时候系统的推荐策略要解决两个问题怎么快速了解你以及怎么避免因为你早期的偶然行为过早锁定你的画像。TikTok对新用户的策略可以描述为宽口径试探初始推荐大量不同类型的高质量内容观察你对每类内容的反应。这个阶段特别注重内容的多样性分配——不会因为你点了一个健身视频就开始猛推健身内容。原因很简单早期行为噪声太大你点那条视频可能是碰巧被封面吸引不代表你对健身有兴趣。一个更精细的做法是给不同内容主题设置不同的信任阈值。对用户已表现出明确偏好的主题比如连续多次完整观看提高该主题内容的推荐占比对用户偶尔接触的主题保持一定的曝光概率但不过量对用户从未接触过的主题继续随机试探。整个过程是一个贝叶斯更新的思想——先验是所有主题等概率每一条行为反馈都在更新后验分布。这种设计对推荐系统的长期效果影响很大。如果用户冷启动阶段就过度拟合早期行为用户画像会被初始的偶然行为带偏而且很难纠正——因为你永远只推用户曾经看过的用户永远缺少机会展示新的兴趣。平台不愿意为短期点击率牺牲长期画像质量这又是一次长期目标对短期指标的胜利。5.3 反馈信号的时间窗口与衰减设计最后讲一个冷启动和在线学习都绕不开的技术细节反馈信号的时效性处理。同一个视频发布后第1小时的反馈数据和发布后第24小时的反馈数据对模型的参考价值完全不同。第1小时的数据噪声很大但时效性强第24小时的数据统计上更稳定但内容热度可能已经过去。TikTok的做法是给不同时间窗口的反馈信号设置不同的衰减系数近距离窗口比如最近15分钟的数据权重最高用来捕捉突发热度中等窗口比如最近6小时的数据用来评估趋势远窗口最近24小时或更久的数据用来做稳定质量判断。三个窗口各自发挥作用模型对内容热度的感知才能跟上短视频的快节奏。这块还有一个小技巧预测短窗口结果时模型不能直接拿原始反馈数据当特征因为短窗口内的反馈数据方差极大。实践中通常会对数据进行平滑处理比如用最近15分钟的完播率加上一个贝叶斯先验做平滑降低极端情况的影响。6. 研究这套系统的实用方法实验设计和逆向分析的边界如果你也想深入研究这套推荐算法我给你一些实验设计上的建议。这些方法都源于我自己做推荐系统研究和拆解别人系统时的经验不涉及任何灰产或违规操作纯粹是技术研究角度。6.1 行为实验法通过控制变量反推机制最基础的研究方法是行为实验。你可以自己注册一个全新账号用完全受控的行为模式去和系统交互通过观察推荐结果的变化来反推系统的决策逻辑。举个例子你可以在第一天完全不互动只刷视频记录推荐内容的分布第二天只点赞美妆类内容看看第三天推荐列表里美妆内容占比上升的速度和幅度第三天只完播不看内容、纯挂机同一类内容看看完播行为对推荐的影响权重再对比点赞和完播两种信号哪个对推荐影响更大。要注意的是这类实验的周期至少需要几天甚至几周因为推荐系统的反馈链路本来就有延迟——你今天的行为明天或后天才会影响推荐结果。单日实验的结论噪声很大不太可信。而且同一类实验建议重复几次看看结果是否稳定。如果第一次实验显示美妆占比上升了20%第二次可能只上升了5%这种波动本身也是研究对象——它说明系统对单一行为的权重设置了随机性或上限。实验设计里还有一个容易犯的错误过早下结论。很多做研究的人刷了几天视频发现推荐内容越来越窄就说算法把我关进信息茧房了。但实际上推荐系统通常会故意分阶段处理新用户前几天的摸索期试探性分发再往后才进入收敛期逐步聚焦。只观察前几天的数据就下结论等于只看了比赛的开始就判断胜负。6.2 推荐结果逆向分析从输出反推特征权重另一个研究手段是对推荐结果做逆向分析。当你对系统有了一定的控制能力通过行为实验建立了稳定的用户画像可以开始分析系统为什么推给你某条内容。具体做法是系统推给你一条内容你先记录这条内容的类别、风格、发布时间、交互热度然后结合你过去的行为记录猜测这条内容命中了你的哪些特征。举例来说如果你过去只看过减脂餐和宠物猫两类内容系统突然推给你一条居家健身器材测评你要分析它命中的是健身这个一级标签还是减脂这个二级标签还是其他更细粒度的特征。这种分析积累到一定量你能画出系统对你兴趣理解的边界哪些特征它识别准确哪些特征它完全没识别到。比如你只看了3次烘焙视频系统可能还不会把你的画像锁定到烘焙这个二级标签但如果你看完并点赞了它可能会尝试给你推初级烘焙工具。这个观察本身就体现了特征权重的设计逻辑——不同行为类型完播、点赞、评论、保存在同一特征上的权重分配不同。逆向分析还有一个高级玩法对比不同账号在同一时间点的推荐结果。用两个新账号制造不同的行为历史一个只看搞笑内容一个只看财经内容然后登录同一台设备、同一时间刷新推荐对比两个账号推荐结果的重合度。重合度高说明热门内容在推荐中的基础权重很大重合度低说明个性化主导。这个实验可以帮你定量估计个性化强度这个参数。6.3 合法边界与工程复现建议最后必须强调研究伦理和合规边界。做算法研究研究对象的数据应该限于你自己产生的行为数据不能使用任何非公开渠道获取平台内部数据。公开的技术论文、官方技术博客、工程团队分享这些才是合规的信息来源。从工程复现的角度如果想自己搭一套类似的推荐系统练手技术栈可以参考这套组合内容理解用现成的多模态预训练模型CLIP类模型或视觉Transformer做视频内容向量提取召回向量检索用Facebook开源的FAISS或商用的向量数据库线上服务写成REST API排序精排模型可以用DeepCTR库里的MMoE实现特征工程参照上面讲的三类特征体系重排MMR算法几十行就能实现DPP有现成的开源库冷启动兜底策略用规则引擎实现进阶可以用汤普森采样做探索-利用平衡这套组合能让你在一两周内跑通一个mini版的信息流推荐系统。虽然和TikTok这种工业级的系统比还差得很远但核心链路是完整的——数据、特征、召回、排序、重排、反馈你能亲手走一遍对算法的理解深度完全不一样。做实验时一个小建议一开始不要想着复刻全部功能先跑通一个最简版本哪怕只用10万条模拟数据、只做兴趣召回和精排两个模块也比搭一个半吊子全链路要好。推荐系统这个领域做完一个完整的闭环比看懂十篇论文都更有收获——因为只有亲手处理过特征拼接、数据回传、线上延迟这些问题你才能真正理解为什么工业级系统长成今天这个样子。
返回列表