目录:
1、排序模型为什么一般都是从LR到GBDT再到DNN进行迭代的?
Hierarchical Softmax的的缺点及负采样的优势
1、排序模型为什么一般都是从LR到GBDT再到DNN进行迭代的?
在业务开始阶段,数据量和特征量都比较少,通常会采用LR模型。随着算法的迭代,数据量和特征规模越来越多的时候,基于XGBOOST或者LightGBM构建GBDT模型是业务成长期快速拿到收益的好的选择。当数据量越来越大的时候,需要基于DNN的框架来把个性化模型做的更细。
-
LR
在LR里,决策边界函数是线性的。
模型的优点:可以通过模型的权重大小,解释特征的重要性;同时LR支持增量更新;在引入大规模离散特征的情况下,业界在LR时代的经典做法是对LR加L1正则并通过OWLQN或者 Coordinate Descent的方式进行优化,也可以通过FTRL算法让模型稀疏避免过拟合。
模型的缺点:线性决策边界这个假设太强,会让模型的精度受到限制;另外,模型的可扩展性程度低。
-
GBDT
在GBDT中,决策边界是非线性的;模型通过将样本空间分而治之的方式,来提高模型精度。
模型的优点:树模型可以计算每个特征的重要性程度,来获得一些可解释性;同时模型比LR有更高的精度。
模型的缺点:不支持大规模的离散特征,不支持增量更新;模型可扩展性程度低。
我们在酒店推荐场景中,尝试了pointwise loss和pairwise loss,每次尝试都获得了不少的提升。
-
DNN
在DNN中,决策边界是高度非线性的。我们知道计算机通过与或非这种简单的逻辑,可以表达各种复杂的对象:音频,视频,网页等。而DNN每一层网络比与或非更加复杂,DNN通过多层神经元叠加,成为一个万能函数逼近器。在理想情况下,只要有足够的数据量,不论我们实际的决策边界如何复杂,我们都可以通过DNN来表达。
同时DNN,支持增量更新,支持根据业务场景进行灵活定制各种网络结构,支持大规模离散DNN,在离散模型中学习出来的Embedding向量还可以用在向量相似召回里面。正因为有这么多的好处,DNN正在成为业界推荐算法的标配。
这个模型的缺点是:特征经过不同层交叉,交互耦合关系过于复杂,而导致可解释性不好;工程复杂度在我们用不同结构的时候所有不同。
2、分类问题为什么大都使用交叉熵作为损失函数而不是MSE?
假设给定输入为x,label为y,其中y的取值为0或者1,是一个分类问题。我们要训练一个最简单的Logistic Regression来学习一个函数f(x)使得它能较好的拟合label,如下图所示:
可知,我们要学的函数为:,目标为使a(x)与label y越逼近越好。
我们可以回忆下交叉熵Loss和均方差Loss定义是什么:
我们想衡量模型输出a和label y的逼近程度,其实这两个Loss都可以。但是为什么Logistic Regression采用的是交叉熵作为损失函数呢?看下这两个Loss function对w的导数,也就是SGD梯度下降时,w的梯度。
sigmoid函数如下图所示,可知的导数sigmoid
在输出接近 0 和 1 的时候是非常小的,故导致在使用最小均方差Loss时,模型参数w会学习的非常慢。而使用交叉熵Loss则没有这个问题。为了更快的学习速度,分类问题一般采用交叉熵损失函数。
补充说明:
MSE求w和b的导数分别为:
从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。
在上图的绿色部分,初始值是0.98,红色部分初始值是0.82,假如真实值是0。直观来看那么0.82下降的速度明显高于0.98,但是明明0.98的误差更大,这就导致了神经网络不能像人一样,误差越大,学习的越快。也就是说,MSE损失函数并不是误差越大学习的越快。
反观交叉熵:
可以看出梯度中不再含有sigmoid的导数,有的是sigmoid的值和实际值之间的差,也就满足了我们之前所说的错误越大,下降的越快。也就是说,交叉熵损失函数能够做到误差越大,下降的越快。
总结:
- 神经网络中如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛,如果预测值与实际值的误差小,各种参数调整的幅度就要小,从而减少震荡。
- 使用平方误差损失函数,误差增大参数的梯度会增大,但是当误差很大时,参数的梯度就会又减小了。
- 使用交叉熵损失是函数,误差越大参数的梯度也越大,能够快速收敛。
3、过拟合与欠拟合
什么是拟合?拟合是指你逼近目标函数的远近程度。机器学习中的拟合,可以分为过拟合和欠拟合两种。
图1(回归问题的三种拟合状态):欠拟合--正常拟合--过拟合
-
过拟合over-fitting
所谓过拟合,其实就是训练的模型在训练样本中表现得过于优越,近乎完美的预测/区分了所有的数据,但是在验证数据集以及测试数据集中表现不佳。在性能的角度上讲,过拟合就是协方差过大(variance is large),同样在测试集上的损失函数(cost function)会表现得很大。
过拟合会使模型变得复杂,并尽可能拟合训练集,造成在训练集上的准确率特别高,这里就会有一个问题就是:训练集是不靠谱的,其中有容错的数据。直接点,训练集中特别是十几万的数据,会有脏数据,这些脏数据也成为负样本,会造成模型训练有误差,模型在训练的时候并不清楚那些是脏数据,它只会不停的去拟合这些数据,所以过拟合的模型在训练集上准确率特别高,但训练集其实只是整个数据集中的一部分,其包含两部分特征,一部分是整个数据集共有的特征,一部分是训练集自身共有的特征,当过拟合时,模型学到的是这两部分的特征,此时拿模型去在测试集上测试时,因为测试集不包含训练集自身共有的特征,所以测试集在模型上就不会取得很好的效果。
-
欠拟合under-fitting
相对于过拟合,欠拟合稍微比较和理解一些。所谓欠拟合,其实就是模型的拟合程度不够,泛化性能差,在训练集上表现效果差,没有充分的利用数据,预测的准确度低。欠拟合在训练集上的准确率不高,同时在测试集上的准确率也不高,这样如何训练出来的模型也得不到较好的效果。
-
如何判断过拟合还是欠拟合
可以通过绘制损失函数随数据集增加的学习曲线来判断过拟合还是欠拟合。
模型欠拟合(高偏差),是指拥有足够的训练样本时,训练误差和测试误差都很高,并且训练误差约等于测试误差。
模型过拟合(高方差),是指随着训练样本的增加,训练误差在增加,测试误差在减少,但训练误差远远小于测试误差。
注:准备几个不同时间窗口、不同范围的训练集和测试集,然后在不同数据集里分别对模型进行交叉验证,这是工业界判断模型欠拟合或过拟合的最常用方法。
-
如何防止过拟合
过拟合问题的根本原因是特征维度过多,导致拟合的函数完美的经过训练集,但是对新数据的预测结果则较差。
解决过拟合的方法:
- 减少特征维度,可以人工选择保留的特征,或者模型选择算法。
- 正则化:正则化是指在优化目标函数或代价函数是,在目标函数后面加上一个正则项。通过正则项来影响模型的复杂度。
- 数据集扩增:即需要得到更多的符合要求的数据,让训练集中的噪音数据占比越来越小,这样噪音对模型的影响就较小,可以防止模型过拟合。
- 模型选择:挑选相对简单的模型进行训练,对模型中的参数、训练层数等做限制。
- Dropout:在神经网络的训练过程中,对于神经单元按一定的概率将其随机从网络中丢弃,从而达到对于每个mini-batch都是在训练不同网络的效果,防止过拟合。
-
如何解决欠拟合
欠拟合的问题比较好理解,根本的原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大。
解决欠拟合的方法:
- 增加训练数据:让模型学习的更充分一些。
- 增加特征维度:即添加新特征,从业务思路上构造新特征是最重要的优化措施。优化算法:提升模型复杂度。