1 正则化(Regularization)
你可能听说过奥卡姆剃刀原则:给出两个解释,最可能正确的解释也是更简单的那一个–假设较少的解释。这个原则也同样适用于神经网络的模型:简单的模型比复杂的泛化能力好。
对于训练来说,加入正则化。显示了两个网络的训练集损失值随epoch的变化情况,更大的网络很快就会把训练集损失训练到接近零。网络越大,训练数据学习的速度就越快(是训练损失很快降低),但是也更容易过拟合(导致训练和验证损失之间的巨大差异)。
对于验证集合来讲,显示了L2正则化惩罚的影响。两个模型具有相同的参数,具有l2正则化的模型(点)也比参考模型(十字)更能减少过拟合。
正则化,即在成本函数中加入一个正则化项(惩罚项),惩罚模型的复杂度,防止网络过拟合
1.1 逻辑回归的L1与L2正则化
逻辑回归的参数W数量根据特征的数量而定,那么正则化如下:
逻辑回归的损失函数中增加L2正则化
其中L2范数可以理解:
解释:所有W参数的平方和的结果
逻辑回归的损失函数中增加L1正则化
其中L2范数可以理解为:
注:其中,λ为正则化因子,是超参数。由于L1正则化最后得到w向量中将存在大量的0,使模型变得稀疏化,因此L2正则化更加常用
1.2 正则化项的理解
在损失函数中增加一项,那么其实梯度下降是要减少损失函数的大小,对于L2或者L1来讲都是要去减少这个正则项的大小,那么也就是会减少w权重的大小。
接下来我们用过方向传播来理解L2,对于损失函数我们反向传播求参数梯度:
前面的默认损失函数的梯度计算结果默认为backprop,那么更新的参数就为:
那么我们将第一个公式带到第二个得到:
所以每次更新的时候都会让这个系数永远小于1,所以我们通常称L2范数为权重衰减。
1.3 正则化为什么能够防止过拟合
正则化因子设置的足够大的情况下,为了使成本函数最小化,权重矩阵W就会被设置为接近于0的值,直观上相当于消除了很多神经元的影响,那么大的神经网络就会变成一个较小的网络。
在加入正则化项后,当λ增大,导致减小,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传便会减小。由上图可知,在z较小(接近于0)的区域里,函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,因此不会发生过拟合。
1.4 tf.keras正则化API
正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚。
正则化器网络结构权重关键字参数:
· kernel_regularizer:keras.regularizers.Regularizer 的实例
· from tensorflow.keras import regularizers
· 可用的正则化器
·目的不是为了让训练更好,而是在训练很好的条件下,在测试集表现不好,有可能模型出现过拟合,需要在原始网络当中增加正则化参数(L2正则化)
2 Dropout 正则化
在验证集上,训练迭代5次之后,在验证集合上面效果,dropout拟合效果更好
Dropout论文地址:
http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf
Dropout:随机的对神经网络每一层进行丢弃部分神经元操作。
对于网络的每一层会进行设置保留概率,即keep_prob。假设keep_prob为0.8,那么也 就是每一层中所有神经元有20%的概率直接失效,可以理解为0
2.1 Inverted dropout
这种方式会对每层进行如下代码操作:
训练的时候只有占比为p的隐藏层单元参与训练。
2.2 dropout为什么有效
加入了dropout后,输入的特征都存在被随机清除的可能,所以该神经元不会再特别依赖于任何一个输入特征,也就是不会给任何一个输入特征设置太大的权重。通过传播过程,dropout将产生和L2正则化相同的收缩权重的效果。
· 对于不同的层,设置的keep——prob大小也不一致,神经元较少的层,会设 keep_prob为1.0,而神经元多的层则会设置比较小的keep_prob
· 通常被使用再计算机视觉领域,图像拥有更多的特征,场景容易过拟合,效果被实 验人员证明是很不错的。
调试时候使用技巧:
· dropout的缺点是成本函数无法被明确定义,保证损失函数是单调下降的,确定网 络没有问题,再次打开droupout才会有效。
2.3 DropoutAPI
· keras.layers.Dropout(0.2)
指定丢失率
· 效果
· 迭代10次没有dropout效果
· 迭代10次有dropout效果
3 其他正则化方法
早停止法(Early Stopping)
数据增强
3.1 早停止法(Early Stopping)
通常我们在验证的时候,发现过拟合。可以得到下面这张损失图
通常不断训练之后,损失越来越小。但是到了一定之后,模型学到的过于复杂(过于拟合训练集上的数据的特征)造成测试集开始损失较小,后来又变大。模型的w参数会越来越大,那么可以在测试集损失减小一定程度之后停止训练。
但是这种方法治标不治本,得从根本上解决数据或者网络的问题。
3.2 数据增强
数据增强
指通过剪切、旋转/反射/反转变换、缩放变换、尺度变换、对比度变换、噪声扰动、颜色变换等一种或多种组合数据增强变换的方式来增加数据集的大小。
即使卷积神经网络被放在不同方向上,卷积神经网络对平移、视角、尺寸或照度(或以上组合)保持不变性,都会被人为是一个物体。
数据增强类别:
· 离线增强。预先进行所有必要的变换,从根本上增加数据集的规模(例如,通过翻转所有图像,保存后数据集数量会增加到2倍)
· 在线增强,或称为动态增强。可通过对即将输入模型的小批量数据的执行相应的变化,这样同一张图片每次训练被随机执行一些变化操作,相当于不同的数据集了。
那么在代码中也是进行这种在线增强。
下面一些方法基础但功能强大的增强技术,目前被广泛应用。
· 翻转:tf.image.random_flip_left_righr
你可以水平或垂直翻转图像。一些架构并不支持垂直翻转图像。但,垂直翻转等价于将图片旋转180再水平翻转。下面就是图像翻转的例子。
· 旋转:rotate
· 剪裁:random_crop
随机从原始图像中采样,然后将这部分图像调整为原始图像大小
· 平移、缩放等方法
数据增强的效果是非常好的,比如下面的例子,绿色和粉色表示没有数据增强之前的损失和准确率效果,红色和蓝色表示数据增强之后的损失和准确率结果,可以看到学习效果也改善较快。
那么TensorFlow官方源码都是基于vgg与inception论文的图像增强介绍,全部通过tf.Image相关API来预处理图像。并且提供了各种封装过tf.image之后的API。那么TensorFlow官网也给我们提供了一些模型的数据增强过程。