BatchNorm原理解析

BatchNorm要解决的问题

我们都知道,深度学习的话尤其是在CV中,都需要对数据进行归一化处理,因为深度学习网络主要就是为了学习训练数据的分布,并在测试集中得到更好的泛化效果。但是我们每一个batch输入的数据都具有不同的分布,显然会给网络训练带来困难。此外,数据经过一层层的网络之后,会导致数据的分布也在不断地发生变化,这会给下一层网络训练带来困难。

Internal Covariate Shift

专业术语,google小组在论文Batch Norm中提出,主要描述为:训练深度网络的时候经常发生训练困难的问题,因为每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据分布都会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变就很难学习)

Batch norm之前测策略就是小心的初始化参数,对数据做白话处理,但显然治标不治本。

Covariate shift

Covariate shift 和 Internal covariate shift 具有相似性,但并不是一个东西,前者发正在神经网络内部,所以是Internal,后者发生在输入数据上。

Covariate shift描述的是由于训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响。我们经常使用的方法就是做归一化或者白化处理

BatchNorm原理解读

为了减小Internal Covariate Shift,需要对每一层的数据进行处理。如果直接对每一层后进行归一化,会将每一层的输出数据都归一化到0均值和1方差,满足正态分布,但会导致每一层数据都是正态分布,导致其完全学不到输入数据的特征。

之所以称之为batchnorm是因为所norm的数据是一个batch的。

batchnorm的步骤如下:

1.先求出各个维度的均值和方差,接下来对x做归一化处理。

2.归一化处理之后,为每一个维度引入两个变量,放缩变量和偏移变量。 yi = λ xi + β

特殊请款下,如果λ和β分别等于此维度上一个batch的标准差和均值,那么xi将被还原为归一化之前的xi,即放缩平移到了归一化之前的分布,相当于batchnorm没有起到作用。因此,通过对归一化之后的数据进行放缩和偏移操作即可保证每一次数据经过归一化后还保留有学习来的特征,同时又能完成归一化这个操作。

训练的时候是这样的,但是测试的过程中,批次大小可能发生变化,会造成需要使用不同的λ和β。极端情况,batchsize=1的时候,无法计算批量的均值和方差。因此在训练的过程中保存下这两个值。测试的时候直接拿过用即可,不需要再次计算均值和方差。

你可能感兴趣的:(深度学习笔记,机器学习,深度学习,batchnorm)