@第4章 粗排之柔
粗排发展趋势
模型复杂化指的是从双塔(偏向召回)变为MLP(偏向精排),甚至是其他更复杂的结构。#card
这一条路径的发展和算力的发展息息相关,随着算力的提升,粗排可以运行更复杂的网络。
说不定在未来,召回也是基于MLP的。
样本松弛化有三方面的动机:#card
其一是粗排召回的都是序敏感的,不必得到XTR(CTR、CVR等指标的概括写法)准确的值;
其二是学习的目标和后面的环节联系更强;
其三是目标松弛后对网络要求变低,反而更容易学好,带来提升。
4.1 粗排存在与否的必要性
- 那为什么要多粗排这一个环节呢?在现有的召回+精排两级的结构下,实践中加一个粗排其实不一定能直接观测到提升,此时我们可以下结论说不应该加粗排吗?加一个额外的排序环节,应该需要两点支持 #card
(1)算力充足,加新环节后,整个推荐系统的并发和时延可以支持。
(2)对未来的信心,多了一个环节,前面的漏斗可以透出更多,后面的漏斗可以输入更少。
- 此时相信后面的环节输入更少后,可以改出更复杂的结构进一步做出收益,或者前面的环节卸下了一个很大的负担,从而学得更好。
4.2 粗排复杂化的方法
第一个方面是特征,输入特征可以不是精排的全部,而是最重要的一个子集。#card
在Embedding+DNN范式中,特征变少,输入的嵌入的拼接就更窄,DNN的入口也会变小,再往下就会减少很多复杂度。
对于特征筛选,COLD训练了一个SE(Squeeze-and-Excitation)的模块,和第3章所讲的注意力机制类似,随着训练的进行,注意力系数会揭示哪些特征是更重要的(系数大的更重要)。
据此我们从高往低挑选想要的数量的特征,然后可以重新训练一个网络,就是所要的粗排。
第二个方面是计算精度,在很多任务中都可以尝试用低一点的精度来做加速。#card
原来的网络是float 32的计算精度,如果能够简化到uint 8来计算,那么时间消耗能够大大降低。
反过来,如果时间不是太关键,也可以把网络变大,在时延差不多不变的情况下追求性能提升。
在COLD中就是用float 16来替代float 32的,这个跨度是比较小的。
4.3 [[Pair Wise]] 与 [[List Wise]]
Pair-wise和List-wise的区别#card
Pair-wise表达的东西比较清晰,A比B大写出来就是最大化A-B的得分,
而List-wise的损失函数表达的过程是间接的,需要借助归一化或有界化才能完整表达。
缺点
Pair-wise的收敛相对于List-wise要慢,有拉扯的问题:#card
A大于B,可以是0.9大于0.8,也可以是0.2大于0.1,
因此A和B的位置飘忽不定,必须学习大量的样本,反复振荡才能收敛到最终的位置。
List-wise一开始就缩小了范围:A、B、C、D、E、F由大到小,分别在1、0.8、0.6、0.4、0.2和0附近,省去了很多收敛需要的时间。#card
不过List-wise想要看到全局,列表的长度会比较长,在实践中列表长度会和批处理的那一维复用。
比如Point-wise的batch-size=100,换到List-wise下,列表长度是10的话,batch-size就只能缩减到10。
所以在应用List-wise学习方法时,太长的列表长度会导致batch-size变小,这一点要额外注意。