🎯
type
Post
status
Published
date
Mar 18, 2020
slug
2020.03.18 数据流采样优化
summary
2020.03.18 数据流采样优化
tags
样本
算法
广告
推荐
category
算天算地系列
icon
password
本文介绍了几种对样本流进行采样的方法,采样后可以减少参与训练的样本量,提升训练速度,同时尽可能保证效果。
1. 均匀采样和纠偏
这是最常见的采样方法,一般对负样本进行概率为
的均匀采样,这样可以减少的负样本量,大大提升训练的速度。同时,均匀负采样会让正负样本的差异变小,特别是长尾样本,因此会降低模型对这部分样本的区分度,所以在模型的泛化能力不足的情况下,这样做可以减少这些样本对模型的影响,优化一部分模型的泛化能力,当模型的泛化能力足够好的时候,均匀负采样就是纯粹的提升训练效率。由于采样后改变了正负样本的分布,因此需要对结果进行纠偏,通常有两种纠偏方法:
(1) serving 阶段纠偏,即用采样后的数据正常 training,在 serving 的时候进行纠偏。但这种方法非常不灵活,比如数据流在不同时间段的采样率不一样,或者构成数据流的不同路数据采样率不一样的时候,就无法在 serving 阶段进行纠偏。因此业界一般都是在 training 阶段进行纠偏;
(2) training 阶段纠偏,即在训练时,对模型的输出进行校正后再计算 loss 和梯度,保证模型的输出直接就是无偏的,在 serving 阶段无需再进行处理。这样可以非常灵活地根据时间或者不同路的数据流进行采样率的设计。
正负样本不重叠情况下的纠偏
这种情况下,正负样本是严格定义的,纠偏只需要简单的推导出采样前后模型输出的
之间的关系即可:上面的推导中,带符号
‘的即为采样后的概率,为负样本的采样率,并隐含了假设,即负采样不影响特征分布。所以在 training 阶段纠偏,只需要对模型输出的原始做一个小改动后再用函数计算预估分和 loss,serving 阶段:正负样本重叠情况下的纠偏
这种情况下,会同时把正样本当作是负样本也用一次 (比如考虑到正样本的延迟到达等原因),在这种情况下,
,以及,然后带入下面的推导:2. LCC 采样和纠偏
上面的均匀采样是对所有负样本一视同仁,实际情况下,负样本也有
hard和easy的区分,如果我们能尽可能保留hard负样本,就可能即减少了样本量还能让效果不负。LCC 方法来自斯坦福大学的这篇 2014 年的文章:Local Case-Control Sampling: Efficient Subsampling in Imbalanced Data Sets。原理也很简单,就是对预估的不太准的样本多采点,否则少采点,采样后的数据流分布肯定跟之前不一样了,因此需要再做纠偏,确保最后 serving 的时候模型输出是无偏的。2021年,字节的文章 Nonuniform Negative Sampling and Log Odds Correction with Rare Events Data 从理论上证明了个性化负例采样比均匀负例采样有更小的渐进预估方差。
假设
表示采样该样本,其中正样本的采样率,负样本的采样率(以下推导均省略了表示某具体样本的下标 i)。正负样本不重叠情况下的纠偏
正负样本重叠情况下的纠偏
可见,当正样本的采样率为 1,且负样本均匀采样时,就回退到上面提到的负样本均匀采样的情形。在 LCC 方法中,使用了一个所谓的 pilot model 来进行预估 (可以用线上主力模型),即得到每一样本的采样率为:
所以
,即为 pilot model 输出的 logit。3. 基于损失的采样和纠偏
LCC 采样也可以进一步扩展,比如在召回/粗排模块,经常会用到级联模型,级联模型的样本也可以考虑采样优化,比如在广告推荐场景,可以根据粗排与精排的 ecpm 的差异作为损失,损失越大采样概率越大,否则采样概率越小。
4. AUC 计算和评估
经过采样优化后,尤其是 LCC 采样后,每个样本的采样率都不同,这会导致在采到后的样本上计算AUC 和在全体样本上计算的 AUC 不可比。为了能让 AUC 可比,一般有两种思路:
1、保留一部分全体样本作为测试集,在此测试集上进行 AUC 的对比;
2、对 AUC 的计算进行纠偏,使得经过纠偏后的 AUC 和真实 AUC 在期望上是相同和可比的。纠偏方法也很简单,就是对每一个样本,count 的时候不再 count 1,而是其采样概率。
🎯 




type
Post
status
Published
date
Aug 18, 2018
slug
2018.08.18 curveball 优化算法推导
summary
2018.08.18 curveball 优化算法推导
tags
优化算法
推荐
算法
category
算天算地系列
icon
password
前段时间,VGG 的一拨人搞了个叫 curveball 的优化算法,能够将二阶信息用起来,同时避免了之前的传统方法要么去近似 Hessian 矩阵的逆,要么通过 conjugate-gradient 的方法去得到 Hessian 矩阵的逆,这些传统方法既耗时又对噪声敏感。而 curveball 算法并不需要直接算 Hessian 矩阵和它的逆,每次只是去估计梯度与 Hessian 矩阵的乘积即可,所付出的代价仅仅是额外的两次正向传播。 由于这篇文章写的极为简略,很多过程都直接略掉了,今天我们就来推导这个算法,将作者略去的部分补上。
文章链接:点我
文章代码 github 链接:点我
本文推导内容的 pdf 链接:点我
推导细节




