基于机器学习batch归一化克服深层神经网络导致难以训练的问题
covariate shift问题
机器学习中有一个经典的假设:训练数据和测试数据是满足相同分布的。这是训练数据获得的模型能够在测试集上获得好的效果的一个基本保障。
当训练集数据和测试集数据不一致的时候,训练集训练出来的模型未必能够在测试集上有好的效果,这种训练集和预测集样本分布不一致的情况就叫做covariate shift现象。
不一致的数据集
深度神经网络的中间网络层在训练过程中,中间层数据不断的改变,我们称这种情况是深度神经的covariate shift问题,这也是深度神经网络难以训练的原因之一。
深度神经的covariate shift问题
深度神经网络
深度神经网络是由多层网络层构成的,前一层的输出会作为后一层的输入。我们知道网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外,后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。
第三层
我们只看神经网络的第三层,它是由第二层的参数和第二层的输出计算得到的,而第二层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变,一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,这就是covariate shift问题。为了解决这个问题,于是就有了BN算法,也就是batch归一化。
batch归一化(BN算法)
当数据特征维度尺度不同的时候,我们一般归一化之后的数据传输给神经网络的输入层,这样有利于神经网络的学习速度,但这仅仅是对于输入层一层而言,但是从第二个隐藏层开始,我们的接收到前一层的数据就是没有归一化的,这样随着神经网络的训练,中间层数据分布会发生改变,所以我们可以思考是否在层与层传输的过程中,也进行一下归一化,这样使得神经网络的每一层都存在归一化操作,这样的神经网络的训练效果是否会更好。
BN算法通俗来说就是对每一层神经网络进行标准化处理, 我们知道对输入数据进行标准化能让机器学习有效率地学习. 如果把每一层看成这种接受输入数据的模式, 那么我们就可以让所有层进行归一化处理。BN算法就是在神经网络的训练过程中对每层的输入数据加一个标准化处理。
每一层都进行标准化
BN算法具体操作
我们对每一层都进行类似输入层数据的标准化,使其数据的变化范围永远固定在均值为μ,标准差为σ,这里我们需要注意的一点是:输入层的标准化是固定在均值为0,标准差为1的,而神经网络的其它层如果和输入层一样,这样会出问题,正确的做法是,我们引进参数来动态的帮助我们调节均值和方差,这两个参数γ,β也要通过梯度下降学习得到,具体来说就是:
BN算法
BN算法的优点
- 你可以选择比较大的初始学习率,让你的训练速度飙涨。
- 再也不需要使用使用局部响应归一化层了
- 可以把训练数据彻底打乱
BN算法类似于对输入层数据进行归一化,其实BN算法相当于对每一层输入做归一化,同时当浅层变化大时不会对深层造成很大的影响,这就有点类像减弱蝴蝶效应,它可以帮助神经网络加速收敛,BN算法引入了部分噪声,所以带有弱正则化效果,有点像dropout正则化。