赞
踩
只使用Accuracy的不足:
应当将以下三个公式结合使用:
Accuracy = (TP+TN)/(TP+FP+FN+TN)
Precision = TP/(TP+FP)
Recall = TP/(TP+FN)
过拟合问题是指过于完美拟合了训练集数据,而对新的样本失去了一般性,不能有效预测新样本,这个问题也叫做高方差(high variances)。
如图所示,真实曲线是绿色的直线。但是训练结果却是红色曲线将点分成了两类,并且准确率还达到了100%。这是因为受到了噪声点(黄色圈起来的)的影响。
过拟合原因
这个是很容易产生过拟合的一个原因。设想,我们有一组数据很好的吻合3次函数的规律,现在我们局部的拿出了很小一部分数据,用机器学习或者深度学习拟合出来的模型很大的可能性就是一个线性函数,在把这个线性函数用在测试集上,效果可想而知肯定很差了。
训练集训练出一个适合训练集那样分布的数据集,当你把模型运用到一个不一样分布的数据集上,效果肯定大打折扣。这个是显而易见的。
在选择模型算法的时候,首先就选定了一个复杂度很高的模型,然后数据的规律是很简单的,复杂的模型反而就不适用了。
数据还有很多噪声,模型在学习的时候,肯定也会把噪声规律学习到,从而减小了具有一般性的规律。这个时候模型用来预测肯定效果也不好。
这个是同第4个是相联系的,只要训练时间足够长,那么模型肯定就会吧一些噪声隐含的规律学习到,这个时候降低模型的性能是显而易见的。
优化方法
训练验证集划分
**交叉验证 **
把数据集切成等比例的几份,每个时间段用不同的数据进行验证,其余部分用于训练。这样所有的数据既当过验证数据,又当过训练数据。
从下图中的线性回归和逻辑回归的拟合曲线上我们可以发现,高阶项(函数复杂度)越多就会对数据的拟合能力越强,特征数目越多对数据的拟合能力越强。
正则化思路:
保留所有特征,但减少参数θj
当特征很多,但很多对于预测贡献量仅一点点时,工作的很好
用损失函数来解释:
从上图中,我们可以看到左面的曲线高阶项没有右边高阶项次数高,明显右侧有点过拟合了,但是这时候我们不想丢弃特征,那么我们对高阶项施以惩罚,使得θ3,θ4 非常小,用一个有惩罚的高阶项(可能高阶项不同程度的减小),来达到保留了高阶项(特征)又避免过拟合的基础上,又不至于因为丧失某些特征之后出现欠拟合。
如果我们想高阶项系数尽可能的小,那么就给一个很大的常数,如1000,如果高阶项系数很大那么整个loss就会很大。那么上面式子在梯度下降的过程中就会使得高阶项系数不断的减小。这时候比较小的高阶项系数就会使得高阶项起作用的影响变小,就会一定程度解决过拟合的问题。
上图中第二个粉色的项就是把所有的需要的起作用的参数 θ 都考虑进来,并对他们进行惩罚 。粉丝中括号中的前一项代表的是数据拟合程度,后一项表示模型复杂度。
讨论 λ :
所以我们可以看出来 λ 实际就是惩罚的程度,λ 越大 θ 的作用程度越低,拟合程度越低,模型复杂度越低; λ 越小 θ 起作用的程度越大,拟合程度越高,模型复杂度越大。例如:
假如上图 λ 非常大,那么为了保证带 λ 一项足够小就会使得所有惩罚的系数都会很小接近于 0,这时候拟合曲线就是一条直线,明显是欠拟合。同理,反之过拟合。
L(Y,f(x))=||Y-f(x)||2+α||w||2,下标指的是范数
L0范数:向量中非零元素的个数,记为||W||0
L1范数:绝对值之和,记为||W||1
L2范数:平方和或者说模,记为||w||2
Dropout的意义在于,减小了不同神经元的依赖度。有些中间输出,在给定的训练集上,可能发生只依赖某些神经元的情况,这就会造成对训练集的过拟合。而随机关掉一些神经元,可以让更多神经元参与到最终的输出当中。
梯度消失和梯度爆炸的本质都是因为神经网络的层数太深。
优化方法 :
非饱和的激活函数:
梯度截断:
T
0
(
v
i
,
θ
)
=
{
0
,
if
∣
v
i
∣
≤
θ
v
i
,
otherwise
T_0(v_i,θ)= {0,if |vi|≤θvi,otherwise
T0(vi,θ)={0,vi,if ∣vi∣≤θotherwise
初始化的方法:
所有的参数初始化为0或者相同的常数
全0初始化最为简单,但不适合采用。因为如果将神经网络中参数全部初始化为0,那么每个神经元就会计算出相同的结果,在反向传播的时候也会计算出相同的梯度 ,最后导致所有权重都会有相同的更新。换句话说,如果每个权重都被初始化成相同的值,那么权重之间失去了不对称性。
随机初始化
我们希望权重初始化的时候能够尽量靠近0,但是不能全都等于0 ,所以可以初始化权重为一些靠近0的随机数,通过这个方式可以打破对称性。这里面的核心想法就是神经元最开始都是随机的、唯一的,所以在更新的时候也是作为独立的部分,最后一起合成在神经网络当中。
一般的随机化策略有高斯随机化 、均匀随机化等,需要注意的是并不是越小的随机化产生的结果越好,因为权重初始化越小,反向传播中关于权重的梯度也越小,因为梯度与参数的大小是成比例的,所以这会极大地减弱梯度流的信号,容易导致梯度消失问题。
Xavier初始化
W ∼ U [ − 6 n j + n j + 1 , 6 n j + n j + 1 ] W\sim U[-\frac{\sqrt6}{\sqrt{n_j+n_{j+1}}},\frac{\sqrt6}{\sqrt{n_j+n_{j+1}}}] W∼U[−nj+nj+1 6 ,nj+nj+1 6 ]
条件:正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
假设激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign
He初始化
条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
适用于ReLU的初始化方法:
W ∼ N [ 0 , 2 n ^ i ] W∼N[0, \sqrt{\frac{2}{\hat{n}_i}}] W∼N[0,n^i2 ]适用于Leaky ReLU的初始化方法:
W ∼ N [ 0 , 2 ( 1 + a 2 ) n ^ i ] W\sim N[0,\sqrt{\frac{2}{(1+a^2)\hat{n}_i}}] W∼N[0,(1+a2)n^i2 ]n ^ i = h i ∗ w i ∗ d i \hat{n}_i=h_i*w_i*d_i n^i=hi∗wi∗di
其中,hi、wi分别表示卷积层中卷积核的高和宽,而di是当前层卷积核的个数
Pre-train初始化(迁移学习)
就是指之前被训练好的Model, 比如很大很耗时间的model, 你又不想从头training一遍。这时候可以直接download别人训练好的model进行微调
对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。
BN的提出正是为了应对深度模型训练的挑战。在模型训练时Batch Normalization利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。
BN层也是像全连接层,卷积层,池化层这些网络层一样,同样属于网络中的一层。
note:可以对某层做单独的normalization,看哪层效果最好
不是一次性把所有数据给模型进行训练,而是将训练数据切成很多batch,一个batch一个batch喂给模型。
好处:
提高训练速度
对训练过程引入随机性,帮助找到全局最优解
gradient descent with momentum
通常情况我们在训练深度神经网络的时候把数据拆解成一小批一小批地进行训练,这就是我们常用的mini-batch SGD训练算法,然而虽然这种算法能够带来很好的训练速度,但是在到达最优点的时候并不能够总是真正到达最优点,而是在最优点附近徘徊。
另一个缺点就是这种算法需要我们挑选一个合适的学习率,当我们采用小的学习率的时候,会导致网络在训练的时候收敛太慢;当我们采用大的学习率的时候,会导致在训练过程中优化的幅度跳过函数的范围,也就是可能跳过最优点。我们所希望的仅仅是网络在优化的时候网络的损失函数有一个很好的收敛速度同时又不至于摆动幅度太大。
Momentum优化器刚好可以解决我们所面临的问题,它主要是基于梯度的移动指数加权平均。假设在当前的迭代步骤第 步中,那么基于Momentum优化算法可以写成下面的公式:
v
d
w
=
β
v
d
w
+
(
1
−
β
)
d
W
v
d
b
=
β
v
d
b
+
(
1
−
β
)
d
b
W
=
W
−
α
v
d
w
b
=
b
−
α
v
d
b
{v_{dw}} = \beta {v_{dw}} + (1 - \beta )dW\\ {v_{db}} = \beta {v_{db}} + (1 - \beta )db\\ W = W - \alpha {v_{dw}}\\ b = b - \alpha {v_{db}}
vdw=βvdw+(1−β)dWvdb=βvdb+(1−β)dbW=W−αvdwb=b−αvdb
dW和db分别是损失函数反向传播时候所求得的梯度,α是网络的学习率,β是梯度累积的一个指数,这里我们一般设置值为0.9,vdw和vdb分别是损失函数在前t−1轮迭代过程中累积的梯度梯度动量。
Momentum优化器的主要思想就是利用了类似与移动指数加权平均的方法来对网络的参数进行平滑处理的,让梯度的摆动幅度变得更小。
RMSProp算法的全称叫 Root Mean Square Prop,是Geoffrey E. Hinton在Coursera课程中提出的一种优化算法,在上面的Momentum优化算法中,虽然初步解决了优化中摆动幅度大的问题。所谓的摆动幅度就是在优化中经过更新之后参数的变化范围,如下图所示,蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。
其中,假设在第 t轮迭代过程中,各个公式如下所示:
s
d
w
=
β
s
d
w
+
(
1
−
β
)
d
W
2
s
d
b
=
β
s
d
b
+
(
1
−
β
)
d
b
2
W
=
W
−
α
d
W
s
d
w
+
ε
b
=
b
−
α
d
b
s
d
b
+
ε
{s_{dw}} = \beta {s_{dw}} + (1 - \beta )d{W^2}\\ {s_{db}} = \beta {s_{db}} + (1 - \beta )d{b^2}\\ W = W - \alpha \frac{{dW}}{{\sqrt {{s_{dw}}} + \varepsilon }}\\ b = b - \alpha \frac{{db}}{{\sqrt {{s_{db}}} + \varepsilon }}
sdw=βsdw+(1−β)dW2sdb=βsdb+(1−β)db2W=W−αsdw
+εdWb=b−αsdb
+εdb
算法的主要思想就用上面的公式表达完毕了。在上面的公式中 sdw和 sdb分别是损失函数在前 t−1轮迭代过程中累积的梯度动量, β是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当dW 或者db 中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值ϵ来进行平滑,一般取值为 10−8。
有了上面两种优化算法,一种可以使用类似于物理中的动量来累积梯度,另一种可以使得收敛速度更快同时使得波动的幅度更小。那么讲两种算法结合起来所取得的表现一定会更好。Adam(Adaptive Moment Estimation)算法是将Momentum算法和RMSProp算法结合起来使用的一种算法,我们所使用的参数基本和上面讲的一致,在训练的最开始我们需要初始化梯度的累积量和平方累积量。
v
d
w
=
0
,
v
d
b
=
0
;
s
d
w
=
0
,
s
d
b
=
0
{v_{dw}} = 0,{v_{db}} = 0;{s_{dw}} = 0,{s_{db}} = 0
vdw=0,vdb=0;sdw=0,sdb=0
假设在训练的第 t轮训练中,我们首先可以计算得到Momentum和RMSProp的参数更新:
v
d
w
=
β
1
v
d
w
+
(
1
−
β
1
)
d
W
v
d
b
=
β
1
v
d
b
+
(
1
−
β
1
)
d
b
s
d
w
=
β
2
s
d
w
+
(
1
−
β
2
)
d
W
2
s
d
b
=
β
2
s
d
b
+
(
1
−
β
2
)
d
b
2
{v_{dw}} = {\beta _1}{v_{dw}} + (1 - {\beta _1})dW\\ {v_{db}} = {\beta _1}{v_{db}} + (1 - {\beta _1})db\\ {s_{dw}} = {\beta _2}{s_{dw}} + (1 - {\beta _2})d{W^2}\\ {s_{db}} = {\beta _2}{s_{db}} + (1 - {\beta _2})d{b^2}
vdw=β1vdw+(1−β1)dWvdb=β1vdb+(1−β1)dbsdw=β2sdw+(1−β2)dW2sdb=β2sdb+(1−β2)db2
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。
v
d
w
c
=
v
d
w
1
−
β
1
t
v
d
b
c
=
v
d
b
1
−
β
1
t
s
d
w
c
=
s
d
w
1
−
β
2
t
s
d
b
c
=
s
d
b
1
−
β
2
t
v_{dw}^c = \frac{{{v_{dw}}}}{{1 - \beta _1^t}}\\ v_{db}^c = \frac{{{v_{db}}}}{{1 - \beta _1^t}}\\ s_{dw}^c = \frac{{{s_{dw}}}}{{1 - \beta _2^t}}\\ s_{db}^c = \frac{{{s_{db}}}}{{1 - \beta _2^t}}\\
vdwc=1−β1tvdwvdbc=1−β1tvdbsdwc=1−β2tsdwsdbc=1−β2tsdb
通过上面的公式,我们就可以求得在第 t轮迭代过程中,参数梯度累积量的修正值,从而接下来就可以根据Momentum和RMSProp算法的结合来对权重和偏置进行更新。
W
=
W
−
α
v
d
w
c
s
d
w
c
+
ε
b
=
b
−
α
v
d
b
c
s
d
b
c
+
ε
W = W - \alpha \frac{{v_{dw}^c}}{{\sqrt {s_{dw}^c} + \varepsilon }}\\ b = b - \alpha \frac{{v_{db}^c}}{{\sqrt {s_{db}^c} + \varepsilon }}
W=W−αsdwc
+εvdwcb=b−αsdbc
+εvdbc
上面的所有步骤就是Momentum算法和RMSProp算法结合起来从而形成Adam算法。在Adam算法中,参数 β1所对应的就是Momentum算法中的β值,一般取0.9,参数 β2所对应的就是RMSProp算法中的 β值,一般我们取0.999,而 ϵ 是一个平滑项,我们一般取值为 10−8,而学习率 α则需要我们在训练的时候进行微调。
降低训练误差
降低验证/测试误差
设置一个优化指标,其它为满足指标
数据增强扩大比例较低的样本的数量
比如99个良品、1个次品中可以扩大次品的样本数量
修改损失函数赋予比例较低样本更高的权重
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。