文章目录
Batch Normalization是基于mini-batch进行的,所以在下文中我们首先复习一下mini-batch是怎么一回事,然后说明为什么需要进行Batch Normalization,最后说明如何进行Batch Normalization与它的优缺点
一. Batch & mini-batch
我们来复习一下mini-batch与batch的区别:
深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
二. 为什么要使用 Batch Nomalization
接着我们来看一下为什么需要Batch Nomalization
在神经网络中,为了增加模型的非线性表达能力,我们在输入与隐藏层之间、两个隐藏层之间、隐藏层与输出层之间,都需要增加一层激励函数,这个激励函数可以是ReLU(常用于图像)、也可以是tanh(输出值在-1到1之间)、sigmoid(输出在(0-1之间))等等都可以。而它们的作用就来自于它们图形的样子–非线性。
一般的神经网络中,如果没有激活函数,由于神经元之间的计算都是线性的矩阵变换,那么输入与输出之间必定是某种线性关系,而这对于我们的应用是不够的
但是一旦我们使用了激活函数,那么它也会造成一些缺点,比如说tanh函数
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
tanh(x)=ex+e−xex−e−x
对应图像为
它对于输入值在
(
−
2
,
+
2
)
(-2,+2)
(−2,+2)时比较敏感,在这个区间内导数的绝对值较大
但是对于在这个区间以外的数据,则十分不敏感。甚至输入
t
a
n
h
(
50
)
tanh(50)
tanh(50)与
t
a
n
h
(
100
)
tanh(100)
tanh(100)的值也无甚区别
在这种情况下,随着神经网络深度的加深,到了后面,非标准化的数据就越来越没有用。
换句话说,计算结果的值的分布,对于激励函数是很重要的
下图便是一个例子,可以看到,经过normalization后的数据能够更有效地前向传递
下面这个图中,上面是经过
t
a
n
h
tanh
tanh之前的输入,下面是经过之后的输出
很显然,经过normalization后的数据能够更好地传递到下一层进行计算。
下图中是另一个类似的例子,这样我们就可以一眼看出normalization的功效了
三. 如何进行 normalization
如何去进行normalization呢?实际上很简单,其实就是直接把我们的数据正态化
变量说明
Batch Normalization(简称BN)中的batch就是批量数据,即每一次优化时的样本数目,通常BN网络层用在卷积层后,用于重新调整数据分布。假设神经网络某层一个batch的输入为X=[x1,x2,…,xn],其中xi代表一个样本,n为batch size。
计算方法
首先,我们需要求得mini-batch里元素的均值:
μ
B
=
1
n
∑
i
=
1
n
x
i
\mu_B = \frac{1}{n}\sum_{i=1}^nx_i
μB=n1i=1∑nxi
接下来,求取mini-batch的方差:
σ
=
1
n
∑
i
=
1
n
(
x
i
−
μ
B
)
2
\sigma = \frac{1}{n}\sum_{i=1}^n(x_i-\mu _B)^2
σ=n1i=1∑n(xi−μB)2
这样我们就可以对每个元素进行归一化。
x
i
′
=
x
i
−
μ
B
σ
B
2
+
ϵ
x'_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}}
xi′=σB2+ϵxi−μB
最后进行尺度缩放和偏移操作,这样可以变换回原始的分布,实现恒等变换,这样的目的是为了补偿网络的非线性表达能力,因为经过标准化之后,偏移量丢失。具体的表达如下,yi就是网络的最终输出。
y
i
=
γ
i
⋅
x
+
β
i
y_i=\gamma_i \cdot x+ \beta_i
yi=γi⋅x+βi
假如gamma等于方差,beta等于均值,就实现了恒等变换。
四. normalization 的优缺点
优点
- 减轻了对参数初始化的依赖,这是利于调参的
- 训练更快,可以使用更高的学习率。
- BN一定程度上增加了泛化能力,dropout等技术可以去掉。
缺点
从上面可以看出,batch normalization依赖于batch的大小,当batch值很小时,计算的均值和方差不稳定。研究表明对于ResNet类模型在ImageNet数据集上,batch从16降低到8时开始有非常明显的性能下降,在训练过程中计算的均值和方差不准确,而在测试的时候使用的就是训练过程中保持下来的均值和方差。
这一个特性,导致batch normalization不适合以下的几种场景。
- batch非常小,比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景。
- rnn,因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。在rnn中,对bn进行改进也非常的困难。不过,困难并不意味着没人做,事实上现在仍然可以使用的,不过这超出了咱们初识境的学习范围。