首先,这里不讨论目标明确性的问题(目标明确性指的是,我们是否有一个可以明确优化且可以数值化的目标,不能直接数值化的例如“优化用户体验”,这个先决条件在这里不做解释,其实是另一个课题)。所以,我们假设我们有一个明确的可以量化的目标。比如提升用户时长。
那么在目标明确后,我们如何对问题进行完整的建模呢?
例如
- 1、原始做法(point-wise)
常规的点击率,播放时长在曝光情况下的建模,即预估p(ctr | user, item),但是这个建模忽略了用户浏览的上下文
- 2、上下文建模(context-dnn)
进一步,我们可以加入context的建模,即我们在预估下一个展现位时,输入之前展现过的列表。即每一个位置,都依赖于它之前的内容。比如一次请求预估10个输出,那么预估第2个输出的时候,就把第一个输出的内容作为context,预估第三个的时候,第1,2个已选项为context,以此类推。(当然,实际操作中会减枝)
- 3、局部双向依赖(list-wise)
但是2的方法有个问题,就是没有考虑到双向的依赖。即用户一次能接触到整个序列(一屏),而其点击某个位置的概率其实可能会依赖于整屏中的任意一个位置的内容。为此我们引入了list-wise的模型,直接预估一个序列带来整体的收益(点击,播放,gmv等),则预估时,其实每个位置的贡献,都考虑到了整个序列(上下文)。【实际操作的时候,一般也是通过启发式搜索,加入随机性等,生成候选序列,再评估)
- 4、短期双向依赖(SDDM)
上述我们只考虑了在一次请求的一个序列中的双向依赖关系。但我们把视角继续扩大,可以发现,在一个用户的历史行为序列中,实际上也存在双向依赖。我们当前(1,2,3)系统给出的结果,并不是在“双向依赖”假设下的最优解。
在这里,如何理解双向依赖呢?:先定义“依赖”,依赖是指,当我们做当前决定的时候,所依赖的东西。我们先从单向理解,用户的很多行为,可能会很大程度上受到之前环境(例如推送的内容)的影响,即当前的推送,依赖于之前(历史)的推送。
那么问题便成了我们已知之前的推送内容的条件下,最大化当前推送选择的收益,能否使整体的收益最大?
答案是否定的。原因很好理解,我们在之前推送的时候,并没有考虑到后续的收益,换句话说,我们这次的推送,可能会对下一次,后几次用户的行为产生影响(收益),如果只考虑当前收益,那么便只优化了当前的局部最优【即很多系统都会陷入到的一个局部最优的状态】,所以我们还需要考虑当前推送对未来造成的潜在影响,即:当前的决策其实也隐式依赖于后续的收益,那后续的收益怎么获取呢?当然、我们也只能从历史数据中的某一刻,来为模型定义当前和后续。
PS1:【由于实际上我们没法拿到(所有的后续),以及过长依赖造成的学习难度问题,所以操作中可能需要一些强假设以简化问题,例如将后续的收益限制在一个依赖窗口内(比如1h),一次session等】
PS2:【有的同学可能会想,是否能通过更复杂的归因方式,将后续的收益,归因到当前的曝光上。实际上这样是可以的,也能一定程度优化这个问题,但是带来的问题是,归因的合理性是一个更强的假设,可能本身就是有误的】
PS3:【当然除了归因,还能通过其他间接收益来侧面优化整体的收益(比如视频网站要优化时长,那么我们加入评论这个目标)】
- 5、长期双向依赖问题。(LDDM)
在4中,我们可能只考虑了短期的收益,那么对于决策周期很长的用户行为来说,我们如何建模呢?这就需要我们对这种长周期决策进行分析和归因,来简化这个问题(其实也是加入了归因逻辑的强假设)【虽然不是很优,但目前比较直接的方法就是如此了,欢迎大家在这个问题上进行沟通和讨论,我也希望有更健壮和高效的方式来解决这个问题。】
PS:有句话说的非常对,“算法的短期收益总是被高估,长期收益被低估”