粗排是介于召回和精排之间的,由于多路召回筛选得到物料库量级仍然很大,无法满足在线实时训练的要求。并且如果召回后直接精排,可能对推荐系统精度无法保证。
一、模型结构
(一)粗排双塔和召回双塔的异同
1、相同点
- 用户塔和物料塔相互独立,独立解耦建模,不允许交叉。
- 用户向量通过在线计算得到,物料向量可以提前离线计算好缓存起来。
2、不同处
① 部署时物料向量的存储方式
- 召回:召回面对的候选物料集量级过大,因此离线计算好物料向量后缓存到faiss这样的向量数据库,并建立索引。
- 粗排:粗排面对的候选物料集量级没有那么大,因此离线计算好的物料向量后缓存到内存中,item是键,物料向量是value。面对新物料,可以由物料塔实时在线生成,并缓存起来。
②负样本选择
- 召回负样本主要采用随机采样选择。
- 粗排负样本主要采用曝光但未点击作为筛选指标,但是由于存在样本选择偏差SSB,因此纠正SSB也是业界优化的方向。
③损失函数的设计
- 召回的损失函数主要采用In-batch-sampled softmax loss,正样本t_i是与用户u_i交互过的物料,负样本t_j主要是通过随机采样得到的。loss的目标是正样本与用户匹配的概率尽量大。负样本t_j只在分母中,没有直接受约束。另外,用户u_i需要与batch内所有物料都计算一遍点积。
- 粗排的损失函数主要采用BCE loss。一个batch由(u_i,t_i,y_i)组成,y_i的值是0或1,表示来自于用户的真实反馈。另外,用户u_i只需要与t_i计算一遍点积。
④用户向量和物料向量的交互方式
- 召回中,采用ANN最近邻搜素,需要用户向量和物料向量进行点积操作。
- 粗排中,可以采用做点积的方式,也可以将用户向量和物料向量喂给DNN进行更复杂的交叉。
(二)双塔改进的技术主线
双塔模型的缺点就在于用户向量和物料向量的交叉太晚了,交叉的向量被高度压缩了,一些细粒度的信息损失了,因此改进的技术主线主要在于如何在用户向量和物料向量中保留更多的信息。
(三)双塔改进:SENet
为了在用户向量和物料向量中保留更多细粒度的信息,可以在源头就减少噪声的输入,可以通过SENet来动态调整输入信息,核心是得到各特征的动态重要性。
SENet是squeeze-and-excitation network的缩写。假设某一侧的信息在喂入塔之前一共由f个field组成,其中第i个field的embedding是e_i。SENet由三个步骤组成:

1、Squeeze/压缩
将f个feature filed的embedding通过某种方式压缩成一个代表数字。可以通过average pooling把embedding中每一位相加取平均值,这个代表数字就反映了这个field embedding的全部信息。最后可以得到一个由f个field代表数字组成的向量Z。
2、Excitation
将上一步得到的向量Z喂给一个小网络,最终得到一个向量A,A中每个元素反映了不同field的重要性。
3、Reweight
上一步得到的A与最初各field的embedding相乘,得到新的embedding输入到上层网络中,通过这种方式对feature field按照重要性进行加权和降权,去弱化甚至过滤噪声信息。
在Excitation中,最后通过函数重新映射成长度为f的向量A。如果这个函数采用RELU,那么对于不重要的特征,重要性A[i]可能直接被压缩成0。
(三)细粒度信息抄近路


1、抄近路思路
x_0直接到达最后一层与塔本来的输出融合,得到最后的输出x_1。融合方式可以有按位相加等等。这样输出不仅有高度压缩后的信息,还包含了更细粒度的信息。
2、抄近路方法
(1)方法1:把每个中间隐藏层的输出和最后一层的输出拼接到一起,再经过一个FC层压缩成最后输出的向量。
(2)方法2:将关键信息不仅插入最后一层,还插入中间的每一层。
3、抄近路的缺点
将关键信息引入中间层,会导致中间层的训练参数量增大,给存储等带来巨大压力。因此应当筛选出较为重要的信息再引入。
(四)改造双塔
1、改造双塔的思路
①思路1:信息流动
- 筛:将不重要的噪声弱化或者过滤掉。
- 疏:不同信息沿着不同塔进行流动,最后拼接成一个embedding。
②思路2:多个信息通道
不再执着于DNN这一个信息通道,而是信息在多个信息通道流动后得到的embedding再进行聚合。
2、双塔+FM模型
(1)FM辅助双塔的学习
FM辅助双塔粗排最终的结果得分来源于两个部分:一个部分是logit_tower,来自于经过双塔得到的用户向量与物料向量的点积结果;另外一个部分是logit_FM,实现了用户历史行为序列和候选物料之间的交叉。最后将两部分线性组合而成最终打分公式,权重需要学习。为了方便在线预测,需要拆解成向量点积的形式,最后表示为:。

3、Meta的Attention Fussion
将多个信息通道得到的embedding进行简单拼接再通过一层FC压缩,是一种比较常见的做法。而Meta的Attention Fussion相比于“先拼接再映射”取得了更好的结果。

(1)主要思路
通过N个信息通道得到N个embedding,拼接成一个大向量以后映射得到每个通道的权重,塔最终的输出结果是各个通道embedding的加权和。
(2)Document Tower举例
将文章标题和文章简介喂入XLM Encoder获得表示文本内容的embedding;再将title、文章简介分别以3字符一组拆解成词袋,喂给模型输出分别表示title和文章简介的embedding;再将文章图片通过CNN得到表示文章图片的embedding,最后进行simple attention fusion得到一个embedding。
为了防止有些通道质量不佳的情况,Facebook使用用户某个通道输出的向量与物料最终向量点积得到一个向量,作为辅助目标与主目标一起优化。
二、知识蒸馏
(一)知识蒸馏简介
1、知识蒸馏的组成
知识蒸馏涉及两个模型:teacher模型和student模型。知识蒸馏的意义在于取长补短。
teacher模型,相对来说比较复杂,喂入了更多特征,表达能力更强。
student模型,相对来说比较简单,loss主要由两部分组成:①拟合真实目标y。②拟合teacher模型的输出。最后优化目标是,两部分loss通过加权平均后的结果最小。
2、训练完毕的部署
训练完毕,只将Student部署,因为相比teacher,student模型比较简单,便于上线。
(二)知识蒸馏用于粗排
知识蒸馏用于粗排,可以让精排去当teacher,粗排作为student来向精排和真实反馈学习。主要的优点有如下两个:①粗排可以借助于精排复杂的交叉结构和交叉特征知识来增强模型的表达能力。②粗排和精排的一致性可以增强。
1、联合训练粗排和精排模型
- 训练初期,不蒸馏,因为此时精排模型还没训练好,没有指导意义。
- 精排训练一段时间后进行蒸馏。
- 蒸馏损失不会更新精排模型的参数。
2、两阶段蒸馏
由于联合训练粗排和精排模型参数量很大,并且耦合在一起维护不方便,因此大厂实际更多采用两阶段蒸馏的方法。
两阶段蒸馏是利用的线上运行精排模型得到的得分被记录在日志中,可以直接从日志中提取,再让粗排模型去拟合。因此两阶段蒸馏的loss主要来源于两部分,一部分去拟合用户真实体验,一部分去拟合线上精排得分,batch中样本表示为(输入特征,真实反馈,精排打分)。拟合精排得分可以采用MSE,也可以采用BCE。

三、纠正数据曝光偏差
(一)样本选择偏差SSB问题
出现样本选择偏差的根本原因是正负样本都来自于曝光的数据,负样本的样本质量没有那么差。
(二)纠正方式
纠正方式是选择那些被精排排在后面,但是没有曝光机会的那部分样本作为粗排的负样本。步骤主要如下:
- 精排排序后,获得排在前面的物料集合S_top和排在后面的物料S_bottom,与当前用户u组成一个三元组T。
- 由于排在后面的物料S_bottom没有机会曝光,因此采用Learning-to-rank(LTR)建模,建模目标是排在前面物料被点击的概率要远大于排在后面物料被点击的概率。pairwise loss可以采用BPR等。
实践中的做法:对S_top中的物料的用户真实反馈进行预测,额外添加一项BCE loss。
也有的做法是将精排排序后的物料划分多个档位,任意两个档位的物料组成pair进行pairwise loss。优点是更多档位对精排排序刻画地更加细致,缺点是未曝光物料集规模非常庞大。

四、模型:轻量级全连接
去双塔,将用户特征与物料特征从底层就开始交叉。阿里巴巴的COLD从如下几个方面来简化粗排模型:
- 筛选出重要特征,通过SENet等模型来给出特征重要性。
- 削减全连接层的规模,层数削减。
- 底层框架的一些工程优化,比如说重新实现一些TensorFlow算子优化效率。
- 缓存起来一些高频使用的用户行为序列embedding和物料特征embedding。
优点是物料特征和用户特征在底层就开始交叉,模型的表达能力大大增强。
缺点是需要离线反复实验,模型投入大,可扩展性比较差。
