批归一化(Batch Normalization)-加速神经网络训练

sallyyoungsh 2018-06-04

神经网络 - 一种复杂的设备,正在成为人工智能的基本组成部分之一。使用神经网络的一个重要问题是网络训练需要很长时间才能实现有效的深度网络 - 即使在GPU上,也不用CPU。

神经网络使用BackPropagation算法来了解问题。通过反向传播,神经元学习了他们做了多少错误并自行纠正,即纠正了他们的“权重”和“偏差”。通过这一点,他们学习了这个问题,在给定输入的情况下产生正确的输出。BackPropagation包含计算每层的梯度并向后传播,因此得名。

批归一化(Batch Normalization)-加速神经网络训练

BackProp算法

但在误差对权重和偏差的反向传播过程中,我们将面临一个不期望的内部协变量移位性质。这使得网络太长,无法训练。

内部Covariate Shift

在训练过程中,每一层都试图自行纠正前向传播过程中产生的错误。但是每一层单独行动,试图纠正自己的错误。

批归一化(Batch Normalization)-加速神经网络训练

Internal Covariate Shift

例如,在上面给出的网络中,第二层调整其权重和偏差以校正输出。但是由于这种重新调整,第二层的输出,即第三层的输入,对于相同的初始输入而改变。所以第三层必须从头开始学习,为相同的数据产生正确的输出。

批归一化(Batch Normalization)-加速神经网络训练

训练顺序

这就提出了一个问题,即一个层在上一层之后开始学习,也就是说,第三层在第2层完成后学习,第4层在第3层之后开始学习,等等。同样地,想想目前存在的深度神经网络,深度在100到1000层之间!训练他们真的需要epochs:D

更具体地说,由于前一层的权重发生变化,当前层的输入值分布发生变化,迫使它学习新的“输入分布”。

归一化

在数据集中,所有的特性(列)可能不在同一范围内。如。房子的价格(千美元),房子的年龄(100以内)等等。这些数据集需要花费大量的时间去训练。

批归一化(Batch Normalization)-加速神经网络训练

原始数据和归一化数据

通常,在线性回归等更简单的ML算法中,输入在训练前是“normalized”的,使其成为单分布。归一化是将所有输入的分布转换为平均值= 0和标准偏差= 1。所以大多数值都在-1和1之间。

我们甚至可以对神经网络的输入应用这种归一化。它加强了训练,就像线性回归一样。但是由于第二层改变了这个分布,所以连续的层没有受益。那么,我们能做什么呢?是啊!为什么不在每个层之间添加归一化呢?这就是批归一化的作用。

批归一化

为了减少内部covariate shift的问题,批归一化在每层之间添加归一化“层”。这里需要注意的一个重要问题是,归一化必须针对每个维度(输入神经元),在“mini-batches”上单独完成,而不是与所有维度完全一致。因此名字'批(Batch)'归一化。

批归一化(Batch Normalization)-加速神经网络训练

批归一化

由于这种在每个完全连接的层之间的“层”的归一化,每层的输入分布的范围保持不变,而不管前一层中的变化。给定来自第k个神经元的x个输入。

批归一化(Batch Normalization)-加速神经网络训练

归一化将所有输入集中在0左右。这样,每个层输入中没有太多变化。因此,网络中的层可以同时从反向传播中学习,而不需要等待前一层学习。这巩固了网络的训练。

批归一化尽管非常好。但是,我们需要处理一些BatchNorm的小问题。

Scale and Shift

通常有两种类型可以应用批归一化:

  1. 激活功能之前(非线性)
  2. 非线性后

在原始文件中,BatchNorm在应用激活之前应用。以这种方式应用时,大多数激活函数都有问题。对于sigmoid和tanh激活,归一化区域比非线性更具线性。

批归一化(Batch Normalization)-加速神经网络训练

Sigmoid和Tanh在零附近变成线性

为了激活,一半的输入被清零。

批归一化(Batch Normalization)-加速神经网络训练

Relu activation

因此,必须进行一些转换才能将分布从0移开。使用缩放因子γ和移位因子β来执行此操作。

批归一化(Batch Normalization)-加速神经网络训练

随着训练的进行,这些γ和β也通过反向传播学习以提高准确性。这就要求为每一层学习2个额外的参数来提高训练速度。

这个最终转换因此完成了批归一算法的定义。缩放和移位的使用特别有用,因为它提供了更多的灵活性。假设如果我们决定不使用BatchNorm,我们可以设置γ=σ和β= mean,从而返回原始值。

最近,已经观察到,激活后应用BatchNorm,性能更好,甚至更精确。对于这种情况,我们可能决定仅使用BatchNorm,而不是缩放和移位。为此,设γ= 1和β= 0。然而,γ和β被包括在批归一化算法中。

在推理时BatchNorm

我们现在知道,批归一化计算了训练时每个小批量的均值和方差,并使用反向传播进行了学习。但是,在推理时要做什么。如果我们要使用微量批次测试的均值和方差,那就不好了,因为它可能会出现偏差。

我们所做的是,我们使用所有最小批量均值和方差来计算训练后均值和方差的“总体平均数”。并且在推断时,我们将均值和方差固定为该值,并将其用于归一化。这提供了更精确的均值和方差值。

批归一化(Batch Normalization)-加速神经网络训练

Population mean and variance

但是,有时候,很难跟踪所有的小批量均值和差异。在这种情况下,可以使用指数加权“移动平均数”来更新总体均值和方差:

批归一化(Batch Normalization)-加速神经网络训练

移动均值和方差的计算

这里α是前一个移动统计的“momentum”,约为0.9。B下标为小批量均值和小批量方差。这是在大多数库中可以找到的实现,在这些库中可以手动设置动量。

这里需要注意的一点是,移动平均值和移动方差是在训练时间和训练数据集中计算出来的,而不是在测试时间。

由BatchNorm正则化

除了紧扣神经网络的学习之外,BatchNorm还提供了一种弱化的正则化形式。它如何引入正则化?正则化可能是由于向数据引入噪声而造成的。由于归一化不是在整个数据集上进行的,而是在最小批次上进行的,它们就像噪音一样。

然而,BatchNorm只提供弱调整,它不能完全依赖于避免过度拟合。然而,其他正则化可以相应减少。例如,如果要dropout 为0.6(drop rate),使用BatchNorm,可以将drop rate低到0.4。

相关推荐