Batch Normalization论文读后感

断断续续花了几天时间读了BN论文,发现BN确实很强大,解决了梯度消失和梯度爆炸,加快了模型的训练速度。BN给的不只是算法,帮助固定输入的分布,还说明了一种想法:网络层是人为规定的,可以把BN,激活函数,加权看成新的一层。所以看成这样新的网络结果就能固定输入分布。
也就是从一开始的网络结构开始看起,第一层第二层是固定的,把剩下的所有layers看成是一层,然后在第二层后面接一个BN,相当于BN是后面整个层的输入标准化。同理再把这个整层的网络再分割,也就固定了输入的分布。所以BN能够加快模型的训练速度。

然后是几个当时看觉得疑问的点,和几个需要了解的基础概念。

为什么bn需要放在激活函数之前。

在论文的试验中,作者他们通过实验得到,在第一第二时刻使用BN能够是函数更能保持输入的分布。而且如果在非线性函数的输出后面使用BN,会得到稀疏的值。

为什么标准化后还要跟一个线性映射。

我们再把activations标准化后可能会使得原来的数据丢失了一部分特征。比如在sigmoid函数中,只保持了线性部分,而丢失了非线性的部分。所以通过线性映射来得到原来的特征。映射的两个参数需要通过学习得到。

为什么要得到高斯分布而不是其他?

……有人证明了高斯分布是收敛最快的。

梯度消失和梯度爆炸

大的输入进入到sigmoid函数后,可以从图像中看到产生的梯度非常小,这就得到了梯度弥散的问题,小的梯度导致权值不学习。
Batch Normalization论文读后感_第1张图片
又比如在深度网络中,通过反向传播,最后一层的梯度自对自己求导一次,梯度较大,而前面几层在链式求导的规则下产生很小的梯度。这就导致了后面网络在学习,而前面的网络基本不再学习。梯度爆炸原理相同。
通过了BN层后,在对梯度进行求偏导,可以再论文的公式中看到,很好地解决了这个问题。

测试时的标准差和均值

标准化的mini_batch activations可以更高效的训练。但是我们希望输入是依赖于整个输出的,所以在测试时我们使用的平均值和标准差应该跟训练的每一次都相关,即Alg2.

covariate shift

convariate shift。因为我们在传统机器学习中假设训练集和测试集是独立同分布的,比如:假设q1(x)是测试集中一个样本点的概率密度,q0(x)是训练集中一个样本点的概率密度,独立同分布则说明q0(x)=q1(x).所以当用训练集得出最优参数时,依然可以保证q1(x)最优。但现实中,伴随新数据产生,老数据会过时,两个概率密度会不再相等,也就是发生了covariate shift。

定义convariate shift为,由于在训练中参数的变化导致了网络激活的分布。

mini_batch比one_example at one time更有效

1.我们通过计算m个训练样本的损失函数,并对其求出梯度来优化参数。这比通过求解m次单个例子来求解损失函数,梯度,更新参数更有效。

2.在mini_batch上的损失函数的梯度是对整个训练集的一种估计。并且它的质量提高随着它的大小增加。

你可能感兴趣的:(Batch Normalization论文读后感)