1、判断过拟合
训练集上精度高,验证集上表现不好。训练出的模型泛化能力差(学习器正确学习到了数据分布,但数据分布有问题)
2、解决模型过拟合的策略
增加训练集数据
降低模型复杂度
增加正则化的约束(L2限制参数过大,L1限制参数过多,BN限制分布偏移)
通过集成学习的方式训练模型
提前终止训练
正则化是针对过拟合而提出的,在求解模型最优的解是一般优化最小的经验风险,现在在该经验风险上加入模型复杂度这一项(正则化项是模型参数向量的范数),并使用一个rate比率来权衡模型复杂度与以往经验风险的权重,如果模型复杂度越高,结构化的经验风险会越大,现在的目标就变为了结构经验风险的最优化,可以防止模型训练过度复杂,有效的降低过拟合的风险。
3、L1和L2有什么区别
定义
L1正则化是指权值向量w中各个元素的绝对值之和
L2正则化是指权值向量w中各个元素的平方和然后求平方根
作用
L1正则化可以产生系数权值矩阵,可以用于特征选择(也可以用于防止过拟合)
L2正则化输出更加平滑,防止模型过拟合
区别
L1有0解,L2产生趋于0的解
L1稀疏性,L2获得非0稠密解
4、L1、L2原理
(1)推导:基于约束条件的最优化
求解w,都是基于
模型的复杂度用VC维衡量(VC维=系数个数+1),VC维与系数w的个数成线性关系,因此考虑减少w的个数降低模型复杂度,即让w向量中一些元素为0或者限制w中非0元素的个数,因此加入约束L0范数,但是问题是NP问题,故放松以L1,L2范数来近似L0范数
,s.t 或 ,s.t
转为拉格朗日函数形式
(平方方便求导)
假设为最优解,则对L(w,a)求最小化
即可等价于加正则项
(2)效果理解
对于L1,原函数的等高线切点和某个菱形相交时候容易落在坐标轴上,也就是最终解某些维度可能为0
h(w)=f(w)+C|w|,要使0点成为最值可能的点,虽然在0点不可导,但在0点左右异号即可,即
若的情况下,0点都是可能的最值点
也可理解为L1正则化使得原最优解的元素产生不同量的偏移,并使某些量为0
对于L2,因为从菱形变为圆,则切点不容易交在坐标轴上,但是仍比较靠近坐标轴,故解比较小(靠近0),但是比较平滑(不等于0)。可以理解为最优解的元素进行了不同比例的放缩。
3、L1有什么缺点
不稳定,增加或者减少数据对其拟合会有很大的变动。实验证明L1无法获得真正的稀疏解,都是将处理过的最小值变成0.
4、dropout策略
定义:dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
起作用的解释:(1)相当于很多个模型的组合 (2)相当于数据增强
数据量小的时候,dropout效果不好,数据量大了,dropout效果好。
当然在测试过程中是不能用dropout的!!!!
5、预测时,是使用dropout训练出的参数还是要乘keep-prob
要乘。因为预测时,神经元就无法随机丢弃,一种补偿方案就是每个神经元的权重都乘p,这样在总体上使得测试数据和训练数据大致上是一样的,保证测试的时候把这个神经元的权重乘以p可以得到同样的期望。
注:目前主流是用inverted dropout替代dropout,inverted dropout不需要乘,它是在训练阶段执行了dropout的层,其输出激活函数除以keep_prob.
6、BN原理
使得每一层输入保持同一分布,因为一般整体分布会随着网络层的加深逐渐往非线性函数取值的上下限两端靠近,BN就是将其拉回正态分布。初衷是为了解决梯度下降的缺陷,但是有提升泛化性能的作用。
计算流程:
计算样本的均值
计算样本的方差
样本数据标准化处理
进行平移和缩放处理
代码实现
def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
"""
param:x : 输入数据,设shape(B,L)
param:gama : 缩放因子 γ
param:beta : 平移因子 β
param:bn_param : batchnorm所需要的一些参数
eps : 接近0的数,防止分母出现0
momentum : 动量参数,一般为0.9, 0.99, 0.999
running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
running_var : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
"""
running_mean = bn_param['running_mean'] #shape = [B]
running_var = bn_param['running_var'] #shape = [B]
results = 0. # 建立一个新的变量
x_mean=x.mean(axis=0) # 计算x的均值
x_var=x.var(axis=0) # 计算方差
x_normalized=(x-x_mean)/np.sqrt(x_var+eps) # 归一化
results = gamma * x_normalized + beta # 缩放平移
running_mean = momentum * running_mean + (1 - momentum) * x_mean
running_var = momentum * running_var + (1 - momentum) * x_var
#记录新的值
bn_param['running_mean'] = running_mean
bn_param['running_var'] = running_var
return results , bn_param
7、BN作用
提升了训练速度,加快收敛
增加了分类效果
调参简单
防止过拟合
打乱样本训练顺序
8、BN在训练和测试的不同
在训练时,是对每一批训练数据进行归一化,也即用其均值和方差。
在测试时,如果进行一样本的测试,无batch概念,此时的均值和方差用的是训练时的全部数据集的
9、BN与LN有什么差异,LN是在哪一维归一化
LN就是把每个CHW单独拿出来归一化处理,不受batch影响。
BN是取不同样本的同一个通道的特征做归一化
LN是取同一样本的不同通道做归一化
10、如何同时使用BN和dropout
BN和dropout单独使用都能减少过拟合并加快训练速度,但是一起使用可能效果并不好,因为网络状态切换过程中存在神经方差不一致行为,方差偏移
如果一定要同时使用,把dropout放在所有BN之后或者是修改dropout的公式
11、机器学习中,为何要经常对数据做归一化
(1)归一化后加快了梯度下降求最优解的速度
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛
(2)归一化有可能提高精度。
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
(3)归一化类型
以上内容均来源于各个版主、牛客网总结