[toc]
总结一下目前工作中涉及到的短视频和广告推荐领域相关优化经验,个别地方表述未必准确,欢迎大家批评指正~
短视频、广告及推荐场景经常涉及到对连续值的预估建模,如时长建模、GMV建模、流量ecpm预估、LTV预估、付费次数、直播打赏金额预估等,回归问题相比分类问题更加难以优化,原因如下:
-
回归问题的损失函数更难选取。 回归问题的损失函数一般都隐含着对样本概率分布的假设,如果真实的后验数据不符合该假设,拟合效果就会很差;而分类问题的损失函数如交叉熵,对标签、误差没有什么前置假设,仅仅等价于最大似然
-
分类问题对误差的容忍更大。 例如,逻辑回归输出0.6和1.0是一样的,最后都会被转化为同一个类别。而回归则不是,0.1的误差就是0.1。因此,回归问题对结果的要求更严格,同时,这也导致回归问题对离群点更为敏感。 从优化的角度讲,由于回归问题对离群点敏感,这就导致在梯度下降(或反向传播)时容易发生梯度消失或梯度爆炸的问题。同时,由于回归问题对误差要求比较高,过多的正则会导致结果变差,因此一些在分类问题里面常用的正则化方法无法简单的套用在回归问题中。这使得回归问题调参变得困难。 从样本的角度看,由于回归问题对误差的要求比较高,因此对样本量的需求也更大。例如,对于两个样本,其真值分别为0.6和1.0,因此它们是属于同一类的,对于分类问题,学习器只要学习到它们属于同一类即可,因此不要求那么多的数据,而对于回归问题,有时0.1的误差都是很大的,因此对样本量的需求也会更大。
-
样本不均衡。 分类问题中,样本不均衡是指一个或多个类的样本数量远远少于其他类,导致模型无法很好的学习这些类的信息,进而使模型更倾向于预测样本多的类。在CV中,常采用的方法是augmentation,旋转平移等方法增加样本量。在回归问题中,不仅仅是不均衡,而是经常出现“断片”现象。如一个问题的值域是[0, 100],但是在[10, 100]里样本量很少,几乎没有样本,不能硬插值填充数据,这种情况会导致严重的样本不均衡问题,进而在该区间上拟合效果非常差。 另外,回归问题的值域可能是无穷的,而样本所对应的空间仅仅是很小的一部分。当新样本的label不在训练样本对应的值域中时,模型的预测值也会严重偏离实际。
参考:https://cloud.tencent.com/developer/news/60043
如何对回归问题进行优化,主要有以下优化思路:
- 损失函数优化
优化方向:损失函数上做优化,不同的损失对数据有不同的先验分布假设,针对业务场景做出适配调整。
损失函数 | insight | 推导 |
---|---|---|
MSE | error(即label-pred)服从正态分布 | 假设 |
MAE | error(即label-pred)服从拉普拉斯分布 | 假设 |
Huber Loss | Huber loss是MAE和MSE损失函数的结合,具备两者的优点 | |
Huberpp Loss | MSE/MAE/Huber Loss关注的是绝对误差,而在业务中,关注的更多的是相对误差 | |
AM Loss | 以上Loss均是对称性Loss,而在业务中,我们对于高低估问题关注程度不同,可以据此调整 |
-
回归转分类 优化方向:采用各类变换方式将回归问题转为分类问题进行优化。
-
calibration
用MSE损失函数对观看时长 or GMV or LTV 拟合,由于观看时长 or GMV or LTV 数值范围较大,直接对原始值拟合会导致
对观看时长 or GMV or LTV 做
MSE隐含的假设是error服从正态分布,然而很多情境下这个假设并不成立。当error不服从正态分布时,MSE的效果就有可能受损。
MAE隐含的假设是error服从拉普拉斯分布,然而很多情境下这个假设并不成立。当error不服从拉普拉斯分布时,MAE的效果就有可能受损。
Huber Loss是MAE和MSE损失函数的结合,
求梯度为
即
广告出价系统里,GMV模型预估值直接参与ROI出价,相对预估偏差是GMV模型更加关注的指标。如GMV模型将5元的样本预估为10元,将100元的样本预估为105元,从Huber Loss来看,两者得到的Loss绝对值和梯度步长项均一样,但对于广告竞价来看,前者的预估偏差和超成本风险要远高于后者,因此可以对Huber Loss做调整,让GMV模型更加关注相对预估偏差更大的样本。我们希望
其中
后半段的常数项
MAE、MSE、Huber Loss和Huberpp Loss在高低估的时候loss计算相同,即不满足非对称性,而在GMV预估中,更希望模型优先优化低估的问题,提高收入上限。设计新的loss函数,采用log函数对相对误差做平滑,且当
在不同的
由导数反向推导损失函数,并考虑分段函数的连续情况,如下:
- 优化目标
建模用户观看短视频的时长
- 方案借鉴
参考YouTube的Deep Neural Networks for YouTube,是否点击作为正负样本,将正样本的观看时长作为其样本权重,负样本权重为1,用加权逻辑回归进行训练,线上infer用odds作为预估时长,具体推导过程参考:https://zhuanlan.zhihu.com/p/435912211
- WCE加权分类
普通二值交叉熵损失函数定义如下:
这和普通二值交叉熵仅仅有一点变化,就是在正样本的判别上加了一个
- WCE具体方案
Youtube的页面是上下滑的列表,因此是否点击就可以作为正负样本的区分,但是短视频是沉浸式业务,每个视频都是点击的状态,都有播放时长,正负样本的定义较难界定,因此业界的做法是:用样本的观看时长作为正样本的权重,同时复制一份样本作为负样本,采用加权Logloss训练,因此
具体实现方案有两种:
- 直接修改loss函数
$$Loss=- \frac{1}{N} \sum_{i=1}^N [w_{i} \cdot log(p_{i}) + log(1-p_{i})]$$
此时,正样本的梯度变为原来的
负样本的梯度保持不变,即
样本梯度推导见:https://lukebest.github.io/posts/d28f
- 样本复制一份作为负样本,权重为1,然后一起训练
两种方案除了工程性能的差异,最终的训练效果是否有差异???
- 短视频WCE具体实现方案
WCE建模时长的方案在国内某手app上得到充分验证,对于权重
对于权重
一种是对其做log变换,如方案1和2所示,快手采用该处理方法:观看时长
一种是直接用原值,如方案3所示:此方法与YouTube的论文和字节的处理方式一致
- WCE隐含的假设是y服从几何分布
$p(y) = p^y \cdot (1-p)$ 最大似然可得wce loss,即wce的预估值等于数学期望,是无偏预估。以方案3为例,具体推导如下:
求解该损失,得到无偏的预估时长
当
几何分布:https://en.wikipedia.org/wiki/Geometric_distribution
WCE的缺点:
- WCE隐含的假设是y服从几何分布。虽然WCE是无偏预估,预估值等于数学期望,但其隐含的假设是y服从几何分布,如果label的分布和几何分布差异较大,则WCE效果会变差;
- WCE在低估和高估的时候梯度大小不同。对loss梯度做简单推导后可以发现WCE在低估和高估的时候梯度大小不同,具体推导如下:
可以看出,在低估
将观看时长做分桶离散化,进而将回归问题转为多分类问题,业界方案如下:
- 对观看时长
$wt$ 做等频划分,划为$K$ 个桶:
- 根据样本的观看时长得到label转换后的类别:
当
- 模型优化由回归变为多分类问题,loss函数如下:
- 线上serving时,得到样本的预测时长
softmax多分类采用的是0-1的hard label,目标只能离散到一个桶里,类别之间绝对隔离,这种硬标签忽略了负标签直接的差别,丢失了回归问题label连续的假设。例如,某样本被分到第
distill softmax多分类借鉴了知识蒸馏中soft label的思路,依然使用原始label分桶后做模型softmax输出做多分类的思路。假如我们有一个很强的teacher时长模型,输出应该是原始label附近的一个概率分布,我们的student模型去学习这个概率分布,这个概率分布大概率不是一个等方差的高斯分布,而是一个label_aware的分布,更贴近label的误差分布。这样既能让student模型捕捉到label间的关系,也能降低student模型的学习难度,模型最终使用输出的概率分布做加权平均得到最终的staytime预估值。
实际上我们并没有teacher模型,但反过来思考下我们需要teacher模型原因是对原始label分桶的一个软化过程,只是这个软化使用的是能区分样本难度的teacher模型来做。如果只是考虑软化,基于人工经验我们是可以做的相当好的,可以跳过训练teacher模型这一步,对原始label分类软化的这一步我们称为人工蒸馏,人工蒸馏中软化还可以做到分布均值的无偏以及分布的label_aware,甚至比强teacher模型做得更多更好。
最终使用人的先验知识作为虚拟teacher对时长label进分桶行了软化,帮助多分类任务感知label间序关系以及分布,降低了时长模型的学习难度。
假设时长分桶服从某个先验分布
软化函数的设计则只要label变换后的分布符合场景后验值的分布即可。 无论哪种软化策略,都依赖分桶,顾名思义是对staytime的一堆边界划分点,可以均匀划分,也可以非均匀划分,具体每个场景的分桶策略可根据场景特性决定,核心原则是让桶内的样本数量分布更均匀。下面给出一些常见的划分例子,分桶策略有以下几种:
- uniform,设定bin_size,进行等距分桶
ST_BOUNDS = tf.range(0.0, 3600.0, 1.0, dtype=M.get_dtype())
- segment,根据时长分布,手动分桶
# segment
ST_BOUNDS = np.concatenate(
[
np.arange(0, 10, 0.2),
np.arange(10, 180, 1.0),
np.arange(180, 600, 10.0),
np.arange(600, 3600, 50.0),
], axis=0
)
- exp_bin 时长场景建模推荐该种分桶方式,时长越短,数据更密集,分桶要更细;时长越长,数据更稀疏,分桶要更粗
ST_BOUNDS = [np.exp(x/40.0) - 1 for x in range(bucket_size)]
- 线上serving时,得到样本的预测时长
distill softmax方法可以适用于其他回归问题的建模和优化上,如电商场景、直播场景的GMV优化,
电商场景GMV优化,分桶策略采用GMV分布的离散峰值作为桶边界进行分桶,软化函数采用log_norm的正态分布或者log_norm的拉普拉斯分布,类似zlin的log_norm,即先对label和bounds做log变换,然后做正态变换或者拉普拉斯变换。
https://github.com/hufu6371/DORN
简单的多分类存在没有考虑非目标类的之间的序关系的问题,Ordinal Regression则是一种考虑类间序关系的回归方法,推导过程参考:https://zhuanlan.zhihu.com/p/573572151
具体做法如下:
- 观看时长
$wt$ 划为$K$ 个桶:
- 根据样本的观看时长得到转换后的label:
当
[1, 1, ..., 1, 0, ..., 0]
- 模型优化由回归问题转化为多个独立的二分类问题,loss函数如下:
- 线上serving时,得到样本的预测时长
待补充 https://arxiv.org/pdf/2206.06003
回归问题预估为什么会「高区间低估,低区间高估」?
回归模型的预估总是会出现「高区间低估,低区间高估」的现象,而不是「低区间低估,高区间高估」,或是「无序混乱地低估/高估」呢?
- 定性解释
直观想象一下,假设我们要使用一个函数
$f(x)$ 来拟合如图所示的蓝色点,我们必然不可能让函数经过每一个点,一种较好的拟合方式如红线所示,对于局部点误差较大,但对整体点平均误差最小。在这种情况下,对于分布在红线左右的点,红线其实拟合的是他们的中间状态(可能是均值/中位数等,取决于使用的误差定义),因此预估输出表现出的现象即为「高区间低估,低区间高估」。
通用的回归损失函数的收敛目标一般是样本点的均值或中值,这就导致了预估分布相比原始分布更加向“中心”靠拢,从而导致了「高区间低估,低区间高估」。
假设我们要寻找一个
Loss | 结论 | 推导 |
---|---|---|
MSE | MSE是均值回归 |
|
MAE | MAE是中值回归 |
|
WCE | WCE是均值回归 |
|
待补充 PPNet POSO