赞
踩
欠拟合指模型无法得到较低的训练误差;
过拟合指模型的训练误差远小于它在测试数据集上的误差。
解决过拟合
提高模型的泛化能力
从数据上提升性能:
从算法调优上提升性能:用可靠的模型诊断工具对模型进行诊断,
知乎详解
l1 loss在零点不平滑,用的较少。一般来说,l1正则会制造稀疏的特征,大部分无用的特征的权重会被置为0。
(适合回归任务,简单的模型,由于神经网络通常解决复杂问题,很少使用。)
l2 loss:对离群点比较敏感,如果feature是unbounded的话,需要好好调整学习率,防止出现梯度爆炸的情况。l2正则会让特征的权重不过大,使得特征的权重比较平均。
(适合回归任务,数值特征不大)
smooth l1 loss修改零点不平滑问题,L1-smooth比l2 loss对异常值的鲁棒性更强。具有l1和l2的优点,当绝对差值小于1,梯度不至于太大,损失函数较平滑,当差别大的时候,梯度值足够小,较稳定,不容易梯度爆炸。
(回归,当特征中有较大的数值,适合大多数问题)
各种norm
motivation
首先,在进行训练之前,一般要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布;
此外,为了解决internal covarivate shift问题,这个问题定义是随着batch normalization这篇论文提出的,在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。
所以batch normalization就是强行将数据拉回到均值为0,方差为1的正太分布上,这样不仅数据分布一致,而且避免发生梯度消失。
此外,internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据,比如我们在训练数据前做归一化等预处理操作。
加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
BN在训练测试时是不同的,测试freeze了参数。
BN层的作用是把一个batch内的所有数据,从不规范的分布拉到正态分布。这样做的好处是使得数据能够分布在激活函数的敏感区域,敏感区域即为梯度较大的区域,因此在反向传播的时候能够较快反馈误差传播。避免梯度消失的问题.
梯度消失的根源—–深度神经网络和反向传播
两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。
1. 深层网络角度:
对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
总结:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
2. 激活函数角度
计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了。
如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。
同理,tanh作为激活函数比sigmoid要好一些,但是它的导数仍然是小于1的。
方案1-预训练加微调
采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。
此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
方案2-梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是
l
1
l_1
l1正则和
l
2
l_2
l2正则。
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
L
o
s
s
=
(
y
−
W
T
x
)
2
+
α
∣
∣
W
∣
∣
2
Loss=(y-W^Tx)^2+\alpha||W||^2
Loss=(y−WTx)2+α∣∣W∣∣2
其中,
α
\alpha
α是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
方案3-relu、leakrelu、elu等激活函数
Relu思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu的主要贡献在于:
– 解决了梯度消失、爆炸的问题
– 计算方便,计算速度快
– 加速了网络的训练
同时也存在一些缺点:
– 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
– 输出不是以0为中心的
leakrelu
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:
l
e
a
k
r
e
l
u
=
m
a
x
(
k
∗
x
,
x
)
leakrelu=max(k∗x,x)
leakrelu=max(k∗x,x)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
leakrelu解决了0区间带来的影响,而且包含了relu的所有优点。
elu
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
elu相对于leakrelu来说,计算要更耗时间一些
解决方案4-batchnorm
Batchnorm本质上是解决反向传播过程中的梯度问题,具有加速网络收敛速度,提升训练稳定性的效果。
通过规范化操作将输出信号x规范化保证网络的稳定性。
具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:
正向传播中
f
2
=
f
1
(
w
T
∗
x
+
b
)
f_2=f_1(w^T∗x+b)
f2=f1(wT∗x+b),那么反向传播中,
∂
f
2
∂
w
=
∂
f
2
∂
f
1
x
\frac{\partial f_2}{\partial w}=\frac{\partial f_2}{\partial f_1}x
∂w∂f2=∂f1∂f2x
反向传播式子中有x的存在,所以x的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了x带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
解决方案5-残差结构
短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。
原因:
1. 数据和标签
数据分类标注是否准确?数据是否干净?数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题。
2. 学习率设定不合理
在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。
有的时候候学习率太低走不出低谷,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。
3. 网络设定不合理
如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛。可以尝试加深当前网络。
4. 数据集label的设置
检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。
5. 数据归一化
一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化
参考我的博客专栏深度学习optimizer
sgd:
每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定。
缺点:
Mini-batch gradient descent 不能保证很好的收敛性,
learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate。
SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定
Momentum
模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Adagrad
上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。
自适应地为各个参数分配不同学习率的算法。
缺点:
其学习率是单调递减的,训练后期学习率非常小
其需要手工设置一个全局的初始学习率
更新xt时,左右两边的单位不统一
Adadelta
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。
Adam
就是在 RMSprop 的基础上加了 bias-correction 和 momentum
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
**xgboost在代价函数里加入了正则项,用于控制模型的复杂度。**正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型。
区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的。
最简单判别一个模型是否为线性的,只需要判别决策边界是否是直线,也就是是否能用一条直线来划分。
虽然逻辑回归的模型特征经过非线性函数Sigmoid的转换,但是它的决策边界是线性方程,所以逻辑回归LR是非常典型的线性分类器。
参考知乎
Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象
relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。
LeetCode(不同路径)
解法一:
一共54张牌,其中地主20张,两个农民各17张。
将牌重新组合,将54张牌一次排成一列,分成三堆,前20张给地主,中间17张给第一个农民,最后17张给第二个农民。
问题关键:仅考虑大小王的位置,而不考虑其他所有牌。
所有情况:
A
54
2
=
54
∗
53
A_{54}^2=54*53
A542=54∗53
王炸在地主手里:
A
20
2
=
20
∗
19
A_{20}^2=20*19
A202=20∗19
王炸在农民手里:
2
A
17
2
=
2
∗
17
∗
16
2A_{17}^2=2*17*16
2A172=2∗17∗16
所求概率为:
解法二:
一副牌54张,斗地主时并不是每个人拿18张,而是两个人拿17张一个人拿20张,每种分配方式的概率是相同的,一共有
C
54
20
C
34
17
C
17
17
C_{54}^{20}C_{34}^{17}C_{17}^{17}
C5420C3417C1717 种。如果王炸在地主(拿20张牌者)手上,共有种
C
2
2
C
52
18
C
34
17
C
17
17
C_{2}^{2}C_{52}^{18}C_{34}^{17}C_{17}^{17}
C22C5218C3417C1717 情况,即先把王炸给地主,再给地主补足牌,最后分配农民的牌;如果王炸在农民(拿17张牌者)手上,共有
2
C
2
2
C
52
15
C
37
20
C
17
17
2C_{2}^{2}C_{52}^{15}C_{37}^{20}C_{17}^{17}
2C22C5215C3720C1717 种情况,即先把王炸给农民,再给他补足手牌,然后给地主分牌,最后给第二个农民分牌。由于两个农民是对称的,因此乘2.按照这个模型,所求概率即为两种符合条件概率相加除以总方法数,结果约为154/477,约等于32.28%。
倒排
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。