在推荐系统中,使用传统的机器学习模型,基本思路都是在历史点展数据上训练得到模型的参数。每次推荐时,把pCTR最高的TOP-k给选出来。这是一种非常贪婪的做法,在新闻等系统中,每天资讯的更新非常快,很多资讯完全没有历史点展信息,这种情况下,大部分机器学习模型会给出一个先验值(e.g.均值)或者通过泛化特征给出一个值(注.相当于各维度均值加权)。如果按pCTR来选,TOP-k会被历史数据中点展比高的资讯占据,新资讯将无法获得下发,形成典型的马太效应。
Explore-Exploit(E&E)通过主动展现的方式,让新物料都能得到一定的下发(explore);同时,使用反馈学习,让低质的物料退场,高质的物继续下发(exploit)。从而缓解上述的马太效应。
但在实际应用中,E&E比想象的要困难很多。本文梳理了做E&E实验需要注意的地方。
E&E收益来源
首先,我们对E&E的潜在收益点做一下分析,整体上来说,它的diff包括以下三点:
- Exploit:后验模型。
- Explore:主动展现机制。
- Info:主动展现后获取的log数据。
顺着它的diff,我们来寻找潜在的收益点。
- ΔExploit:如果想Exploit产生收益,则需要后验的精确性比基线的模型好。如果是这种情况,我们单纯的替换后验模型即可,没必要做E&E。但是基础的E&E,使用点展词典做后验,精度一般是不够的。而使用Contextual E&E,每个物料一个模型,工程难度大。所以Exploit很难直接取得收益,想办法降低损失是更现实的做法。
- ΔExplore:如果想Explore产生收益,则需要Explore上来的物料比原位置的物料更好。如果是这种情况,直接做插入就行。这条路对Explore的精确度要求很高,或者基线非常弱才行得通。Explore直接产生收益非常难,更需要考虑的是怎么降低explore的成本。
- ΔInfo:回到做E&E的初衷,就是要打破系统的马太效应,让一些冷门物料/新物料获得一些展示机会,获得反馈信息,从而在这部分物料中挑选出优质资源。用传统的机器学习模型,这些Info是无法获取的。所以,E&E的收益点就是牺牲短期利益,获取更多的Info,进而拿到长期收益。
E&E实验怎么做
想清楚E&E的收益点之后,就可以考虑E&E的工程实现了,归纳起来就是节流和数据隔离。
- 节流:降低Exploit和Explore过程中的成本。分开来看,Exploit的损失主要是后验精度不够,可以采用和基线后验bagging的方式来降低影响。Explore的成本主要是前期的探索,可以考虑启发式的探索,使用点击无关的模型(权威性,质量度等)作为潜力因子,提高探索的效率。
- 数据隔离:E&E的收益主要来源于ΔInfo,那就必须要保证ΔInfo只能被实验组学习。不然就变成实验组用部分流量来做Explore,基线组纯Exploit。不做数据隔离,相当于ΔInfo=0,那整体来看,实验组基本就是负向了。 但是做数据隔离实验也是一件很难的事,下面拿我实践中的方案举例说明。(注:暂时没有找到完全置信的实验方式,待填坑)。
数据隔离实验方案1:
组别 | 模型 | 训练数据 | 流量 |
---|---|---|---|
A | baseline | A | 50% |
B1 | baseline | B1+B2 | 10% |
B2 | E&E | B1+B2 | 40% |
实验结论: B1 > B2 > A
分析:A相当于Exploit(baseline),B1相当于Exploit(baseline)+ΔInfo,B2相当于Exploit(baseline)+ΔInfo+ΔExploit+ΔExplore。
问题:实验期间,每组用的训练数据只有整数据量的50%。后验精度有损失。
数据隔离实验方案2:
组别 | 模型 | 训练数据 | 流量 |
---|---|---|---|
A | baseline | A + B1 | 80% |
B1 | baseline | A + B1 | 10% |
B2 | E&E | A + B2 | 10% |
实验结论: B2 > A = B1
分析:A和B1相当于Exploit(baseline),B2相当于Exploit(baseline)+ΔInfo+ΔExploit+ΔExplore。
问题:本质上A和B1为同一个基线组,B2训练用到了A,相当于用到了基线的Info。
数据隔离实验方案3:
组别 | 模型 | 训练数据 | 流量 |
---|---|---|---|
A | baseline | A + B2 | 80% |
B1 | baseline | A + B1 | 10% |
B2 | E&E | A + B2 | 10% |
实验结论: A > B2 > B1
分析:A相当于Exploit(baseline)+ΔInfo,B1相当于Exploit(baseline),B2相当于Exploit(baseline)+ΔInfo+ΔExploit+ΔExplore。
问题:B2挖出来的ΔInfo,会被A组使用,然后间接的传递给B1组。