一起来学PyTorch——神经网络(BN层)

在追求高性能的过程中,卷积网络被设计的越来越深,同时变得难以训练收敛和调参。原因在于,浅层参数的微弱变化经过多层线性变换与激活函数后,会被放大。

由于网络中参数变化导致的内部节点数据分布发生变化的现象称作ICS(Internal Covariate Shift)。ICS现象容易使训练过程陷入饱和区【自变量进入某个区域后,梯度基本不变化,不变化就找不到下降最快的方向】,减慢网络的收敛。激活函数中的ReLU可以在一定程度上解决这个问题。BN层则从改变数据分布的角度避免了参数陷入饱和区。

BN层首先对每一个batch的输入特征进行白化操作,即去均值方差过程。假设一个batch的输入数据为x:B={,......,},首先求该batch数据的均值与方差。

以上公式中,m代表batch的大小,是批处理数据的均值,为批处理数据的方差。在求得均值方差后,再进行去均值方差操作,具体如下:

白化操作可以使输入的特征分布具有相同的均值与方差,从而加速网络的收敛。但是,白化操作也限制了网络中数据的表达能力,浅层学到的参数信息会被白化操作屏蔽掉。因此,BN层在白化操作后又增加了一个线性变换操作,让数据尽可能地回复本身的表达能力。

BN层有以下3个优点:

  1. 缓解梯度消失,加速网络收敛。

BN层可以让激活函数的输入数据落在非饱和区,缓解了梯度消失问题。而且,由于每一层数据的均值与方差都在一定范围内,深层网络不必去不断适应浅层网络输入的变化,加快了网络的收敛。

  1. 简化调参,网络更稳定。

在调参时,学习率调的过大容易出现震荡与不收敛,BN层抑制了参数的微小变化随着网络加深而被放大的问题,因此对参数变化的适应能力更强,便于调参。

  1. 防止过拟合。

BN层将每一个batch的均值与方差引入到网络中,由于每个batch的这两个值都不相同,可以看作为训练增加了随机的噪音,可以起到一定的正则效果,防止过拟合。

BN层有以下2个缺点:

  1. 要求较大的batch。

因为是在batch的维度进行归一化,所以需要较大的batch,同时算法占用内存较高,限制了batch的大小,也会限制BN层的效果。

  1. 数据的batch大小在训练与测试时往往不一样。

在训练时一般采用滑动来计算平均值与方差,在测试时直接使用训练集的结果。因此对训练集和测试集的数据分布有要求。

Pytorch实现实例如下:

from torch import nn
# 使用BN层需要传一个参数num_features, 即特征的通道数
bn = nn.BatchNorm2d(64)
input = torch.randn(4, 64, 224, 224)
output = bn(input)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值