什么是过拟合?深度学习的过拟合如何缓解?
过拟合一般指过度在训练集上进行优化,反而损害了测试集上的泛化能力的现象。一般出现训练集的loss下降,测试集的指标不降反增,就说明出现了过拟合。
在模型层面我们可以通过Early Stop, L1/L2 Regularization, Batchnorm, Dropout,weight decay等方法进行缓解。
在输入数据层面,我们可以通过数据增广来进行缓解,如旋转,图像直方图正则化,以及Mixup等方法。
欠拟合、过拟合判断方法
1.通过Loss判断
训练集loss 不断下降,验证集loss不断下降:网络正常,仍在学习。
训练集loss 不断下降,验证集loss趋于不变,可能出现过拟合,数据分布不均匀。
训练集loss 不断下降,验证集loss不断上升,可能出现过拟合。
训练集loss 趋于不变,验证集loss不断下降,数据集有问题。
训练集loss 趋于不变,验证集loss趋于不变,学习过程中遇到瓶颈,可以减小学习率或批量数目和更换梯度优化算法,也有可能网络设计问题。
训练集loss 不断上升,验证集loss不断上升,可能网络结构有问题,超参数设置不正确
2.通过Accuracy判断
验证集的作用是在训练的过程对对比训练数据与测试数据的准确率,便于判断模型的训练效果是过拟合还是欠拟合 。
过拟合:训练数据的准确率较高而测试数据的准确率较低
欠拟合:训练数据的准确率和测试数据的准确率均较低
欠拟合
(1)在保证训练误差和验证误差差距在一定范围内,适当增加训练次数。
(2)增加特征
(3)减少正则化程度
逻辑回归
https://cloud.tencent.com/developer/article/1541704
逻辑回归函数的损失函数是对数似然函数。
交叉熵损失函数取平均就是对数似然函数(对数损失函数)。
layer normalization:
https://zhuanlan.zhihu.com/p/568938529?utm_id=0
问题1:Pytorch和Tensorflow的区别?
图创建
创建和运行计算图可能是两个框架最不同的地方。
在pyTorch中,图结构是动态的,这意味着图在运行时构建。
而在TensorFlow中,图结构是静态的,这意味着图先被“编译”然后再运行。
pyTorch中简单的图结构更容易理解,更重要的是,还更容易调试。调试pyTorch代码就像调试Python代码一样。你可以使用pdb并在任何地方设置断点。调试tensorFlow代码可不容易。要么得从会话请求要检查的变量,要么学会使用tensorFlow的调试器。
灵活性
pytorch:动态计算图,数据参数在CPU与GPU之间迁移十分灵活,调试简便;
tensorflow:静态计算图,数据参数在CPU与GPU之间迁移麻烦,调试麻烦
设备管理
pytorch:需要明确启用的设备
tensorflow:不需要手动调整,简单
问题3:torch.eval()的作用
对BN的影响:
对于BN,训练时通常采用mini-batch,所以每一批中的mean和std大致是相同的;而测试阶段往往是单个图像的输入,不存在mini-batch的概念。所以将model改为eval模式后,BN的参数固定,并采用之前训练好的全局的mean和std;总结就是使用全局固定的BN。
对dropout的影响:
训练阶段,隐含层神经元先乘概率P,再进行激活;而测试阶段,神经元先激活,每个隐含层神经元的输出再乘概率P,(所有神经元输出后再乘概率p)总结来说就是顺序不同!
问题4:PCA是什么?实现过程是什么,意义是什么?
主成分分析 (PCA, principal component analysis)是一种数学降维方法, 利用正交变换 (orthogonal transformation)把一系列可能线性相关的变量转换为一组线性不相关的新变量,也称为主成分,从而利用新变量在更小的维度下展示数据的特征。
实现过程:一种是基于特征值分解协方差矩阵实现PCA算法,一种是基于SVD分解协方差矩阵实现PCA算法。
意义:使得数据集更易使用;降低算法的计算开销;去除噪声;使得结果容易理解。
问题5:简述K-means.
K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为k个类别,算法描述如下:
(1)适当选择k个类的初始中心,最初一般为随机选取;
(2)在每次迭代中,对任意一个样本,分别求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类;
(3)利用均值方法更新该k个类的中心的值;
(4)对于所有的k个聚类中心,重复(2)(3),类的中心值的移动距离满足一定条件时,则迭代结束,完成分类。
Kmeans聚类算法原理简单,效果也依赖于k值和类中初始点的选择。