Skip to content

Lesson-28

批量归一化
  • 动机:当我们构造一个很深的网络的时候,我们定义的损失函数(输出导致的部分)和原始的数据输入离得就会非常 “远”(中间间隔了许多层、许多函数),这就会导致:离输出近的部分梯度大,远的部分梯度小(梯度消失)

  • 这样的梯度差异会让上层的训的比较快,下层训的慢,而一般来说离数据更近的下层抽取的是数据底层的信息,这也会影响着上层。那么每次下层改变的时候,上层就白训了。

  • 因此我们考虑:能否实现在训下层的时候,避免对上层的影响呢?

实现思想

我们固定每一层中输出的均值和方差,我们认为这样可以保证每一层输出的分布都是固定的、相似的。首先,我们固定小批量中的均值和方差(下面的\(B\)就是批量的样本数,\(x_i\)就是批量中的样本):

\[\mu_B = \frac{1}{|B|}\sum_{i \in B}x_i\]
\[\sigma_B^2 = \frac{1}{|B|}\sum_{i \in B}(x_i-\mu_B)^2+\epsilon\]

那么,我们每次实现 Batch Norm,实际上是在做:

\[X_{i+1}=\gamma\frac{X_i-\hat{\mu_B}}{\hat{\sigma_B}}+\beta\]

这里,下标\(i\)表示的是更新的步数,\(X\)表示这个 Batch 中所有的样本。

我们引入了两个可以学习的参数\(\gamma\)\(\beta\),这是因为,可能方差为1,均值为0的分布并不是最好的,最好的可以通过学习来得到。

作用范围
  • 对于全连接层来说,它作用在特征维;对于卷积层,它作用在通道维:我们可以这样理解,对于一个100通道的图片,它的每一个像素点都是一个样本,那么对于这个样本而言,每个通道就是它的特征
  • 作用在每个全连接层和卷积层的输入上;作用在每个全连接层和卷积层的输出后,在激活函数之前

可以实现加速收敛速度,但是并没有改善模型的精度。