Regularization(正则化)、Dropout和BatchNormalization(批规范化)

本文主要讲解神经网络中的正则化(Regularization)和Dropout,都是用了减小过拟合。正则化在机器学习领域中很重要。主要针对模型过拟合问题而提出来的。本文是观看麦子学院的视频整理而来。下面开始介绍。

1 正则化

机器学学习中的正则化相关的内容可以参见李航的书:统计学习方法。参阅者可以先了解有关的内容。正则化是用来降低overfitting(过拟合)的,减少过拟合的的其他方法有:增加训练集数量,等等。对于数据集梳理有限的情况下,防止过拟合的另外一种方式就是降低模型的复杂度,怎么降低?一种方式就是在cost函数中加入正则化项,正则化项可以理解为复杂度,cost越小越好,但cost加上正则项之后,为了使cost小,就不能让正则项变大,也就是不能让模型更复杂,这样就降低了模型复杂度,也就降低了过拟合。这就是正则化。正则化也有很多种,常见为两种L2和L1。

1.1  L2 Regularization

下面先定义Regularization cross-entropy 函数:

相比于cross-entropy函数,这里多了最后一项,也就是正则化项。该项就是神经网络中的权重之和,其中λ>0为Regularization参数,n为训练集包含的实例个数。L2指的是2范数,这里是指最后一项的w的平方项。

而对于二次cost,也可以加上正则化项:

Regularization quadratic cost:

概括上面两种函数为:

可以看出来,Regularization的cost偏向于让神经网络学习比较小的权重w,否则第一项的C0明显减小。

λ:调整两项的相对重要程度,较小的λ偏向于让第一项C0最小化,较大的λ倾向于最小化增大的项:权重值和。

对上面公式求导得:

相比于没有正则项时,对w的偏导多了一项λw/n,而对偏向b不变。

对于随机梯度算法来说,权重w和偏向b的更新法则变为:

对于随机梯度下降算法变为:

其中m为mini_batch_size的大小。下面简单分析Regularization能降低overfitting的原因:

在神经网络中,正则化网络更倾向于小的权重,在权重小的情况下,数据x随机的变化不会对神经网络的模型造成太大的影响,所以可能性更小的受到数据局部噪音的影响。而未加入正则化的神经网络,权重大,容易通过较大的模型改变来适应数据,更容易学习到局部的噪音。

1.2 L1 Regularization

先介绍L1(1范数)Regularization cost函数为:

对C关于w求偏导得:

sgn(w)表示为符号函数,w为正,结果为1,w为负结果为-1。权重的更新法则为:

与L2 Regularization对比: 两者都是减小权重,但方式不同:

L1减少一个常量(η,λ,n根据输入都是固定的,sgn(w)为1或-1,故为常量),而L2减少的是权重的一个固定的比例;如果权重本身很大的话,L2减少的比L1减少的多,若权重小,则L1减少的更多。多以L1倾向于集中在少部分重要的连接上(w小)。这里要注意的是:sgn(w)在w=0时不可导,故要事先令sgn(w)在w=0时的导数为0。

2 Dropout

Dropout的目的也是用来减少overfitting(过拟合)。而和L1,L2Regularization不同的是,Dropout不是针对cost函数,而是改变神经网络本身的结构。下面开始简单的假设Dropout。

假设有一个神经网络:

按照之前的方法,根据输入X,先正向更新神经网络,得到输出值,然后反向根据backpropagation算法来更新权重和偏向。而Dropout不同的是,

1)在开始,随机删除掉隐藏层一半的神经元,如图,虚线部分为开始时随机删除的神经元:

2)然后,在删除后的剩下一半的神经元上正向和反向更新权重和偏向;

3)再恢复之前删除的神经元,再重新随机删除一半的神经元,进行正向和反向更新w和b;

4)重复上述过程。

最后,学习出来的神经网络中的每个神经元都是在只有一半的神经元的基础上学习的,因为更新次数减半,那么学习的权重会偏大,所以当所有神经元被回复后(上述步骤2)),把得到的隐藏层的权重减半。

 

对于Dropout为什么可以减少overfitting的原因如下:

一般情况下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一半的一隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其他神经元之间的更加健壮robust的特征。在Dropout的作者文章中,测试手写数字的准确率达到了98.7%!所以Dropout不仅减少overfitting,还能提高准确率。

3、BatchNormlization

关于BN这里直接连接到一个非常好的讲解,不在此赘述。链接

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在PyTorch中,可以使用正则化dropout来提高模型的泛化能力和防止过拟合。 1. 正则化(Regularization): 正则化是通过在损失函数中引入模型参数的惩罚项来减小模型的复杂度。常见的正则化方法有L1正则化和L2正则化。 - L1正则化(L1 Regularization):通过在损失函数中添加模型权重的绝对值之和作为惩罚项。这可以促使模型权重变得稀疏,即某些权重趋近于零。 ```python loss = criterion(output, target) l1_lambda = 0.01 # L1正则化系数 l1_regularization = torch.tensor(0, dtype=torch.float32) for param in model.parameters(): l1_regularization += torch.norm(param, 1) loss += l1_lambda * l1_regularization ``` - L2正则化(L2 Regularization):通过在损失函数中添加模型权重的平方和作为惩罚项。这可以使权重趋向于较小的值,但不会使其为零。 ```python loss = criterion(output, target) l2_lambda = 0.01 # L2正则化系数 l2_regularization = torch.tensor(0, dtype=torch.float32) for param in model.parameters(): l2_regularization += torch.norm(param, 2) loss += l2_lambda * l2_regularization ``` 2. Dropout: Dropout是一种在训练过程中随机丢弃一部分神经元以减少模型过拟合的技术。它在每个训练次中以一定的概率将神经元的输出置为零,使得网络不依赖于特定的神经元,从而提高了模型的泛化能力。 在PyTorch中,可以使用`torch.nn.Dropout`来添加Dropout层到模型中: ```python import torch.nn as nn # 在模型的定义中添加Dropout层 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.dropout = nn.Dropout(p=0.5) # dropout概率为0.5 # 其他网络层的定义... def forward(self, x): x = self.dropout(x) # 其他网络层的计算... return x ``` 在训练过程中,模型会自动应用Dropout,并在评估或推理时关闭Dropout以获得更稳定的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值