文章目录
正则化
1 数据集的划分
正常情况下,主要将数据集分为三种,如果只使用一种算法,可以只划分两种
1.1 训练集
用于训练
1.2 验证集
用于验证哪种算法更优
1.3 测试集
测试训练完成的模型准确率
2 偏差与方差
2.1 高偏差(欠拟合)
训练集 | 测试集 | 结果 |
---|---|---|
15% | 20% | 欠拟合 |
2.2 高方差(过拟合)
训练集 | 测试集 | 结果 |
---|---|---|
1% | 20% | 过拟合 |
3 修正网络
如果不幸出现高偏差或者方差,可以从下面几个角度入手修改
3.1 高偏差:
1.更复杂的网络
2.修改网络的结构、参数
3.寻找更好的特征值
3.2 高方差:
1.更多的数据
2.正则化
3.更适合的网络架构
4.适当减少特征
4 正则化
避免过拟合的最常用的方法,最好祈祷这种方法有作用,否则你就要更换网络模型或者进行漫无天日的寻找数据集的过程。
4.1 L1正则化
在原本的损失函数后面加上正则项
λ
2
m
∣
∣
W
∣
∣
∣
∣
W
∣
∣
=
λ
m
∑
j
=
1
m
∣
W
∣
\frac{\lambda}{2m}{||W||}\\ {||W||} = \frac{\lambda}{m}\sum_{j=1}^{m} |W|
2mλ∣∣W∣∣∣∣W∣∣=mλj=1∑m∣W∣
4.2 L2正则化
在原本的损失函数后面加上正则项
λ
2
m
∣
∣
W
∣
∣
2
∣
∣
W
∣
∣
2
为
W
所
有
元
素
的
平
方
和
\frac{\lambda}{2m}{||W||}^2\\ {||W||}^2 为W所有元素的平方和
2mλ∣∣W∣∣2∣∣W∣∣2为W所有元素的平方和
λ:正则化参数
通常设置为比较小的值,随着λ的增大,W的值会减小,这样保证了线性运算的结果保持在一个较小的区间内,比如:原来的线性运算结果为(-100,100)之间,经过L2正则化之后,范围在(-10,10)之间,这样在经过非线性运算时,看起来更像是一段线性运算,以减少非线性运算后的过拟合状态。
4.3 Dropout正则化:
随即丢弃一定数量的神经网络节点,用以修正过拟合状态。
通过设置丢弃率,比如,丢弃率为25%,则以随机1/4的概率丢弃该层的节点,以避免过拟合状态
下面是Dropout的常用方法
4.3.1 反向随机失活
假设我们使用的是一个三层的神经网络,主要分为以下几个步骤:
1.第三层的权重矩阵为W3,生成一个与W3相同大小的0-1的随机矩阵d3。
d3 = np.random.rand(W3.shape[0],W3.shape[1])
W 3 : [ 2 3 1 5 4 1 3 3 1 ] d 3 : [ 0.20295277 0.81966998 0.28544819 0.97917905 0.22021902 0.15454601 0.2466112 0.82815697 0.03148317 ] W3: \begin{bmatrix} 2 & 3 & 1\\ 5 & 4 & 1\\ 3 & 3 & 1\\ \end{bmatrix} \\ d3: \begin{bmatrix} 0.20295277 & 0.81966998 & 0.28544819\\ 0.97917905 & 0.22021902 & 0.15454601\\ 0.2466112 & 0.82815697 & 0.03148317\\ \end{bmatrix} W3:⎣⎡253343111⎦⎤d3:⎣⎡0.202952770.979179050.24661120.819669980.220219020.828156970.285448190.154546010.03148317⎦⎤
2.设置keep_prob(0-1),表示该层中节点保留的概率,并使用d3与keep_prob相比较,比krrp_prob小的置为1(true),大的置0(false).
d3 < keep_prob
keep_prob设为0.8,则输出结果为:
3.再将W3与生成的bool矩阵逐元素相乘,生成新的矩阵W3
W3 = np.multiply(W3, d3)
此时W3为:
[
2
0
1
0
4
1
3
0
1
]
\begin{bmatrix} 2 & 0 & 1\\ 0 & 4 & 1\\ 3 & 0 & 1\\ \end{bmatrix}
⎣⎡203040111⎦⎤
4.最后,最关键的一步来了,需要将W3除以keep_prob,保证输出的期望值与原来相同,保证与原来的输出不变
W3 = W3/keep_prob
此时的w3为:
[
2.5
0
1.25
0
5
1.25
3.75
0
1.25
]
\begin{bmatrix} 2.5 & 0 & 1.25\\ 0 & 5 & 1.25\\ 3.75 & 0 & 1.25\\ \end{bmatrix}
⎣⎡2.503.750501.251.251.25⎦⎤
至此,第三层的Dropout就完成了,那么为什么能达到正则化的效果呢?
4.3.2 为什么Dropout能达到正则化的效果?
首先,我第一次使用Dropout层进行网络设计时,我觉得这不就是直接简化网络了吗?少设计几个神经单元不也一样能行?直到看了AlexNet网络模型的论文,才知道我小了,格局小了。
随机失活,每一次的训练都会选择不同的神经单元节点进行删除,这样不会过于依赖某一个或几个节点,因为每个节点都有可能会失活,会有收缩权重的平方范数的效果。
4.4 数据集增强正则化
并不是让你去获取更多的数据集,而是通过在原有数据集上修改获得更多的数据,比如将数据集中的图片反转或者截取主题的一部分等操作。
举个栗子,手写数字识别中,可以将原有的数字图片进行扭曲,缩放等操作获得更多的图片
这种获取的方法成本几乎为0,但肯定比不上完全不同的数据集,实际上可能是我方法不对,这种增强办法一次也没有奏效过,俺也不知道为什么。
4.5 早停止策略(early stopping)
跟名字一样,就是在未达到过拟合状态的时候就停止梯度下降的训练。
怎么说呢,感觉用处不大。。。。需要控制的因素太多,精度和过拟合问题无法同时满足,两者折中,中国人的性情总是调和的,折中的。