【深度学习基础知识】Group Nomalization在batch size小时代替BN做归一化

编程入门 行业动态 更新时间:2024-10-13 04:26:11

【深度学习<a href=https://www.elefans.com/category/jswz/34/1769428.html style=基础知识】Group Nomalization在batch size小时代替BN做归一化"/>

【深度学习基础知识】Group Nomalization在batch size小时代替BN做归一化

参考博客:
参考一

文章目录

  • 为什么要归一化?
  • LRN(2012)
  • 为什么BN不好?
  • 各种归一化的区别
  • Group Nomalization代码实现
  • 小结


为什么要归一化?

归一化有助于快速收敛;

详细解释:神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
深度网络的训练是复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。

其它的解释:

LRN(2012)

  • LRN(Local Response Normalization)首次提出于AlexNet,BN提出后被抛弃;
  • 用于激活、池化后;
  • 来源于神经生物学的侧抑制,被激活的神经元会抑制相邻神经元,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力;

为什么BN不好?

  1. BN全名是Batch Normalization,以batch的维度做归一化,此归一化方式对batch是independent的,过小的batch size会导致其性能下降,作者实验发现一般来说每GPU上batch设为32最合适;但是对于一些其他深度学习任务batch size往往只有1-2,比如目标检测,图像分割,视频分类上,输入的图像数据很大,较大的batchsize显存吃不消
  2. Batch Normalization是在batch这个维度上Normalization,但是这个维度并不是固定不变的,比如训练和测试时一般不一样,一般都是训练的时候在训练集上通过滑动平均预先计算好平均-mean,和方差-variance参数。在测试的时候,不再计算这些值,而是直接调用这些预计算好的来用,但是,当训练数据和测试数据分布有差别是时,训练机上预计算好的数据并不能代表测试数据,这就导致在训练,验证,测试这三个阶段存在inconsistency

各种归一化的区别


深度网络中的数据维度一般是[N, C, H, W]或者[N, H, W,C]格式。

N是batch size,H/W是feature的高/宽,C是feature的channel,压缩H/W至一个维度,其三维的表示如上图,假设单个方格的长度是1,那么其表示的是[6, 6,H, W ]。

上图中从左到右分别为BN,LN,IN,GN:

  • Batch Nomalization:在batch的维度上norm,归一化维度为[N,H,W],对batch中对应的channel归一化
  • Layer Nomalization避开了batch维度,归一化的维度为[C,H,W];
  • Instance Nomalization归一化的维度为[H,W];
  • Group Nomalization介于LN和IN之间,其首先将channel分为许多组(group),对每一组做归一化,及先将feature的维度由[N, C, H, W]reshape为[N, G,C//G , H, W],归一化的维度为[C//G , H, W]

事实上,GN的极端情况就是LN和I N,分别对应G等于C和G等于1,作者在论文中给出G设为32较好

Group Nomalization代码实现

def GroupNorm(x, gamma, beta, G, eps=1e-5):
# x: input features with shape [N,C,H,W]
# gamma, beta: scale and offset, with shape [1,C,1,1]
# G: number of groups for GN
N, C, H, W = x.shape
x = tf.reshape(x, [N, G, C // G, H, W])
mean, var = tf.nn.moments(x, [2, 3, 4], keep dims=True)
x = (x - mean) / tf.sqrt(var + eps)
x = tf.reshape(x, [N, C, H, W])
return x * gamma + beta

其中beta 和gama参数是norm中可训练参数,表示平移和缩放因子

小结


这张图就能看出来,在batch size很小,GN对batch size的鲁棒性更强,用GN,当batch size较大时(官方建议32),GN和BN都可以用

更多推荐

【深度学习基础知识】Group Nomalization在batch size小时代替BN做归一化

本文发布于:2023-07-28 21:39:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1325276.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基础知识   深度   小时   Group   batch

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!