[
  {
    "path": "README.md",
    "content": "# 推荐系统八股160问\n\n总结了推荐系统相关的160个问题，包括基础知识，召回，排序，冷启动，涨指标的方法。知识来源于王树森《推荐系统公开课》和赵传霖《互联网大厂推荐算法实战》部分知识。 如有错误和漏洞敬请指正！\n"
  },
  {
    "path": "推荐系统八股160问/1. 推荐系统基础.md",
    "content": "# 推荐系统基础\n\n**1、推荐系统的转化流程是什么？**\n\n先曝光，后点击，点击以后分为滑动到底+评论，点赞，收藏，转发四种（抖音没有曝光和点击）\n\n**2、推荐系统的短期消费指标？**\n\n点击率、点赞率、收藏率、转发率，点击率是点击次数/曝光次数，后三个是除以点击次数\n\n阅读完成率=滑动到底次数/点击次数×f（归一化函数，与笔记长度有关）\n\n**3、推荐系统的北极星指标（最关键指标）？**\n\n日活/月活用户数（DAU/MAU），人均使用推荐时长，人均阅读笔记数量，发布渗透率（当日发布人数/日活人数）和人均发布量（当日发布笔记数/日活人数）\n\n最核心的指标是DAU和留存（LT7、LT30，代表7天/30天内用户对app的使用率）\n\n北极星指标有利于提升内容多样性，提高用户的活性和数量\n\n**4、推荐系统实验流程分为哪几种？**\n\n离线实验（线下，无用户交互）\n\n小流量A/B测试、全流量上线（线上，有用户交互）\n\n**5、推荐系统的链路（重点）**\n\n过程：               召回——>粗排——>精排——>重排\n\n物品数：几亿——>几千——>几百——>几百——>几十\n\n召回：从物品数据库中快速取回一些物品\n\n粗排：用规模较小的机器学习模型对笔记打分，得到几百篇笔记（需要截断）\n\n精排：用大规模神经网络对粗排的几百篇笔记打分，反映用户兴趣（不用截断）\n\n重排：根据精排分数和多样性分数抽样得到几十篇笔记，并把内容打散\n\n链路当中哪个被公司投入的资源最多：精排\n\n**6、A/B测试的分桶方式是什么？**\n\n先用哈希函数把用户ID映射到某个区间内整数，然后采用随机分桶，把n位用户（这些整数）分到b个桶。设置一个桶作为对照组，其它若干桶作为实验组，实验组指标明显优于对照组，将策略推全。\n\n**7、分层实验的目的是什么？两个原则？**\n\n目的是增加同时做的实验数量，解决流量不够用的问题\n\n两个原则：同层互斥（一个桶不受多种实验策略影响），不同层正交（相互独立）\n\n**8、holdout的策略？**\n\nholdout是考虑整个推荐系统对业务指标的贡献，取10%用户作为holdout桶作为对照，对剩余90%用户进行实验，90%实验桶和10%holdout桶的diff就为整个部门业务指标收益。\n\n每个考核周期结束后清除holdout桶，将实验推全到100%用户，下一周期重新随机划分得到新的holdout桶，开始新一轮考核。\n\n**9、反转实验的必要性？实验方式？一个考核周期结束后对反转桶有无影响？**\n\n必要性：有的指标需要长期观测才能获得稳定指标，反转实验既保证了新策略推全，也可以长期观测实验指标。\n\n方式：推全的新层开个旧策略的桶，对比观测新策略和旧策略的diff。\n\n一个考核周期结束后，会清除holdout桶，但只要反转实验没有结束，反转桶就不会受影响，反转结束后才把新策略用到反转桶上，实验得到真正推全。\n\n**10、推荐系统的架构分为哪两方面？**\n\n功能架构和数据架构，功能架构就是推荐系统链路中的四个过程，数据架构运用Lambda架构，包含离线层、近线层、在线层。\n\n**11、冷数据和热数据的含义？**\n\n冷数据：已经存储在Hadoop分布式文件系统（HDFS）的数据日志\n\n热数据：没来得及生成用户日志的数据，或没来得及落盘在HDFS上的数据\n\n**12、Lambda架构如何处理数据？**\n\n离线层：冷数据在该层进行定时批量计算，每小时统计每个视频的曝光数、点击数并保存结果，一周的CTR就是这168（24x7）个中间结果的汇总，采用Hadoop、Spark、Flink等大数据框架完成。\n\n近线层：离线层计算完毕后视频CTR还在HDFS上，HDFS不利于快速读写，因此将离线批量计算的结果导入Cassandra、Redis这种键值型数据库，缓存离线层结果，便于快速读取。\n\n在线层：离线层中的统计存在时间缺口（例如1-2小时），因此需要让热数据在该层进行流式更新，弥补时间缺口下的数据，计算结果也缓存在Redis中。该层采用Storm、Flink等流式计算框架。\n\n**13、推广搜的作用？有哪些相同点？**\n\n推荐和搜索：负责留住用户，生产流量；广告：负责将流量变现。\n\n相同点：功能架构上都遵循召回粗筛，排序模块精挑细选；数据架构都遵循Lambda结构，算法上三者很多都通用，且都需要很强的个性化。\n\n**14、推荐和搜索的区别？**\n\n第一个区别：用户表达意图的方式不同，搜索依赖输入的查询语句显示表达意图，推荐无需用户显示表达意图，而是通过系统长期观察猜测用户意图。\n\n第二个区别：搜索对结果准确性更加严格，搜索的结果是交集，推荐的结果是并集。\n\n**15、推搜和广告的区别?**\n\n广告对用户的行为考察更多：点击、下载、注册、成功下单等，行为链比推搜更深，且广告和利益相关，因此对预测的精度有绝对准确性的要求。"
  },
  {
    "path": "推荐系统八股160问/2. 召回.md",
    "content": "# 召回\n\n**1、基于物料属性的召回过程？**\n\n离线时按把相同属性的物料集合起来，构成属性-物料的map结构，线上提取用户喜欢的标签、关注的作者等信息，在map中检索返回相应物料。\n\n**2、ItemCF的原理？如何计算用户对物品的兴趣评分？**\n\n某用户喜欢物品1，物品2和物品1相似，那么该用户很可能喜欢物品2。\n\n用户对某物品的兴趣=Σ用户对其它若干物品的评分×若干物品与该物品的相似度。\n\n评分：点击、点赞、收藏、转发各为1分。\n\n**3、如何计算两个物品的相似度？从矩阵的角度如何考虑？**\n\n计算喜欢物品1的用户数量W1，喜欢物品2的用户数量W2，相似度=(W1∩W2)/sqrt.(W1·W2)。\n\n若考虑喜欢程度，分子改为交集用户对物品1的评分×对物品2的评分再求和，分母W1项改为喜欢物品1的所有人喜欢程度的平方和再取模，W2项同理。\n\n考虑用户反馈矩阵A（mxn），m是用户总数，n为物品总数，矩阵每个元素代表用户对物品的评分，计算 $S=A^TA$得到n×n矩阵，即可得到物品之间的相似度。为用户召回时，根据用户的历史交互，选出相似度最高的若干物品作为结果。\n\n**4、ItemCF完整的召回流程？**\n\n离线计算：建立用户→物品的索引，得到用户近期感兴趣的物品评分，以及物品→物品的索引，得到物品间的相似度。\n\n线上召回：给定用户id，找到该用户近期感兴趣的last-n物品，每个物品找到top-k相似的物品，得到一共nk个相似物品，根据公式预估每个物品的兴趣分数，返回分数最高的若干物品作为结果。\n\n**5、Swing模型的作用？利用Swing如何改写ItemCF相似度公式？**\n\nSwing模型是为了降低小圈子的权重，防止物品的重合用户是来自同一小圈子对计算带来误差。\n\nSwing要考虑重合用户集合V里两两之间喜欢的物品重合度。假设用户u1喜欢的物品为J1，用户u2喜欢的物品为J2，定义重合度overlap(u1,u2)=J1∩J2，重合度高，说明可能来自一个小圈子，要降低它们的权重。改写相似度公式= $Σ_{u_1∈V}Σ_{u_2∈V}1/α+overlap(u_1,u_2)$。\n\n**6、ItemCF的优点？**\n\n物料数量更少且特征更稳定，因此nxn的矩阵S不会很大，且可以提前计算好。以及S的计算有MapReduce分布式算法，计算方便。\n\n**7、UserCF的原理？如何计算用户对物品的兴趣评分？**\n\n用户1和用户2相似，用户2喜欢某物品，那么用户1很有可能喜欢这个物品。\n\n用户对某物品的兴趣=Σ该用户和其它用户的相似度×其它用户对该物品的评分\n\n**8、如何计算两个用户的相似度？公式如何优化？**\n\n用户u1喜欢的物品为J1，用户u2喜欢的物品为J2，相似度=(J1∩J2)/sqrt.(J1·J2)。\n\n公式的不足在于同等对待热门和冷门的物品，两个用户同时喜欢热门物品，不能完全说明两个用户相似，因此优化公式，将分子变为 $Σ_{l∈I}1/log(1+n_l)$。I是两个用户共同喜欢的物品，$n_l$代表喜欢物品l的用户数量。\n\n**9、UserCF完整的召回流程？**\n\n离线计算：建立用户→用户的索引，得到用户间的相似度，以及用户→物品的索引，得到用户对物品的兴趣评分。\n\n线上召回：给定用户id，找到与该用户最相似的top-k用户；对这些用户，找到它们近期感兴趣的last-n物品，得到一共nk个相似物品，根据公式预估每个物品的兴趣分数，返回分数最高的若干物品作为结果。\n\n**10、如何得到One-hot编码和Embedding向量？**\n\nOne-hot：把特征类别映射成序号，再把序号映射成高维稀疏向量，根据序号得到对应位置为1，其它全为0。\n\nEmbedding：把序号映射成低维稠密向量。Embedding参数以矩阵形式保存，大小为向量维度×类别数量。Embedding可由参数矩阵×One-hot向量得到。\n\n**11、LR模型的内容？特点？问题？解决该问题的方式？**\n\n内容：LR是一种评分卡，代表一些特征值构成的组合成交概率，分数越高越容易成交，LR最终得分是一条样本能够命中的评分卡中所有条目的得分总和。\n\n特点：强于记忆，依赖人工输入，不能挖掘新模式，能通过正则剔除得分较低的罕见模式。\n\n问题：弱于扩展，记住的是高频、大众的模式，缺乏挖掘小众需求，推荐个性化弱。\n\n解决方式：将概念拆分成向量，实现将细粒度特征拆分成粗粒度的特征，从而使概念得到扩展，包含内容更加丰富。\n\n**12、Embedding有哪两种类型？各自的内容？**\n\n两种类型：共享Embedding和独占Embedding。\n\n共享Embedding：能缓解由于特征稀疏，数据不足导致的训练不充分；复用Embedding能节省存储空间。例如：双塔模型中，候选物品和用户历史行为序列，以及特征交叉时会用到共享Embedding。但共享Embedding存在特征之间的互相干扰。\n\n独占Embedding：避免特征之间的干扰，特征交叉时Embedding的独占（FFM/CAN）。\n\n**13、FFM的内容？**\n\n不同于FM的地方在于：FM中 $w_{ij}=v_iv_j$的v是在同一embedding中，而FFM的v是要在对方的embedding中找对应向量。它的embedding是独占的，但会引起参数爆炸。\n\n**14、CAN的目标？模型内容？**\n\n目标：让每个特征在与其他不同特征交叉时使用完全不同的embedding，同时不引入FFM那样那么多的参数导致空间爆炸和训练难度。\n\n内容：将item的embedding拆解成若干个小矩阵，分别与user embedding通过MLP进行加权融合，从而实现特征交叉。也就是同一物品和不同用户交叉时，物品向量的不同位置发挥作用，相当于使用了不同的物品embedding，减少了不同交叉之间的相互干扰。\n\n**15、矩阵补充模型结构？训练思路？**\n\n结构：用户ID经过embedding层得到用户向量，物品ID经过embedding层得到物品向量（两个embedding不共享参数），两个向量进行内积，得到用户对物品的兴趣。\n\n训练：有用户embedding和物品embedding两个参数矩阵A和B，第u号用户对应矩阵第u列，第i号物品对应矩阵第i列。将两个矩阵相乘，最小化平方和损失，即真实兴趣分数y与两个向量内积之差。\n\n两个矩阵相乘的结果里有很多空白值，我们的目标是通过学习矩阵A和B，来预测空白位置的值，补充结果矩阵的内容，补全后就可将分数较高的物品推荐给用户。\n\n**16、矩阵补充的缺点？**\n\n（1）只用了用户和物品的ID embedding，没利用物品和用户的属性，改进方法是采用双塔模型。\n\n（2）负样本的选择方式不对：不能用曝光未点击的方式作为负样本。\n\n（3）内积不如余弦相似度反映用户兴趣，平方和损失不如交叉熵损失效果好。\n\n**17、如何利用矩阵补充做线上召回？会出现什么问题？如何改进？**\n\n模型存储：训练得到用户矩阵和物品矩阵A和B，A的每一列代表一个用户，B的每一列代表一个物品。矩阵A存储在key-value表，B的存储比较复杂。\n\n线上服务：采用最近邻查找（KNN）——给定用户ID得到他的向量a，查找他最感兴趣的k个物品作为召回结果。这种方法需要对B矩阵的每一列进行内积，计算量巨大。\n\n改进方式：近似最近邻查找（ANN），采用聚类思想。对物品数据进行预处理，将相似的物品聚在一起作为同一扇形区域，每个扇形区域用一个单位向量表示。每个扇形区域向量作为key，区域内的点（物品）作为value。于是用户a与物品的内积转变为与扇形单位向量内积，得到相似度最大的向量，返回向量内的所有物品。\n\n**18、向量化召回的4个维度？**\n\n如何定义正样本，如何定义负样本，如何将用户、物品特征转为embedding，如何定义损失函数。\n\n**19、如何定义正样本？存在问题？解决方案？**\n\n正样本的定义：\n\n对用户和物品而言，曝光且有交互（如点击、点赞、购买等）的用户-物品二元组构成正样本；\n\n对物品和物品而言，在同一会话（间隔时间较短的用户行为序列）交互过的两个物品构成正样本；\n\n对用户和用户而言，两个用户的交互历史相近，构成一堆正样本。\n\n存在问题：少部分物品占据了大部分点击，导致正样本大多是热门物品，导致热门物品更热，冷门物品更冷。\n\n解决方案：过采样冷门物品，降采样热门物品。\n\n**20、如何定义负样本（两种类型）？两种采样方式及具体内容？**\n\n简单负样本：未被召回的物品。\n\n复杂负样本：与正样本有几分相似，但细节有所不同，或者说用户对这些样本多少有点兴趣，但兴趣不够（召回但在排序阶段被淘汰的物品）。\n\n采样方式：随机采样或batch内负样本。\n\n（1）随机采样：分为均匀采样和非均匀采样，均匀采样对冷门物品不公平，因此要用非均匀采样过采样热门物品，抽样概率正比于点击次数的0.75次方。\n\n（2）batch内负样本：每个用户对应点击的物品构成用户-物品正样本，该用户与其它用户点击的物品构成负样本（都是简单负样本）。batch内负样本的问题在于热门物品成为负样本的概率过大，过采样程度过大，缺乏冷门样本（easy negative）。因此需要引入 $-logp_i$纠偏，将预估值抬高，注意纠偏只在训练中起作用。\n\n**21、能否将曝光未点击的物品作为负样本？为什么？**\n\n不能。召回的目标是将用户可能喜欢的和完全不感兴趣的物品区分开，不是优中选优。曝光未点击的物品实际上用户是有兴趣的，只是兴趣不够。将这部分物品作为召回负样本，违背了召回的目的，无法让模型见世面（既看到最匹配的组合，也看到最不靠谱的组合），它们应当在排序阶段被区分。\n\n**22、召回要求解耦指的是什么？原因？具体方式？**\n\n解耦：将用户信息和物料信息隔离，先各自处理，最后再将两个embedding交叉得到结果。\n\n原因：召回的样本数量很大，如果每个用户都进行DNN那样的复杂运算，会使推荐系统负担过重，效率过低，不能满足在线实时性的要求。\n\n方式：先将物品向量离线计算好，存储并建立好索引。在线时利用近似最近邻快速搜索与用户最相似的物品向量。\n\n**23、召回损失函数有哪些？**\n\nNCE Loss：基于交叉熵损失函数，与正样本的内积和负样本的内积（随机采样一部分物料）相关，同时引入纠偏项。\n\nNEG Loss：NCE的简化，忽略纠偏项。\n\nSampled Softmax Loss：基于softmax函数，分子反映正样本的相似度值，分母包含正样本和负样本的相似度值，同时引入纠偏。\n\nPairwise Loss：鼓励正样本的余弦相似度大于负样本的余弦相似度，分为triplet hinge loss（MH Loss，直接考虑内积）和triplet logistic loss（BPR Loss，将内积作为指数）。\n\n**24、借助Word2Vec的召回方式有哪些？Word2Vec分为哪两类？比较异同？**\n\n召回方式：Item2Vec、Airbnb、EGES召回。\n\nWord2Vec：Skip-Gram和CBOW。前者是用中心词预测上下文，后者是用上下文预测中心词。采用NEG Loss进行训练，正样本是中心词上下文的目标词汇，负样本是为中心词随机采样的一批单词。\n\n比较：Skip-Gram预测次数更多，对大规模数据集，生僻词/专业术语较多的情况更适合。\n\n**25、Item2Vec的原理？如何利用4个维度进行召回？Item2Vec存在的问题？**\n\n原理：将用户某一行为序列（一个会话内点击过的物料）当成一个句子，序列中的每个ID当成一个单词。套用Word2Vec训练就能得到每个物料的embedding，用于I2I召回。\n\n召回：\n\n（1）如何定义正样本：利用滑窗技术，对同一用户同一会话交互过的物料，某个物料前后出现的其他物料认为彼此相似，成为正样本。\n\n（2）如何定义负样本：从整个物料库中随机采样一部分物料作为负样本。\n\n（3）如何embedding：定义待学习的矩阵V，装载物料的embedding。\n\n（4）如何定义损失函数：采用NEG Loss。\n\n问题：滑窗导致Item2Vec缺乏对长时间序列的相关性探究，但在推荐系统里面，点击的第一个物料和最后一个物料存在高度相关的可能。\n\n**26、Airbnb召回在Item2Vec基础上做了哪些改进？**\n\nAirbnb以民宿房间为背景，对I2I召回：\n\n（1）正样本：点击序列的每个房屋和最终成功预订的房屋是相似的。\n\n（2）负样本：引入hard negative，将每个房屋与其它同城的房屋作为负样本。\n\n（3）损失函数：同样采用NEG Loss，但增加了额外的正负样本。\n\n对U2I召回（拓展至冷启动领域）：\n\n（1）正样本：某用户u预订过某房间l，u属于的类别U和l属于的类别L的向量相似，成为正样本。\n\n（2）负样本：对一个用户类别U，随机选择一部分房屋作为easy negative；同时引入hard negative，将被房东拒绝的用户类别U与该房屋类别L作为负样本。\n\n（3）如何embedding：考虑了第i类用户和第i类房屋的embedding，利用人工先验规则进行分类。\n\n（4）损失函数：同样采用NEG Loss，但增加了额外的负样本。\n\n**27、EGES是针对什么背景的召回？如何利用4个维度进行召回？**\n\nEGES相比Airbnb I2I，Item2Vec破除了同一用户同一会话的限制，考察了跨用户，跨会话的情况。 \n\nEGES召回：\n\n（1）正样本：根据用户行为序列构建物料关系图，每一条边代表两个物料被顺序交互过，根据关系图随机游走生成若干新的序列，对这些新序列利用Word2Vec定义滑窗，窗口内的两个物料认为相似，构成正样本。\n\n（2）负样本：采用随机采样的方式。\n\n（3）如何embedding：将物品ID的embedding和属性的embedding合成新物料的embedding，合并方法有简单平均和加权平均，融合过程是由算法自动学习。\n\n（4）损失函数：采用NEG Loss。\n\n**28、FM如何运用于召回中？**\n\n对给定用户，考虑 $F(u,t)=W_t+V_{tt}+V_{ut}$，第一项是所有物品的权重，第二项是物料特征内部的两两交叉，第三项是每个用户特征和每个物料特征的两两交叉（各自要预先得到），采用BPR Loss进行评估。预测时将物品特征和用户特征拆开（$E_u×E_t$）。\n\n**29、双塔模型的内容？如何负采样？混合负采样的原理？**\n\n分为用户塔和物品塔：用户塔将用户ID、用户离散特征、用户连续特征通过特征变换，再进入神经网络学习得到用户表征向量，物品塔同理得到物品表征向量，将两个向量求得余弦相似度作为用户对物品的兴趣评估。\n\n负采样方式：batch内负采样，混合负采样。\n\n混合负采样：额外建立一个向量缓存，存储训练中得到的最新物料向量，除了batch内负采样得到的hard negative，再从向量缓存中采样一些向量作为easy embedding。\n\n**30、双塔模型的特点？生成用户向量过程中如何将历史行为赋予不同权重？**\n\n特点：双塔模型要求严格解耦，单塔可以很复杂，求余弦相似度前不允许用户和物品特征进行交叉。\n\n如果想将用户不同历史行为赋予权重作为用户向量，将物料作为query进行attention行不通，可以做出如下替代方案：\n\n（1）用户输入的搜索文本最能反映用户当下意图，作为query；（2）将用户画像作为query给历史行为打分；（3）将用户最后点击的物料作为query衡量历史行为重要性。\n\n**31、双塔模型的训练方式？**\n\n训练方式：\n\npointwise：独立看待每个正样本和负样本，做简单二元分类；\n\npairwise：对给定用户，每次取一个正样本和一个负样本，鼓励用户与正样本相似度越大，与负样本相似度越小，采用Pairwise Loss；\n\nlistwise：对给定用户，取一个正样本和多个负样本，鼓励正样本余弦相似度尽量大，负样本余弦相似度均尽量小，采用Sampled Softmax Loss。\n\n**32、Sampled Softmax Loss的训练技巧？**\n\n（1）L2正则化：用户和物品的向量点积采用余弦相似度，体现出归一的过程；\n\n（2）引入温度调整系数：用户和物品的相似度乘上1/τ，用于放大没被训练好的负样本，损失增加，该样本被重点关注。\n\nτ如果太小，会导致推荐精度高，但对用户潜在兴趣探索不够（用户没点击某物品并不完全因为不感兴趣，还可能是还未被曝光），导致进入信息茧房。\n\nτ如果太大，召回把关太松，影响用户体验，但有利于实现推荐多样性。\n\n（3）采样概率修正：负样本包括batch内负样本和向量缓存的负样本，纠偏的概率变成两种负样本的组合概率。\n\n**31、双塔模型的线上召回过程？为什么要分为离线存储和在线存储？**\n\n物品塔：离线存储，将训练好的物品向量存入向量数据库，并建立向量-ID索引，加速最近邻查找。\n\n用户塔：给定用户ID和特征线上计算用户向量，将其作为查询在数据库中做最近邻查找，返回与用户向量余弦相似度最高的物品向量。\n\n原因：线上计算几亿物品向量代价过大；且用户兴趣是动态变化的，必须线上计算，而物品特征相对稳定，因此可以线上计算物品向量。\n\n**32、双塔模型的两种更新方式？**\n\n全量更新：今天凌晨用昨天全天的数据，训练1 epoch，即每个数据只用一次（要randomshuffle打乱），目的是消除偏差。\n\n增量更新：做online learning更新模型参数，实时捕捉用户变化的兴趣，按数据从早到晚的顺序训练1 epoch。增量更新对数据流要求高，同时对时间延迟有严格要求。\n\n**33、双塔模型的问题？如何进行改进？改进方式的目标是什么？**\n\n双塔模型对高点击物品学习得好，长尾物品（低曝光物品）学习不好。可采用自监督学习方法，做data augmentation，把长尾物品向量表征学得更好，把低曝光物品、新物品推荐更准。\n\n**34、特征变换的方式有哪些？**\n\nrandom mask：随机选一些离散特征，把它们遮住；\n\ndropout：随即丢弃特征中的50%值；\n\n互补特征：把特征随机分成两组输出两个物品表征；\n\n关联特征：随机选择一个特征作为种子，利用互信息大小将相关性大（互信息大）一组关联特征mask，保留剩下的特征。\n\n**35、自监督训练的过程？**\n\n将物品i做数据增强，得到特征i1和i2，物品j同理得到特征j1和j2，目标是同一物品i1和i2的向量（正样本）相似度大，不同物品之间i1和j1/j2向量（负样本）的相似度小，采用交叉熵损失函数衡量。\n\n**36、Deep Retrieval的内容？四要素？**\n\n内容：把物品表征为路径，先上查找用户最匹配的路径。\n\n（双塔模型以向量作为中介，Deep Retrieval以路径作为中介）\n\n四要素：索引，神经网络预估路径，线上召回，训练。\n\n**37、Deep Retrieval的索引分为哪两部分？**\n\n（1）物品→路径：一个物品对应多条路径。\n\n（2）路径→物品：一条路径对应多个物品。\n\n**38、Deep Retrieval如何利用神经网络预估路径？**\n\n用3个节点[a, b, c]表示一条路径，a代表给定用户特征x，预估用户对节点a的兴趣 $p_1(a|x)$；b代表给定x和a，预估用户对节点b的兴趣 $p_2(b|a;x)$；c代表给定x、a和b，预估用户对节点c的兴趣 $p_3(c|a,b;x)$，将3项乘起来则代表用户对该路径的兴趣 $p(a,b,c;x)$。\n\n**39、Deep Retrieval如何进行线上召回？beam search的内容？如何选择beam size？**\n\n召回过程：给定用户特征，用神经网络做预估，用beam search召回一批路径；然后利用索引路径→物品召回一批物品；再对物品打分排序，选择一个子集。\n\nbeam search：设置参数k作为beam size，代表从一个节点出发选择k条最优路径。它本质是一种贪心算法，分别让p1，p2，p3最大化，但单独最大化这3项得到的结果不一定是最优路径。k越大，越容易选出最优路径。\n\n**40、Deep Retrieval训练步骤？正则项的作用？**\n\n训练步骤（以下两个步骤是同时进行的）：\n\n（1）学习神经网络参数（用户到路径）：要让物品表征的路径兴趣分数更大，损失函数则为兴趣分数取对数再取相反数。\n\n（2）学习物品表征（以用户为中介，探究物品和路径的关联）：用户→物品看的是用户是否点击过物品，用户→路径则为（1）中内容，两者相乘即为物品和路径的相关性，损失函数方法同（1）。\n\n正则项：在学习物品表征时，避免过多item集中在一条路径上，在损失函数中加上正则项，做到路径上item数量的平衡。\n\n**41、说出其它的一些召回通道？**\n\n地理位置召回：GeoHash召回（经纬度编码）和同城召回。\n\n作者召回：关注的作者，有交互的作者召回，相似作者召回。\n\n缓存召回：精排没有被曝光的缓存起来，作为一条召回通道，缓存要实行退场机制（成功曝光、超出缓存大小、超过召回次数、达到保存最多日期）\n\n**42、曝光过滤问题指的是什么？采用什么方式？**\n\n曝光过滤问题：如果用户看过某个物品，则不再把该物品曝光给该用户，曝光过的物品会从召回结果中被排除，采用Bloom Filter的方式。\n\n**43、Bloom Filter的作用？有什么问题？**\n\n作用：判断一个物品ID是否在已曝光的集合中，如果判断为no，则一定不在集合中（一定没被曝光）；如果判断为yes，则很可能在集合中（有可能被曝光，有可能没被曝光），将被舍弃。\n\n问题：这种方式一定可以避免物品重复曝光，但容易误伤，把未曝光物品视为已曝光物品过滤掉。\n\n**44、Bloom Filter具体做法？如何定性分析误伤概率？**\n\n具体做法：把每个物品映射到0到m-1的向量空间内，设置哈希函数k代表映射的空间位数。每往集合添1个曝光物品，只需把向量k个位置设为1，原本为1则不变。k＞1时，必须映射的每一位都为1才会被判断为已曝光。\n\n误伤概率：设曝光物品集合大小为n，二进制向量维度为m，使用k个哈希函数。如果n越大，向量中的1越大，误伤概率越大；m越大，向量越长，越不容易发生哈希冲突，误伤概率越小；k太大或太小都不好。\n\n（由于年龄大于1个月的物品不可能被召回，因此没必要把它们记录在Bloom Filter中，将它们移除可以减少n，降低误伤率）\n\n**45、Bloom Filter曝光过滤的完整链路？**\n\n前端记录下所有被曝光的物品，写入Kafka队列；用Flink对队列内容实时读取，并实时将结果写入向量空间；再将得到的向量空间应用于召回物品中，过滤掉判断为已曝光的物品，剩下的进入排序和曝光环节。\n\n**46、Bloom Filter曝光过滤的缺点？**\n\n只支持添加物品，不支持删除物品，从集合中移除物品，无法消除它对向量的影响（不能简单地把对应位置从1改为0）。\n\n**47、GCN的内容？特点？如何定义正样本、负样本及损失函数？**\n\n内容：将推荐系统构建成一张图，各种实体（用户、商品、店铺、品牌等）构成图的顶点，各种互动关系（浏览、点击、购买等）构成图的边。GCN将召回建模为边预测问题，预测两节点之间是否有边存在。\n\n特点：GCN考虑了图中的拓扑连接关系，有传递信息的作用。它能让两个用户的信息，通过共同购买过的商品、共同关注的品牌和商店进行相互传递；也能让两个物料的信息，通过同属的标签、品牌等相互传递，从而丰富用户和物料建模时的信息来源。\n\n定义：一条边上两端节点v1和v2构成正样本，v1+随即采集的顶点构成负样本，损失函数利用NEG、SS、MH、BPR等都可以。\n\n**48、GraphSAGE的原理？和GCN相比有什么优势？**\n\nGraphSAGE是GCN的一种实现思想。它并不直接学习图上各节点的向量，而是学习出一个转换函数，只要输入节点的特征和它的连接关系，它就能返回该节点的向量表示。\n\n优势：GCN需要将整个图的邻接矩阵输入模型，这意味着它在处理大规模图时会遇到内存和计算资源的瓶颈，遇到未见过的新节点时存在预测局限；而GraphSAGE是采样固定数量邻居节点进行聚合，避免了GCN需要整个图的限制，能很好的处理未见过的新节点，提高模型拓展性。\n\n**49、GCN的具体实现过程（定性，以推荐算法实战p133为例）？GAT如何改进GCN？**\n\n总结：自上而下生成节点，自下而上逐层卷积。\n\n生成节点：考虑节点A（最高层），先生成和它直接相邻的节点B、C、D（次高层），再对B、C、D生成它们各自相邻的节点（底层）。\n\n逐层卷积：从底层开始聚合邻居节点的信息（AGG聚合+PROJW1权重分配），并和本节点信息（PROJB1权重分配）合成，逐层操作得到最高层节点A的信息。聚合邻居节点信息时可以考虑拼接、attention等方式。\n\nGCN的聚合权重是固定的，而GAT通过attention生成权重，让模型自己学习，使处理更加灵活。\n\n**50、GCN召回的实例？目标是什么？同构图的含义？**\n\n实例：PinSage，图中有Pin和Board两种节点，分别代表网址和收藏夹，两节点的连接边代表收藏这一动作，它的目标是学出高质量的Pin Embedding。\n\n同构图：一类节点和一类边的关系图。\n\n**51、PinSage的训练和推理技巧？**\n\n训练：（1）Mini-Batch训练，将关联的节点有限化，减少计算时间和内存，提高效率；（2）选取邻居关联节点的方式是随机游走，选取被访问次数最多的若干个节点，剩余的节点可以作为Hard negative样本（相关但是相关性不够）。\n\n推理：MapReduce分布式推理，map是指各节点独立将上一轮卷积得到的旧向量映射成新向量，并发送给邻居节点；reduce是指各节点聚合邻居节点发来的向量，再映射成新向量。\n\n**52、异构图的GCN两种方式是什么？**\n\nMuitiBiSage：多个同构图卷积，思路是先考虑单一关系的同构图的节点信息传递，然后再将每种单一关系得到的结果融合（用到self-attention）起来生成节点向量。\n\nGraphTR：直接在异构图上进行卷积，先用transformer实现同一类型的邻居节点内部信息交叉，再用FM实现不同类型邻居节点之间的信息交叉。"
  },
  {
    "path": "推荐系统八股160问/3. 排序.md",
    "content": "# 排序\n\n### 推荐系统公开课第三章：排序+推荐算法实战第二章：特征工程\n\n**1、多目标排序模型可以有哪些指标？最终排序的依据？针对的排序类型？**\n\n指标：点击率、点赞率、收藏率、转发率等，最终是将每个指标得到的分数加权融合得到总分，对其进行排序，针对精排模型。\n\n**2、简要说明多目标排序模型的结构？和双塔模型有什么不同？**\n\n结构：将用户特征、物品特征、统计特征、场景特征串接融合进入神经网络，通过处理得到融合的特征向量，再通过全连接层+非线性输出指标分数（全连接层对每个指标而言是独立的）。\n\n不同：双塔模型是用户向量和物品向量先各自进行神经网络处理，再将输出进行相似度求解操作，神经网络是独立的；而多目标排序是一开始将用户和物品向量进行融合，神经网络是共享的。\n\n**3、排序模型的训练采用什么损失函数？训练难点在哪里？**\n\n采用交叉熵损失函数，难点在于正负样本的类别数量极不平衡，需要对负样本降采样，由于负样本变少，预估点击率将大于真实点击率。\n\n**4、MMoE的作用？模型结构？一般专家神经网络数量为多少？**\n\n作用：采用若干个专家神经网络，能够实现不同的指标交由不同神经网络，通过每个网络的门控（分配不同权重）处理，减少指标间的干扰；且处理某个指标的神经网络规模减小，防止了过拟合。\n\n模型结构：将用户、物品、统计、场景特征融合后，用若干个专家神经网络处理得到若干个向量，将这些向量依据权重加权平均得到最终的融合向量，进行后续处理，权重通过神经网络和softmax函数生成。专家神经网络数量一般为4或8。\n\n**5、什么是极化现象？如何解决？**\n\n极化现象：专家神经网络的权重一个接近1，其余接近0，导致没有将多个专家神经网络充分利用，没有被利用的专家神经网络处于“dead”状态。\n\n解决方法：对softmax的输出使用dropout，强迫每个任务根据部分专家做预测，但结果可能偏差较大（特别是权重接近1的专家被dropout）。\n\n**6、视频排序的依据？播放时长建模公式？**\n\n依据：在多目标排序模型指标的基础上，还有播放时长和完播。\n\n建模：用z代表经过全连接层输出的播放时长，p代表z经过sigmoid函数得到的值，p=exp(z)/1+exp(z)，用户真实播放时间为t，则y=t/1+t，对p和y用交叉熵函数使p接近于y。\n\n**7、衡量视频完播的两种方法？完播率调整的原因？如何调整？**\n\n两种方法：（1）回归方法，用实际播放时间/视频长度衡量播放率；（2）二元分类方法，定义完播指标（百分比），超过这个百分比代表完播，作为正样本，反之为负样本。全连接层输出的概率代表视频播放超过这个百分比的概率。\n\n完播率调整：不能把预估的完播率用到融分公式中，否则有利于短视频，对长视频不公平；调整方式是将预估播放率/f(视频长度)作为融分公式的一项参与排序。\n\n**8、物料画像由哪些组成？**\n\n物料属性（即Item ID）、物料的类别和标签、基于内容的embedding、动态画像（限定时间下的点击数、点赞数等指标）、作者特征（发布笔记数、粉丝数、笔记消费指标等）、用户给物料反向打的标签。\n\n**9、用户画像由哪两部分组成？**\n\n用户的静态画像：人口统计学属性，如性别、年龄，以及其它稳定的数据信息，对推荐算法作用不大，用户唯一标识User ID是很重要的信息。\n\n用户的动态画像：从用户历史交互行为提取出的用户兴趣爱好，如物料属性、用户动作类型（结合时间），可以采用简单平均、DIN、SIM等方法。\n\n**10、物料画像和用户画像特征通常用什么方式来提取和查询？优缺点？**\n\n方式：离线提取，在线查询。\n\n优点：线上提取用户兴趣/物料特征只需要一个查询操作，耗时短，适合召回、粗排这种候选集庞大的任务。\n\n缺点：提取出的用户兴趣不会随候选物料的不同而改变，针对性不强。\n\n**11、偏差特征的定义？举例？如何处理这些特征？**\n\n偏差特征：用户的选择并非完全出自他的兴趣爱好，而是受了场外不公平因素的影响，这些因素就是偏差。\n\n例如位置偏差：用户对某笔记/视频没有点击，不是因为他不喜欢，而是笔记/视频出现的位置太偏不醒目，影响了用户的行动，造成了用户兴趣和反馈的不匹配。\n\n处理方式：偏差特征通过一个线性层接入模型，保证无论这些特征取值如何，都不改变排序结果，实现偏差特征不起作用的效果。\n\n**12、数值特征处理的方式？**\n\n处理缺失值：用均值/中位数代替，或训练一个模型来预测缺失值。\n\n标准化：将不同量纲，不同取值范围的数值特征压缩到同一数值范围内。对于长尾数据，常采用开方、取对数等非线性变换后再标准化。\n\n数据平滑与消偏：威尔逊区间平滑（克服小样本的负面影响，提高计算置信水平）、CoEC（用某位置的点击数量均值代替，消除位置带来的偏差）。\n\n分桶离散化：将连续特征值划分为多个区间，看数值落在哪个区间，就以那个桶的桶号作为特征值。\n\n**13、类别特征有哪些？特点？**\n\n用户画像、物料画像中的一二级分类、标签都是类别特征，特别关注User ID和Item ID。类别特征有高维、稀疏的特点。\n\n**14、服务于类别特征的技术？**\n\n（1）用embedding扩展特征内涵，多特征交叉；（2）利用Parameter Server的分布式集群并行处理；（3）利用FTRL（调节学习率）、DIN（调节正则系数）、FM（交叉特征其中一个不为0就能参与训练）等方法解决罕见特征受训不充分的问题。\n\n**15、处理类别特征的数学方式？**\n\n数学方式：映射（利用映射表映射到embedding矩阵，维护难度大）、特征哈希（根据整数大小映射到embedding矩阵，哈希冲突影响不大）。\n\n**16、粗排和精排的区别？**\n\n粗排是给几千篇笔记打分，单次推理代价很小，预估准确性不高，有截断；\n\n精排是给几百篇笔记打分，单次推理代价很大，预估准确性更高，无截断。\n\n**17、前期融合和后期融合的区别？分别适用什么场景？**\n\n区别：前期融合是将所有特征串接一并输入神经网络（多目标排序模型），线上推理代价很大；后期融合是特征分别输入各自神经网络处理，得到各自处理结果最后再融合，线上推理代价很小。\n\n场景：前期融合适用于精排，后期融合适用于召回。\n\n**18、粗排使用的三塔模型结构？下层塔分别有什么大小关系？**\n\n三塔模型介于前期融合和后期融合之间。下层分为用户塔、物品塔和交叉塔，分别对用户/场景特征、物品特征、统计/交叉特征进行处理，得到不同向量；上层将这些向量串接融合，分别输入不同指标的全连接层，最终输出指标结果，粗排推理绝大部分计算量在模型上层。\n\n用户塔很大，一个用户只做一次推理；物品塔较大，利用缓存向量减少大部分推理；交叉塔较小，交叉特征是动态变化的，不能用缓存，必须每次做推理。\n\n### 推荐系统公开课第四章：交叉结构+推荐算法实战第四章：精排（4.2）\n\n**19、LR的基本原理？特点？**\n\nLR是将输入和权重相乘，通过sigmoid函数输出。对类别特征而言，LR是非零输入对应的权重相加。\n\n特点：LR强于记忆，将每个特征（主要是大众的，普遍的）的重要性（权重）牢牢记住，没有embedding和交叉作特征外延，无引申含义。\n\n**20、FTRL原理的定性描述？损失之和如何定义？**\n\nFTRL原理：为减少单个样本的随机抖动，第t步的最优参数不单单要最小化第t步的损失，而是让之前所有步的损失之和最小，在此基础上还增加正则项，即构成FTRL。\n\n损失之和分为两项：第一项是前面t步的梯度向量之和与被前t条样本优化后的权重相乘；第二项是当前步被优化权重与历史权重之差的平方和，要求它们不能相差太远，以防损害对旧样本的拟合能力。\n\n**21、FTRL是如何兼顾了预测精度和解的稀疏性的？**\n\n预测精度：采用梯度累积的方式，防止单个样本的随机抖动，并为每个特征单独设置学习步长（特征出现频率与学习率成负相关）。\n\n解的稀疏性：权重更新时设置了阈值λ，当梯度和权重计算的中间量z小于阈值时，权重会置零。\n\n**22、FM的基本原理？空间上如何改进？**\n\nFM对两个特征进行交叉，产生$w_{ij}x_ix_j$交叉项。由于n个特征交叉将引入n的平方个参数，因此将n×n矩阵拆分成两个n×k的矩阵相乘（其中一个为转置），k代表每个特征embedding的长度。于是，FM改进为 $(v_i^Tv_j)x_ix_j$。\n\n**23、Wide&Deep的模型内容？**\n\nWide侧：处理普遍大众的特征，以及一些偏差特征（如位置偏差），利用LR计算。\n\nDeep侧：将稀疏特征映射成稠密向量，通过DNN层得到输出结果。\n\nWide&Deep模型中，Deep是主力，Wide是辅助。\n\n**24、DeepFM在Wide&Deep基础上做了什么改进？**\n\n将Wide侧改为FM特征交叉，即模型由FM层和DNN层构成，FM和DNN的输入都是稠密的embedding向量。\n\n**25、DCN交叉层的数学原理描述？如何做空间优化？**\n\n原理：对向量$x_i$，将其进行Wx+b的操作后，与初始向量$x_0$按位相乘，并加上$x_i$，得交叉结果$x_{i+1}$。\n\n空间优化：将n×n的W拆分成两个n×r的小矩阵。\n\n**26、DCN-V2分为哪两个部分？两种不同的结构？**\n\n分为交叉网络和DNN两个部分，两种结构为串联和并联。\n\n**27、LHUC的基本原理？如何用于推荐系统的特征交叉？**\n\nLHUC用于语音识别：将语音信号和说话者特征各自进行处理后相乘得到交叉向量，再将交叉向量和说话者特征相乘，以此不断交叉下去。\n\n将语音信号、说话者的特征两个输入分别变成物品特征，用户特征，可用于推荐系统的特征交叉。\n\n**28、SENet的模型内容？**\n\n对m个特征进行embedding（长度可以不同），通过平均池化、非线性、全连接层等得到m个特征的权重，即每个特征的重要性，再将权重与对应embedding相乘得到新的向量作为结果，可以起到去噪的作用，可用于粗排和精排。\n\n**29、双线性交叉的两种方式？**\n\n内积：向量转置相乘；哈达玛乘积：向量对应位相乘。\n\n**30、FiBiNet的模型结构？**\n\n将SENet和双线性交叉进行结合，离散特征向量embedding以后分成三路，一路是直接串接，一路是双线性交叉，另一路是SENet+双线性交叉，三路向量串接融合，和连续特征一起输入上层神经网络进行后续处理。\n\n### 推荐系统公开课第五章：用户行为序列建模+推荐算法实战第四章：精排（4.3）\n\n**31、用户行为信息的构成有哪几个部分？**\n\n每个视频ID的embedding组成的向量，观看该视频的时刻距离本次请求时刻的时间差，视频元信息（作者、来源、标签），动作程度（观看时长、完成度）等。\n\n**32、简单平均的操作过程？适用模型？缺点？**\n\n操作过程：对用户历史交互的LastN物品得到n个embedding向量，再对向量取平均表示用户特征。\n\n适用模型：召回双塔模型、粗排三塔模型、精排模型。\n\n缺点：简单平均提取出的兴趣是固定的，不会随候选物品的变化而变化。\n\n**33、DIN模型的基本思想？内容？实现目标？适用模型？**\n\nDIN利用注意力机制的思想，将用于精排的候选物品的向量作为查询，将用户历史交互的LastN物品作为键和值，依次计算候选物品与历史交互物品的相似度（查询-键的权重），再将相似度（权重）与对应LastN物品向量相乘，加权融合得到最终用户的行为特征。这种方法能实现用户的行为序列特征随候选物品的不同而改变，实现“千物千面”。\n\n适用模型：DIN适用于精排模型，不适用于双塔、三塔模型，因为注意力机制要用到LastN+候选物品的融合，然而这两种模型用户塔和物品塔是解耦的。\n\n**34、如何将双层attention用于DIN模型？**\n\n在候选物品与历史交互物品attention之前，加一个自注意力机制模块，输入是用户历史交互的LastN物品原始向量，进入自注意力机制模块后输出的N个向量都融合了其它物料的信息，实现了特征交叉（类似autoint的原理），这里的self-attention可以用多头。\n\n**35、DIN模型的缺点？SIM做了如何改进？**\n\n缺点：建模的序列太短，容易有噪声；用户更早的交互行为可能对用户特征向量影响较大，而DIN将这类行为给忽略了，遗忘了用户的长期兴趣。\n\n改进：SIM将用户历史交互的物品数量n变得很大（可以是几千），从这n个物品中选出k个相似物品作为注意力层的键/值输入，使得LastN变为TopK，实现了用户长期兴趣的关注和计算量的减少。\n\n**36、选出k个相似物品的两种在线提取方式？维护的索引是否和主模型完全一致？**\n\n硬搜索：根据候选物品的类目，在用户完整的长期历史序列中搜索与其有相同属性的历史物料。实际有数据库（如UBT）将用户长期行为序列缓存（用户ID-物料属性-物料属性对应的物品），所以只需在缓存中查找筛选。\n\n软搜索：把候选物品向量作为query，做k近邻查找（也可用近似最近邻ANN），保留相似度最高的k个。实际是将物品的embedding存入向量数据库并建立索引，加速软搜索。\n\n注意：离线索引中的embedding是另一套模型训练出来的，可能与推荐主模型不一致，且索引中的embedding更新频率不如主模型，所以会带来软搜索和SIM模型的差异。\n\n**37、离线训练用户兴趣采用什么方式？简要原理？优缺点？**\n\n采用双塔模型：一个塔用于提取用户长期兴趣，输入为用户A的画像和长期行为序列；另一个塔用于提取用户短期兴趣，输入为另一用户B的画像和短期行为序列。训练目标是鼓励同一用户的长短期向量相近（余弦相似度更大），不同用户的长短期向量较远（余弦相似度更小）。这种方式每天只需要更新一次即可，然后把用户兴趣向量存入数据库，预测时就拿用户的ID去数据库里检索得到用户兴趣向量。\n\n优点：实现简单，耗时较少；缺点：得到的用户长期兴趣不会随候选物料变化。\n\n### 推荐系统公开课第六章：重排\n\n**38、如何基于物品属性标签度量相似度？**\n\n由CV、NLP算法推断出类目、品牌、关键词等信息，再根据这些类目、关键词等设置的权重，加权计算总的相似度。\n\n**39、基于物品向量表征衡量相似度中，学习物品向量有哪两种方式？各自特点？哪种更好？**\n\n用召回的双塔模型学习物品向量，问题在于对新物品/长尾物品的学习效果不好。\n\n根据CV、NLP模型提取出文字和图片的向量作为向量表征，思想是对于图片-文本二元组，预测图文是否匹配。优势是无需人工标注，且大部分笔记图文相关，这种方法优于双塔模型学习物品向量。\n\n**40、重排在推荐系统链路中的位置？思想是什么？**\n\n重排在精排给几百个物品打分之后，其思想在于保证被推荐物品的多样性。对于精排的几百个物品，既要考虑它们的打分，也要考虑物品之间的相似度，从而选出曝光的k个物品以及曝光顺序。\n\n**41、简述MMR多样性算法的流程？**\n\n设已选中物品的集合为S（一开始为空），未选中的物品集合为R；从R中选择精排分数最高的物品移到S，再计算集合R每个物品的MR分数（与它的精排分数和它与集合S中的物品的最大相似度有关，利用θ给两个因素分配权重，最大相似度一项起抑制作用），选择最大的MR作为MMR，对应物品从R移动到S；对上述操作进行k-1轮循环，结束后即可得到k个物品，每次MR和MMR都要重新计算。\n\n**42、MMR计算的问题？如何解决？**\n\n问题：当选中的物品越多（集合S越大），越不容易找出物品i，使得它与S中的物品都不相似，即最大相似度总是约等于1，导致MMR算法失效。\n\n解决方法：引入滑动窗口，原本计算最大相似度的集合为S，现在改为滑动窗口对应集合W，表示最近选中的若干个物品。\n\n**43、重排有哪些规则？如何将这些规则应用到MMR算法中？**\n\n规则：（1）最多连续出现k篇同类型笔记（图文、视频）；（2）每k篇笔记最多出现1篇某种笔记（如每9篇笔记中最多只能出现1篇运营推广笔记）；（3）前t篇笔记最多出现k篇某种笔记（如前4篇笔记最多出现1篇带电商卡片的笔记）。\n\n方式：重排结合MMR与规则，每轮先根据上述规则排除R中的部分物品，再对排除后的集合应用MMR公式。\n\n**44、DPP的目标？利用其作为多样性衡量的依据？超平行体的体积和物品向量构成的行列的关系？**\n\n目标：从集合中选出多样的物品，考虑选出物品集合的多样性。\n\n依据：利用超平行体的体积衡量物品多样性，给定k个物品及其向量（单位化），如果这些向量两两正交，此时体积最大化，物品多样性好；如果向量之间线性相关，此时体积最小化，物品多样性差。\n\n关系：超平行体的体积平方=det(物品向量构成的矩阵转置×它本身)。\n\n**45、简述DPP多样性算法的流程？**\n\n先精排给n个物品打分，从n个物品中选出k个物品组成集合S，保证精排分数之和越大越好，且k个向量组成的超平行体的体积越大越好。将选中的物品集合设为S，未选物品集合为R，每次从R中选出物品i加入S，在i的精排分数和加入S后超平行体的体积（即行列式一项）之间分配权重，每次要使求解公式值最大，进行k次循环即可选出k个物品作为重排结果。\n\n**46、Hulu快速算法如何加快行列式的计算速度？**\n\n可将行列式一项变成$A_{S∪{i}}$。它是在矩阵$A_S$基础上多一行和一列，计算该矩阵行列式时，可以利用Cholesky分解：有$A_S=LL^T$，其中L为下三角矩阵（对角线以上元素全为0）。每次多一行和一列时Cholesky分解情况变化不大，这样算行列式就会非常方便，减少运算。\n\n**47、DPP如何结合滑动窗口和规则约束？**\n\n当S集合中的物品越来越多时，行列式一项将趋近于0，导致DPP算法效果不好。于是将S变为滑动窗口集合W代表最近的若干个物品；以及在加入物品到S前，先从R中把不符合要求的物品排除，再从排除后的集合中选择物品加入S。"
  },
  {
    "path": "推荐系统八股160问/4. 冷启动.md",
    "content": "# 冷启动\n\n**1、什么是物品冷启动？冷启动的两种类型？哪种更复杂？**\n\n物品冷启动：针对新发布的笔记和视频；分为用户上传的内容UGC和平台采购的PGC；UGC更复杂，物品质量差异更大。\n\n**2、为什么要特殊对待新笔记？**\n\n可以促进作者发布，增加作者发布笔记的动力，进而增大内容池；挖掘优质笔记，让每篇新笔记得到足够曝光。\n\n**3、优化冷启动的目标？**\n\n精准推荐：把新笔记推荐给合适用户；激励发布：流量向低曝光新笔记倾斜，激励作者发布；挖掘高潜：通过初期的流量试探，给每篇新笔记曝光机会，找到高质量笔记给予流量倾斜。\n\n**4、作者侧的两大指标含义？反映了什么？**\n\n发布渗透率=当日发布人数/日活人数，即每天发布笔记的作者比例；\n\n人均发布量=当日发布笔记数量/日活人数，即平均每个人当日发表多少篇笔记。\n\n作者侧指标反映了作者发布积极性，低曝光新笔记扶持越好，作者侧指标越高。\n\n**5、用户侧的两类指标？反映了什么？大力扶持低曝光新笔记会发生什么？**\n\n新笔记消费指标：新笔记的点击率、交互率。\n\n大盘消费指标：消费时长、日活、月活。\n\n大力扶持低曝光新笔记，作者侧发布指标变好，用户侧大盘消费指标变差。因为低曝光笔记缺乏用户交互，推荐不准，大力推荐这些笔记会使用户体验下降。\n\n**6、内容侧指标指的是什么？**\n\n内容侧指标指的是高热笔记占比（30天超过1000点击的笔记），高热笔记占比越高，冷启动阶段挖掘优质笔记的能力越强。\n\n**7、冷启动的两大优化点？**\n\n优化全链路：包括召回、排序，保证低曝光/新发布笔记能正常走完链路，且能被准确推荐；\n\n流量调控：如何在新物品、老物品中分配流量。\n\n**8、冷启动召回的难点？**\n\n新笔记包含图片、文字、地点等信息，但缺乏用户交互信息，导致物品ID embedding没学好，进而使双塔模型效果不好，且ItemCF不适用。\n\n**9、冷启动召回可以从哪些方面改进？**\n\n双塔模型召回、类目和关键词召回、聚类召回、Look-Alike召回。\n\n**10、如何对双塔模型进行改进，从而有利于冷启动？**\n\n（1）新笔记使用default embedding，共享一个向量，default embedding是学习出来的；（2）查找topk个内容最相似的高曝光笔记，将它们的embedding取平均，作为新笔记的embedding；（3）采用多召回池（设置笔记的不同时限，如1小时内，5小时内等）让新笔记有更多曝光机会。\n\n**11、类目/关键词召回的原理？有什么缺点？**\n\n系统维护类目/关键词→笔记列表的索引，笔记列表中的笔记是按时间倒排的。根据用户画像中感兴趣的类目以及关键词，取对应笔记列表中最新的k篇笔记，作为召回结果。\n\n缺点：只对刚刚发布的新笔记有效，过期限后就没法被召回；且根据类目/关键词做召回太宽泛，不够具体，缺乏个性化。\n\n**12、聚类召回的基本思想？实现聚类的具体步骤？维护索引？**\n\n基本思想：如果用户喜欢一篇笔记，那么他会喜欢内容相似的笔记。\n\n具体步骤：采用k-means聚类法，根据笔记的类目和图文内容，把笔记映射成向量，对这些向量做聚类，划分为1000个cluster，记录每个cluster的中心方向。当一篇新笔记发布以后，将它映射成一个向量，从1000个cluster对应的向量中选择最相似的一个，作为新笔记的cluster。\n\n维护索引：cluster→笔记ID列表（按时间倒排），召回时选择列表前几篇笔记。\n\n**13、聚类进行线上召回的步骤？缺点？**\n\n步骤：（1）给定用户ID，找到他的last-n交互的笔记列表，把这些笔记作为种子笔记；（2）把这些种子笔记映射到向量，寻找最相似的n个cluster；（3）从这些cluster中各取出最新的m篇笔记，因此最多取出mn篇新笔记。\n\n缺点：只对刚刚发布的新笔记有效。\n\n**14、聚类召回的训练步骤？如何选取正负样本？**\n\n训练步骤：选择种子笔记和正负样本笔记求解余弦相似度，鼓励种子笔记和正样本相似度接近于1，和负样本相似度接近-1，采用Pairwise loss（triplet hinge loss或triplet logistic loss）训练。\n\n正样本：算法选择高曝光/相同二级类目的笔记作为正样本，也可以利用ItemCF中的物品相似度选择正样本；负样本：随机选出字数较多（神经网络提取出的文本信息有效），笔记质量高的（避免图文无关）作为负样本。\n\n**15、Look-Alike召回的基本思想？具体步骤？**\n\n基本思想：考虑的是用户之间的相似度。把和新笔记有交互的用户作为新笔记的种子用户，若一个用户可能和种子用户相似，就用Look-Alike把新笔记在这些相似用户中扩散，两个用户的相似度用UserCF或用户ID embedding求余弦相似度得到。\n\n具体步骤：将与新笔记交互的用户向量平均，作为新笔记的特征向量，每当有用户交互该笔记，就将它的特征向量更新，然后存入数据库中。每次将用户向量作为query在数据库中做查找，将相似度最高的几十个向量对应笔记给用户推送。\n\n**16、流量调控有哪些技术？**\n\n（1）在推荐结果中强插新笔记；（2）对新笔记的排序分数做提权；（3）通过提权，对新笔记做保量，保证新笔记的曝光达到一定数量；（4）差异化保量。\n\n**17、新笔记提权的方式？提权的缺点？**\n\n方式：在粗排和重排环节，对新笔记提权，使其占比和分数大幅提升。\n\n缺点：曝光量对提权系数很敏感，不易精确控制曝光量，容易过分曝光或不充分曝光。\n\n**18、新笔记保量的内容？方式？**\n\n内容：不论笔记质量高低，都保证前24小时获得100次曝光。\n\n方式：在原有提权系数的基础上，乘以额外的提权系数，发布时间越长，当前曝光次数越少，提权系数越高。\n\n**19、新笔记保量的难点？给新笔记分数提权越多，是否对新笔记越有利？**\n\n难点：由于提权系数调整较难，以及召回、排序存在不足等问题，保量成功率远低于100%；且线上环境变化（召回通道、排序模型、重排规则等）会导致保量失败。\n\n给新笔记分数提权越多，会使新笔记曝光次数越多，但会把笔记推荐给不合适的受众，导致互动指标降低，被推荐系统打压，难以成为热门笔记。\n\n**20、差异化保量的内容？具体做法？**\n\n内容：不同笔记有不同的保量目标，普通笔记获得100次曝光，优质笔记获得100-500次曝光。\n\n做法：先让笔记获得基础保量，即24小时100次曝光，再根据笔记内容的质量高低，和作者历史笔记的质量高低，给予额外保量，上限分别是200次曝光。\n\n**21、冷启动用户侧AB测试方法？缺点？推全后diff缩小的原因？**\n\n方法：将用户侧分为50%的实验组和50%的对照组，实验组采用新策略，将新笔记权重增大两倍，从而使实验组用户看到更多新笔记，对照组采用原策略，考察新笔记的CTR和用户消费时长的diff。\n\n缺点：观测的结果是消费指标会变差，AB测试的diff是负数，这是因为新笔记虽然曝光变多，但曝光不精准，带来用户使用app时长贬低，体验变差。\n\n推全后diff缩小的原因：推全后会面向更多用户群体，新笔记曝光更有可能获得用户的点击、点赞、收藏等。\n\n**22、冷启动作者侧AB测试的三种方案简述？各自的缺点？**\n\n方案一：用户侧100%用户面向100%的老笔记和两种策略的新笔记，新笔记分为50%的实验组和50%的对照组，实验组采用差异化保量，新笔记权重增大两倍，对照组用简单保量。缺点：（1）新笔记之间会抢流量；（2）新笔记会抢老笔记流量。最终导致推全后diff会减小甚至消失。\n\n方案二：将用户侧分为50%实验组和50%对照组，实验组用户面向新笔记中50%的实验组（差异化保量），对照组用户面向新笔记50%的对照组（正常保量），避免了新笔记之间抢流量的问题。缺点：（1）新笔记会抢老笔记流量；（2）新笔记内容池减少一半，需要从差一点的笔记中选一半补上来，影响用户体验，消费指标下降。\n\n方案三：在方案二的基础上把老笔记也分为50%的实验组和50%的对照组，实现老笔记、用户侧、新笔记实验组和对照组的50%-50%-50%对应。这种方式就像把app切成两半，消费指标会大跌。"
  },
  {
    "path": "推荐系统八股160问/5. 涨指标的方法.md",
    "content": "# 涨指标的方法\n\n**1、推荐系统最核心的两个指标？简要解释留存的含义？其它核心指标和非核心指标？**\n\n最核心的两个指标：日活用户数和留存。\n\n留存的含义：以LT7为例，它代表的是某用户今天登录APP，未来7天有4天登录APP，那么该用户今天的留存LT7为4。留存通常是所有用户LT的平均，它的增长通常意味着用户体验提升，但阅读数、曝光数可能会下降。\n\n其它核心指标：用户使用时长、总点击数、总曝光数、发布量、发布渗透率等；非核心指标：点击率、交互率等。\n\n**2、简述涨指标有哪些方法？**\n\n（1）改进或增加召回模型；（2）改进排序（粗排和精排）模型；（3）提升召回、粗排、精排的多样性；（4）特殊对待新用户，低活用户人群；（5）利用关注、转发、评论三种交互行为。\n\n**3、简述如何改进召回模型？**\n\n改进召回模型，从双塔模型和item-to-item两大最重要的模型入手，也可以添加某些召回模型和内容池（按时限划分），得到多条召回通道。\n\n**4、双塔模型的改进方向有哪些？**\n\n（1）优化正负样本的选取：简单正样本、简单&复杂负样本；（2）改进神经网络结构（实际不提倡）：如用户塔、物品塔的全连接网络用DCN代替，在用户塔中采用用户行为序列（通常要离线训练和储存），使用多向量模型等；（3）改进模型训练方法：如batch内负采样（要纠偏），采用自监督学习方法等。\n\n**5、item-to-item的常见变体有哪些？**\n\nU2I2I（物品间的相似）、Swing（考虑小圈子因素）、U2U2I（用户间的相似）、U2A2I（考虑用户感兴趣的作者）、U2A2A2I（考虑作者间的相似）等。\n\n**6、如何改进精排模型？**\n\n基座部分（特征神经网络处理部分）：将基座加宽加深，增加预测准确性；做特征交叉，如bilinear、LHUC等；特征工程，如添加统计/多模态内容特征。\n\n多目标预估部分：增加新的预估目标；使用MMoE、PLE等结构、引入偏差特征的处理模块。\n\n**7、如何改进粗排模型？这种方法的缺点？**\n\n采用粗精排一致性建模，让粗排和精排更一致，能提升核心指标：（1）pointwise蒸馏：设y为用户真实行为，p为精排预估，将(y+p)/2作为粗排拟合目标；（2）pairwise/listwise蒸馏：粗排阶段做LTR，去拟合物品精排的排序，若排序和精排不同则给予惩罚。\n\n缺点：如果精排出问题，会对粗排的训练和预测带来影响。\n\n**8、如何对用户行为序列建模方式改进？**\n\n（1）增加序列长度（SIM）；（2）用类目、物品向量表征聚类，线上排序时保留候选物品对应聚类序号的物品；（3）对行为序列中的物品，使用ID以外的一些特征。\n\n**9、在线学习指的是哪种更新？资源消耗和额外算力情况？**\n\n在线学习，即增量更新。每天既要在凌晨做全量更新，也要不间断做增量更新，因此需要额外算力。如果线上有m个模型，则需要m套在线学习的机器。其中1个是holdout，1个是推全模型，剩下m-2个即为测试新模型。在线学习对指标提升很大，但会降低模型迭代升级效率。\n\n**10、老汤模型的内容？如何判断新模型结构优于老模型？如何更快追平、超过线上老模型？**\n\n内容：每天新产生的数据对模型做1 epoch训练，久而久之，老模型训练的非常好，很难被超过。\n\n判断新模型优于老模型，只需要判断新老模型谁的结构更优，新模型的全连接层和embedding层可以采用老模型相同的参数，用n天的数据训练新老模型，如果新模型显著优于老模型，新模型很可能更优。\n\n要追平、超过线上老模型，可以尽量多复用老模型训练好的embedding层，避免随机初始化；也可以用老模型做teacher，蒸馏新模型（真实行为y，老模型预测p，新模型用(y+p)/2作为训练目标）。\n\n**11、如何提升精排多样性？**\n\n结合兴趣分数和多样性分数对物品排序，常用方法是MMR、DPP，并结合滑动窗口和打散规则。\n\n**12、如何提升粗排多样性？**\n\n将粗排打分的几千个物品，选择分数最高的几百个物品送入精排，剩余物品计算兴趣分数和多样性分数再进行排序，再选出几百个物品送入精排，实现最终精排有这两个部分。\n\n**13、提升召回多样性的两种模型？对应方式？**\n\n双塔模型：（1）添加噪声：线上召回计算出用户向量之后，在ANN检索之前往用户向量中添加随机噪声，用户兴趣越窄，添加噪声更强，使得召回的物品更多样。（2）抽样用户行为序列：将用户最近交互的n个物品，保留最近的r个，再从n-r个物品中随机抽样t个，将r+t作为用户行为序列。这种方式可以注入随机性，且n可以非常大，得到用户很久以前的兴趣。\n\nU2I2I：选出用户最近交互的n个物品之一，可能得到的类目数量很少。因此做非均匀随机采样，从n个物品（n可以很大）中选出t个让类目平衡。\n\n**14、探索流量的内容？具体做法？依据是什么？**\n\n内容：每个用户曝光物品有2%是非个性化的，做兴趣探索。\n\n具体做法：维护一个精选内容池，里面的物品均为交互指标高的优质物品，从这个池中随机抽样几个物品，跳过排序，直接插入作为排序结果。\n\n依据：用户个性化欠缺，就要通过提升物品质量来吸引用户，用高质量弥补个性化的损失，这样短期对核心指标会有负向影响，长期会带来正面影响。\n\n**15、为什么要特殊对待特殊人群？**\n\n（1）新用户、低活用户行为很少，个性化推荐不准确；（2）新用户、低活用户容易流失，要想办法促使他们的留存；（3）特殊用户的交互行为和主流用户有差异，用主流用户训练出的模型在他们身上有偏差。\n\n**16、构造特殊内容池的目标？方式？**\n\n目标：用于特殊人群的召回，保证内容质量好，提升用户满意度。\n\n方式：（1）先圈定人群，然后用该人群对物品交互次数、交互率打分，选出分数最高的物品进入内容池。内容池要定期更新加入新物品，排除交互率低和失去时效性的老物品。（2）判断物品对人群留存率的贡献，根据贡献值选择物品。\n\n**17、构建特殊内容池召回的模型？会带来哪些额外代价？**\n\n模型：双塔模型。注意对于新用户而言，双塔模型个性化不准确，所以要高质量内容来弥补。\n\n额外代价：（1）训练代价：正常用户不论多少个内容池，都只训练一个双塔模型，而新用户需要单独训练模型；（2）推理代价：内容池要定期更新，ANN索引也要更新，然而特殊内容池比较小，额外算力不大。\n\n**18、如何使用特殊排序策略？**\n\n（1）排除低质量物品：新发布物品不在新用户、低活用户上做探索，只在活跃的老用户上做探索，防止推荐不准损害新用户、低活用户的体验；（2）差异化融分公式：改变指标（如点击率）的权重，或直接保留该指标最高的几个物品，甚至直接把指标最高的物品放在第一位给用户推荐。\n\n**19、使用特殊排序模型的方法有哪些？**\n\n大模型+小模型：用全体用户训练大模型，大模型的预估p拟合用户真实行为y；再用特殊用户训练小模型，小模型的预估q拟合大模型残差y-p（类似GBDT），起到大模型纠偏的作用。主流用户只用大模型预估p，特殊用户用大模型和小模型预估p+q。\n\n融合多个experts：用多个experts输出向量，再根据用户特征（新老、活跃度等）输出权重，对experts加权平均。\n\n**20、关注和留存率的关系？**\n\n关系：关注作者数量和留存率成正相关，关注的作者越多，该平台对他的吸引力越强。关注的作者少，就需要促使用户关注更多作者。\n\n**21、如何利用关注行为提升留存和发布？**\n\n提升留存：（1）优化排序策略：定义单调递减函数w(f)，用户关注作者越少，该函数越大。将该函数与对某物品的关注率p相乘，实现促进用户对该物品作者的关注；（2）构造促关注内容池和召回通道：物品关注率高，能促进作者的关注。当用户关注作者数少时，对该用户使用该内容池。\n\n提升发布：作者粉丝数越少，则每增加一个粉丝对发布积极性的提升越大。定义单调递减函数w(f)，f为粉丝数量。将该函数与作者发布的物品关注率p相乘，帮助低粉作者涨粉。\n\n**22、显式关注和隐式关注的含义？挖掘隐式关注的意义？**\n\n显式关注：用户u关注了作者a，将a发布的物品直接推荐给u；\n\n隐式关注：用户u喜欢看作者a发布的物品，但u未关注a。\n\n隐式关注的作者数量远大于显式关注，挖掘隐式关注关系，构建U2A2I召回通道，可以提升推荐系统核心指标。\n\n**23、如何利用转发提升推荐系统指标？目标是什么？识别方式？具体方法？**\n\n简单提升转发次数，让转发率大的物品更容易获得曝光机会，但这样会负面影响交互情况，因此可采用KOL建模。\n\n目标：不损害点击和其它交互的前提下，尽量多吸引站外流量，其它平台KOL（大V）转发的内容吸引流量更大。\n\n识别方式：考察该用户历史转发能带来多少站外流量，例如转发到抖音的流量高，则可判断他可能是抖音的KOL。\n\n具体方法：（1）在物品i的转发率p基础上乘一个k，如果用户在其它平台是KOL，则k更大，从而提升该用户发表的物品在本平台的流量，提升大盘指标；（2）也可以构造促转发内容池和召回通道，对站外KOL生效。\n\n**24、评论的发布价值和留存价值？高质量评论的作用？**\n\n发布价值：新物品获得评论能提升作者发布积极性，当新物品尚未获得很多评论时，则给预估评论率提权。\n\n留存价值：给喜欢留评论和与作者互动的用户添加促评论内容池，促进他们在平台的互动和参与度，有利于提升用户留存。\n\n高质量评论的作用：对作者、其他用户的留存有贡献，推荐系统常鼓励高质量评论用户多留评论。"
  }
]