面试八股
防止过拟合的方法有哪些?
过拟合现象就是模型在train data上表现很好,但是在test data上表现不好。在神经网络的loss中表现为train loss一直在下降,但是dev set上的loss在某个节点开始上升。
过拟合 == 泛化能力差
过拟合出现的原因:
- 训练数据太少,样本不足;
- 训练数据中有大量的噪音,导致模型更多的关注了噪音特征,而忽略了数据本身的特征;
- 模型太复杂【和极少的训练数据量相比】;
对应的解决方案:
- 增加训练数据(data augmentation):不同领域做数据增强的方法不一样,CV领域可以旋转、平移等,NLP领域可以back translation、相似词替换等(data augmentation for NLP的好文章推荐,总结的很好,https://amitness.com/2020/05/data-augmentation-for-nlp/);
- 控制模型的复杂度,例如dropout、early stopping、weight decay;
- 批归一化(Batch Normalization)
- 正则化方法(加入正则项):l1-norm、l2-norm;
只有在优化方法是SGD时,l2-norm == weight decay。
weight_decay: 权重衰减项,防止过拟合的一个参数。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
提高泛化能力的方法(防止过拟合与欠拟合)
- 使用更多的数据。
- 使用更大的batch_size。在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式,模型输出结果也会更加稳定。
- 数据过采样。很多情况下我们拿到手的数据都存在类别不均匀的情况,模型这个时候过多的拟合某类数量多的数据导致其输出结果偏向于该类数据,此时如果我们过采样其他类别的数据,使得数据量比较均衡可以一定程度提高泛化能力。
- 数据增强。数据增强是指在数据有限的情况通过一些几何操作对图像进行变换,使得同类数据的表现形式更加丰富,能够增加样本的多样性,以此提高模型的泛化能力。数据增强是一门比较大的学问,在分类,检测,分割中数据增强的方式都有区别。
- 修改损失函数。这方面有大量的工作,如目标检测中的Focal Loss, GHM Loss,IOU Loss等都是为了提升模型的泛化能力。
- 修改网络。如果网络过浅并且参数量过少往往会使得模型的泛化能力不足导致欠拟合,此时一般考虑使用简单的堆叠卷积层增加网络的参数,提高模型的特征提取能力。而如果网络过深且训练数据量比较少,那么就容易导致模型过拟合,此时一般需要简化网络结构减少网络层数或者使用resnet的残差结构以及bn层。
- 权重惩罚。权重惩罚也即是正则化操作,一般是在损失函数中添加一项权重矩阵的正则项作为惩罚项,用来惩罚损失值较小时网络权重过大的情况,此时往往是网络权值过拟合了数据样本。
- Dropout策略。如果网络最后有全连接层可以使用Dropout策略,相当于对深度学习模型做了Ensemble,有助于提高模型的泛化能力。
L1-norm(Lasso)和L2-norm(Ridge)的区别和联系?
相同的点:都可以用来解决过拟合问题的,提高模型的泛化能力。
不同的点:
- l1-norm使用的是每个权重值的绝对值之和,l2-norm使用的是每个权重值的平方和;
- l1-norm会得到稀疏解,可用于特征选择,l2-norm不会;
- l1-norm下降速度更快;
深度学习最优化的方法有哪些?有什么区别?
常用的最优化方法:SGD,Adagrad,Adadelta,Adam,Adamax,Nadam。
transformer和bert中用的最优化方法都是Adam,所以着重问一下Adam的原理。
Adam
核心思想:利用梯度的一阶矩和二阶矩动态的调整每个参数的learning rate(自适应learning rate),即当我们知道某些参数确实需要比其他参数变化更快时,此时继续像SGD那样用固定的lr是不合适的。
优点:动态调整learning rate,所以收敛速度很快。
缺点:Adam无法对权重过大的项做出惩罚,如果引入l1-norm,只会导致越大的权重惩罚越大。
4.归一化
作用:
-
归一化加快了梯度下降求解最优解的速度;
未使用归一化时,模型训练需要迭代很多次才能收敛;当时用了归一化时,使用梯度下降求解时能较快较准的收敛。 -
归一化可能提高精度。
一些分类器需要计算样本之间的距离(如欧式距离、曼哈顿距离等)。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,可能实际情况是此时值域范围小的特征更重要,从而有可能提高精度。
归一化的类型:
a.线性归一化;b.标准差标准化;c.非线性归一化。
- min-max标准化(线性变换,数据落在(0,1)之间),这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
- z-score标准化(处理后服从标准正态分布),方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕
BN批量归一化(Batch Normalization)
作用:为解决内部协方差偏移问题
原理:因为同一个数据在不同批中被归一化后的值会有差别,相当于做了data augmentation
LN层归一化 (layer Normalization)
其他
1.word2vec的两个加速训练方法为: Negative Sample(负采样) Hierarchical Softmax
2.xgboost和gbdt的区别
GBDT是机器学习算法,XGBoost是该算法的工程实现。
GBDT
①在模型训练时只使用了代价函数的一阶导数信息
②采用CART作为基分类器
③在每轮迭代时使用全部的数据
④没有设计对缺失值进行处理
XGBoost:
①对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
②支持多种类型的基分类器,比如线性分类器。显式地加入了正则项来控制模 型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
③采用了与随机森林相似的策略,支持对数据进行采样。
④能够自动学习出缺失值的处理策略。
为什么xgboost可以处理缺失数据?
①xgboost在寻找分裂点时不考虑缺失值的数值,只对该列特征值为non-missing的样本上对应的特征值进行遍历。为了保证完备性,缺失值数据会被分到左子树或右子树分别计算损失,选择最优的那一个。
②可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。
③如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
3.线性回归使用均方误差作为损失函数,逻辑回归使用对数损失函数
参考资料:
算法面试问题一
XGBoost和GBDT的区别