天津网站搜索排名优化,网站开发和软件开发那个简单,产品设计工程师,新乡网站关键字优化星标/置顶小屋#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术有人的地方就会有江湖#xff0c;就会有鄙视链存在#xff0c;推荐系统中也不例外。排序、召回#xff0c;尽管只是革命分工不同#xff0c;但是我感觉待遇还是相差蛮大的排序排序#xff0c;特别是精排… 星标/置顶小屋带你解锁最萌最前沿的NLP、搜索与推荐技术有人的地方就会有江湖就会有鄙视链存在推荐系统中也不例外。排序、召回尽管只是革命分工不同但是我感觉待遇还是相差蛮大的排序排序特别是精排处于整个链条的最后一环方便直接对业务指标发力。比如优化时长只要排序模型里样本加个权就可以了。排序由于候选集较小所以有时间使用复杂模型各种NN各种Attention能加的都给它加上逼格顿时高大上了许多。用于排序的基础设施更加完善特征抽取、指标监控、线上服务都相对成熟。召回一个系统中不可能只有一路召回平日里相互竞争召回结果重合度高导致单路召回对大盘的影响有限好处是相互冗余有几路出问题也不至于让排序饿肚子。召回处于整体推荐链条的前端其结果经过粗排、精排两次筛选作用于最终业务指标时影响力就大大减弱了。受限于巨大的候选集和实时性要求召回模型的复杂度受限不能上太复杂的模型。平日里最简单的基于统计的策略比如ItemCF/UserCF表现就很不错改进的动力也不那么急迫。用于召回的基础设施不完善。比如接下来我们会提到召回建模时需要一些压根没有曝光过的样本。而线上很多数据流设计时只考虑了排序的要求线上的未曝光样本线下不可能获取到。总之我感觉排序更受关注很多问题被研究得更透彻。而召回尽管召回不存排序焉附地位相当重要但是受关注少有好多基本问题还没有研究清楚。比如接下来我们要谈到的诸如“拿什么样的样本训练召回模型”这样的基本问题很多人还存在误区习惯性照搬排序的方法适得其反。在这种情况下2020年Facebook最新的论文《Embedding-based Retrieval in Facebook Search》EBR更显难能可贵值得每个做召回算法的同行仔细阅读。正所谓“实践出真知”文中涉及的部分问题哪怕你有推荐算法经验但只做过排序比如一年前的我都压根不会意识到更不能给出解决方案。而在你实践过召回算法特别是向量化召回之后方能感觉到这篇文章切中召回工作中的痛点“对症下药”。所以今天我将解读一下Facebook EBR这篇经典论文。论文解读不是简单的翻译这年头谁还看不懂个英文呢?而是结合自己的亲身实践把论文中一笔带过的地方讲透补充论文中忽略的细节列举针对相同问题业界其他的解决方案算是论文原文的一个补充。简述Facebook EBR模型这篇论文非常全面涵盖了一个召回从样本筛选、特征工程、模型设计、离线评估、在线Serving的全流程。但在我看来并非每部分都是重点。论文中的某些作法就是召回算法的标配。在详细论文EBR的重点之前我还是将这个模型简单描述一下。模型老生常谈的双塔模型。双塔避免底层就出现特征交叉方便拆分模型使doc embedding进入FAISS。双塔模型不是唯一的只要user,doc的匹配得分能够表达成user embedding/doc embedding内积或cosine的形式比如FM都适用于召回。LOSS文中了使用了Pairwise Hinge Loss的形式lossmax(0,margin-u,du,d-)。即同一个用户与“正文章”点击过的文章的匹配度u,d要比用户与“负文章”怎么选择负文章就是召回的关键的匹配度u,d-高于一定的阈值尽管不同召回算法有不同的loss但是背后基于Pairwise LTR的思想都是共通这一点与排序时采用binary cross entropy loss有较大的不同。比如Youtube/DSSM模型使用(Sampled) Softmax。但经过Negative Sampling之后同样是针对同一个用户一个d要配置若干个d-与Pairwise思路类似而想让u在d上的概率最高同样要求分子u,d尽可能大而分母所有的u,d-尽可能小与LTR的思路类似。但是根据我的实践经验使用BPR losslog(1exp(u,d--u,d))效果要比这里的Pairwise Hinge Loss好文中也说了margin对于模型效果影响巨大BPR loss少了一个需要调整的超参Hinge loss中u,d-u,d-大于margin后对于loss的贡献减少为0。而BPR则没有针对u,d-u,d-设定上限鼓励优势越大越好。离线评估由于线上AB测度周期长易受外界影响。因此在线上AB测试之前我们需要进行充分的离线评估减少实验的时间成本。文中所使用的方法是拿Top K召回结果与用户实际点击做交集然后计算precision/recallAirbnb所使用的方法是看“用户实际点击”在“召回结果”中的平均位置实际上不同于排序召回的离线评测更加难做因为召回的结果未被用户点击未必说明用户不喜欢而可能是由于该召回结果压根没有给用户曝光过根据我的亲身实践无论是precision/recall还是平均位置和实际线上结果之间还是存在一定gap。曾经发生过新模型的离线评测结果没有显著提升但是上线后去发现提升明显。所以缺乏置信度高的离线评测手段仍然是召回工作中的痛点。特征因项目而异可借鉴的地方不多FAISS调优毕竟与Faiss师出同门非常宝贵的调参经验。但是受篇幅所限就不在这里过多展开了。重中之重是筛选负样本简单描述之后才进入本文的华彩段落即Training Data Mining。单单Mining一个词感觉就比Sample Filtering高大上了许多也让你感觉到这件工作的艰巨远不是“过滤脏数据”那么简单。本文最精彩的部分就是对样本的筛选。如果说排序是特征的艺术那么召回就是样本的艺术特别是负样本的艺术。样本选择错了那么上述的模型设计、特征工程只能是南辕北辙做得越卖力错得越离谱。本文在“样本筛选”上的贡献有三破除“召回照搬排序”的迷信明确指出不能只拿“曝光未点击”做负样本提出了easy negative/hard negative的样本分级思路提出了增强hard negative的思路也不算首创了和百度Mobius的思路几乎一模一样也算英雄所见略同了本文的另外两个贡献也算是“样本筛选”的引申全链路优化中提出将召回结果交给人工审核不过是增强hard negative的一个手段多模型整合也算是hard negative除了“增强样本”之外的另一种利用方式。而且不同模型也是按照negative samples的难度来分级的为什么不能只拿曝光未点击做负样本我曾经做过Youtube召回当时就特别不理解为什么Youtube不用“曝光未点击”做负样本而是拿抽样结果做负样本。而且这样做的还不仅仅Youtube一家Microsoft的DSSM中的负样本也是随机抽取来的。两篇文章都没说明这样选择负样本的原因。当时我只有排序方面的经验而排序是非常讲究所谓的“真负”样本的即必须拿“曝光未点击”的样本做负样本。为此还有所谓above click的作法即只拿点击文章以上的未点击文章做负样本。所以排序思维根深蒂固的我觉得拿“曝光未点击”做负样本简直是天经地义何况还那么有诱惑力“曝光未点击”是用户偏好的“真实”cross finger反馈。而随机抽取的可能压根就没有曝光过不能断定用户就一定不喜欢。“曝光未点击”的数量有限处理起来更快用“曝光未点击”数据能够复用排序的data pipeline很多数据都已经处理好了无须重新开发和生成碰上“万能”的FM模型拿曝光数据训练出来的模型既能做排序又能做召回岂不美哉????所以当我第一次实践Youtube算法时直接拿“曝光未点击”样本做负样本训练出来的模型离线AUC达到0.7做为一个特征简化的召回模型已经算是非常高了但是线上表现一塌糊涂。离线评测时发现召回的物料与用户画像、用户点击历史完全没有相关性。而当我抱着“照着论文画瓢”拿随机采样的样本做负样本线上结果却非常好。何也其实是因为我自以为是的做法违反了机器学习的一条基本原则就是离线训练数据的分布应该与线上实际应用的数据保持一致。以前我们谈到召回与排序的不同往往只强调速度即因为召回的候选集更大所以要求速度更快所以模型可以简单一些。这是只知其一。另一个方面起码之前是我没有深刻意识到的就是排序其目标是“从用户可能喜欢的当中挑选出用户最喜欢的”是为了优中选优。与召回相比排序面对的数据环境简直就是温室里的花朵。召回是“是将用户可能喜欢的和海量对用户根本不靠谱的分隔开”所以召回在线上所面对的数据环境就是鱼龙混杂、良莠不齐。所以要求喂入召回模型的样本既要让模型见过最匹配的user,doc也要让模型见过最不靠谱的user,doc才能让模型达到开眼界、见世面的目的从而在“大是大非”上不犯错误。最匹配的user,doc没有异议就是用户点击的样本最不靠谱的user,doc是“曝光未点击”样本吗显然不是。这里牵扯到一个推荐系统里常见的bias就是我们从线上日志获得的训练样本已经是上一版本的召回、粗排、精排替用户筛选过的即已经是对用户“比较靠谱”的样本了。拿这样的样本训练出来的模型做召回一叶障目只见树木不见森林。就好比一个老学究一辈子待在象牙塔中查古籍访高人能够一眼看出一件文物是“西周”的还是“东周”的。但是这样的老学究到了潘家园却很可能打眼看不出一件文物是“上周”的。为什么他一辈子只见过“老的”和“更老的”“新的”被象牙塔那阅人无数的门卫给屏蔽了他压根就没见过。拿随机采样做负样本所以文章中描述的基本版本就是拿点击样本做正样本拿随机采样做负样本。因为线上召回时候选库里大多数的物料是与用户八杆子打不着的随机抽样能够很好地模拟这一分布。但是文章中没有说明随机抽样的概率千万不要以为是在整个候选库里等概率抽样。在任何一个推荐系统中“八二定律”都是不可避免的也就是少数热门物料占据了绝大多数的曝光与点击这样一来正样本被少数热门物料所绑架导致所有人的召回结果都集中于少数热门物料完全失去了个性化。因此当热门物料做正样本时要降采样减少对正样本集的绑架。比如某物料成为正样本的概率如下其中z(wi)是第i个物料的曝光或点击占比当热门物料做负样本时要适当过采样抵销热门物料对正样本集的绑架同时也要保证冷门物料在负样本集中有出现的机会。比如某物料成为负样本的概率如下其中n(w)是第i个物料的出现次数而一般取0.75NLP背景的同学看以上两个采样公式是不是有点眼熟没错它们就是word2vec中所采用的采样公式。没错word2vec也可以看成一个召回问题由center word在整个词典中召回context word。但是使用随机采样做负样本也有其缺点即与d相比d-与user太不匹配了。这样训练出来的模型只能学到粗粒度上的差异却无法感知到细微差别。就好比一个推荐宠物的算法能够正确做到向爱狗人士推荐狗向爱猫人士推荐猫但是在推荐狗的时候无法精确感受到用户偏好上的细微差别将各个犬种一视同仁地推出去。这样的推荐算法用户也不会买账。挖掘Hard Negative增强样本将的匹配度分成三个档次匹配度最高的是以用户点击为代表的那是正样本。匹配度最低的那是随机抽取的。能被一眼看穿没难度所谓的easy negative达不到锻炼模型的目的。所以要选取一部分匹配度适中的能够增加模型在训练时的难度让模型能够关注细节这就是所谓的hard negative。如何选取hard negative业界有不同的做法。Airbnb在《Real-time Personalization using Embeddings for Search Ranking at Airbnb》一文中的做法就是根据业务逻辑来选取hard negative增加与正样本同城的房间作为负样本增强了正负样本在地域上的相似性加大了模型的学习难度增加“被房主拒绝”作为负样本增强了正负样本在“匹配用户兴趣爱好”上的相似性加大了模型的学习难度当业务逻辑没有那么明显的信号时就只能依靠模型自己来挖掘。这也是本文与百度Mobius的作法二者的作法极其相似都是用上一版本的召回模型筛选出没那么相似的对作为额外负样本训练下一版本召回模型。怎么定义“没那么相似”文章中是拿召回位置在101~500上的物料。排名太靠前那是正样本不能用太靠后与随机无异也不能用只能取中段。上一个版本的召回模型作用于哪一个候选集上文章中提供了online和offline两个版本。online时就是一个batch中所有user与所有d的cross join这一点就与Mobius几乎一模一样了。offline的时候需要拿上一版本的召回模型过一遍历史数据候选集太大需要用到基于FAISS的ANN。可能有人还有疑问这样选择出来的hard negative已经被当前模型判断为“没那么相似”了那拿它们作为负样本训练模型还能提供额外信息吗能起到改善模型的作用吗我觉得一来这是一个“量变”变“质变”的过程。在上一版召回模型中这批样本只是“相似度”比较靠后而已而在训练新模型时直接划为负样本从“人民内部矛盾”升级为敌我矛盾能够迫使模型进一步与这部分hard negative“划清界限”二来毕竟是百度和Facebook两家团队背书过的方案还是值得一试。不过需要特别强调的是hard negative并非要替代easy negative而是easy negative的补充。在数量上负样本还是以easy negative为主文章中经验是将比例维持在easy:hard100:1。毕竟线上召回时库里绝大多数的物料是与用户八杆子打不着的easy negative保证easy negative的数量优势才能hold住模型的及格线。不同难度的模型融合上一节只是从“样本增强”的角度来利用hard negative。还有一种思路就是用不同难度的negative训练不同难度的模型再做多模型的融合。并行融合不同难度的模型独立打分最终取Top K的分数依据是多模型打分的加权和各模型的权重是超参需要手工调整但是线上召回时为了能够使用FAISS必须将多个模型产出的embedding融合成一个向量。做法也非常简单将权重乘在user embedding或item embedding一侧然后将各个模型产出的embedding拼接起来再喂入FAISS。这样做能够保证拼接向量之间的cosine与各单独向量cosine之后的加权和成正比。easy model肯定是拿随机采样训练出来的模型这个没有异议。问题是hard model是哪一个文章中指出使用“曝光未点击”作为hard negative训练出来的hard model离线指标好但是线上没有效果反而使用挖掘出来的hard negative训练出来的hard model也easy model融合的效果最好。串行融合其实就是粗排候选物料先经过easy model的初筛再经过hard model的二次筛选剩余结果再交给下游更复杂粗排或是精排。根据文章中的经验使用“曝光未点击”作hard negative训练出来的hard model同样没有效果反而是挖掘出来的hard negative训练出来的hard model做二次筛选更加有效。全链路优化这一节切切实实cover到了我们召回工作中的痛点就是新的召回算法往往不受ranker的待见ranker是在已有召回算法筛选过的数据的基础上训练出来的日积月累也强化了某种刻板印象即user,doc之间的匹配模式只有符合某个老召回描述的匹配模式才能得到ranker的青睐才有机会曝光给用户才能排在容易被用户点击的好位置。新召回所引入的user,doc之间的匹配模式突破了ranker的传统认知曝光给用户的机会就不多。即使曝光了也会被ranker排在不讨喜的位置不太容易被用户点击。这就形成一个恶性循环新召回被ranker歧视后验指标不好看让ranker歧视的理由更加充分然后曝光的机会更小排到的位置更差。但是本文针对这一问题的解决方案有限将各路召回的打分作为特征加入到训练ranker的过程中。但是这改变不了新召回是少数派的现实新召回的打分作为特征在训练样本中的占比有限发挥的作为也可能有限将召回结果交人工审核发现bad case增强下一版本的训练样本。这就是一种人工寻找hard negative的方式不太现实。总而言之各路召回之间的重叠、竞争召回与排序之间的“相爱相杀”将会是推荐系统内一个无解的永恒话题。曝光未点击就是鸡肋最后说一下“曝光未点击”样本。在排序中“曝光未点击”是要被严格筛选的“真负”样本对于排序模型的成败至关重要。而到了召回中无论是根据我自己的亲身实践还是Facebook的经验“曝光未点击”样本都是妥妥的鸡肋“食之无味弃之可惜”前面说了“曝光未点击”不能单独拿来做负样本。“曝光未点击”作为hard negative增强训练集和easy negative一起训练出一个模型亲验线上没任何提升。“曝光未点击”毕竟经过召回、粗排、精排说明与用户还是比较匹配的能否作为正样本我也有过类似的想法但是Facebook的论文告诉我没啥效果。“曝光未点击”能否作为权重较小的正样本Facebook论文指出拿“曝光未点击”训练出来的hard model与easy model无论是串行融合还是并行融合粗排都没啥效果这也被我们的实验结论所印证。导致“曝光未点击”成为鸡肋的原因可能是由于它的两面性它们经过上一轮召回、粗排、精排的层层筛选推荐系统以为用户会喜欢它们。而用户的行为表明了对它们的嫌弃。当然用户“不点击也包含很多噪声未必代表用户不喜欢“曝光未点击”样本的两面性使它们既不能成为合格的正样本也不能成为合格的负样本。唉“大是大非”面前“骑墙派”总是不受欢迎的????总结很高兴能看到一篇论文契合了你之前的实践和经验不由得生出“英雄所见略同”的慨叹特别是在召回这一重要但是受关注较少的领域。我给本文起名为负样本为王就是想传递这样的观点如果说排序是特征的艺术那么召回就是样本的艺术特别是负样本的艺术。负样本的选择对于召回算法的成败是决定性的选对了你就hold住了及格线。之后的模型设计、Loss设计、特征工程、Serving优化不过是锦上添花。选错了之后的模型设计、Loss设计、特征工程、Serving优化都是南辕北辙无本之木平添无用功罢了。至于怎么选对样本Facebook的这篇论文是难得的来自一线实践的经验之谈值得每个做召回的小伙伴认真阅读。 文末福利 后台回复关键词【入群】加入卖萌屋NLP/IR/Rec与求职讨论群有顶会审稿人、大厂研究员、知乎大V和妹纸等你来撩哦~夕小瑶的卖萌屋关注星标小夕带你解锁AI秘籍订阅号主页下方「撩一下」有惊喜