作者:京东零售 吕豪
EE(Explore & Exploit)模块是搜索系统中改善生态、探索商品的重要链路,其目标是缓解数据马太效应导致模型对商品排序丰富性、探索性不足,带来的系统非最优解问题。
在JD搜索体系中,EE模块被定义的核心定位是:在给定流量和时间的约束下,探索出更多高效率的商品。EE的优化目标即为,以保障搜索效率为前提,提升广义中长尾商品的探索成功率,提升搜索结果的流动性、丰富性。
由于EE场景的特殊性,其从核心定位 → 在线指标 → 离线评估体系 → 模型迭代的优化链路中的每一步,都需结合EE特点进行针对性升级。
以下分别从模型迭代、在线实验指标、离线评估体系介绍相应模块的优化。
EE的核心定位在于探索更多更高效的潜力中长尾商品,其首要回答的问题便是,在目前搜索体系中,哪些因素阻碍中长尾商品获得更公平合理的展现机会?系统性的各类bias 。
1). Position-bias (展示位置偏置)
当前打分模型基于每天dump的搜索日志进行训练更新。由于搜索结果的position-bias(位置偏置)效应,user的行为动作不仅与商品本身质量有关,而且受position(展示位置)较大影响。position-bias(位置偏置)效应对头部商品的增益,加剧了平台生态的马太效应。使用position-bias的日志数据进行训练,而未对position(展示位置)做去偏,不利于中长尾商品的正确效率预估,不利于平台流动性、丰富性和长期价值。
2). Polularity-bias (流行度偏置)
存在与user偏好匹配程度相当的多个商品时,由于商品间的历史累计销量、累计评论等流行度特征的差异,造成倾向于给用户呈现热门流行商品,已流行商品则更流行。而匹配程度相似的中长尾商品,则难有机会被展现,中长尾更中长尾。
3). Exposure-bias (曝光偏置)
一次搜索请求下,只有有限的商品列表展现给user,绝大多商品无法展示;搜索系统一天内,整体被展现的商品集也只占全部商品集的小部分。 由此带来的问题一方面是模型泛化问题,训练在已展现商品的日志上进行,serving需在所有商品上做推断,如何平衡训练、推断样本分布差异化的矛盾,尤其是头、尾部商品的巨大差距。另一方面是商品label问题,商品未累积获得用户正反馈,是因为与用户不匹配,还是未有展现机会?
针对以上bias问题,EE排序模型从位置偏置建模、反事实推理学习方面进行升级,尝试缓解position-bias和polularity-bias,取得一定收益。而Exposure-bias由于随机dump样本的label问题,还需要做更多探索。
目前EE排序模型整体结构图:
EE模型升级至训练、预测两阶段的position-debias方案,通过pos-bias tower建模position-bias影响,并在高语义层级与输出均值融合,拟合训练label,而后在预测阶段摘除,以期去除pos-bias影响。
Pos的建模方式
1.1 pos as feat
训练阶段,pos作为模型特征使用,与其他u/q/i侧特征联合,共同输入模型网络,计算相应logits并梯度回传。预测推理阶段,所有样本强制采用同一个pos值,近乎理解为:同一个user/query下, 所有商品在同样的展示位置上,进行预测分数比较。
其潜在风险如下:
1.2 multi-pos predict
设计最后一层为多位置通道输出的网络,预测商品在各枚举位置上的logits输出。训练阶段计算商品在所有位置上的输出结果,只激活真实的pos通道计算logit和loss,其他位置通道进行mask。推断时,贪心的从第一个位置开始,无放回的选择当前位置上的最优商品,直至最后一个位置。
此方案适配用于排序位置较为固定的场景,如重排N选N,在搜索EE现有架构下并不适配,一方面是SVGP结构对多通道结果输出并不友好,另一方面,EE现有插入范围较大[1-60]、比较插入机制也需做非常复杂化的适配改造,方案过重。
1.3 pos as tower
升级现有DNN + 稀疏变分高斯(svgp) 采样打分模型,采用基于position-bias net(位置偏置)的模型方案,方案具体为训练、预测两阶段的位置去偏。
用户对商品的偏好是个性化的,不同用户对商品的偏好不同。用户对位置的偏好也是差异化的,不同用户对位置的敏感度存在差异。
上文的bias-net建模方式,假定所有用户对同一位置偏好相同,忽略了用户间的位置偏好差异。典型例子如下,偏逛用户在系统中对position相对不敏感,position的排名前后对用户的行为决策影响相对更小,而对偏快速够买用户则影响截然相反。
个性化位置偏置建模。升级现有bias-net结构,引入用户个性化特征,包括静态profile和动态行为序列。通过个性化bias-net 计算不同用户对不同position的位置偏好,更准确的还原用户对商品内容的真实偏好。
Pos Tower 与 svgp的结合方式。
2.1 SVGP简介
GP(Gaussian process,高斯过程)是用于在样本间存在相关关系的情况下,通过观测值对未知样本label 进行修正预测的算法。简言之,距离观测点越近的未知样本,其均值被修正越多、更接近观测值,方差也越收敛,反之亦然。SVGP(Sparse Variational Gaussian Process, 基于稀疏变分的高斯过程),针对大样本量下协方差矩阵和求逆难以计算的问题,设计一定数量的可学习的引导点,对所有训练样本进行归纳,未知样本通过与引导点的协方差来计算均值和方差。
2.2 表征层融合(Representation Fusion)
Pos-tower与Main-tower融合方式有两种,表征层融合和logit层融合。在SVGP计算前进行融合,即表征层向量进行融合,可以采用 concat/sum/avg 等各种方式。其难点在于,向量间的相加、平均操作,无法直观理解其物理意义和作用,向量叠加是否导致logit正向增大,向量带来多大的logit提升,这些位置偏置作用难以解析。
另外从模型结构来看,svgp依赖样本内容间相似度计算均值和方差,而position-bias的影响应该独立于样本内容的计算。
2.3 logit层融合(Logit Fusion)
在svgp之后的logit层融合,可采用 logits 相乘相加方式,其直接从模型结构上诠释了这样的公式 Label = f(content) + f(position) / Label = f(content) * f(position) ,其中 f(position)的绝对值大小,直观的表示 position 带来的增益大小。
位置偏置建模线上效果
保持大盘效率持平的情况下,EE核心指标提升明显,探索流动性指标(探索更多商品)提升明显 +1.35%,探索成功率指标(探索更高效商品)显著改善 +0.74%。
3.1 IPS
对每个商品预估 propensity score,然后采用逆向 propensity score 权重的方式,消除倾向分的影响,预估商品真实的内容匹配度得分。
挑战点:
3.2 流行度降权
在实际搜推数据中,在user侧、item侧分别依据其流行程度,设计对应降权权重,缓解整体被热门用户、商品所主导的趋势,增强所关注样本的影响力。
面临难点:
3.3 基于因果关系的反事实推理
如何缓解流行度偏置问题?在训练链路中,增强改善中长尾商品的学习是一类重要方法;对用户交互行为进行解构,拆分出商品流行度等因子的作用,是另一个视角的解决思路。
因果图、因果关系简介
因果图是有向无环图,其中节点表示随机变量、有向边表示节点之间的因果作用方向。如上图对于节点Y变量,有两条路径的因果作用,分别是 I → Y 、I → K → Y。
总因果效应计算,可以由自变量的单位扰动带来的因变量变化进行计算,自然因果和间接因果效应计算亦然:
以上公式可得,求出TE和NDE时,可推导计算中间接因果效应 TIE。
搜索中的因果效应
在电商搜索场景下,用户对商品的交互行为,可表示为 U-I 间各种因子的综合作用。常见思路为考虑 U-I 间内容匹配程度作为待预测因子,学习此因子在交互行为中的作用,在未来样本上进行预测排序。
从电商搜索的现实情况出发,对交互行为进一步拆分,影响用户商品交互行为的因子大体包含如下三方面:
以上因子的拆解,包括了U/I 内容匹配度的间接因子的效应,也包括了 U、I的直接效应影响。因此在EE模型中设计如下网络,分别建模各个因子的作用:
具体分别设计 UI-Match-Net, User-Net, Item-Net 分别预测对应三种因子的作用,其中总效应,U/I 效应分别表示为
在训练中Loss的设计如下,分别表示
预测阶段缓解流行度偏置,主要在于去除流行度因素、用户心智因果(偏置因子)的影响,具体通过总因果效应减去自然直接效应(偏置因子效应),尽量准确还原 U-I 内容匹配程度的影响
TIE = TE - NDE
反事实推理后的因果图状态如下,将U/I 的直接效应消除,保留U-I 内容匹配度的效应:
反事实推理建模线上效果
保持大盘效率持平的情况下,EE核心指标提升明显,探索流动性指标(探索更多商品)提高 +0.82% ,探索成功率指标(探索更高效商品) 显著提升 +0.66%。
探索成功率指标,用于在小流量AB期间指导EE效果分析,其设计思路从EE核心价值出发,推导出长期价值相关联的AB期间核心指标。
具体而言,即论证 探索成功率指标 → EE核心价值。
通过对 1). 商品概况和承接定义, 2). 商品承接统计, 3). 分层承接分析 等方面进行分析,迭代出搜索EE在AB实验期间所关注的EE核心指标集–探索成功率。
EE线上指标主要关注
在线的探索成功率和辅助指标,现阶段难以与模型离线指标(AUC等)关联,无法在离线评测EE模型的探索能力,限制EE模型迭代速度,极大增加迭代时间成本。
针对EE场景特异性的指标,设计了离线指标评测集合,分别从 效率、中长尾探索强度、不确定预估等方面,综合评测EE模型,加速迭代。
搜索EE是提升搜索场景流动性、多样性的关键模块,其面临的问题和以效率排序为主模块的问题有很大差异,对EE同学提出了不一样的挑战。
针对EE场景的特点,排序模型从Debias(打分公平性)入手,拆解存在于各种排序场景的bias问题,对位置偏置和流行度偏置问题升级较通用化的解决方案,取得了EE核心指标的显著提升。同时对于迭代链路中的 在线AB指标、离线评估体系,也进行了论证和迭代,完成对整个EE排序闭环链路的升级。限于篇幅,AB指标和离线评估体系在这里不做全面展开,感兴趣的同学欢迎随时交流,共同探讨。
EE场景面临的挑战很多,后续计划从如下方面继续深入探索:
1). 引入更丰富的用户探索信号的表达,增加explore-net和监督loss,提升EE模型对探索偏好的学习。
2). 思考EE的长期价值,如何在模型结构、Loss设计上结合长期价值。
3). 优化EE探索机制和EE候选集,提升EE全链路探索能力。
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是rubygems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和rubygems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night