目录
为什么需要批量规范化
困难
训练深层神经网络并使其在较短时间内收敛很困难
原因
反向传播算梯度(从顶层到底层)—> 顶层更新参数快,底层更新参数慢;但是,一旦底层更新后,前向传播至顶层,顶层又要重新训练 —> 收敛慢
需求
如何实现在学习底层时,避免变化顶层?
固定小批量的均值和方差(可学习的参数)
如何实现批量规范化
公式
\(x_{i+1}=\gamma\frac{x_{i}-小批量的原均值}{小批量的原标准差+\epsilon}+\beta\)
\(\gamma\)和\(\beta\):可学习的参数
原均值和原标准差:训练时使用小批量的均值和标准差,预测时使用整个数据集精确计算的均值和标准差
\(\epsilon\):防止分母为0
使用部位
BN是线性变换(重塑数据,把均值和标准差捏得比较好,不让其有很大变化),一般都放在激活函数前,相当于把每一层的输出先调到一个比较稳定的分布再作为下一层的输入
卷积层:作用于通道维
全连接层:作用于特征维
为什么卷积层的通道维相当于全连接层的特征维?
全连接层的输入:(batch_size, dim)
*dim为输入向量的维度,即特征维度、特征的个数
卷积层的输入:(batch_size, channel, H, W)
把卷积层输入的每个pixel视作全连接层输入的一个样本,则\(pixel数=batch\_size*H*W\),而每个pixel的通道维相当于全连接层每个样本的特征维
补充:为什么1*1卷积层相当于逐像素全连接层?
1、数学上,操作公式一致
2、意义上,作用相似,微小差别
深入思考BN的作用
加快收敛速度(达到同样的精度,需要跑的epoch数更少),但不改变模型精度
BN解决的是:当输入数据的分布发生变化后,如何减少其对深层网络结构的影响(对应参数对结果的影响,因为W与X相乘)?
通过计算方差和均值,和参数γ和β的调整,对于不同分布的输入数据
1、保持一定的数值稳定性:通过限制均值&标准差,限制每个input在特征维度上的分布——W也相应被scale得比较稳定——Loss关于W的曲线会比较平滑,没有梯度特别大or小的情况——用同一个lr可以较快收敛
2、保持数据的特征:在数据中学习得到均值和标准差
“How Does Batch Normalization Help Optimization?”这篇文章提出的观点是BN可以让loss function变得更平滑,进而加速收敛。而且文章里面通过实验证明了BN并没有改变internal covariate distribution
代码实现
nn.BatchNorm2d()
传入输入通道数即可
Q&A
• Xaiver初始化、BatchNorm的思想都是一样:想让模型数值稳定,一旦稳定(不会梯度消失也不会爆炸),收敛就不会变慢
• 如何稳定?限制分布!只不过一个在初始化时限制初始化值,一个在整个训练过程中一直限制模型输入(在上一层限制输出)
• epoch、batch_size、lr的调参思路:epoch通常选大一点(调到收敛;先跑到过拟合再说?),先调batch_size(根据内存调,不能太大或太小,一般调到每秒处理样本数不再明显增大时就行了),然后调lr
BatchNorm和LayerNorm的解释与对比
这篇写得很好:https://blog.csdn.net/Little_White_9/article/details/123345062?spm=1001.2014.3001.5506
标签:卷积,BN,均值,Batch,limu,标准差,P28,输入,size From: https://www.cnblogs.com/xjl-ultrasound/p/18372004