策略算法优化过程中,需要格外注意可迭代性的设计。
有时候,花很多精力设计一个不可持续迭代的算法框架是非常浪费人力资源的。
迭代性考虑
譬如有些系统中存在很多人工预设的变量,如果这些变量有很多都是人工设计出来的,且不能通过离线数据,在线实验等方案对其优化,那么这些变量都是不可迭代的。拓展一下,就算这些变量可以被优化,如果其优化的代价太大,搜索空间太大(譬如都需要线上实验),那么也是较差的设计。这种变量在越上层的设计中应该越要减少。
问题拆解
- 举个例子,比如在信息流推荐中,我们设计了一个选择槽位分配的算法,这个算法通过一系列数值,特征来确定一次曝光对每种不同类型的内容分配几个槽位。这个方案有收益吗,有。可以迭代吗,可以。譬如我们优化选择的公式,甚至用模型替代,甚至可以考虑越来越多的特征。那这个方案设计的好吗,我觉得并不好。
简单地对问题进行形式化,假设我们列表最终的收益 R 取决于槽位的组合A,以及槽位内内容的组合B,即我们要优化原问题:A,B = max p(R|A,B) over A,B,当前的方案我们将优化拆成了两个步骤,即:
1、通过计算A = max p(R|A) over A来求解A
2、确定了A 再 通过计算B = max p(R|A,B) over B求解B,此时A为常数
接下来来解答问题:我们需要对它进行拆解吗?这种拆解方式好吗?如果不好,怎么拆解比较好?
- 1、我们拆解问题的底层逻辑是什么?我认为其中最主要的是系统中的约束。譬如,很常见的,延迟约束,存储约束,计算能力的约束。正因为此,我们才需要设计粗排->精排->序列优化这样的结构。
所以拆解的最主要的原则是:1、拆分求解后,次优解带来的损失。2、拆解后通过约束资源的重新分配带来的增益。
譬如,拆分精排粗排是为了使得上层可以使用更复杂的模型,代替简单模型,从而获得收益。
再回到这个问题本身:
- 1、首先,需要拆解吗?需要,因为遍历序列的解实在太多,无法计算。就算通过硬性的剪枝策略(譬如业务上有时候有一些硬的需求)可能也无法缩减到一个可计算的空间。
- 2、其次,上述这种拆解方式好吗?对于上述的拆解方案,核心问题是,要想优化最终的解,必须要不断地优化第一步A的估计,比如用更加复杂模型建模来优化。但是R本身肯定是受到B的影响更大,如果我们要在不确定B的情况下优化A,这就会有很大的bias(模型本身的bias)。而且如果后续对于B的优化也需要模型,这里的算力消耗还是会很大。
- 3、最后,应该如何拆解?比较常见的方案是:启发式搜索+模型序列评估。当然,启发式搜索的算法设计也至关重要。当然,如果我们将上述的拆解方案,当作是启发式搜索的一种方案可以吗?我觉得也不算优,还是一样的道理,对A的估计bias严重则失去了它的意义。