您的位置:首页 > 理论基础 > 计算机网络

Batch Normalization笔记

2017-10-03 14:21 92 查看

Batch Normalization笔记

在训练深度神经网络的时候,由于前面网络层参数的变化,会使得当前层网络的输入分布发生改变,这种情况需要我们很小心的对网络参数的参数进行初始化,以及使用很小的学习率,而这就会减缓整个网络的训练速度。上面的这种状况就被称为:internal covariate shift。而为了解决这种问题,论文中就提出了一种Batch Normalization的方法。之所以用Batch,而不是用all,或者one,是因为在训练深度神经网络模型的时候,在进行一次迭代训练的时候,绝大多数时候都是用整个数据集中的一小批数据,因此在每次迭代使用Batch Normalization都是针对当前迭代使用的这一小批数据。

训练过程

通常我们在训练神经网络前,都需要对数据进行归一化操作,这是因为归一化操作可以加速网络的收敛速度。Batch Normalization是一种类似对数据进行白化处理的归一化操作,即使得数据的均值为0,方差为1。



但是如果只是直接简单对数据的输入使用上面这种白化处理方式,则又会影响这一层的表征形式。例如:如果直接归一化sigmoid函数的输入,则可能由于变换后的数据全部聚集在距离原点很小的范围内,而这就使得原来的非线性函数突然变成了线性函数,而这是我们最不想看到的。因此为了解决这个问题,在网络中插入上面的白化处理操作后,再将数据进行一次线性变换,这就保证了数据既有相同的分布,而又没有影响到它原来的表征形式。



线性变换需要两个参数γ,β。如果γ等于训练时计算数据的方差,β等于计算数据的均值,这种线性变换就相当于又将归一化后的数据重构回原来的数据。



γ和β也是通过在训练的过程中学习得到。而对于γ和β的求解方式,和求解网络中权值参数的方式类似,先分别计算γ和β的梯度,然后利用各自的梯度去更新γ和β的值。



测试过程

在测试的时候,就不再有batch的概念,通常情况下,测试每次只是针对一个样本。但是这时候,对样本进行归一化时所需的均值和方差因该如何计算又是一个问题。解决方法:一旦网络训练完毕,网络的数据都有固定的均值和方差。因为前面在网络进行最后一次epoch训练的时候,会将每个batch计算得到的均值和方差都保存下来,这样在测试的时候,就可以直接利用这些训练数据的均值和方差来对测试数据进行归一化。



卷积层的归一化:

论文中Batch Normalization操作是添加在数据进入非线性激活函数之前的,也即对x=Wu+b进行归一化。由于是对x进行减均值处理,因此Wu+b中的偏置项b就可以直接忽略。因此z=g(Wu+b)就可以替换成z=g(BN(Wu))。

而对卷积层的归一化,则希望同样满足卷积的特性——对于相同的feature map中的不同位置的elements,用相同的方式进行Batch Normalization。每个feature map的神经元共用一对γ和β,而不是对每个神经元都用一对γ和β。

Batch Normalization优点

1.网络的收敛速度变得更快

2.可以使用更大的学习率,而不用担心网络不收敛的问题

3.BN对网络模型有正则化的作用,因此网络可以减少对dropout,L2等这些正则化操作的使用

4.网络模型中不再需要LRN层

参考内容

[1].Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

[2].http://blog.csdn.net/hjimce/article/details/50866313

[3].http://blog.inet198.cn/?u012816943/article/details/51691868
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  神经网络 trick