深度学习之Batch Normalization

BN(Batch Normalization),顾名思义也就是“批规范化“。目前很多深度学习网络中都会加入BN层,那么它为何这么有效呢?

1、BN是什么?

与激活层、卷积层、池化层一样,BN也属于神经网络的一层。在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1(cnn中BN一般加在卷积层与激活层之间)。但是原本数据分布被破坏了,怎么办?最后的“scale and shift”变换重构操作就是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入,从而保证整个network的capacit,这是算法最关键的一步。

关于DNN中的数据预处理,最好的算法应该是白化(whitening),经过白化预处理后,数据满足条件:a、特征之间的相关性降低,这个就相当于pca;b、数据均值、标准差归一化,也就是使得每一维特征均值为0,标准差为1。如果数据特征维数比较大,要进行PCA,也就是实现白化的第1个要求,是需要计算特征向量,计算量非常大,于是为了简化计算,BN的作者忽略了第1个要求,提出两种简化方式:1)直接对输入信号的每个维度做规范化(“normalize each scalar feature independently”);2)在每个mini-batch中计算得到mini-batch mean和variance来替代整体训练集的mean和variance. 这便是我们所说的BN算法。

2、BN算法以及实现?

具体算法描述:
这里写图片描述

实现的话就是我们常见的链式求导:
这里写图片描述

3、为什么要用BN?

BN的提出是为了克服深度神经网络难以训练的弊病。深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。

在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如,transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同大家细想便会发现对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。BN可以在某种程度上解决covariate shift的问题。

3、BN如何解决梯度问题?

BN到底还是为了防止“梯度弥散”。关于梯度弥散,大家都知道一个简单的栗子: 0.9 30 0.04 。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。

详细来说,反向传播时经过该层的梯度是要乘以该层的参数的,即前向有:

h l = w l T h l 1

那么反向传播有:
J h l 1 = J h l . h l h l 1 = J h l w l

那么考虑从l层传到k层的情况,有:

扫描二维码关注公众号,回复: 2186503 查看本文章
J h k = J h l i = k + 1 l w i

问题就出在 w i 上,当 w i < 1 是,连乘结果会趋向于0,大于1则会趋向于无穷大。BN所做的就是解决这个梯度传播的问题,因为BN作用抹去了w的scale影响,抑制了w的持续变大或变小的趋势(不知道这么理解对不对)。

猜你喜欢

转载自blog.csdn.net/wyisfish/article/details/80483243