Regularizing your neural network

Regularizing

如果怀疑神经网络过度拟合了数据,即存在高方差问题那么最先想到的方法可能就是正则化,另一个解决高方差的方法就是准备更多数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据或者获取数据的成本很高。

  • 接下来使用逻辑回归实现一下正则化:

L2正则化是最常见的正则化类型,加的L2范数;及L1正则化。
如果用的L1正则化,W最终会是稀疏的,W向量中会有很多0。越来越倾向于使用L2正则化
注:在python编程语言中,λ(lambda)是一个保留字段,所以我们用 lambd代替 lambda正则化参数

Regularizing your neural network_第1张图片

  • 神经网络中怎么实现正则化

代价函数是m个训练样本上 的损失之和,至于正则化 再加上lambda/2m 乘以所有参数W的范数的平方之和 。这里W是你的参数矩阵 ,这里矩阵范数的平方:定义为 对于i和j 对矩阵中每一个元素的平方求和 。如果你想为这个求和加上索引 ,这个求和是i从1到n[l-1], j从1到n[l] 。因为w是一个n[l-1]列 、n[l]行的矩阵 。这些是第l-1层和第l层的隐藏单元数量单元数量 。或 这个矩阵的范数称为矩阵的弗罗贝尼乌斯范数 ,使用角标F标记。

Regularizing your neural network_第2张图片

Why regularization reduces overfitting?


如果lamda被设置的足够大,权重矩阵被设置为接近于0的值,直观理解就是把多隐藏单元的权重设置为0,于是基本消除了这些隐藏单元的许多影响,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑单元,可是深度却很大。它会使这个网络从过拟合状态更接近左图的高偏差状态。但是lamda会有一个中间值,于是会有一个接近与“just right ”的状态


Regularizing your neural network_第3张图片

再来看一个例子:
假设我们用的是这样双曲激活函数,g(z)表示tanh(z),我们发现,只要z非常小,并且只取一个小范围的参数,利用了双曲正切函数的线性状态,同理,lamda增大,W会变小,相对于Z也会变小,在一个线性区间。


Regularizing your neural network_第4张图片

Understanding Dropout

Regularizing your neural network_第5张图片
  • 反向随机失活(inverted dropout)
    定义一个向量d,d3表示第三层的dropout向量

d3 = np.random.rand( a3.shape[0],a3.shape[1])

Other regularization methods

除了 2正则化和随机失活( dropout),还有几种方法可以减少神经网络中的过拟合。

  • 数据扩增

假设你正在拟合猫咪图片分类器,如果你想通过扩增训练数据来 解决过拟合,但扩增 数据代价高,而且有时候 我们无法扩增数据,但我们可以添加这类图片来增加数据集。例如 ,水平翻转图片,并把它添加到训练集。除了水平翻转,你也可以随意裁剪图片,可以把原图旋转并随意放大后裁剪的。
对于光学字符识别,我们还可以通过添加数字,随意旋转或扭曲数字来扩增数据

  • early stopping
    运行梯度下降时,代价函数J的优化过程单调下降趋势,如图。


    Regularizing your neural network_第6张图片

    我们不但可以绘制代价函数loss,还可以绘制验证集误差,你会发现验证集误差通常会呈先下降,然后在某个节点 处开始上升。early stopping的作用就是,就在那个点停止训练。

Normalizing inputs

训练神经网络,其中一个加速训练的方法就是归一化输入,假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:

  • 零均值
  • 归一化方差
    我们希望无论是训练集还是测试集都是通过相同的μ,σ2定义的数据装换
    1.第一步是零均值化 :
    Regularizing your neural network_第7张图片

    它是一个向量,x等于每个训练数据 x减去μ,意思是移动训练集,直到完成零均值化
    2 .第二步是归一化方差 ,注意特征x1的方差比特征x2的方差要大得多 。

    每个特征都有方差,注意,我们已经完成了零均值 ,x2就是y2的方差,然后把所有数据除以σ2向量

tips:如果用它来调整数据,那么用相同的μ,σ2来归一化测试集,而不是在测试集和训练集分别预估μ,σ2。尤其是,你不希望训练集和测试集的归一化有什么不同。其中:μ,σ2是由训练集数据计算得来的。

Regularizing your neural network_第8张图片

为什么做归一化:然而如果你归一化特征,代价函数看起来更对称,更容易优化,前提是特征都在相似范围内,不是从1到1000,,0到1的范围而是在-1到1的范围内或相似偏差。
所以如果输入特征处于不同范围内,可能有些特征值从1到1000,那么归一化特征值就非常重要了,如果特征值处于相似范围内 ,那么归一化就不是很重要了,执行这类归一化并不会产生设么危害,我通常会做归一化处理,虽然我不确定能否提高训练或算法速度。

你可能感兴趣的:(Regularizing your neural network)