DeepLearing学习笔记-改善深层神经网络(第三周- 将batch-norm拟合进神经网络)

0- 背景

介绍如何将batch归一化引入到神经网络中

1- 流程如下:

在计算z之后,才是之前介绍的batch归一化方法,对其进行归一化,再替代原来的z值,输入到下该层的激活函数中。其他隐藏层,操作类似。
这里写图片描述
在实际中,可以直接使用框架中函数,而不必自己实现这些具体的细节。

tf.batch_normalization()#进行batch 归一化操作

2-min-batch下的batch归一化

对于采用min-batch的处理方式的话,则是对每个min-batch样本集处理之后,对输出的Z进行batch归一化操作(减去均值,除以标准差)。各个min-batch样本都是做类似的工作:
这里写图片描述
其中每个min-batch之后,都会更新 βγ 值,batch归一化(BN)。
由于batch归一化处理的时候,减掉了一个均值操作,所以其实参数中的b参数会被均值减法所抵消掉。所以,在使用batch归一化时候,是可以不考虑b参数。
z[l]=w[l]a[l1]
z[l]norm
z~[l]=γ[l]z[l]norm+β[l]
其实只是在之前的处理逻辑中对 z[l] 进行了替换而已,其他的步骤是一样的。
γ[l]β[l] 的尺寸都是 n[l],1 ,这是因为每层的神经元个数是 n[l] ,用 γ[l]β[l] 将每层的均值和方差进行缩放。

3- batch归一化加速原理

其中一个原因与输入特征值的归一化一样,归一化后的值都在一个特定范围内变化,加速了学习速度。另一个更深层次的原因是batch-归一化可以使权重比神经网络更滞后或者更深层。可以这样理解,batch归一化之后,比如第10层的权重相比于前层的权重(例如第1层)更够经受住变化,即更加稳定,使得前层和后层之后的相互影响减缓,层级之间相互独立一些。

假设有一个用于猫识别的浅层神经网络或者逻辑回归模型。训练集上的数据都是黑色的猫,但是如果现在想要用有色猫来作为测试集的话,可能结果不好。这类问题其实可以简化为映射问题,训练集是x,模型是映射函数,y则是映射结果。如果已经学习了x到y的映射,此时当x的分布改变了,那么我们可能需要重新训练,这就是神经网络中的covariate shift问题。
我们从下面的一个神经网络模型来分析:
这里写图片描述
从第三隐藏层来看学习过程,此时的网络已经学习了参数 w[3]b[3] 。从该层角度来看的话,它从前层中获取的值,结合参数 w[3]b[3] 等参数,目的是希望最后输出层的输出值 y^ 接近真实值 y
我们先不看第三层左边部分,只看第三隐藏层:
这里写图片描述
输入是a[2]1,a[2]2,a[2]3,a[2]4,接收该输入的隐藏层找到一种方式,使得这些输入值映射到 y^ ,其中涉及到的参数是 w[3]b[3],w[4]b[4]
我们再来看第三隐藏层左边的部分,涉及到的参数是 w[2]b[2],w[1]b[1] ,如果这些参数发生变化,对于第三隐藏层的输入值 a[2] 也会发生变化。
所以,从第三隐藏层的角度来看,这些隐藏单元的值在不断变化着,所以,就有了covariate shift问题。batch归一化的作用,就是减少了这些隐藏单元值分布变化的数量范围。

当神经网络的参数更新时, z[2]1z[2]2 等发生改变,通过batch归一化可确保,无论这些值怎么变化,都可以保证 z[2]1z[2]2 等的均值和方差保持不变。
batch归一化操作,限制了前层的参数更新,从而影响单元值分布程度。它减少了输入值的改变,使得这些值变得更加稳定。这也使得之后的神经网络的基础更牢固,即使输入分布改变了一些,那么它会变得更小。它所做的就是减弱了前层参数的作用与后层参数的作用之间的联系,使得每层网络都可以自己学习,稍稍独立于其他层,从而有助于加速整个网络的学习。
从后层的角度来看,batch归一化使得前层不会左右移动太多。毕竟它们都被相同的均值和方差所限制。所以,均值和方差相同是指这个意思。这也使得后层的学习变得更加容易。

batch-归一化的轻微正则化效果
batch归一化中非直观的就是每个min-batch( X{i} )的值Z都被均值和方差缩放了。由于在min-batch上计算的均值和方差是基于子数据集(min-batch size大小的数据上),而不是整个训练集,所以,均值和方差都有一些小噪声。这也就使得 z[l] 计算 z~[l] 也存在噪声。这种效果与dropout相似,它往每个隐藏层的激活值中都添加了噪声。dropout使得一个隐藏的单元,以一定概率乘以0,一定概率乘以1,所以是含有多重噪声的。batch归一化的多重噪声,则是由于标准偏差的缩放,和减去均值操作带来的。隐藏单元多出来的这些噪声,迫使后部隐藏单元,不过分地依赖任何一个隐藏单元,因此有轻微的正则化效果。
因为噪声很小,所以,正则化效果不大,不如dropout的正则化效果。如果min-batch size较大,则会减少噪声,进而减少正则化效果。在使用过程可以将batch归一化和dropout一起使用。注意,batch-归一化的轻微正则是附带的,不是其主要的作用。

4- 测试时的batch归一化

训练时,batch归一化将数据以mini-batch的形式逐一处理,但在测试时,你可能需要对每一个样本逐个处理,怎样调整网络来做到这一点?
训练时:
μ=1mmiz(i)
σ2=1mmi(z(i)μ)2
z(i)norm=z(i)μσ2+ϵ
z~(i)=γz(i)norm+β
其中的m表示该min-batch中的样本数量。
但是在测试的实时,我们是对于单个样本,无法同时取如一个min-batch size的样本数量进行处理,要怎么办?此时,我们需要用其他方式来计算 μσ2 ,而且对于一个样本来说,计算均值和方差也是没有意义的。
为了将训练好的神经网络应用于测试,需要单独计算 μσ2 ,一般是采用
指数加权平均的方式来估算 μσ2 。这个平均数涵盖了所有的min-batch。
min-batch分别为 X{1} , X{2}....
在为第 l 层训练数据X{1}时,得到 μ{1}[l]
在为第 l 层训练数据X{2}时,得到 μ{2}[l]
采用指数加权平均的方式我们就可以获取对这一隐藏层的均值 z 的估计,同理我们可以根据各个min-batch的σ2来估计这层的 σ2 。在此基础上,我们就可以用z值来计算 znorm ,进而计算得到 z~ 。所以,这里的均值和方差,其实是根据训练集估算出来的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!改善深层神经网络的方法有很多,以下是一些常见的方法: 1. 使用更好的激活函数:传统的激活函数如Sigmoid、tanh等可能存在梯度消失或爆炸的问题。可以尝试使用ReLU、Leaky ReLU、ELU等激活函数,以减轻这些问题。 2. 使用批标准化(Batch Normalization):批标准化对网络的输入行标准化,有助于加快网络的训练速度,并且可以缓解梯度问题,使得更深层的网络也能够训练得更好。 3. 使用残差连接(Residual Connections):残差连接可以帮助信息在网络中更好地流动,从而减轻梯度消失的问题。通过将某些的输出与输入相加,可以使得网络更易于训练。 4. 使用更好的优化算法:传统的梯度下降算法如随机梯度下降(SGD)可能存在训练速度慢、易陷入局部最优等问题。可以尝试使用更高级的优化算法如Adam、RMSprop等,以加快模型的收敛速度。 5. 添加正则化:过拟合深层神经网络常见的问题之一。可以通过添加正则化项如L1正则化、L2正则化等来限制模型的复杂度,防止过拟合的发生。 6. 数据增强:通过对训练数据行一些随机的变换,如平移、旋转、缩放等,可以增加模型的泛化能力,防止过拟合。 这些方法只是改善深层神经网络的一部分,具体的选择和调整需要根据具体问题和数据集来行。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值