很少有 UGC 能让冷启动达到天花板。
- 小红书上用户新发布的笔记
- B站上用户新上传的视频
- 今日头条上作者新发布的文章
此处主要考虑** UGC(User Generated Content)** 的物品冷启动;与 UGC 相反的是 PGC(Platform Generated Content),例如网飞、腾讯视频。UGC 冷启比 PGC 更难,因为用户上传的内容良莠不齐,而且量大。
- 思考:为什么要特殊对待新笔记?
- 新笔记缺少与用户的交互,导致推荐的难度大、效果差
- 扶持新发布、低曝光的笔记,可以增强作者发布意愿
- 精准推荐:克服冷启的困难,把新笔记推荐给合适的用户,不引起用户反感
- 激励发布:流量向低曝光新笔记倾斜,激励作者发布
- 挖掘高潜:通过初期小流量的试探,找到高质量的笔记,给与流量倾斜
- 作者侧指标:反映用户的发布意愿;对低曝光扶持的越好,作者侧指标就越高。
- 发布渗透率、人均发布量;
- 用户侧指标:反映推荐是否精准,是否会引起用户反感
- 新笔记指标:新笔记的点击率、交互率
- 大盘指标:消费时长、日活、月活
- 内容侧指标:反映冷启是否能挖掘优秀笔记
- 高热笔记占比
作者侧和用户侧指标基本都在用,内容侧指标选用
- 发布渗透率、人均发布量反映出作者的发布积极性
- 冷启的重要优化目标是促进发布,增大内容池
- 新笔记获得的曝光越多,首次曝光和交互出现得越早,作者发布积极性越高
衡量用户的发布积极性。
- 发布渗透率 = 当日发布人数 / 日活人数
- 发布一篇或以上,就算一个发布人数
- 例:
- 当日发布人数 = 100 万
- 日活人数 = 2000 万
- 发布渗透率 = 100 / 2000 = 5%
- 人均发布量 = 当日发布笔记数 / 日活人数
- 例:
- 每日发布笔记数 = 200 万
- 日活人数 = 2000 万
- 人均发布量 = 200 / 2000 = 0.1
新笔记的点击率、交互率
- 问题:曝光的基尼系数很大。即少量头部新笔记推送准确,但大部分新笔记的推送不准,综合下来点击率、交互率也很高
- 少数头部新笔记占据了大部分的曝光
分别考察高曝光、低曝光新笔记
- 高曝光(占比低,推荐简单):比如 >1000 次曝光
- 低曝光(占比高,推荐难):比如 <1000 次曝光
- 优化冷启时,不是为了提升大盘指标,而是确保新策略不显著伤害大盘指标
- 大盘的消费时长、日活、月活
- 大力扶持低曝光新笔记会发生什么?
- 作者侧发布指标变好
- 用户侧大盘消费指标变差(损害用户体验)
高热笔记占比
- 高热笔记:前 30 天获得 1000+ 次点击
- 高热笔记占比越高,说明冷启阶段挖掘优质笔记的能力越强
- 作者侧指标:发布渗透率、人均发布量
- 用户侧指标:新笔记消费指标、大盘消费指标
- 内容侧指标:高热笔记占比
- 冷启动的优化点
- 优化全链路(包括召回和排序)
- 流量调控(流量怎么在新物品、老物品中分配)
召回的依据
- ✔ 自带图片、文字、地点
- ✔ 算法或人工标注的标签
- ❌ 没有用户点击、点赞等信息。这些信息可以反映笔记的质量,以及哪类用户喜欢该笔记
- ❌ 没有笔记 ID embedding。ID embedding 是从用户和笔记的交互中学习出来的;缺少这个特征,召回和排序都不准确。
冷启召回的困难
- 缺少用户交互,还没学好笔记 ID embedding,导致双塔模型效果不好,后续会影响排序,让排序模型也不准确。
- 双塔模型是推荐系统中最重要的召回通道,没有之一
- 缺少用户交互,导致 ItemCF 不适用
itemCF不使用于物品冷启动:根据笔记和用户的交互,来判断两个物品的相似度。
召回通道
- ❌** ItemCF 召回(不适用)**
- ❔ 双塔模型(改造后适用)
- ✔ 类目、关键词召回(适用);刚刚发布时,是最有用的指标,等一段事件后,会失效。
- ✔ 聚类召回(适用)
- ✔ Look-Alike 召回(适用)
物品ID(笔记ID)是物品塔中最重要的特征。新笔记还没有embedding向量,直接中双塔模型的物品塔做embedding,效果不是很好。
改进方案 1:新笔记使用 default embedding
- 物品塔做 ID embedding 时,让所有新笔记共享一个 ID,而不是用自己真正的 ID
- Default embedding:共享的 ID 对应的 embedding 向量
- 学出来的 Default embedding 比随机初始化一个 ID embedding 要好;
- 到下次模型训练的时候,新笔记才有自己的 ID embedding 向量
改进方案 2:利用相似笔记 embedding 向量
- 查找 top k 内容最相似的高曝笔记
- 把 k 个高曝笔记的 embedding 向量取平均,作为新笔记的 embedding
- 之所以用 高爆笔记,是因为它们的 embedding 通常学得比较好
多个召回池,让新笔记有更多曝光机会
- 1 小时新笔记
- 6 小时新笔记
- 24 小时新笔记
- 30 天笔记
所有召回池共享同一个双塔模型,那么多个召回池不增加训练的代价
- 感兴趣的类目:美食、科技数码、电影......
- 感兴趣的关键词:纽约、职场、搞笑、程序员、大学......
- 系统维护类目索引:类目 → 笔记列表(按时间倒排)
- 用类目索引做召回:用户画像 → 类目 → 笔记列表
- 取回笔记列表上前 k 篇笔记(即最新的 k 篇)
- 系统维护关键词索引:关键词 → 笔记列表(按时间倒排)
- 根据用户画像上的关键词做召回
**缺点 1:**只对刚刚发布的新笔记有效
- 取回某 类目/关键词 下最新的 k 篇笔记
- 发布几小时之后,就再没有机会被召回
- 所以应该在用户高频使用软件的时间段发布内容
**缺点 2:**弱个性化,不够精准
- ❌ ItemCF 召回(不适用)
- ❔ 双塔模型(改造后适用)
- ✔ 类目、关键词召回(适用)
- ✔ 聚类召回(适用)
- ✔ Look-Alike 召回(适用)
- 如果用户喜欢一篇笔记,那么他会喜欢内容相似的笔记
- 事先训练一个神经网络,基于笔记的类目和图文内容,把笔记映射到向量
- 对笔记向量做聚类,划分为 1000 cluster,记录每个 cluster 的中心方向(k-means 聚类,用余弦相似度)
- 一篇新笔记发布之后,用神经网络把它映射到一个特征向量
- 从 1000 个向量(对应 1000 个 cluster)中找到最相似的向量,作为新笔记的 cluster
- 索引:cluster → 笔记 ID 列表(按时间倒排)
- 给定用户 ID,找到他的 last-n 交互的笔记列表,把这些笔记作为种子笔记,去召回相似的笔记
- 把每篇种子笔记映射到向量,寻找最相似的 cluster(知道了用户对哪些 cluster 感兴趣)
- 从每个 cluster 的笔记列表中,取回最新的
$m$ 篇笔记 - 最多取回$mn$篇新笔记 (n表示保留n条用户行为记录,包括点赞、收藏、转发等;m表示每篇种子笔记召回m条新笔记)
- 聚类召回与类目召回的缺点相同:只对刚发布的新笔记有效
聚类召回通过内容相似度模型来把笔记映射到向量。
CNN提取图片特征,得到一个向量;用BERT提取文字特征,得到另一个向量。把两个向量拼接,输入FC,得到笔记的特征向量。
- 左右两个用的神经网络的参数是相同的
- CNN 和 BERT 可以用预训练模型,全连接层是随机初始化后训练出来的
给定用户 ID,找到他的 last-n 交互的笔记列表,把这些笔记作为种子笔记
训练方式和双塔模型类似,输入特征为三元组<正样本笔记,种子笔记,负样本笔记>
基本思想:鼓励$\cos \left(\mathbf{a}, \mathbf{b}^{+}\right)$大于$\cos \left(a, b^{-}\right)$
Triplet hinge loss:$L\left(\mathbf{a}, \mathbf{b}^{+}, \mathbf{b}^{-}\right)=\max \left{0, \cos \left(\mathbf{a}, \mathbf{b}^{-}\right)+m-\cos \left(\mathbf{a}, \mathbf{b}^{+}\right)\right}$
Triplet logistic loss:$L\left(\mathbf{a}, \mathbf{b}^{+}, \mathbf{b}^{-}\right)=\log \left(1+\exp \left(\cos \left(\mathbf{a}, \mathbf{b}^{-}\right)-\cos \left(\mathrm{a}, \mathbf{b}^{+}\right)\right)\right)$
此处的公式与 召回 - 双塔模型 - Pairwise 训练 中相似
筛选条件:
- 只用高曝光笔记作为二元组(因为有充足的用户交互信息)
- 两篇笔记有相同的二级类目,比如都是“菜谱教程”
用 ItemCF 的物品相似度选正样本
从全体笔记中随机选出满足条件的:
- 字数较多(神经网络提取的文本信息有效)
- 笔记质量高,避免图文无关
- 基本思想:根据用户的点赞、收藏、转发记录,推荐内容相似的笔记
- 线下训练:多模态神经网络把图文内容映射到向量
- 线上服务:用户历史喜欢的笔记 → 特征向量 → 最近的 Cluster → 每个 Cluster 上的新笔记
Tesla Model 3 典型用户:
- 年龄 25~35
- 本科学历以上
- 关注科技数码
- 喜欢苹果电子产品
符合全部条件的人很少,但是潜在符合调价的用户可能会很多,我们缺乏他们的主要信息,没有办法找到他们。
Look-Alike用户:和种子用户相似的用户。利用这种方式,可以用十几万个种子用户扩展到百万用户。
如何计算两个用户的相似度?
- UserCF:两个用户有共同的兴趣点
- Embedding:两个用户向量的 cosine 较大
- 点击、点赞、收藏、转发——用户对笔记可能感兴趣
- 把有交互的用户作为新笔记的种子用户
- 用 look-alike 在相似用户中扩散
- 系统把新笔记推荐给了许多用户,由于是新笔记,所以受众不太精准
- 而跟新笔记进行了交互用户,就成了种子用户
- 用双塔模型学习种子用户的向量,然后取均值,把得到的向量作为 新笔记 的表征
- 近线更新特征向量。近线:不用实时更新,做到分钟级更新即可
- 此处是做到每当有新交互发生后,几分钟内更新特征向量
- 特征向量是有交互的用户的向量的平均
- 每当有用户交互该物品,更新笔记的特征向量
把新笔记向量都放在向量数据库中,这些向量数据库都支持最近邻查找;如果有用户刷一下小红书,就给用户做推荐。
用双塔模型计算用户的特征向量,用特征向量作为query,在向量数据库中做最近邻查找,取回几十篇笔记。
这个召回通道就叫 Look-Alike
左边:种子用户,有交互行为
将种子用户的特征向量作为新笔记的特征向量
和广告中的Look-Alike 是一样的。
- 优化全链路(包括召回和排序)
- 流量调控(流量怎么在新物品、老物品中分配)
工业界的通常做法是扶持新笔记
目的 1:促进发布,增大内容池
- 新笔记获得的曝光越多,作者创作积极性越高
- 反映在发布渗透率、人均发布量
目的 2:挖掘优质笔记
- 做探索,让每篇新笔记都能获得足够曝光
- 挖掘的能力反映在高热笔记占比
- 假设推荐系统只分发年龄 <30 天的笔记。
- 假设采用自然分发,新笔记(年龄 <24 小时)的曝光占比为 1/30
- 扶持新笔记,让新笔记的曝光占比远大于 1/30
- 在推荐结果中强插新笔记;
- 对新笔记的排序分数做提权(boost)。很划算的做法,实现不难,抖音、小红书前期都这么做;
- 通过提权,对新笔记做保量;保量的手段也是提权,只不过更复杂一些
- 差异化保量:根据内容质量,来确定保量定多少
如果不做提权干预,新笔记的曝光机会是很少的
目标:让新笔记有更多机会曝光
- 如果做自然分发,24 小时新笔记占比为 1/30
- 做人为干涉,让新笔记占比大幅提升
干涉粗排、重排环节,给新笔记提权
优点:容易实现,投入产出比好
缺点:
- 曝光量对提权系数很敏感
- 很难精确控制曝光量,容易过度曝光和不充分曝光
保量:不论笔记质量高低,都保证 24 小时获得 100 次曝光
在原有提权系数的基础上,乘以额外的提权的系数,比如:
用下面四个值计算提权系数
- 目标时间:比如 24 小时
- 目标曝光:比如 100 次
- 发布时间:比如笔记已经发布 12 小时
- 已有曝光:比如笔记已经获得 20 次曝光
提权系数 :
保量成功率远低于 100%
- 很多笔记在 24 小时达不到 100 次曝光
- 召回、排序存在不足
- 提权系数调得不好
线上环境变化会导致保量失败
- 线上环境变化:新增召回通道、升级排序模型、改变重排打散规则......
- 线上环境变化后,需要调整提权系数
思考题:是否可以给所有新笔记一个很大的提权系数(比如 4 倍),直到达成 100 次曝光为止?
- 这样的保量成功率很高
- 为什么不用这种方法呢?
给新笔记分数 boost 越多,对新笔记越有利?
- 好处:分数提升越多,曝光次数越多
- 坏处:把笔记推荐给不太合适的受众
- 点击率、点赞率等指标会偏低
- 笔记长期会受推荐系统打压,难以成长为热门笔记
即这个笔记如果推荐给合适用户,那它是不错的,但强行提高曝光次数,导致它被经常推给不适合的用户,进而交互指标偏低
保量:不论新笔记质量高低,都做扶持,在前 24 小时给 100 次曝光
差异化保量:不同笔记有不同保量目标,普通笔记保 100 次曝光,内容优质的笔记保 100~500 次曝光
- 基础保量:24 小时 100 次曝光
- 内容质量:用模型评价内容质量高低,给予额外保量目标,上限是加 200 次曝光
- 作者质量:根据作者历史上的笔记质量,给予额外保量目标,上限是加 200 次曝光
- 一篇笔记最少有 100 次保量,最多有 500 次保量
- 流量调控:流量怎么在新老笔记之间分配
- 扶持新笔记:增加单独的召回通道、在排序阶段提权
- 保量:帮助新笔记在前 24 小时获得 100 次曝光
- 差异化保量:根据内容质量、作者质量,决定保量目标
本节后面讲的保留技术不是最新的,但也只有业界一线核心部门能做到,而且做到后对作者侧的指标提升显著
想要上线新的模型或策略都要做 AB 测试。冷启动的 AB 测试特别复杂,所以单独讲一节
作者侧(发布)指标:
- 发布渗透率、人均发布量
用户侧(消费)指标:
- 对新笔记的点击率、交互率
- 大盘指标:消费时长、日活、月活
标准的 AB 测试只测大盘指标,而冷启动 AB 测试还要测上面提到的指标
标准的AB测试
- 限定:保量 100 次曝光
- 假设:新笔记曝光越多,用户使用 APP 时长越低 ;这个假设很合理,因为新笔记推送不准确,过多会影响体验
- 新策略:把新笔记排序时的权重增大两倍
- 结果(只看消费指标):
- **AB 测试的 diff 是负数(策略组不如对照组) **
- **如果推全,diff 会缩小(比如 −2% → −1%) **
使用新策略后,实验组看到的新笔记会增多,又因为有着保量 100 次的目标,所以对照组看到的新笔记数量会减少;
实验组看多了新笔记,消费指标变差;对照组看少了新笔记,消费指标变好
但推全后,这 100 次的保量目标会均匀的分配给所有用户,消费指标依然会下降,但不会有 实验组 那么差
作者侧实验不好做,没有很完美的实验方案。
作者侧实验示意图
缺点:新笔记之间会抢流量。给实验组新笔记提权后,同是新笔记,实验组中的能获得更多曝光,而对照组中的曝光就少了,而一旦推全后,就不存在新笔记间强流量的情况,diff 就消失了 。
设定:
- 新老笔记走各自队列,没有竞争
- 重排分给新笔记 1/3 流量,分给老笔记 2/3 流量 ,两者曝光占比固定不变
新策略:把新笔记的权重增大两倍;这对新笔记来说依然是公平竞争,而新笔记在重排中还是 1/3 流量,所以新策略不会激励发布,不会改变发布侧指标 。
结果(只看发布指标):
- AB 测试的 diff 是正数(实验组优于对照组);实验组的新笔记会抢走对照组的曝光,那么实验组的发布指标会涨,对照组的发布指标会跌。
- 如果推全,diff 会消失(比如 2% → 0)
给实验组新笔记提权后,同是新笔记,实验组中的能获得更多曝光,而对照组中的曝光就少了,而一旦推全后,就不存在新笔记间强流量的情况,diff 就消失了 。
设定:新老笔记自由竞争
新策略:把新笔记排序时的权重增大两倍
AB 测试时,50% 新笔记(带策略)跟 100% 老笔记抢流量;一份新笔记抢走两份老笔记的流量。
推全后,100% 新笔记(带策略)跟 100% 老笔记抢流量;一份新笔记只能抢走一份老笔记的流量
作者侧 AB 测试结果与推全结果有些差异 。
**新老笔记抢流量不是问题,问题是 AB 测试与推全后的 设定 不一致,导致 AB 测试的结果不准确 **
实验组用户只能看到实验组新笔记,对照组用户同理
这样就避免了两组新笔记抢流量
方案二比方案一的优缺点
- 优点:新笔记的两个桶不抢流量,作者侧实验结果更可信
- 相同缺点:新笔记和老笔记抢流量,作者侧 AB 测试结果与推全结果有些差异;依然是 AB 测试时 50% 新笔记跟 100% 老笔记抢流量,推全后 100% 新笔记跟 100% 老笔记抢流量 ;
- 方案二缺点:新笔记池减小一半,对用户体验造成负面影响
相当于把小红书切成了 2 个 APP
这样做的实验结果是最精准的
**不太可行,太损害用户体验了 ** ,内容池小了一般,消费指标一定会大跌;
但是跨国 APP 可以用这个方案呀
- 冷启的 AB 测试需要观测作者发布指标和用户消费指标 ;两个目标:激励作者发布、让用户满意
- 各种 AB 测试的方案都有缺陷(小红书有更好的方案,但也不完美)
- 设计方案的时候,问自己几个问题:
- 实验组、对照组新笔记会不会抢流量?
- 新笔记、老笔记怎么抢流量? AB 测试时怎么抢?推全后怎么抢?
- 同时隔离笔记、用户,会不会让内容池变小?
- 如果对新笔记做保量,会发生什么?