1.批量归一化和残差网络
-
什么是批量归一化?为什么要使用它?
这里先解释一下为什么对输入数据要进行标准化?
主要是为了使输入数据各个特征的分布相近。我们知道,神经网络学习的本质是学习数据集的分布,如果训练集与测试集的分布不同,那么该网络的泛化能力就会大大降低。另外,在使用批量数据训练神经网络时,如果每批数据的分布不同,网络训练的过程中一直学习适应不同分布,会大大降低网络的训练速度。
假设大家已经了解反向传播算法,神经网络在训练过程中,层与层之间的权重会不断改变和调整,前面层的权重参数的改变会影响到后面层的输入,当网络层数很多时,层之间的关联度变得很高,前面层的改变一直积累会对后面产生很大的影响,因此到某一层的输入值与上一次(此次参数更新前)的输入分布可能有很大的差距。而深度神经网络要求输入变量在训练集和测试集上的分布是相似的,这是通过训练集获得的模型能够在测试集获得好效果的一个基本保障。当输入的分布在参数更新前后有较大变化时,网络就要不断去适应新的数据分布,从而使得训练变得异常困难,这个时候只能使用一个很小的学习率和精调的初始化参数来解决。当中间层数越大,这种现象越明显。
批量归一化是指 ** 将网络层间的输入值进行归一化,而“批量”是因为归一化操作是针对训练的小批量数据进行的。**
批量归一化的好处:
(1) 可以选择较大的初始学习率,加快训练速度。以前的话学习率可能需要慢慢调整,现在可以采用初始很大的学习率,因为这个算法的收敛速度很快,学习率的衰减也很快。
(2)不用再理会drop out ,L2正则化参数选择问题,因为BN算法具有提高网络泛化能力的特性。
(3)不用使用局部响应归一化层(局部响应归一化是Alexnet网络用到的方法,在CV领域)因为BN本身就是一个归一化网络层。
(4)可以把训练数据彻底打乱。
(5)数据批量归一化后相当于只使用了S型激活函数的线性部分,可以缓解S型激活函数反向传播中的梯度消失的问题。
2. 在全连接层使用批量归一化
将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为u,权重参数和偏差参数分别为W和b,激活函数为ϕ,批量归一化运算符为BN。使用批量归一化的全连接层输出ϕ(BN(Wu+b))
**训练阶段:**每一层,BN的计算过程如下:这里,ϵ>0是一个很小的常数,是为了保证分母大于0。批量归一化在标准化的基础上增加了变换重构这一操作,引入了两个可以学习拉伸参数γ和偏移参数β,如果批量归一化没有起到优化作用,可以通过这两个参数进行抵消。只需学习出γ和β。
批量归一化可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行了额外的约束,从而增强模型的泛化能力。但是批量归一化同时也降低了模型的拟合能力,归一化之后的分布被强制拉到均值为0和标准差为1的正态分布上来。比如用Sigmoid函数为例,批量归一化之后数据整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布。为了恢复原始数据分布,保证非线性的获得,引入了变换重构以及参数γ和β,其对应于输入数据分布的方差和偏差。对于一般的网络不采用批量归一化操作时,这两个参数高度依赖前面网络学习到的连接权重(对应复杂的非线性)。在批量归一化操作中,γ和β变成了该层的学习参数,仅用两个参数就可以恢复最优的输入数据分布有利于优化过程,提高模型的泛化能力。
将数据从标准正态分布左移或者右移一点并长胖或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区域往非线性区动了动。核心是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
在训练阶段,使用批量归一化我们可以将批量大小设的大一点,从而使批量内样本的均值和方差的计算都较为准确,将训练好的模型用于预测时,因为我们希望模型对任意输入都有确定的输出。因此,单个样本的输出不应该取决于批量归一化所需要的随机小批量中的均值和方差。一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定输出。批量归一化在训练阶段和测试阶段下的计算结果是不一样的。
3.卷积层上的批量归一化
见链接批量归一化详解
来源:CSDN
作者:yq313210
链接:https://blog.csdn.net/yq313210/article/details/104412854