UGC平台中用户可以自由发表内容, 如何对最新的内容做推荐就涉及到冷启动问题, UGC比PGC更难做冷启动, 因为内容量大且差异大.
出发的角度主要分为三部分: 用户侧(推荐), 作者侧(激励), 高热内容(发掘).
为什么需要做冷启动
三方面原因:
- 正常物品可以依赖用户点击信息作推荐, 而新发表内容缺少用户交互信息,
所以需要做特殊处理.
- 对新发表内容做扶持可以增强作者发布意愿.
- 为了发掘有潜力的内容
所以冷启动的目标就是:
- 精准推荐: 克服冷启动的困难,
把新内容推荐给用户的同时尽量保证不引起用户的反感.
- 激励发布: 向低曝光的新物品倾斜流量, 从而激励作者的发布意愿.
- 挖掘高潜: 小流量试探, 找到高质量的内容推荐给用户, 给予一部分流量倾斜.
评价指标
作者侧指标
主要包括发布渗透率, 人均发布量
发布渗透率 = 当日发布人数 / 日活人数. (发布一篇以上都算一个发布人数.)
人均发布量 = 当日发布笔记数 / 日活人数
这些指标反映了作者发布积极性, 冷启的目标是促进发布从而扩大内容池.
新发布内容曝光越多, 交互越多, 作者积极性就更高.
用户侧指标:
包括两个方面:
- 新笔记指标: 点击率, 交互率
- 大盘指标: 消费时长, 日活, 月活
对于新笔记而言, 还是存在头部效应, 少量热门笔记会占据大多数曝光, 因此做推荐的时候最好进行分类考虑, 比如将高曝光笔记和低曝光笔记分开看, 高曝光笔记交互充足, 不需要冷启动也能推荐得好; 而低曝光笔记交互信息少, 推荐不够准, 因此需要特殊处理.
而对于大盘指标, 我们要做的就是做好作者侧激励的同时保证大盘指标的稳定.(过于扶持新用户会导致大盘指标降低, 而只关注大盘指标又很难扶持新用户).
内容侧指标:
主要是高热笔记占比. 高热笔记占比越高, 说明冷启动挖掘优质笔记的能力越强, 即内容侧推荐做得越好.
冷启动涉及的优化点
- 优化全链路(召回, 排序)
- 流量调控(流量如何在新老物品之间分配)
召回通道冷启动
冷启动召回和传统召回有相同点也有不同点.
相同点:
- 自带图片, 文字, 地点等.
- 有算法或者人工标注的标签.
不同:
- 没有点击信息.
- 缺少embedding信息(embedding一般是从用户和物品交互的过程中学习的, 而这里并没有学习到embedding信息).
itemCF(不再适用)
因此, 从这里可以看出, 由于缺少点击信息, itemCF不能够使用(itemCF:用户对物品j的喜欢程度可以通过用户对i的喜爱程度和物品ij之间的相似度来表示, 其中相似度由共同喜欢两个物品的用户数参与计算, 而新物品并没有交互信息, 因此itemCF不适用).
不过个人感觉似乎强行要用也不是不行,
相似度可以使用多模态模型获取图片文字信息, 然后不同笔记做内容相似度计算,
再通过用户喜欢过的笔记来寻找相似的新发布笔记做推荐.
可能工业界有自己的考量所以并不这么做. 即聚类召回.
双塔模型(需要改进)
与此同时, 双塔模型我们又需要物品的embedding信息才能使用, 而这里我们看到其实是缺少embedding信息的, 所以我们需要对双塔模型进行修改, 具体的有两种方式.
- 新笔记使用default embedding.
物品塔做推荐的时候让所有新笔记共享一个default embedding并用default embedding进行训练, 下一次训练再用训练好的embedding.
- 使用相似物品的embedding.
多模态模型获取图文内容表征为一个向量, 查找topk内容最相似的高曝光笔记(高曝光笔记的embedding学的更好, 所以优先使用), 然后得到的k个向量取平均即为新笔记的embedding.
多召回池
对于新物品我们可以设置多个召回池, 从而让笔记有更多曝光机会.
比如我们分:
- 1小时新笔记
- 6小时新笔记
- 24小时新笔记
- 30天老笔记
召回池可以独立区分不同时长的笔记, 即1小时新笔记中我们必定会曝光其中一部分, 而不是说1小时新笔记和30天笔记混一起然后可能1小时新笔记一篇都没曝光.
然后就是多召回池使用的是同一个双塔模型, 所以并不增加训练代价.
类目召回以及关键词召回
各个做推荐的公司都会记录用户的画像, 画像记录了用户感兴趣的类目和关键词.
做类目召回: 即系统维护一份类目到笔记的索引, 然后按照发布时间倒排(鼓励新笔记), 最后按照相应的索引召回笔记.
关键词召回和类目召回完全相似.
缺点:
- 只对新发布的笔记有效: 因为只取回类目/关键词下面的最新的笔记,
一旦过了几个小时就再也没有机会召回.
- 弱个性化, 不够精准.
缺点虽然明显, 但是还是很重要, 尤其对于促进作者发布的积极性.
聚类召回
思路: 如果用户喜欢一篇笔记, 那么用户还可能喜欢与这篇笔记内容相似的笔记.
做法:
事先训练一个神经网络, 基于笔记的图文内容将笔记映射到向量, 然后对笔记向量做聚类, 比如我们分出1000个cluster(K-Mean, 相似度可以用余弦相似度), 然后记录下每个cluster的中心.
从1000个中心向量里面找出最相似的向量作为新笔记的cluster.
把新笔记添加到cluster上, cluster到笔记列表是建立了索引的(按时间倒排).
召回: 给定用户id, 找到用户的lastN交互, 然后将这些作为种子, 找到用户对哪些cluster感兴趣, 然后再从cluster中取回最新的m篇笔记. 最多共有m*n篇被召回.
图文转向量的模型:
非常直观的CNN + Bert + FC层. 其中CNN和Bert都可以是预训练模型加上Finetuning, fc随机化权重然后进行学习.
学习过程中网络输出正样本笔记b+, 种子笔记a和负样本笔记b-, 然后我们鼓励 cosine(a, b+) > cosine(a, b-). 比如我们可以用triplet hinge loss, 或者triplet logistic loss.
正负样本选择:
正样本:
- 使用人工标注的二元组的相似度.(代价大)
- 算法自动选择正样本.
筛选条件:
- 只用高曝光笔记作为二元组(充足的用户交互信息,
算法选的会比较准).
- 相同二级类目进行筛选, 从而避免完全不相关类目.
- 最后用itemCF来进行筛选.
负样本:
全体笔记里面选, 只要字数相对多, 笔记质量高, 避免图文无关即可.
Look-Alike召回
Look-Alike起源于互联网广告, 即物品i的目标用户构成集合U, 那么所有和集合U内部用户相似的用户也可以被推荐.(个人理解类似userCF).
如果用户u对新发布的笔记有点击点赞收藏转发的行为, 则表示用户u对新笔记感兴趣, 那么我们就可以把用户u记为种子用户, 从而我们可以将新笔记推荐给所有与用户u相似的用户.
具体我们可以将种子用户的特征向量(可以复用双塔模型的用户向量)取均值得到一个向量, 将其作为新笔记的特征向量. (本质为使用相似用户的向量作为物品的特征, 方便后续做最近邻查找来召回)
这个向量需要做近线更新, 即不需要实时更新, 但是还是需要做分钟级更新. 每当有新的交互用户, 就需要将新用户的向量加入平均来更新向量.
然后实际场合我们需要将新笔记向量加入向量数据库, 然后每当用户刷新一下软件, 我们就对用户向量(复用双塔)做最近邻查找, 然后最近邻查找的返回就是Look-Alike的召回结果.
流量调控
- 推荐结果强插新笔记(较落后)
- 对新笔记的分数做提权(boost)
- 对新笔记做保量曝光(通过boost)
- 在保量的基础上做差异化保量
强插就字面意思, 每次曝光强行带入一个新笔记, 从而保证新笔记的曝光.
分数提权
如果不做提权, 新老笔记权重相似, 则曝光率也类似, 从而新笔记曝光率低. 分数提权的本质是给新笔记提高权重(比如乘一个大于1的系数),目标是让新笔记有更多曝光机会.
做提权的阶段一般是粗排和重排.
优点: 容易实现, 投入产出比好
缺点: 曝光非常受提权系数影响, 一旦控制不好权重系数就会导致新笔记过度曝光或者曝光不足.
新笔记保量
比如我们不管笔记质量高低, 在前24小时我们都给笔记100次曝光. 假如笔记前期曝光不足, 我们就给笔记更大的系数让它更容易曝光.
具体权重可能得在真正做保量的时候去仔细调.
动态提权保量
基于目标曝光数, 目标时间以及已有曝光数和已经经过的时间来计算提权系数.
比如
$ 提权系数=f(\frac{发布时间}{目标时间}, \frac{已有曝光}{目标曝光}) = f(0.5, 0.2) $
保量的难点
成功率低, 很多笔记前24小时曝光依然达不到100.
这可能是召回和排序存在不足(新笔记没有得到正确的预估分数), 也可能是权重没调好(分数差不多但是权重低了).
需要注意的是: 线上环境的变化也会导致保量失败
比如线上环境的变化: 新增了召回通道, 排序模型有新的升级, 重排规则发生改变...
一旦线上环境发生改变, 我们都需要重新调整提权系数.
思考题: 可不可以强行提高新笔记权重从而完成保量的目标呢?(比如我们给新笔记权重全部乘以4)
答: 非常直观的思考, 即直接高权重提权是否可行. 答案当然是否定的, 这样不管用户是谁, 物品都会被推荐(相当于重排阶段强插新笔记), 一方面新笔记点击点赞不太行, 其次就是即使是热门笔记, 被不喜欢的用户占用了曝光次数也可能因此被埋没.
因此合适的权重才是好的, 合适的权重才能让曝光次数被喜欢的用户占用, 并且尽量保证能够让新笔记得到更多曝光.
差异化保量
传统保量: 不管笔记内容是什么, 我们都做扶持, 比如让其在前24小时获得100次曝光.
差异化保量: 不同笔记不同保量目标, 比如普通笔记我们保量让其前24小时获得100次曝光, 对于热门笔记我们可以设置更高的数值, 比如前24小时获得500次曝光(算法判定)
具体可以用相应特征决定, 比如:
- 基础保量: 所有笔记保量24小时100次曝光.
- 内容保量: 比如我们可以用多模态神经网络对内容打分,
对优质内容给予额外保量目标, 上限加200.
- 作者质量: 根据作者历史的笔记质量, 给予额外保量目标, 上限是加200次曝光.
这样的策略可以保证新笔记最低有100次曝光, 最多可以有500次曝光.
最后, 按up的说法, 保量很难做, 并且up特意提及了数据非真实数据, 且做保量有很多坑. 我估计应该就是参数难调, 比如差异化保量的数值上限应该怎么设置, 每个部分又该设置多少, 基础曝光又多少合适, 这种应该都得纳入考虑.
AB测试
冷启动的AB测试比之前要复杂很多, 涉及到几方面的东西.
- 传统的AB测试只需要用户分实验组和对照组,
判断对全体笔记的点击指标和大盘指标即可.
- 冷启动的AB测试涉及到老笔记和新笔记两部分,
而新笔记和老笔记之前存在抢流量的现象(新笔记曝光多了,老笔记曝光就少了).
- 开对新笔记的测试, 必须要将新笔记分实验组和对照组,
而新笔记之间也存在抢流量现象(假如用户不分组, 用户实验组的曝光高了,
对照组的曝光就低了).
- 如果对用户限定内容池, 比如实验组用户只能看到实验组新笔记, 那么相当于新笔记内容池少了一半, 会影响公司业务; 同样假如我们还对老笔记分实验组和对照组, 那么老笔记的池子也会减半, 非常影响业务.
用户侧实验以及存在的问题
用户侧主要关注点击率相关, 所以直观来说我们只需要将用户分两组, 然后用不同的推荐方式给实验组和对照组的用户做推荐即可.
缺点:
假设前提: 新笔记保量100次曝光, 新笔记曝光越多, 用户使用APP时间越少(推荐效果变差了).
实验组: 我们在排序的时候, 将新笔记权重乘以2.
对照组: 保持不变
结果: 用户体验降低, diff为负数(负数正常, 因为扶持新笔记本身就会导致指标一定程度的下降).
然而我们将实验推全以后, 发现diff变小了(比如-2%变成-1%).
个人理解: 原因是在实验中我们提高了实验组的权重, 导致实验组更容易看到新笔记, 从而导致指标降低更厉害; 而对照组则影响偏小, 极端情况是实验组抢光了流量, 从而对照组不受影响最终指标持平. 这就导致AB测试导致的diff非常大(表面上看起来就是新策略过差而老策略优秀, 差值大). 而一旦我们推全了结果, 由于曝光数固定, 流量均分给了所有用户, 所以新策略效果没有实验中那么差(100条新笔记推给100个人会导致效果很差, 但是推给一万个人其实每个人曝光只有0.01篇, 效果就没那么差), 这种情况下老策略还是被抢流量所以指标几乎持平, 因此体感来看推全以后diff会变小.
作者侧实验
方案1:
前提: 固定新老笔记走各自的队列, 没有竞争; 重排给新笔记1/3流量, 老笔记2/3流量.
新策略将新笔记权重乘以2.
从作者侧指标来看, 只看结果可能AB测试中实验组优于对照组; 但是推全之后发现diff会变小或消失.
缺陷:
新笔记之间会抢流量, 实验组加了权重, 从而导致实验组结果高于正常值; 对照组被抢了流量, 导致结果低于正常值, 推全之后都恢复正常水平, 就会导致diff变小甚至消失.
新老笔记也会抢流量. 比如实验中50%新笔记和100%老笔记做流量竞争, 推全以后则是100%新笔记和100%老笔记做竞争. up这里说的是实验中1篇新笔记抢2篇老笔记流量, 推全1篇新笔记抢一篇流量, 因此更难推广, 所以实验中有指标提升推全之后可能并没有.
方案2:
优点: 避免了新笔记之间的抢流量.
缺点:
用户组里面可以看到的新笔记池子减半, 会影响公司业务.
依旧存在新老笔记抢流量现象.
方案3:
全部开实验组和对照组, 结果完全可信, 但是用户现在老笔记的内容池也减半了, 严重影响了公司业务, 不可取.
AB测试总结
目的是为了观测冷启动处理策略对指标的影响, 实验设计方面总的来说涉及几个问题:
- 新笔记之间抢流量
- 新老笔记抢流量
- 内容池变小影响业务
这里个人思考的话感觉可以针对前面偏大偏小的情况做纠偏处理, 比如针对抢流量现象按曝光比例做权重处理, 完成纠偏的话可信度应该有所提升. 不过不知道工业级会如何考量.
TODO
余下内容为提升指标相关, 暂时不做学习.