在神经网络中,每一批次数据分布的不一致,当每一批数据进来之后,神经网络就开始寻找这批数据的平衡点,显然会影响收敛速度,甚至产生梯度消失或爆炸等行为,所以引入了一种方法,就是归一化。
除了常见的批归一化,还有4种归一化,分别是层归一化、单例归一化、群归一化、权重归一化,本篇文章主要讲解清楚它们的理论知识以及如何运用在pytorch中的API。
归一化的大致步骤是这样的:
计算出每批次的均值、方差
归一化处理为均值为0,方差为1
恢复网络学习的数据分布
在测试集进入的网络时候,均值从何而来,方差从何而来?
均值是训练集中所有batch均值的平均值,是每个batch方差的无偏估计,至于无偏估计,我知道大概是用样本值取估计总体量的参数,有懂的小伙伴可以介绍一下这个无偏估计是如何计算的。
先放一张图,大家来看一下这几种归一化的区别:
批归一化:
每个batchsize中按照channel做归一化处理,也就是上图1中的公式,(N是batchsize,C是channel,HW被合成一个维度)
pytorch_api:
层归一化:按照每一个样本、每一层来求均值、方差,常用在RNN网络中
单例归一化:在风格迁移中常用,按照每一个样本、每一个通道来求均值方差
群归一化:按照每个样本、每组(channel分组)
上面的几种归一化方法只是求均值、方差的维度不同
权重归一化:WN的做法是将权值向量w 在其欧氏范数和其方向上解耦成了参数向量 v 和参数标量 g 后使用SGD分别优化这两个参数
用v除以v的模得到原来权重向量的方向,再增加一个g的可学习幅度
领取专属 10元无门槛券
私享最新 技术干货